| 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..118153604a9158706f26d764b7d93c3abbdbd046 100644
|
| --- a/media/audio/win/waveout_output_win.cc
|
| +++ b/media/audio/win/waveout_output_win.cc
|
| @@ -87,10 +87,12 @@ PCMWaveOutAudioOutputStream::PCMWaveOutAudioOutputStream(
|
| callback_(NULL),
|
| num_buffers_(num_buffers),
|
| buffer_(NULL),
|
| - buffer_size_(0),
|
| + buffer_size_(params.samples_per_packet * params.channels *
|
| + params.bits_per_sample / 8),
|
| 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 +118,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 +132,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 +231,10 @@ void PCMWaveOutAudioOutputStream::Stop() {
|
| HandleError(res);
|
| return;
|
| }
|
| +
|
| + // Don't use callback after Stop().
|
| + callback_ = NULL;
|
| +
|
| state_ = PCMA_READY;
|
| }
|
|
|
| @@ -347,10 +347,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);
|
| }
|
| }
|
|
|