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/message_loop/message_loop_proxy.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::MessageLoopProxy>& message_loop) 16 : initialized_(false), 17 playing_(false), 18 callback_(NULL), 19 message_loop_(message_loop) { 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(message_loop_, params)); 28 callback_ = callback; 29 initialized_ = true; 30 } 31 32 void NullAudioSink::Start() { 33 DCHECK(message_loop_->BelongsToCurrentThread()); 34 DCHECK(!playing_); 35 } 36 37 void NullAudioSink::Stop() { 38 DCHECK(message_loop_->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(message_loop_->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(message_loop_->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(message_loop_->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