Home | History | Annotate | Download | only in cast
      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
     93