Chromium Code Reviews| Index: media/audio/mac/audio_auhal_mac.cc |
| diff --git a/media/audio/mac/audio_auhal_mac.cc b/media/audio/mac/audio_auhal_mac.cc |
| index 39c4610495392cac6faa92da8ffb1e55c6b05656..1b73b9e1cf4792e5ddc2f1c99e01ffe9431da39b 100644 |
| --- a/media/audio/mac/audio_auhal_mac.cc |
| +++ b/media/audio/mac/audio_auhal_mac.cc |
| @@ -53,6 +53,7 @@ AUHALStream::AUHALStream(AudioManagerMac* manager, |
| hardware_latency_frames_(0), |
| stopped_(true), |
| current_hardware_pending_bytes_(0), |
| + current_lost_frames_(0), |
| last_sample_time_(0.0), |
| last_number_of_frames_(0), |
| total_lost_frames_(0), |
| @@ -204,7 +205,16 @@ OSStatus AUHALStream::Render( |
| AudioBufferList* data) { |
| TRACE_EVENT0("audio", "AUHALStream::Render"); |
| - UpdatePlayoutTimestamp(output_time_stamp); |
| + UpdatePlayoutTimestampAndStats(output_time_stamp); |
| + |
| + // Inform the source about any skipped (lost) frames. If we use a fifo this |
| + // will be out of sync with the fifo pulls (different buffer sizes), so we do |
| + // it here and not in ProvideInput(). |
| + if (lost_frames > 0) { |
| + base::AutoLock auto_lock(source_lock_); |
| + if (source_) |
| + source_->OnSkippedData(lost_frames); |
| + } |
| // If the stream parameters change for any reason, we need to insert a FIFO |
| // since the OnMoreData() pipeline can't handle frame size changes. |
| @@ -248,11 +258,11 @@ void AUHALStream::ProvideInput(int frame_delay, AudioBus* dest) { |
| } |
| // Supply the input data and render the output data. |
| - source_->OnMoreData( |
| - dest, |
| - current_hardware_pending_bytes_ + |
| - frame_delay * params_.GetBytesPerFrame()); |
| + source_->OnMoreData(dest, current_hardware_pending_bytes_ + |
| + frame_delay * params_.GetBytesPerFrame(), |
| + current_lost_frames_); |
| dest->Scale(volume_); |
| + current_lost_frames_ = 0; |
| } |
| // AUHAL callback. |
| @@ -346,7 +356,8 @@ double AUHALStream::GetPlayoutLatency( |
| return (delay_frames + hardware_latency_frames_); |
| } |
| -void AUHALStream::UpdatePlayoutTimestamp(const AudioTimeStamp* timestamp) { |
| +void AUHALStream::UpdatePlayoutTimestampAndStats( |
|
tommi (sloooow) - chröme
2015/12/08 08:34:51
nit: I'd just keep the name as it was. "AndStats"
Henrik Grunell
2015/12/08 09:30:34
Yeah, it's not entirely correctly named either. Ch
|
| + const AudioTimeStamp* timestamp) { |
| if ((timestamp->mFlags & kAudioTimeStampSampleTimeValid) == 0) |
| return; |
| @@ -358,8 +369,9 @@ void AUHALStream::UpdatePlayoutTimestamp(const AudioTimeStamp* timestamp) { |
| DCHECK_GT(diff, last_number_of_frames_); |
| // We're being asked to render samples post what we expected. Update the |
| // glitch count etc and keep a record of the largest glitch. |
| - auto lost_frames = diff - last_number_of_frames_; |
| + UInt32 lost_frames = diff - last_number_of_frames_; |
| total_lost_frames_ += lost_frames; |
| + current_lost_frames_ += lost_frames; |
| if (lost_frames > largest_glitch_frames_) |
| largest_glitch_frames_ = lost_frames; |
| ++glitches_detected_; |