summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authordalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-23 23:33:15 +0000
committerdalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-23 23:33:15 +0000
commit120bfc072ea3b1b2644e1fd327e661e8027dc9dc (patch)
tree6eef68753f9d2c07d311fbfeee62ed666712f481 /media
parent0ba831c266931ef2a76ccfe7fa5b58c3f6a27a01 (diff)
downloadchromium_src-120bfc072ea3b1b2644e1fd327e661e8027dc9dc.zip
chromium_src-120bfc072ea3b1b2644e1fd327e661e8027dc9dc.tar.gz
chromium_src-120bfc072ea3b1b2644e1fd327e661e8027dc9dc.tar.bz2
Replaces the broken raw stream based audio renderer with one based on AudioOutputController.
I looked into switching it over to the low latency based controller, but the setup for low latency is pretty significant. Large portions of AudioRenderImpl and AudioRendererHost would have to be cribbed and tweaked. BUG=96789 TEST=Ran player_x11 --audio Review URL: http://codereview.chromium.org/8631001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111437 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/filters/reference_audio_renderer.cc95
-rw-r--r--media/filters/reference_audio_renderer.h36
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);
};