| Index: media/audio/win/waveout_output_win.cc | 
| diff --git a/media/audio/win/waveout_output_win.cc b/media/audio/win/waveout_output_win.cc | 
| index 2c3d5c4e1660854c3b1a22d505437b9a1fa806f7..9c996340d1956914f6e4c5879f579bf817060ee2 100644 | 
| --- a/media/audio/win/waveout_output_win.cc | 
| +++ b/media/audio/win/waveout_output_win.cc | 
| @@ -87,10 +87,11 @@ PCMWaveOutAudioOutputStream::PCMWaveOutAudioOutputStream( | 
| callback_(NULL), | 
| num_buffers_(num_buffers), | 
| buffer_(NULL), | 
| -      buffer_size_(0), | 
| +      buffer_size_(params.GetPacketSize()), | 
| volume_(1), | 
| channels_(params.channels), | 
| pending_bytes_(0) { | 
| + | 
| format_.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; | 
| format_.Format.nChannels = params.channels; | 
| format_.Format.nSamplesPerSec = params.sample_rate; | 
| @@ -116,11 +117,9 @@ PCMWaveOutAudioOutputStream::~PCMWaveOutAudioOutputStream() { | 
| DCHECK(NULL == waveout_); | 
| } | 
|  | 
| -bool PCMWaveOutAudioOutputStream::Open(uint32 buffer_size) { | 
| +bool PCMWaveOutAudioOutputStream::Open() { | 
| if (state_ != PCMA_BRAND_NEW) | 
| return false; | 
| -  if (buffer_size > kMaxOpenBufferSize) | 
| -    return false; | 
| if (num_buffers_ < 2 || num_buffers_ > 5) | 
| return false; | 
| // Open the device. We'll be getting callback in WaveCallback function. | 
| @@ -132,24 +131,20 @@ bool PCMWaveOutAudioOutputStream::Open(uint32 buffer_size) { | 
| CALLBACK_FUNCTION); | 
| if (result != MMSYSERR_NOERROR) | 
| return false; | 
| -  // If we don't have a packet size we use 100ms. | 
| -  if (!buffer_size) | 
| -    buffer_size = format_.Format.nAvgBytesPerSec / 10; | 
|  | 
| -  SetupBuffers(buffer_size); | 
| -  buffer_size_ = buffer_size; | 
| +  SetupBuffers(); | 
| state_ = PCMA_READY; | 
| return true; | 
| } | 
|  | 
| -void PCMWaveOutAudioOutputStream::SetupBuffers(uint32 rq_size) { | 
| +void PCMWaveOutAudioOutputStream::SetupBuffers() { | 
| WAVEHDR* last = NULL; | 
| WAVEHDR* first = NULL; | 
| for (int ix = 0; ix != num_buffers_; ++ix) { | 
| -    uint32 sz = sizeof(WAVEHDR) + rq_size; | 
| +    uint32 sz = sizeof(WAVEHDR) + buffer_size_; | 
| buffer_ =  reinterpret_cast<WAVEHDR*>(new char[sz]); | 
| buffer_->lpData = reinterpret_cast<char*>(buffer_) + sizeof(WAVEHDR); | 
| -    buffer_->dwBufferLength = rq_size; | 
| +    buffer_->dwBufferLength = buffer_size_; | 
| buffer_->dwBytesRecorded = 0; | 
| buffer_->dwUser = reinterpret_cast<DWORD_PTR>(last); | 
| buffer_->dwFlags = WHDR_DONE; | 
| @@ -235,6 +230,10 @@ void PCMWaveOutAudioOutputStream::Stop() { | 
| HandleError(res); | 
| return; | 
| } | 
| + | 
| +  // Don't use callback after Stop(). | 
| +  callback_ = NULL; | 
| + | 
| state_ = PCMA_READY; | 
| } | 
|  | 
| @@ -347,10 +346,5 @@ void PCMWaveOutAudioOutputStream::WaveCallback(HWAVEOUT hwo, UINT msg, | 
|  | 
| obj->pending_bytes_ += buffer->dwBufferLength; | 
|  | 
| -  } else if (msg == WOM_CLOSE) { | 
| -    // We can be closed before calling Start, so it is possible to have a | 
| -    // null callback at this point. | 
| -    if (obj->callback_) | 
| -      obj->callback_->OnClose(obj); | 
| } | 
| } | 
|  |