Home | History | Annotate | Download | only in audio
      1 // Copyright (c) 2012 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/audio/null_audio_sink.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/single_thread_task_runner.h"
      9 #include "media/audio/fake_audio_consumer.h"
     10 #include "media/base/audio_hash.h"
     11 
     12 namespace media {
     13 
     14 NullAudioSink::NullAudioSink(
     15     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
     16     : initialized_(false),
     17       playing_(false),
     18       callback_(NULL),
     19       task_runner_(task_runner) {
     20 }
     21 
     22 NullAudioSink::~NullAudioSink() {}
     23 
     24 void NullAudioSink::Initialize(const AudioParameters& params,
     25                                RenderCallback* callback) {
     26   DCHECK(!initialized_);
     27   fake_consumer_.reset(new FakeAudioConsumer(task_runner_, params));
     28   callback_ = callback;
     29   initialized_ = true;
     30 }
     31 
     32 void NullAudioSink::Start() {
     33   DCHECK(task_runner_->BelongsToCurrentThread());
     34   DCHECK(!playing_);
     35 }
     36 
     37 void NullAudioSink::Stop() {
     38   DCHECK(task_runner_->BelongsToCurrentThread());
     39 
     40   // Stop may be called at any time, so we have to check before stopping.
     41   if (fake_consumer_)
     42     fake_consumer_->Stop();
     43 }
     44 
     45 void NullAudioSink::Play() {
     46   DCHECK(task_runner_->BelongsToCurrentThread());
     47   DCHECK(initialized_);
     48 
     49   if (playing_)
     50     return;
     51 
     52   fake_consumer_->Start(base::Bind(
     53       &NullAudioSink::CallRender, base::Unretained(this)));
     54   playing_ = true;
     55 }
     56 
     57 void NullAudioSink::Pause() {
     58   DCHECK(task_runner_->BelongsToCurrentThread());
     59 
     60   if (!playing_)
     61     return;
     62 
     63   fake_consumer_->Stop();
     64   playing_ = false;
     65 }
     66 
     67 bool NullAudioSink::SetVolume(double volume) {
     68   // Audio is always muted.
     69   return volume == 0.0;
     70 }
     71 
     72 void NullAudioSink::CallRender(AudioBus* audio_bus) {
     73   DCHECK(task_runner_->BelongsToCurrentThread());
     74 
     75   int frames_received = callback_->Render(audio_bus, 0);
     76   if (!audio_hash_ || frames_received <= 0)
     77     return;
     78 
     79   audio_hash_->Update(audio_bus, frames_received);
     80 }
     81 
     82 void NullAudioSink::StartAudioHashForTesting() {
     83   DCHECK(!initialized_);
     84   audio_hash_.reset(new AudioHash());
     85 }
     86 
     87 std::string NullAudioSink::GetAudioHashForTesting() {
     88   return audio_hash_ ? audio_hash_->ToString() : std::string();
     89 }
     90 
     91 }  // namespace media
     92