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
11using base::SingleThreadTaskRunner;
12
13namespace {
14
15void DeleteLoggingOnMainThread(scoped_ptr<media::cast::LoggingImpl> logging) {
16  logging.reset();
17}
18
19}  // namespace
20
21namespace media {
22namespace cast {
23
24CastEnvironment::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
35CastEnvironment::~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
45bool 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
51bool 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
59scoped_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
74bool 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
93