cast_environment.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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_ && !main_thread_proxy_->RunsTasksOnCurrentThread()) { 38 main_thread_proxy_->PostTask( 39 FROM_HERE, 40 base::Bind(&DeleteLoggingOnMainThread, base::Passed(&logging_))); 41 } 42} 43 44bool CastEnvironment::PostTask(ThreadId identifier, 45 const tracked_objects::Location& from_here, 46 const base::Closure& task) { 47 return GetTaskRunner(identifier)->PostTask(from_here, task); 48} 49 50bool CastEnvironment::PostDelayedTask( 51 ThreadId identifier, 52 const tracked_objects::Location& from_here, 53 const base::Closure& task, 54 base::TimeDelta delay) { 55 return GetTaskRunner(identifier)->PostDelayedTask(from_here, task, delay); 56} 57 58scoped_refptr<SingleThreadTaskRunner> CastEnvironment::GetTaskRunner( 59 ThreadId identifier) const { 60 switch (identifier) { 61 case CastEnvironment::MAIN: 62 return main_thread_proxy_; 63 case CastEnvironment::AUDIO: 64 return audio_thread_proxy_; 65 case CastEnvironment::VIDEO: 66 return video_thread_proxy_; 67 default: 68 NOTREACHED() << "Invalid Thread identifier"; 69 return NULL; 70 } 71} 72 73bool CastEnvironment::CurrentlyOn(ThreadId identifier) { 74 switch (identifier) { 75 case CastEnvironment::MAIN: 76 return main_thread_proxy_ && 77 main_thread_proxy_->RunsTasksOnCurrentThread(); 78 case CastEnvironment::AUDIO: 79 return audio_thread_proxy_ && 80 audio_thread_proxy_->RunsTasksOnCurrentThread(); 81 case CastEnvironment::VIDEO: 82 return video_thread_proxy_ && 83 video_thread_proxy_->RunsTasksOnCurrentThread(); 84 default: 85 NOTREACHED() << "Invalid thread identifier"; 86 return false; 87 } 88} 89 90} // namespace cast 91} // namespace media 92