diff options
author | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-24 18:00:32 +0000 |
---|---|---|
committer | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-24 18:00:32 +0000 |
commit | 1328d55d94cf7b973da1a0a884735c8cbdeb2423 (patch) | |
tree | bbd05bc64668be46fc3804b8ce46d59ac8b44769 /media/audio/linux | |
parent | 21f659de19e3ea874a0958372a311746a0e764c2 (diff) | |
download | chromium_src-1328d55d94cf7b973da1a0a884735c8cbdeb2423.zip chromium_src-1328d55d94cf7b973da1a0a884735c8cbdeb2423.tar.gz chromium_src-1328d55d94cf7b973da1a0a884735c8cbdeb2423.tar.bz2 |
Providing unplayed bytes in audio hardware buffer
BUG=20007
TEST=WinAudioTest.PCMWaveStreamPendingBytes
We used to guess what is in the hardware audio buffer to
perform audio sync. But due the triple buffering and
other platforms has other buffering scheme we need to be
able to know how many bytes are left in the hardware buffer.
We provide this data via AudioCallback::OnMoreData(), so we
can predict when the requested buffer will be played.
Review URL: http://codereview.chromium.org/174243
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24114 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/linux')
-rw-r--r-- | media/audio/linux/alsa_output.cc | 8 | ||||
-rw-r--r-- | media/audio/linux/alsa_output.h | 3 | ||||
-rw-r--r-- | media/audio/linux/alsa_output_unittest.cc | 8 |
3 files changed, 11 insertions, 8 deletions
diff --git a/media/audio/linux/alsa_output.cc b/media/audio/linux/alsa_output.cc index 522b8c4..8a59e33 100644 --- a/media/audio/linux/alsa_output.cc +++ b/media/audio/linux/alsa_output.cc @@ -390,8 +390,9 @@ void AlsaPcmOutputStream::BufferPacket(Packet* packet) { // Request more data if we don't have any cached. if (packet->used >= packet->size) { packet->used = 0; + // TODO(hclam): Provide pending bytes. packet->size = shared_data_.OnMoreData(this, packet->buffer.get(), - packet->capacity); + packet->capacity, 0); CHECK(packet->size <= packet->capacity) << "Data source overran buffer."; // This should not happen, but incase it does, drop any trailing bytes @@ -629,10 +630,11 @@ void AlsaPcmOutputStream::SharedData::set_volume(float v) { size_t AlsaPcmOutputStream::SharedData::OnMoreData(AudioOutputStream* stream, void* dest, - size_t max_size) { + size_t max_size, + int pending_bytes) { AutoLock l(lock_); if (source_callback_) { - return source_callback_->OnMoreData(stream, dest, max_size); + return source_callback_->OnMoreData(stream, dest, max_size, pending_bytes); } return 0; diff --git a/media/audio/linux/alsa_output.h b/media/audio/linux/alsa_output.h index 7d5f381..409b158 100644 --- a/media/audio/linux/alsa_output.h +++ b/media/audio/linux/alsa_output.h @@ -168,7 +168,8 @@ class AlsaPcmOutputStream : // is passed into the output stream, but ownership is not transfered which // requires a synchronization on access of the |source_callback_| to avoid // using a deleted callback. - size_t OnMoreData(AudioOutputStream* stream, void* dest, size_t max_size); + size_t OnMoreData(AudioOutputStream* stream, void* dest, + size_t max_size, int pending_bytes); void OnClose(AudioOutputStream* stream); void OnError(AudioOutputStream* stream, int code); diff --git a/media/audio/linux/alsa_output_unittest.cc b/media/audio/linux/alsa_output_unittest.cc index 8e262b1..d736d93 100644 --- a/media/audio/linux/alsa_output_unittest.cc +++ b/media/audio/linux/alsa_output_unittest.cc @@ -40,8 +40,8 @@ class MockAlsaWrapper : public AlsaWrapper { class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { public: - MOCK_METHOD3(OnMoreData, size_t(AudioOutputStream* stream, - void* dest, size_t max_size)); + MOCK_METHOD4(OnMoreData, size_t(AudioOutputStream* stream, void* dest, + size_t max_size, int pending_bytes)); MOCK_METHOD1(OnClose, void(AudioOutputStream* stream)); MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); }; @@ -273,7 +273,7 @@ TEST_F(AlsaPcmOutputStreamTest, StartStop) { // Expect the pre-roll. MockAudioSourceCallback mock_callback; EXPECT_CALL(mock_callback, - OnMoreData(test_stream_.get(), _, kTestPacketSize)) + OnMoreData(test_stream_.get(), _, kTestPacketSize, 0)) .Times(2) .WillRepeatedly(Return(kTestPacketSize)); EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) @@ -363,7 +363,7 @@ TEST_F(AlsaPcmOutputStreamTest, BufferPacket) { MockAudioSourceCallback mock_callback; EXPECT_CALL(mock_callback, OnMoreData(test_stream_.get(), packet_.buffer.get(), - packet_.capacity)) + packet_.capacity, 0)) .WillOnce(Return(10)); test_stream_->shared_data_.set_source_callback(&mock_callback); |