Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / media / cast / cast_environment.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/cast/cast_environment.h"
6
7 #include "base/bind.h"
8 #include "base/location.h"
9 #include "base/logging.h"
10
11 using base::SingleThreadTaskRunner;
12
13 namespace {
14
15 void DeleteLoggingOnMainThread(scoped_ptr<media::cast::LoggingImpl> logging) {
16   logging.reset();
17 }
18
19 }  // namespace
20
21 namespace media {
22 namespace cast {
23
24 CastEnvironment::CastEnvironment(
25     scoped_ptr<base::TickClock> clock,
26     scoped_refptr<SingleThreadTaskRunner> main_thread_proxy,
27     scoped_refptr<SingleThreadTaskRunner> audio_thread_proxy,
28     scoped_refptr<SingleThreadTaskRunner> video_thread_proxy)
29     : main_thread_proxy_(main_thread_proxy),
30       audio_thread_proxy_(audio_thread_proxy),
31       video_thread_proxy_(video_thread_proxy),
32       clock_(clock.Pass()),
33       logging_(new LoggingImpl) {}
34
35 CastEnvironment::~CastEnvironment() {
36   // Logging must be deleted on the main thread.
37   if (main_thread_proxy_.get() &&
38       !main_thread_proxy_->RunsTasksOnCurrentThread()) {
39     main_thread_proxy_->PostTask(
40         FROM_HERE,
41         base::Bind(&DeleteLoggingOnMainThread, base::Passed(&logging_)));
42   }
43 }
44
45 bool CastEnvironment::PostTask(ThreadId identifier,
46                                const tracked_objects::Location& from_here,
47                                const base::Closure& task) {
48   return GetTaskRunner(identifier)->PostTask(from_here, task);
49 }
50
51 bool CastEnvironment::PostDelayedTask(
52     ThreadId identifier,
53     const tracked_objects::Location& from_here,
54     const base::Closure& task,
55     base::TimeDelta delay) {
56   return GetTaskRunner(identifier)->PostDelayedTask(from_here, task, delay);
57 }
58
59 scoped_refptr<SingleThreadTaskRunner> CastEnvironment::GetTaskRunner(
60     ThreadId identifier) const {
61   switch (identifier) {
62     case CastEnvironment::MAIN:
63       return main_thread_proxy_;
64     case CastEnvironment::AUDIO:
65       return audio_thread_proxy_;
66     case CastEnvironment::VIDEO:
67       return video_thread_proxy_;
68     default:
69       NOTREACHED() << "Invalid Thread identifier";
70       return NULL;
71   }
72 }
73
74 bool CastEnvironment::CurrentlyOn(ThreadId identifier) {
75   switch (identifier) {
76     case CastEnvironment::MAIN:
77       return main_thread_proxy_.get() &&
78              main_thread_proxy_->RunsTasksOnCurrentThread();
79     case CastEnvironment::AUDIO:
80       return audio_thread_proxy_.get() &&
81              audio_thread_proxy_->RunsTasksOnCurrentThread();
82     case CastEnvironment::VIDEO:
83       return video_thread_proxy_.get() &&
84              video_thread_proxy_->RunsTasksOnCurrentThread();
85     default:
86       NOTREACHED() << "Invalid thread identifier";
87       return false;
88   }
89 }
90
91 }  // namespace cast
92 }  // namespace media