diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/filters/reference_audio_renderer.cc | 95 | ||||
-rw-r--r-- | media/filters/reference_audio_renderer.h | 36 |
2 files changed, 67 insertions, 64 deletions
diff --git a/media/filters/reference_audio_renderer.cc b/media/filters/reference_audio_renderer.cc index 188952c..deae588 100644 --- a/media/filters/reference_audio_renderer.cc +++ b/media/filters/reference_audio_renderer.cc @@ -6,51 +6,53 @@ #include <math.h> -#include "base/logging.h" -#include "media/base/filter_host.h" -#include "media/audio/audio_manager.h" +#include "base/bind.h" namespace media { -// This is an arbitrary number, ~184ms in a 44.1kHz stream, assuming a playback -// rate of 1.0. -static const size_t kSamplesPerBuffer = 8 * 1024; - ReferenceAudioRenderer::ReferenceAudioRenderer() : AudioRendererBase(), - stream_(NULL), bytes_per_second_(0) { } ReferenceAudioRenderer::~ReferenceAudioRenderer() { // Close down the audio device. - if (stream_) { - stream_->Stop(); - stream_->Close(); - } + if (controller_) + controller_->Close(base::Bind(&ReferenceAudioRenderer::OnClose, this)); } void ReferenceAudioRenderer::SetPlaybackRate(float rate) { // TODO(fbarchard): limit rate to reasonable values AudioRendererBase::SetPlaybackRate(rate); - static bool started = false; - if (rate > 0.0f && !started && stream_) - stream_->Start(this); + if (controller_ && rate > 0.0f) + controller_->Play(); } void ReferenceAudioRenderer::SetVolume(float volume) { - if (stream_) - stream_->SetVolume(volume); + if (controller_) + controller_->SetVolume(volume); +} + +void ReferenceAudioRenderer::OnCreated(AudioOutputController* controller) { + NOTIMPLEMENTED(); +} + +void ReferenceAudioRenderer::OnPlaying(AudioOutputController* controller) { + NOTIMPLEMENTED(); +} + +void ReferenceAudioRenderer::OnPaused(AudioOutputController* controller) { + NOTIMPLEMENTED(); } -uint32 ReferenceAudioRenderer::OnMoreData( - AudioOutputStream* stream, uint8* dest, uint32 len, - AudioBuffersState buffers_state) { - // TODO(scherkus): handle end of stream. - if (!stream_) - return 0; +void ReferenceAudioRenderer::OnError(AudioOutputController* controller, + int error_code) { + NOTIMPLEMENTED(); +} +void ReferenceAudioRenderer::OnMoreData(AudioOutputController* controller, + AudioBuffersState buffers_state) { // TODO(fbarchard): Waveout_output_win.h should handle zero length buffers // without clicking. uint32 pending_bytes = static_cast<uint32>(ceil(buffers_state.total_bytes() * @@ -59,42 +61,37 @@ uint32 ReferenceAudioRenderer::OnMoreData( base::Time::kMicrosecondsPerSecond * pending_bytes / bytes_per_second_); bool buffers_empty = buffers_state.pending_bytes == 0; - return FillBuffer(dest, len, delay, buffers_empty); + uint32 read = FillBuffer(buffer_.get(), buffer_capacity_, delay, + buffers_empty); + controller->EnqueueData(buffer_.get(), read); } -void ReferenceAudioRenderer::OnClose(AudioOutputStream* stream) { - // TODO(scherkus): implement OnClose. - NOTIMPLEMENTED(); -} +bool ReferenceAudioRenderer::OnInitialize(int bits_per_channel, + ChannelLayout channel_layout, + int sample_rate) { + int samples_per_packet = sample_rate / 10; + int hardware_buffer_size = samples_per_packet * + ChannelLayoutToChannelCount(channel_layout) * bits_per_channel / 8; -void ReferenceAudioRenderer::OnError(AudioOutputStream* stream, int code) { - // TODO(scherkus): implement OnError. - NOTIMPLEMENTED(); -} + // Allocate audio buffer based on hardware buffer size. + buffer_capacity_ = 3 * hardware_buffer_size; + buffer_.reset(new uint8[buffer_capacity_]); -bool ReferenceAudioRenderer::OnInitialize(int bits_per_channel, - ChannelLayout channel_layout, - int sample_rate) { AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, channel_layout, - sample_rate, bits_per_channel, kSamplesPerBuffer); - + sample_rate, bits_per_channel, samples_per_packet); bytes_per_second_ = params.GetBytesPerSecond(); - // Create our audio stream. - stream_ = AudioManager::GetAudioManager()->MakeAudioOutputStream(params); - if (!stream_) - return false; - - if (!stream_->Open()) { - stream_->Close(); - stream_ = NULL; - } - return true; + controller_ = AudioOutputController::Create(this, params, buffer_capacity_); + return controller_ != NULL; } void ReferenceAudioRenderer::OnStop() { - if (stream_) - stream_->Stop(); + if (controller_) + controller_->Pause(); +} + +void ReferenceAudioRenderer::OnClose() { + NOTIMPLEMENTED(); } } // namespace media diff --git a/media/filters/reference_audio_renderer.h b/media/filters/reference_audio_renderer.h index e8b9921..9ab9b26 100644 --- a/media/filters/reference_audio_renderer.h +++ b/media/filters/reference_audio_renderer.h @@ -11,21 +11,17 @@ // // Note: THIS IS NOT THE AUDIO RENDERER USED IN CHROME. // -// See src/chrome/renderer/media/audio_renderer_impl.h for chrome's +// See src/content/renderer/media/audio_renderer_impl.h for chrome's // implementation. -#include <deque> - -#include "media/audio/audio_io.h" -#include "media/base/buffers.h" -#include "media/base/filters.h" +#include "media/audio/audio_output_controller.h" #include "media/filters/audio_renderer_base.h" namespace media { class MEDIA_EXPORT ReferenceAudioRenderer : public AudioRendererBase, - public AudioOutputStream::AudioSourceCallback { + public AudioOutputController::EventHandler { public: ReferenceAudioRenderer(); virtual ~ReferenceAudioRenderer(); @@ -36,12 +32,14 @@ class MEDIA_EXPORT ReferenceAudioRenderer // AudioRenderer implementation. virtual void SetVolume(float volume) OVERRIDE; - // AudioSourceCallback implementation. - virtual uint32 OnMoreData(AudioOutputStream* stream, uint8* dest, - uint32 len, - AudioBuffersState buffers_state) OVERRIDE; - virtual void OnClose(AudioOutputStream* stream); - virtual void OnError(AudioOutputStream* stream, int code) OVERRIDE; + // AudioController::EventHandler implementation. + virtual void OnCreated(AudioOutputController* controller) OVERRIDE; + virtual void OnPlaying(AudioOutputController* controller) OVERRIDE; + virtual void OnPaused(AudioOutputController* controller) OVERRIDE; + virtual void OnError(AudioOutputController* controller, + int error_code) OVERRIDE; + virtual void OnMoreData(AudioOutputController* controller, + AudioBuffersState buffers_state) OVERRIDE; protected: // AudioRendererBase implementation. @@ -51,10 +49,18 @@ class MEDIA_EXPORT ReferenceAudioRenderer virtual void OnStop() OVERRIDE; private: - // Audio output stream device. - AudioOutputStream* stream_; int bytes_per_second_; + // AudioOutputController::Close callback. + virtual void OnClose(); + + // Audio output controller. + scoped_refptr<media::AudioOutputController> controller_; + + // Audio buffer. + int buffer_capacity_; + scoped_array<uint8> buffer_; + DISALLOW_COPY_AND_ASSIGN(ReferenceAudioRenderer); }; |