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 12namespace media { 13 14NullAudioSink::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 22NullAudioSink::~NullAudioSink() {} 23 24void 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 32void NullAudioSink::Start() { 33 DCHECK(task_runner_->BelongsToCurrentThread()); 34 DCHECK(!playing_); 35} 36 37void 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 45void 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 57void NullAudioSink::Pause() { 58 DCHECK(task_runner_->BelongsToCurrentThread()); 59 60 if (!playing_) 61 return; 62 63 fake_consumer_->Stop(); 64 playing_ = false; 65} 66 67bool NullAudioSink::SetVolume(double volume) { 68 // Audio is always muted. 69 return volume == 0.0; 70} 71 72void 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 82void NullAudioSink::StartAudioHashForTesting() { 83 DCHECK(!initialized_); 84 audio_hash_.reset(new AudioHash()); 85} 86 87std::string NullAudioSink::GetAudioHashForTesting() { 88 return audio_hash_ ? audio_hash_->ToString() : std::string(); 89} 90 91} // namespace media 92