Chromium Code Reviews| Index: media/audio/audio_output_device.cc |
| diff --git a/media/audio/audio_output_device.cc b/media/audio/audio_output_device.cc |
| index 9924f76b83e5e4e435a6f0a5598a22a68acad809..cdc9334180ed14f81abbce7f37fe51e5c3652566 100644 |
| --- a/media/audio/audio_output_device.cc |
| +++ b/media/audio/audio_output_device.cc |
| @@ -28,12 +28,19 @@ class AudioOutputDevice::AudioThreadCallback |
| void MapSharedMemory() override; |
| // Called whenever we receive notifications about pending data. |
| - void Process(uint32 pending_data) override; |
| + void Process(uint32_t pending_data) override; |
| + |
| + void FramesSkipped(uint32_t frames_skipped) override; |
| private: |
| AudioRendererSink::RenderCallback* render_callback_; |
| scoped_ptr<AudioBus> output_bus_; |
| uint64 callback_num_; |
| + |
| + // Stores the number of frames skipped by the consumer. Used and cleared in |
| + // Process(). |
|
tommi (sloooow) - chröme
2015/12/01 13:34:26
nit: and modified in FramesSkipped
Henrik Grunell
2015/12/03 17:01:07
Done.
|
| + uint32_t frames_skipped_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(AudioThreadCallback); |
| }; |
| @@ -354,7 +361,7 @@ void AudioOutputDevice::OnStreamCreated( |
| audio_callback_.reset(new AudioOutputDevice::AudioThreadCallback( |
| audio_parameters_, handle, length, callback_)); |
| audio_thread_.Start(audio_callback_.get(), socket_handle, |
| - "AudioOutputDevice", true); |
| + "AudioOutputDevice", true, false); |
| state_ = PAUSED; |
| // We handle the case where Play() and/or Pause() may have been called |
| @@ -387,7 +394,8 @@ AudioOutputDevice::AudioThreadCallback::AudioThreadCallback( |
| AudioRendererSink::RenderCallback* render_callback) |
| : AudioDeviceThread::Callback(audio_parameters, memory, memory_length, 1), |
| render_callback_(render_callback), |
| - callback_num_(0) {} |
| + callback_num_(0), |
| + frames_skipped_(0) {} |
| AudioOutputDevice::AudioThreadCallback::~AudioThreadCallback() { |
| } |
| @@ -402,7 +410,7 @@ void AudioOutputDevice::AudioThreadCallback::MapSharedMemory() { |
| } |
| // Called whenever we receive notifications about pending data. |
| -void AudioOutputDevice::AudioThreadCallback::Process(uint32 pending_data) { |
| +void AudioOutputDevice::AudioThreadCallback::Process(uint32_t pending_data) { |
| // Convert the number of pending bytes in the render buffer into milliseconds. |
| int audio_delay_milliseconds = pending_data / bytes_per_ms_; |
| @@ -417,10 +425,21 @@ void AudioOutputDevice::AudioThreadCallback::Process(uint32 pending_data) { |
| TRACE_EVENT_ASYNC_END0("audio", "StartingPlayback", this); |
| } |
| + // Inform about skipped frames if any. |
| + if (frames_skipped_ > 0) { |
| + render_callback_->OnFramesSkipped(frames_skipped_); |
| + frames_skipped_ = 0; |
| + } |
| + |
| // Update the audio-delay measurement then ask client to render audio. Since |
| // |output_bus_| is wrapping the shared memory the Render() call is writing |
| // directly into the shared memory. |
| render_callback_->Render(output_bus_.get(), audio_delay_milliseconds); |
| } |
| +void AudioOutputDevice::AudioThreadCallback::FramesSkipped( |
|
tommi (sloooow) - chröme
2015/12/01 13:34:25
thread check (must be on the same thread as Proces
Henrik Grunell
2015/12/03 17:01:07
The contract with AudioDeviceThread is that all ca
|
| + uint32_t frames_skipped) { |
| + frames_skipped_ += frames_skipped; |
| +} |
| + |
| } // namespace media. |