| Index: chrome/browser/renderer_host/audio_renderer_host.cc | 
| diff --git a/chrome/browser/renderer_host/audio_renderer_host.cc b/chrome/browser/renderer_host/audio_renderer_host.cc | 
| index 4c833847dda1611c596e7e6756060e7ba5b864d7..5bfc77ea94310fcf7d96770870d1942731b53e11 100644 | 
| --- a/chrome/browser/renderer_host/audio_renderer_host.cc | 
| +++ b/chrome/browser/renderer_host/audio_renderer_host.cc | 
| @@ -55,7 +55,7 @@ static size_t GetMaxAudioStreamsAllowed() { | 
| return kMaxStreams; | 
| } | 
|  | 
| -static uint32 SelectHardwarePacketSize(AudioParameters params) { | 
| +static uint32 SelectSamplesPerPacket(AudioParameters params) { | 
| // Select the number of samples that can provide at least | 
| // |kMillisecondsPerHardwarePacket| worth of audio data. | 
| int samples = kMinSamplesPerHardwarePacket; | 
| @@ -64,7 +64,7 @@ static uint32 SelectHardwarePacketSize(AudioParameters params) { | 
| params.sample_rate * kMillisecondsPerHardwarePacket) { | 
| samples *= 2; | 
| } | 
| -  return params.channels * samples * params.bits_per_sample / 8; | 
| +  return samples; | 
| } | 
|  | 
| AudioRendererHost::AudioEntry::AudioEntry() | 
| @@ -347,15 +347,17 @@ void AudioRendererHost::OnCreateStream( | 
| return; | 
| } | 
|  | 
| -  // Select the hardwaer packet size if not specified. | 
| -  uint32 hardware_packet_size = params.packet_size; | 
| -  if (!hardware_packet_size) { | 
| -    hardware_packet_size = SelectHardwarePacketSize(params.params); | 
| +  AudioParameters audio_params(params.params); | 
| + | 
| +  // Select the hardware packet size if not specified. | 
| +  if (!audio_params.samples_per_packet) { | 
| +    audio_params.samples_per_packet = SelectSamplesPerPacket(audio_params); | 
| } | 
| +  uint32 packet_size = audio_params.GetPacketSize(); | 
|  | 
| scoped_ptr<AudioEntry> entry(new AudioEntry()); | 
| // Create the shared memory and share with the renderer process. | 
| -  if (!entry->shared_memory.CreateAndMapAnonymous(hardware_packet_size)) { | 
| +  if (!entry->shared_memory.CreateAndMapAnonymous(packet_size)) { | 
| // If creation of shared memory failed then send an error message. | 
| SendErrorMessage(msg.routing_id(), stream_id); | 
| return; | 
| @@ -376,16 +378,13 @@ void AudioRendererHost::OnCreateStream( | 
| // entry and construct an AudioOutputController. | 
| entry->reader.reset(reader.release()); | 
| entry->controller = | 
| -        media::AudioOutputController::CreateLowLatency( | 
| -            this, params.params, | 
| -            hardware_packet_size, | 
| -            entry->reader.get()); | 
| +        media::AudioOutputController::CreateLowLatency(this, audio_params, | 
| +                                                       entry->reader.get()); | 
| } else { | 
| // The choice of buffer capacity is based on experiment. | 
| entry->controller = | 
| -        media::AudioOutputController::Create(this, params.params, | 
| -                                             hardware_packet_size, | 
| -                                             3 * hardware_packet_size); | 
| +        media::AudioOutputController::Create(this, audio_params, | 
| +                                             3 * packet_size); | 
| } | 
|  | 
| if (!entry->controller) { | 
|  |