Chromium Code Reviews| Index: ppapi/shared_impl/ppb_audio_config_shared.cc |
| diff --git a/ppapi/shared_impl/ppb_audio_config_shared.cc b/ppapi/shared_impl/ppb_audio_config_shared.cc |
| index 25f356d67fe58ea28e731e617a013a58bb1cd0c1..3a65ff46fe119d36490ffecf45b98796b07af356 100644 |
| --- a/ppapi/shared_impl/ppb_audio_config_shared.cc |
| +++ b/ppapi/shared_impl/ppb_audio_config_shared.cc |
| @@ -8,6 +8,14 @@ |
| namespace ppapi { |
| +// Rounds up requested_size to the nearest multiple of minimum_size. |
| +static uint32_t CalculateMultipleOfSampleFrameCount(uint32_t minimum_size, |
| + uint32_t requested_size) { |
| + const uint32_t multiple = (requested_size + minimum_size - 1) / minimum_size; |
| + return std::min(minimum_size * multiple, |
| + static_cast<uint32_t>(PP_AUDIOMAXSAMPLEFRAMECOUNT)); |
| +} |
| + |
| PPB_AudioConfig_Shared::PPB_AudioConfig_Shared(ResourceObjectType type, |
| PP_Instance instance) |
| : Resource(type, instance), |
| @@ -62,31 +70,63 @@ uint32_t PPB_AudioConfig_Shared::RecommendSampleFrameCount_1_1( |
| if (sample_frame_count < PP_AUDIOMINSAMPLEFRAMECOUNT) |
| sample_frame_count = PP_AUDIOMINSAMPLEFRAMECOUNT; |
| + // If hardware information isn't available we're connected to a fake audio |
| + // output stream on the browser side, so we can use whatever sample count the |
| + // client wants. |
| + if (!hardware_sample_frame_count || !hardware_sample_rate) |
| + return sample_frame_count; |
| + |
| + // Note: All the values below were determined through experimentation to |
| + // minimize jitter and back-to-back callbacks from the browser. Please take |
| + // care when modifying these values as they impact a large number of users. |
| + // TODO(dalecurtis): Land jitter test and add documentation for updating this. |
| + |
| + // These values have only been tested with 44.1kHz and 48kHz, so ensure a |
| + // runtime error occurs when new sample rates are added. |
| + if (sample_rate != PP_AUDIOSAMPLERATE_44100 && |
| + sample_rate != PP_AUDIOSAMPLERATE_48000) { |
| + NOTREACHED() << "Unsupported sample rate, please update " |
|
Chris Rogers
2013/05/03 19:55:06
I could be wrong, but isn't NOTREACHED() supposed
DaleCurtis
2013/05/03 20:02:08
There's PP_DCHECK() which wraps assert(). If that
DaleCurtis
2013/05/21 23:16:43
Actually cpp/ which defines PP_DCHECK is excluded
|
| + << "RecommendSampleFrameCount_1_1()!"; |
| + return 0; |
| + } |
| + |
| // If client is using same sample rate as audio hardware, then recommend a |
| // multiple of the audio hardware's sample frame count. |
| - if (hardware_sample_rate == sample_rate && hardware_sample_frame_count > 0) { |
| - // Round up input sample_frame_count to nearest multiple. |
| - uint32_t multiple = (sample_frame_count + hardware_sample_frame_count - 1) / |
| - hardware_sample_frame_count; |
| - uint32_t recommendation = hardware_sample_frame_count * multiple; |
| - if (recommendation > PP_AUDIOMAXSAMPLEFRAMECOUNT) |
| - recommendation = PP_AUDIOMAXSAMPLEFRAMECOUNT; |
| - return recommendation; |
| + if (hardware_sample_rate == sample_rate) { |
| + return CalculateMultipleOfSampleFrameCount( |
| + hardware_sample_frame_count, sample_frame_count); |
| } |
| - // Otherwise, recommend a conservative 50ms buffer based on sample rate. |
| - const uint32_t kDefault50msAt44100kHz = 2205; |
| - const uint32_t kDefault50msAt48000kHz = 2400; |
| - switch (sample_rate) { |
| - case PP_AUDIOSAMPLERATE_44100: |
| - return kDefault50msAt44100kHz; |
| - case PP_AUDIOSAMPLERATE_48000: |
| - return kDefault50msAt48000kHz; |
| - case PP_AUDIOSAMPLERATE_NONE: |
| - return 0; |
| + // Should track the value reported by XP and ALSA backends. |
| + const uint32_t kHighLatencySampleFrameCount = 2048; |
| + |
| + // If the hardware requires a high latency buffer or we're at a low sample |
| + // rate w/ a buffer that's too large, choose the nearest multiple of the high |
| + // latency sample frame count. An example of too low and too large is 16kHz |
| + // and a sample frame count greater than 160 frames. |
| + if (hardware_sample_frame_count >= kHighLatencySampleFrameCount || |
| + (hardware_sample_rate < 44100 && |
| + hardware_sample_frame_count > hardware_sample_rate / 100)) { |
| + return CalculateMultipleOfSampleFrameCount( |
| + sample_frame_count, |
| + std::max(kHighLatencySampleFrameCount, hardware_sample_frame_count)); |
| } |
| - // Unable to make a recommendation. |
| - return 0; |
| + |
| + // All low latency clients should be able to handle a 512 frame buffer with |
| + // resampling from 44.1kHz and 48kHz to higher sample rates. |
| + const uint32_t kLowLatencySampleFrameCount = 512; |
|
henrika (OOO until Aug 14)
2013/05/13 08:11:56
Would it be beneficial to do as for WebRTC and alw
DaleCurtis
2013/05/13 21:57:37
We could provide AudioConverter to PPAPI, but that
|
| + |
| + // Special case for 48kHz -> 44.1kHz and buffer sizes too large. Which |
|
henrika (OOO until Aug 14)
2013/05/14 07:29:35
This sentence is a bit vague IMO. Could it be clar
DaleCurtis
2013/05/21 23:16:43
Cleaned up a bit. Linux part is unnecessary.
|
| + // includes all Linux clients at the time of this writing (sizes >= 512). |
| + int min_sample_frame_count = kLowLatencySampleFrameCount; |
| + if (hardware_sample_rate == 44100 && sample_rate == 48000 && |
| + hardware_sample_frame_count > hardware_sample_rate / 100) { |
| + min_sample_frame_count = std::max( |
| + 2 * kLowLatencySampleFrameCount, hardware_sample_frame_count); |
| + } |
| + |
| + return CalculateMultipleOfSampleFrameCount( |
| + min_sample_frame_count, sample_frame_count); |
| } |
| // static |