Index: media/audio/win/audio_output_win_unittest.cc |
diff --git a/media/audio/win/audio_output_win_unittest.cc b/media/audio/win/audio_output_win_unittest.cc |
index c78939ad710bb87acbc7dc910aa601cae00b96bb..3e868546770ff39879806f6581354f163e062f22 100644 |
--- a/media/audio/win/audio_output_win_unittest.cc |
+++ b/media/audio/win/audio_output_win_unittest.cc |
@@ -14,6 +14,7 @@ |
#include "base/message_loop/message_loop.h" |
#include "base/run_loop.h" |
#include "base/sync_socket.h" |
+#include "base/time/time.h" |
#include "base/win/scoped_com_initializer.h" |
#include "base/win/windows_version.h" |
#include "media/audio/audio_io.h" |
@@ -37,11 +38,12 @@ using ::testing::Return; |
namespace media { |
-static int ClearData(AudioBus* audio_bus, |
- uint32_t total_bytes_delay, |
- uint32_t frames_skipped) { |
- audio_bus->Zero(); |
- return audio_bus->frames(); |
+static int ClearData(base::TimeDelta /* delay */, |
+ base::TimeTicks /* delay_timestamp */, |
+ int /* prior_frames_skipped */, |
+ AudioBus* dest) { |
+ dest->Zero(); |
+ return dest->frames(); |
} |
// This class allows to find out if the callbacks are occurring as |
@@ -53,13 +55,14 @@ class TestSourceBasic : public AudioOutputStream::AudioSourceCallback { |
had_error_(0) { |
} |
// AudioSourceCallback::OnMoreData implementation: |
- int OnMoreData(AudioBus* audio_bus, |
- uint32_t total_bytes_delay, |
- uint32_t frames_skipped) override { |
+ int OnMoreData(base::TimeDelta /* delay */, |
+ base::TimeTicks /* delay_timestamp */, |
+ int /* prior_frames_skipped */, |
+ AudioBus* dest) override { |
++callback_count_; |
// Touch the channel memory value to make sure memory is good. |
- audio_bus->Zero(); |
- return audio_bus->frames(); |
+ dest->Zero(); |
+ return dest->frames(); |
} |
// AudioSourceCallback::OnError implementation: |
void OnError(AudioOutputStream* stream) override { ++had_error_; } |
@@ -89,15 +92,17 @@ class TestSourceLaggy : public TestSourceBasic { |
explicit TestSourceLaggy(int lag_in_ms) |
: lag_in_ms_(lag_in_ms) { |
} |
- int OnMoreData(AudioBus* audio_bus, |
- uint32_t total_bytes_delay, |
- uint32_t frames_skipped) override { |
+ int OnMoreData(base::TimeDelta delay, |
+ base::TimeTicks delay_timestamp, |
+ int prior_frames_skipped, |
+ AudioBus* dest) override { |
// Call the base, which increments the callback_count_. |
- TestSourceBasic::OnMoreData(audio_bus, total_bytes_delay, frames_skipped); |
+ TestSourceBasic::OnMoreData(delay, delay_timestamp, prior_frames_skipped, |
+ dest); |
if (callback_count() > kMaxNumBuffers) { |
::Sleep(lag_in_ms_); |
} |
- return audio_bus->frames(); |
+ return dest->frames(); |
} |
private: |
int lag_in_ms_; |
@@ -487,31 +492,32 @@ TEST_F(WinAudioTest, PCMWaveStreamPendingBytes) { |
NiceMock<MockAudioSourceCallback> source; |
EXPECT_TRUE(oas->Open()); |
- uint32_t bytes_100_ms = samples_100_ms * 2; |
+ const base::TimeDelta delay_100_ms = base::TimeDelta::FromMilliseconds(100); |
+ const base::TimeDelta delay_200_ms = base::TimeDelta::FromMilliseconds(200); |
- // Audio output stream has either a double or triple buffer scheme. |
- // We expect the amount of pending bytes will reaching up to 2 times of |
- // |bytes_100_ms| depending on number of buffers used. |
+ // Audio output stream has either a double or triple buffer scheme. We expect |
+ // the delay to reach up to 200 ms depending on the number of buffers used. |
// From that it would decrease as we are playing the data but not providing |
// new one. And then we will try to provide zero data so the amount of |
// pending bytes will go down and eventually read zero. |
InSequence s; |
- EXPECT_CALL(source, OnMoreData(NotNull(), 0, 0)).WillOnce(Invoke(ClearData)); |
+ EXPECT_CALL(source, OnMoreData(base::TimeDelta(), _, 0, NotNull())) |
+ .WillOnce(Invoke(ClearData)); |
// Note: If AudioManagerWin::NumberOfWaveOutBuffers() ever changes, or if this |
// test is run on Vista, these expectations will fail. |
- EXPECT_CALL(source, OnMoreData(NotNull(), bytes_100_ms, 0)) |
+ EXPECT_CALL(source, OnMoreData(delay_100_ms, _, 0, NotNull())) |
.WillOnce(Invoke(ClearData)); |
- EXPECT_CALL(source, OnMoreData(NotNull(), 2 * bytes_100_ms, 0)) |
+ EXPECT_CALL(source, OnMoreData(delay_200_ms, _, 0, NotNull())) |
.WillOnce(Invoke(ClearData)); |
- EXPECT_CALL(source, OnMoreData(NotNull(), 2 * bytes_100_ms, 0)) |
+ EXPECT_CALL(source, OnMoreData(delay_200_ms, _, 0, NotNull())) |
.Times(AnyNumber()) |
.WillRepeatedly(Return(0)); |
- EXPECT_CALL(source, OnMoreData(NotNull(), bytes_100_ms, 0)) |
+ EXPECT_CALL(source, OnMoreData(delay_100_ms, _, 0, NotNull())) |
.Times(AnyNumber()) |
.WillRepeatedly(Return(0)); |
- EXPECT_CALL(source, OnMoreData(NotNull(), 0, 0)) |
+ EXPECT_CALL(source, OnMoreData(base::TimeDelta(), _, 0, NotNull())) |
.Times(AnyNumber()) |
.WillRepeatedly(Return(0)); |
@@ -526,7 +532,7 @@ TEST_F(WinAudioTest, PCMWaveStreamPendingBytes) { |
class SyncSocketSource : public AudioOutputStream::AudioSourceCallback { |
public: |
SyncSocketSource(base::SyncSocket* socket, const AudioParameters& params) |
- : socket_(socket) { |
+ : socket_(socket), params_(params) { |
// Setup AudioBus wrapping data we'll receive over the sync socket. |
data_size_ = AudioBus::CalculateMemorySize(params); |
data_.reset(static_cast<float*>( |
@@ -536,13 +542,16 @@ class SyncSocketSource : public AudioOutputStream::AudioSourceCallback { |
~SyncSocketSource() override {} |
// AudioSourceCallback::OnMoreData implementation: |
- int OnMoreData(AudioBus* audio_bus, |
- uint32_t total_bytes_delay, |
- uint32_t frames_skipped) override { |
+ int OnMoreData(base::TimeDelta delay, |
+ base::TimeTicks /* delay_timestamp */, |
+ int /* prior_frames_skipped */, |
+ AudioBus* dest) override { |
+ uint32_t total_bytes_delay = |
+ delay.InSecondsF() * params_.GetBytesPerSecond(); |
socket_->Send(&total_bytes_delay, sizeof(total_bytes_delay)); |
uint32_t size = socket_->Receive(data_.get(), data_size_); |
DCHECK_EQ(static_cast<size_t>(size) % sizeof(*audio_bus_->channel(0)), 0U); |
- audio_bus_->CopyTo(audio_bus); |
+ audio_bus_->CopyTo(dest); |
return audio_bus_->frames(); |
} |
@@ -551,6 +560,7 @@ class SyncSocketSource : public AudioOutputStream::AudioSourceCallback { |
private: |
base::SyncSocket* socket_; |
+ const AudioParameters params_; |
int data_size_; |
std::unique_ptr<float, base::AlignedFreeDeleter> data_; |
std::unique_ptr<AudioBus> audio_bus_; |
@@ -563,6 +573,7 @@ struct SyncThreadContext { |
int frames; |
double sine_freq; |
uint32_t packet_size_bytes; |
+ int bytes_per_second; |
}; |
// This thread provides the data that the SyncSocketSource above needs |
@@ -589,7 +600,9 @@ DWORD __stdcall SyncSocketThread(void* context) { |
if (ctx.socket->Receive(&total_bytes_delay, sizeof(total_bytes_delay)) == 0) |
break; |
if ((times > 0) && (total_bytes_delay < 1000)) __debugbreak(); |
- sine.OnMoreData(audio_bus.get(), total_bytes_delay, 0); |
+ base::TimeDelta delay = base::TimeDelta::FromSecondsD( |
+ static_cast<double>(total_bytes_delay) / ctx.bytes_per_second); |
+ sine.OnMoreData(delay, base::TimeTicks::Now(), 0, audio_bus.get()); |
ctx.socket->Send(data.get(), ctx.packet_size_bytes); |
++times; |
} |
@@ -631,6 +644,7 @@ TEST_F(WinAudioTest, SyncSocketBasic) { |
thread_context.frames = params.frames_per_buffer(); |
thread_context.channels = params.channels(); |
thread_context.socket = &sockets[1]; |
+ thread_context.bytes_per_second = params.GetBytesPerSecond(); |
HANDLE thread = ::CreateThread(NULL, 0, SyncSocketThread, |
&thread_context, 0, NULL); |