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 8a131ac5afa972b947fad4e442bad8a39f53dee9..23c85e5918c6ae5737de1738078d49d3cf63229a 100644 |
--- a/media/audio/win/audio_output_win_unittest.cc |
+++ b/media/audio/win/audio_output_win_unittest.cc |
@@ -532,26 +532,34 @@ class SyncSocketSource : public AudioOutputStream::AudioSourceCallback { |
SyncSocketSource(base::SyncSocket* socket, const AudioParameters& params) |
: socket_(socket), params_(params) { |
// Setup AudioBus wrapping data we'll receive over the sync socket. |
- data_size_ = AudioBus::CalculateMemorySize(params); |
+ packet_size_ = AudioBus::CalculateMemorySize(params); |
data_.reset(static_cast<float*>( |
- base::AlignedAlloc(data_size_, AudioBus::kChannelAlignment))); |
- audio_bus_ = AudioBus::WrapMemory(params, data_.get()); |
+ base::AlignedAlloc(packet_size_ + sizeof(AudioOutputBufferParameters), |
+ AudioBus::kChannelAlignment))); |
+ audio_bus_ = AudioBus::WrapMemory(params, output_buffer()->audio); |
} |
~SyncSocketSource() override {} |
// AudioSourceCallback::OnMoreData implementation: |
int OnMoreData(base::TimeDelta delay, |
- base::TimeTicks /* delay_timestamp */, |
+ 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_); |
+ uint32_t control_signal = 0; |
+ socket_->Send(&control_signal, sizeof(control_signal)); |
+ output_buffer()->params.delay = delay.InMicroseconds(); |
+ output_buffer()->params.delay_timestamp = |
+ (delay_timestamp - base::TimeTicks()).InMicroseconds(); |
+ uint32_t size = socket_->Receive(data_.get(), packet_size_); |
+ |
DCHECK_EQ(static_cast<size_t>(size) % sizeof(*audio_bus_->channel(0)), 0U); |
audio_bus_->CopyTo(dest); |
return audio_bus_->frames(); |
} |
+ int packet_size() const { return packet_size_; } |
+ AudioOutputBuffer* output_buffer() const { |
+ return reinterpret_cast<AudioOutputBuffer*>(data_.get()); |
+ } |
// AudioSourceCallback::OnError implementation: |
void OnError(AudioOutputStream* stream) override {} |
@@ -559,7 +567,7 @@ class SyncSocketSource : public AudioOutputStream::AudioSourceCallback { |
private: |
base::SyncSocket* socket_; |
const AudioParameters params_; |
- int data_size_; |
+ int packet_size_; |
std::unique_ptr<float, base::AlignedFreeDeleter> data_; |
std::unique_ptr<AudioBus> audio_bus_; |
}; |
@@ -571,7 +579,7 @@ struct SyncThreadContext { |
int frames; |
double sine_freq; |
uint32_t packet_size_bytes; |
- int bytes_per_second; |
+ AudioOutputBuffer* buffer; |
}; |
// This thread provides the data that the SyncSocketSource above needs |
@@ -592,17 +600,17 @@ DWORD __stdcall SyncSocketThread(void* context) { |
SineWaveAudioSource sine(1, ctx.sine_freq, ctx.sample_rate); |
const int kTwoSecFrames = ctx.sample_rate * 2; |
- uint32_t total_bytes_delay = 0; |
- int times = 0; |
+ uint32_t control_signal = 0; |
for (int ix = 0; ix < kTwoSecFrames; ix += ctx.frames) { |
- if (ctx.socket->Receive(&total_bytes_delay, sizeof(total_bytes_delay)) == 0) |
+ if (ctx.socket->Receive(&control_signal, sizeof(control_signal)) == 0) |
break; |
- if ((times > 0) && (total_bytes_delay < 1000)) __debugbreak(); |
- 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()); |
+ base::TimeDelta delay = |
+ base::TimeDelta::FromMicroseconds(ctx.buffer->params.delay); |
+ base::TimeTicks delay_timestamp = |
+ base::TimeTicks() + |
+ base::TimeDelta::FromMicroseconds(ctx.buffer->params.delay_timestamp); |
+ sine.OnMoreData(delay, delay_timestamp, 0, audio_bus.get()); |
ctx.socket->Send(data.get(), ctx.packet_size_bytes); |
- ++times; |
} |
return 0; |
@@ -638,11 +646,11 @@ TEST_F(WinAudioTest, SyncSocketBasic) { |
SyncThreadContext thread_context; |
thread_context.sample_rate = params.sample_rate(); |
thread_context.sine_freq = 200.0; |
- thread_context.packet_size_bytes = AudioBus::CalculateMemorySize(params); |
+ thread_context.packet_size_bytes = source.packet_size(); |
thread_context.frames = params.frames_per_buffer(); |
thread_context.channels = params.channels(); |
thread_context.socket = &sockets[1]; |
- thread_context.bytes_per_second = params.GetBytesPerSecond(); |
+ thread_context.buffer = source.output_buffer(); |
HANDLE thread = ::CreateThread(NULL, 0, SyncSocketThread, |
&thread_context, 0, NULL); |