diff options
author | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-08 19:01:38 +0000 |
---|---|---|
committer | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-08 19:01:38 +0000 |
commit | 87e6b1b69003191a0548325d7acac019e0f3777e (patch) | |
tree | 9f65b0c00e5419f87299eeb4a12028ff70327671 | |
parent | 4d220800e2b19f161868732e7e848031a96291cb (diff) | |
download | chromium_src-87e6b1b69003191a0548325d7acac019e0f3777e.zip chromium_src-87e6b1b69003191a0548325d7acac019e0f3777e.tar.gz chromium_src-87e6b1b69003191a0548325d7acac019e0f3777e.tar.bz2 |
Flush audio data after seek
There is about 400 to 600 ms of audio that needs to be flushed
after seek, this have a pretty UX effect. This is partially
fixed in this patch by reducing the amount of data down to
about at most 500 ms stored in the hardware buffer.
This patch clears data in the software buffer in the browser
process when seek happens. We could reduce the amount of
hardware buffer to further reduce the amount of lag but that
can be fixed by subsequent patch.
BUG=24150
TEST=audio still works, audio still play after seek
the playback of old data after seek is substantially
reduced.
Few changes in this patch:
1. Flush software buffer after seek in browser process
2. Get rid of prerolling, this actually has not effect at all, so getting rid of useless code
Needs to be done after this patch:
1. Further reduce the remaining data after seek and pause
2. Still hit the DCHECK in ClockImpl::Play(), this doesn't seem to be a new problem introduced in this patch
Review URL: http://codereview.chromium.org/1508021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43983 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/renderer_host/audio_renderer_host.cc | 52 | ||||
-rw-r--r-- | chrome/browser/renderer_host/audio_renderer_host.h | 61 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 7 | ||||
-rw-r--r-- | chrome/renderer/media/audio_renderer_impl.cc | 100 | ||||
-rw-r--r-- | chrome/renderer/media/audio_renderer_impl.h | 18 | ||||
-rw-r--r-- | media/audio/simple_sources.cc | 13 | ||||
-rw-r--r-- | media/audio/simple_sources.h | 12 | ||||
-rw-r--r-- | media/audio/simple_sources_unittest.cc | 5 | ||||
-rw-r--r-- | media/audio/win/audio_output_win_unittest.cc | 2 |
9 files changed, 148 insertions, 122 deletions
diff --git a/chrome/browser/renderer_host/audio_renderer_host.cc b/chrome/browser/renderer_host/audio_renderer_host.cc index 032978c..8d0a91c 100644 --- a/chrome/browser/renderer_host/audio_renderer_host.cc +++ b/chrome/browser/renderer_host/audio_renderer_host.cc @@ -73,7 +73,6 @@ AudioRendererHost::IPCAudioSource::IPCAudioSource( decoded_packet_size_(decoded_packet_size), buffer_capacity_(buffer_capacity), state_(kCreated), - push_source_(hardware_packet_size), outstanding_request_(false), pending_bytes_(0) { } @@ -202,25 +201,26 @@ void AudioRendererHost::IPCAudioSource::Play() { if (!stream_ || (state_ != kCreated && state_ != kPaused)) return; - if (state_ == kCreated) { - stream_->Start(this); - } + ViewMsg_AudioStreamState_Params state; + state.state = ViewMsg_AudioStreamState_Params::kPlaying; + host_->Send(new ViewMsg_NotifyAudioStreamStateChanged( + route_id_, stream_id_, state)); + State old_state; // Update the state and notify renderer. { AutoLock auto_lock(lock_); + old_state = state_; state_ = kPlaying; } - ViewMsg_AudioStreamState_Params state; - state.state = ViewMsg_AudioStreamState_Params::kPlaying; - host_->Send(new ViewMsg_NotifyAudioStreamStateChanged( - route_id_, stream_id_, state)); + if (old_state == kCreated) + stream_->Start(this); } void AudioRendererHost::IPCAudioSource::Pause() { // We can pause from started state. - if (!stream_ || state_ != kPlaying) + if (state_ != kPlaying) return; // Update the state and notify renderer. @@ -235,6 +235,14 @@ void AudioRendererHost::IPCAudioSource::Pause() { route_id_, stream_id_, state)); } +void AudioRendererHost::IPCAudioSource::Flush() { + if (state_ != kPaused) + return; + + // The following operation is atomic in PushSource so we don't need to lock. + push_source_.ClearAll(); +} + void AudioRendererHost::IPCAudioSource::Close() { if (!stream_) return; @@ -276,7 +284,7 @@ uint32 AudioRendererHost::IPCAudioSource::OnMoreData(AudioOutputStream* stream, // Record the callback time. last_callback_time_ = base::Time::Now(); - if (state_ == kPaused) { + if (state_ != kPlaying) { // Don't read anything. Save the number of bytes in the hardware buffer. pending_bytes_ = pending_bytes; return 0; @@ -323,20 +331,12 @@ void AudioRendererHost::IPCAudioSource::NotifyPacketReady( DCHECK(!shared_socket_.get()); AutoLock auto_lock(lock_); - bool ok = true; outstanding_request_ = false; // If reported size is greater than capacity of the shared memory, we have // an error. if (decoded_packet_size <= decoded_packet_size_) { - for (uint32 i = 0; i < decoded_packet_size; i += hardware_packet_size_) { - uint32 size = std::min(decoded_packet_size - i, hardware_packet_size_); - ok &= push_source_.Write( - static_cast<char*>(shared_memory_.memory()) + i, size); - // We have received a data packet but we didn't finish writing to push - // source. There's error an error and we should stop. - if (!ok) - NOTREACHED() << "Writing to push source failed."; - } + bool ok = push_source_.Write( + static_cast<char*>(shared_memory_.memory()), decoded_packet_size); // Submit packet request if we have written something. if (ok) @@ -434,6 +434,7 @@ bool AudioRendererHost::OnMessageReceived(const IPC::Message& message, IPC_MESSAGE_HANDLER(ViewHostMsg_CreateAudioStream, OnCreateStream) IPC_MESSAGE_HANDLER(ViewHostMsg_PlayAudioStream, OnPlayStream) IPC_MESSAGE_HANDLER(ViewHostMsg_PauseAudioStream, OnPauseStream) + IPC_MESSAGE_HANDLER(ViewHostMsg_FlushAudioStream, OnFlushStream) IPC_MESSAGE_HANDLER(ViewHostMsg_CloseAudioStream, OnCloseStream) IPC_MESSAGE_HANDLER(ViewHostMsg_NotifyAudioPacketReady, OnNotifyPacketReady) IPC_MESSAGE_HANDLER(ViewHostMsg_GetAudioVolume, OnGetVolume) @@ -449,6 +450,7 @@ bool AudioRendererHost::IsAudioRendererHostMessage( case ViewHostMsg_CreateAudioStream::ID: case ViewHostMsg_PlayAudioStream::ID: case ViewHostMsg_PauseAudioStream::ID: + case ViewHostMsg_FlushAudioStream::ID: case ViewHostMsg_CloseAudioStream::ID: case ViewHostMsg_NotifyAudioPacketReady::ID: case ViewHostMsg_GetAudioVolume::ID: @@ -510,6 +512,16 @@ void AudioRendererHost::OnPauseStream(const IPC::Message& msg, int stream_id) { } } +void AudioRendererHost::OnFlushStream(const IPC::Message& msg, int stream_id) { + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); + IPCAudioSource* source = Lookup(msg.routing_id(), stream_id); + if (source) { + source->Flush(); + } else { + SendErrorMessage(msg.routing_id(), stream_id); + } +} + void AudioRendererHost::OnCloseStream(const IPC::Message& msg, int stream_id) { DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); IPCAudioSource* source = Lookup(msg.routing_id(), stream_id); diff --git a/chrome/browser/renderer_host/audio_renderer_host.h b/chrome/browser/renderer_host/audio_renderer_host.h index c17350e..5d7aaa4 100644 --- a/chrome/browser/renderer_host/audio_renderer_host.h +++ b/chrome/browser/renderer_host/audio_renderer_host.h @@ -34,35 +34,37 @@ // *[ Created ] --> [ Playing ] --> [ Paused ] // ^ | // | | -// `-----------------` +// `-----------------' // // Here's an example of a typical IPC dialog for audio: // -// Renderer AudioRendererHost -// | >>>>>>>>>>> CreateStream >>>>>>>>> | -// | <<<<<<<<<<<< Created <<<<<<<<<<<<< | -// | | -// | <<<<<< RequestAudioPacket <<<<<<<< | -// | >>>>>>> AudioPacketReady >>>>>>>>> | -// | ... | -// | <<<<<< RequestAudioPacket <<<<<<<< | -// | >>>>>>> AudioPacketReady >>>>>>>>> | -// | | -// | >>>>>>>>>>>>> Play >>>>>>>>>>>>>>> | -// | <<<<<<<<<<<< Playing <<<<<<<<<<<<< | time -// | ... | -// | <<<<<< RequestAudioPacket <<<<<<<< | -// | >>>>>>> AudioPacketReady >>>>>>>>> | -// | ... | -// | >>>>>>>>>>>>> Pause >>>>>>>>>>>>>> | -// | <<<<<<<<<<<< Paused <<<<<<<<<<<<< | -// | ... | -// | >>>>>>>>>>>>> Start >>>>>>>>>>>>>> | -// | <<<<<<<<<<<< Started <<<<<<<<<<<<< | -// | ... | -// | >>>>>>>>>>>>> Close >>>>>>>>>>>>>> | -// v v -// +// Renderer AudioRendererHost +// | | +// | CreateStream > | +// | < Created | +// | | +// | Play > | +// | < Playing | time +// | | +// | < RequestAudioPacket | +// | AudioPacketReady > | +// | ... | +// | < RequestAudioPacket | +// | AudioPacketReady > | +// | | +// | ... | +// | < RequestAudioPacket | +// | AudioPacketReady > | +// | ... | +// | Pause > | +// | < Paused | +// | ... | +// | Start > | +// | < Started | +// | ... | +// | Close > | +// v v + // The above mode of operation uses relatively big buffers and has latencies // of 50 ms or more. There is a second mode of operation which is low latency. // For low latency audio, the picture above is modified by not having the @@ -197,6 +199,10 @@ class AudioRendererHost // the renderer. void Pause(); + // Discard all audio data buffered in this output stream. This method only + // has effect when the stream is paused. + void Flush(); + // Closes the audio output stream. After calling this method all activities // of the audio output stream are stopped. void Close(); @@ -306,6 +312,9 @@ class AudioRendererHost // required IPCAudioSource is not found. void OnPauseStream(const IPC::Message& msg, int stream_id); + // Discard all audio data buffered. + void OnFlushStream(const IPC::Message& msg, int stream_id); + // Closes the audio output stream, delegates the close method call to the // corresponding IPCAudioSource::Close(), no returning IPC message to renderer // upon success and failure. diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index 3f7b047..1654850 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -1821,7 +1821,8 @@ IPC_BEGIN_MESSAGES(ViewHost) int /* stream_id */, uint32 /* packet size */) - // Start buffering the audio stream specified by (render_view_id, stream_id). + // Start buffering and play the audio stream specified by + // (render_view_id, stream_id). IPC_MESSAGE_ROUTED1(ViewHostMsg_PlayAudioStream, int /* stream_id */) @@ -1829,6 +1830,10 @@ IPC_BEGIN_MESSAGES(ViewHost) IPC_MESSAGE_ROUTED1(ViewHostMsg_PauseAudioStream, int /* stream_id */) + // Discard all buffered audio data for the specified audio stream. + IPC_MESSAGE_ROUTED1(ViewHostMsg_FlushAudioStream, + int /* stream_id */) + // Close an audio stream specified by (render_view_id, stream_id). IPC_MESSAGE_ROUTED1(ViewHostMsg_CloseAudioStream, int /* stream_id */) diff --git a/chrome/renderer/media/audio_renderer_impl.cc b/chrome/renderer/media/audio_renderer_impl.cc index c39c4d5..4325798 100644 --- a/chrome/renderer/media/audio_renderer_impl.cc +++ b/chrome/renderer/media/audio_renderer_impl.cc @@ -23,10 +23,6 @@ const int kMillisecondsPerPacket = 200; // amount to avoid clicks. const int kPacketsInBuffer = 3; -// We want to preroll 400 milliseconds before starting to play. Again, 400 ms -// of audio data should give us enough time to get more from the renderer. -const int kMillisecondsPreroll = 400; - } // namespace AudioRendererImpl::AudioRendererImpl(AudioMessageFilter* filter) @@ -41,9 +37,7 @@ AudioRendererImpl::AudioRendererImpl(AudioMessageFilter* filter) shared_memory_size_(0), io_loop_(filter->message_loop()), stopped_(false), - pending_request_(false), - prerolling_(true), - preroll_bytes_(0) { + pending_request_(false) { DCHECK(io_loop_); } @@ -80,11 +74,8 @@ bool AudioRendererImpl::OnInitialize(const media::MediaFormat& media_format) { uint32 packet_size = bytes_per_second_ * kMillisecondsPerPacket / 1000; uint32 buffer_capacity = packet_size * kPacketsInBuffer; - // Calculate the amount for prerolling. - preroll_bytes_ = bytes_per_second_ * kMillisecondsPreroll / 1000; - io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, &AudioRendererImpl::OnCreateStream, + NewRunnableMethod(this, &AudioRendererImpl::CreateStreamTask, AudioManager::AUDIO_PCM_LINEAR, channels_, sample_rate_, sample_bits_, packet_size, buffer_capacity)); return true; @@ -99,7 +90,7 @@ void AudioRendererImpl::OnStop() { // We should never touch |io_loop_| after being stopped, so post our final // task to clean up. io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, &AudioRendererImpl::OnDestroy)); + NewRunnableMethod(this, &AudioRendererImpl::DestroyTask)); } void AudioRendererImpl::OnReadComplete(media::Buffer* buffer_in) { @@ -114,7 +105,7 @@ void AudioRendererImpl::OnReadComplete(media::Buffer* buffer_in) { // Post a task to render thread to notify a packet reception. io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, &AudioRendererImpl::OnNotifyPacketReady)); + NewRunnableMethod(this, &AudioRendererImpl::NotifyPacketReadyTask)); } void AudioRendererImpl::SetPlaybackRate(float rate) { @@ -131,15 +122,12 @@ void AudioRendererImpl::SetPlaybackRate(float rate) { // Play: GetPlaybackRate() == 0.0 && rate != 0.0 // Pause: GetPlaybackRate() != 0.0 && rate == 0.0 if (GetPlaybackRate() == 0.0f && rate != 0.0f) { - // Play is a bit tricky, we can only play if we have done prerolling. - // TODO(hclam): I should check for end of streams status here. - if (!prerolling_) - io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, &AudioRendererImpl::OnPlay)); + io_loop_->PostTask(FROM_HERE, + NewRunnableMethod(this, &AudioRendererImpl::PlayTask)); } else if (GetPlaybackRate() != 0.0f && rate == 0.0f) { // Pause is easy, we can always pause. io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, &AudioRendererImpl::OnPause)); + NewRunnableMethod(this, &AudioRendererImpl::PauseTask)); } AudioRendererBase::SetPlaybackRate(rate); @@ -148,17 +136,29 @@ void AudioRendererImpl::SetPlaybackRate(float rate) { if (rate > 0.0f) { io_loop_->PostTask( FROM_HERE, - NewRunnableMethod(this, &AudioRendererImpl::OnNotifyPacketReady)); + NewRunnableMethod(this, &AudioRendererImpl::NotifyPacketReadyTask)); } } +void AudioRendererImpl::Seek(base::TimeDelta time, + media::FilterCallback* callback) { + AudioRendererBase::Seek(time, callback); + + AutoLock auto_lock(lock_); + if (stopped_) + return; + + io_loop_->PostTask(FROM_HERE, + NewRunnableMethod(this, &AudioRendererImpl::SeekTask)); +} + void AudioRendererImpl::SetVolume(float volume) { AutoLock auto_lock(lock_); if (stopped_) return; io_loop_->PostTask(FROM_HERE, NewRunnableMethod( - this, &AudioRendererImpl::OnSetVolume, volume)); + this, &AudioRendererImpl::SetVolumeTask, volume)); } void AudioRendererImpl::OnCreated(base::SharedMemoryHandle handle, @@ -195,8 +195,8 @@ void AudioRendererImpl::OnRequestPacket(uint32 bytes_in_buffer, request_delay_ = ConvertToDuration(bytes_in_buffer); } - // Try to fulfill the packet request. - OnNotifyPacketReady(); + // Try to fill in the fulfill the packet request. + NotifyPacketReadyTask(); } void AudioRendererImpl::OnStateChanged( @@ -231,7 +231,7 @@ void AudioRendererImpl::OnVolume(double volume) { // pipeline. } -void AudioRendererImpl::OnCreateStream( +void AudioRendererImpl::CreateStreamTask( AudioManager::Format format, int channels, int sample_rate, int bits_per_sample, uint32 packet_size, uint32 buffer_capacity) { DCHECK(MessageLoop::current() == io_loop_); @@ -257,19 +257,25 @@ void AudioRendererImpl::OnCreateStream( false)); } -void AudioRendererImpl::OnPlay() { +void AudioRendererImpl::PlayTask() { DCHECK(MessageLoop::current() == io_loop_); filter_->Send(new ViewHostMsg_PlayAudioStream(0, stream_id_)); } -void AudioRendererImpl::OnPause() { +void AudioRendererImpl::PauseTask() { DCHECK(MessageLoop::current() == io_loop_); filter_->Send(new ViewHostMsg_PauseAudioStream(0, stream_id_)); } -void AudioRendererImpl::OnDestroy() { +void AudioRendererImpl::SeekTask() { + DCHECK(MessageLoop::current() == io_loop_); + + filter_->Send(new ViewHostMsg_FlushAudioStream(0, stream_id_)); +} + +void AudioRendererImpl::DestroyTask() { DCHECK(MessageLoop::current() == io_loop_); // Make sure we don't call destroy more than once. @@ -280,19 +286,7 @@ void AudioRendererImpl::OnDestroy() { stream_id_ = 0; } -void AudioRendererImpl::WillDestroyCurrentMessageLoop() { - DCHECK(MessageLoop::current() == io_loop_); - - // We treat the IO loop going away the same as stopping. - AutoLock auto_lock(lock_); - if (stopped_) - return; - - stopped_ = true; - OnDestroy(); -} - -void AudioRendererImpl::OnSetVolume(double volume) { +void AudioRendererImpl::SetVolumeTask(double volume) { DCHECK(MessageLoop::current() == io_loop_); AutoLock auto_lock(lock_); @@ -301,7 +295,7 @@ void AudioRendererImpl::OnSetVolume(double volume) { filter_->Send(new ViewHostMsg_SetAudioVolume(0, stream_id_, volume)); } -void AudioRendererImpl::OnNotifyPacketReady() { +void AudioRendererImpl::NotifyPacketReadyTask() { DCHECK(MessageLoop::current() == io_loop_); AutoLock auto_lock(lock_); @@ -344,17 +338,19 @@ void AudioRendererImpl::OnNotifyPacketReady() { // Then tell browser process we are done filling into the buffer. filter_->Send( new ViewHostMsg_NotifyAudioPacketReady(0, stream_id_, filled)); - - if (prerolling_) { - // We have completed prerolling. - if (filled > preroll_bytes_) { - prerolling_ = false; - preroll_bytes_ = 0; - filter_->Send(new ViewHostMsg_PlayAudioStream(0, stream_id_)); - } else { - preroll_bytes_ -= filled; - } - } } } } + +void AudioRendererImpl::WillDestroyCurrentMessageLoop() { + DCHECK(MessageLoop::current() == io_loop_); + + // We treat the IO loop going away the same as stopping. + AutoLock auto_lock(lock_); + if (stopped_) + return; + + stopped_ = true; + DestroyTask(); +} + diff --git a/chrome/renderer/media/audio_renderer_impl.h b/chrome/renderer/media/audio_renderer_impl.h index 2e714ee..d156e63 100644 --- a/chrome/renderer/media/audio_renderer_impl.h +++ b/chrome/renderer/media/audio_renderer_impl.h @@ -130,6 +130,7 @@ class AudioRendererImpl : public media::AudioRendererBase, // Methods called on pipeline thread ---------------------------------------- // media::MediaFilter implementation. virtual void SetPlaybackRate(float rate); + virtual void Seek(base::TimeDelta time, media::FilterCallback* callback); // media::AudioRenderer implementation. virtual void SetVolume(float volume); @@ -164,14 +165,15 @@ class AudioRendererImpl : public media::AudioRendererBase, // The following methods are tasks posted on the IO thread that needs to // be executed on that thread. They interact with AudioMessageFilter and // sends IPC messages on that thread. - void OnCreateStream(AudioManager::Format format, int channels, - int sample_rate, int bits_per_sample, - uint32 packet_size, uint32 buffer_capacity); - void OnPlay(); - void OnPause(); - void OnSetVolume(double volume); - void OnNotifyPacketReady(); - void OnDestroy(); + void CreateStreamTask(AudioManager::Format format, int channels, + int sample_rate, int bits_per_sample, + uint32 packet_size, uint32 buffer_capacity); + void PlayTask(); + void PauseTask(); + void SeekTask(); + void SetVolumeTask(double volume); + void NotifyPacketReadyTask(); + void DestroyTask(); // Called on IO thread when message loop is dying. virtual void WillDestroyCurrentMessageLoop(); diff --git a/media/audio/simple_sources.cc b/media/audio/simple_sources.cc index 228057b..1edd2b2 100644 --- a/media/audio/simple_sources.cc +++ b/media/audio/simple_sources.cc @@ -50,9 +50,8 @@ void SineWaveAudioSource::OnError(AudioOutputStream* stream, int code) { ////////////////////////////////////////////////////////////////////////////// // PushSource implementation. -PushSource::PushSource(uint32 packet_size) - : packet_size_(packet_size), - buffered_bytes_(0), +PushSource::PushSource() + : buffered_bytes_(0), front_buffer_consumed_(0) { } @@ -115,12 +114,18 @@ uint32 PushSource::UnProcessedBytes() { return buffered_bytes_; } +void PushSource::ClearAll() { + // Cleanup() will discard all the data. + CleanUp(); +} + void PushSource::CleanUp() { AutoLock auto_lock(lock_); PacketList::const_iterator it; for (it = packets_.begin(); it != packets_.end(); ++it) { delete [] it->buffer; - buffered_bytes_ -= it->size; } packets_.clear(); + buffered_bytes_ = 0; + front_buffer_consumed_ = 0; } diff --git a/media/audio/simple_sources.h b/media/audio/simple_sources.h index 9d0619f..9d8c5fa 100644 --- a/media/audio/simple_sources.h +++ b/media/audio/simple_sources.h @@ -58,14 +58,10 @@ class PushAudioOutput { class PushSource : public AudioOutputStream::AudioSourceCallback, public PushAudioOutput { public: - // Construct the audio source. Pass the same |packet_size| specified in the - // AudioOutputStream::Open() here. - // TODO(hclam): |packet_size| is not used anymore, remove it. - explicit PushSource(uint32 packet_size); + explicit PushSource(); virtual ~PushSource(); - // Write one buffer. The ideal size is |packet_size| but smaller sizes are - // accepted. + // Write one buffer. virtual bool Write(const void* data, uint32 len); // Return the total number of bytes not given to the audio device yet. @@ -77,6 +73,9 @@ class PushSource : public AudioOutputStream::AudioSourceCallback, virtual void OnClose(AudioOutputStream* stream); virtual void OnError(AudioOutputStream* stream, int code); + // Discard all buffered data and reset to initial state. + void ClearAll(); + private: // Defines the unit of playback. We own the memory pointed by |buffer|. struct Packet { @@ -87,7 +86,6 @@ class PushSource : public AudioOutputStream::AudioSourceCallback, // Free acquired resources. void CleanUp(); - const uint32 packet_size_; typedef std::list<Packet> PacketList; PacketList packets_; uint32 buffered_bytes_; diff --git a/media/audio/simple_sources_unittest.cc b/media/audio/simple_sources_unittest.cc index 6436170..118ec6f 100644 --- a/media/audio/simple_sources_unittest.cc +++ b/media/audio/simple_sources_unittest.cc @@ -39,9 +39,8 @@ TEST(SimpleSourcesTest, PushSourceSmallerWrite) { const uint32 kReadSize = 293; scoped_array<char> read_data(new char[kReadSize]); - // Create a PushSource that assumes the hardware audio buffer size is always - // bigger than the write size. - PushSource push_source(kReadSize); + // Create a PushSource. + PushSource push_source; EXPECT_EQ(0u, push_source.UnProcessedBytes()); // Write everything into this push source. diff --git a/media/audio/win/audio_output_win_unittest.cc b/media/audio/win/audio_output_win_unittest.cc index 0bb18a2..6a06274 100644 --- a/media/audio/win/audio_output_win_unittest.cc +++ b/media/audio/win/audio_output_win_unittest.cc @@ -465,7 +465,7 @@ TEST(WinAudioTest, PushSourceFile16KHz) { // We buffer and play at the same time, buffering happens every ~10ms and the // consuming of the buffer happens every ~50ms. We do 100 buffers which // effectively wrap around the file more than once. - PushSource push_source(kSize50ms); + PushSource push_source; for (uint32 ix = 0; ix != 100; ++ix) { push_source.Write(file_reader.GetChunkAt(offset), kSize50ms); if (ix == 2) { |