| Index: media/audio/audio_output_device.cc
|
| diff --git a/media/audio/audio_output_device.cc b/media/audio/audio_output_device.cc
|
| index e618b3b5242f41ee4838137099788cf36ec1ad4c..e5e3513a413645ab5eee6fa6c446ae3a6eaeddf1 100644
|
| --- a/media/audio/audio_output_device.cc
|
| +++ b/media/audio/audio_output_device.cc
|
| @@ -46,6 +46,7 @@ class AudioOutputDevice::AudioThreadCallback
|
| bool CurrentThreadIsAudioDeviceThread();
|
|
|
| private:
|
| + const int bytes_per_frame_;
|
| AudioRendererSink::RenderCallback* render_callback_;
|
| std::unique_ptr<AudioBus> output_bus_;
|
| uint64_t callback_num_;
|
| @@ -95,11 +96,7 @@ void AudioOutputDevice::Initialize(const AudioParameters& params,
|
| callback_ = callback;
|
| }
|
|
|
| -AudioOutputDevice::~AudioOutputDevice() {
|
| - // The current design requires that the user calls Stop() before deleting
|
| - // this class.
|
| - DCHECK(audio_thread_.IsStopped());
|
| -}
|
| +AudioOutputDevice::~AudioOutputDevice() {}
|
|
|
| void AudioOutputDevice::RequestDeviceAuthorization() {
|
| task_runner()->PostTask(
|
| @@ -118,7 +115,7 @@ void AudioOutputDevice::Start() {
|
| void AudioOutputDevice::Stop() {
|
| {
|
| base::AutoLock auto_lock(audio_thread_lock_);
|
| - audio_thread_.Stop(base::MessageLoop::current());
|
| + audio_thread_.reset();
|
| stopping_hack_ = true;
|
| }
|
|
|
| @@ -267,7 +264,7 @@ void AudioOutputDevice::ShutDownOnIOThread() {
|
| // and can't rely on the main thread existing either.
|
| base::AutoLock auto_lock_(audio_thread_lock_);
|
| base::ThreadRestrictions::ScopedAllowIO allow_io;
|
| - audio_thread_.Stop(NULL);
|
| + audio_thread_.reset();
|
| audio_callback_.reset();
|
| stopping_hack_ = false;
|
| }
|
| @@ -299,8 +296,11 @@ void AudioOutputDevice::OnStateChanged(AudioOutputIPCDelegateState state) {
|
| // TODO(tommi): Add an explicit contract for clearing the callback
|
| // object. Possibly require calling Initialize again or provide
|
| // a callback object via Start() and clear it in Stop().
|
| - if (!audio_thread_.IsStopped())
|
| - callback_->OnRenderError();
|
| + {
|
| + base::AutoLock auto_lock_(audio_thread_lock_);
|
| + if (audio_thread_)
|
| + callback_->OnRenderError();
|
| + }
|
| break;
|
| default:
|
| NOTREACHED();
|
| @@ -400,11 +400,13 @@ void AudioOutputDevice::OnStreamCreated(
|
| if (stopping_hack_)
|
| return;
|
|
|
| - DCHECK(audio_thread_.IsStopped());
|
| + DCHECK(!audio_thread_);
|
| + DCHECK(!audio_callback_);
|
| +
|
| audio_callback_.reset(new AudioOutputDevice::AudioThreadCallback(
|
| audio_parameters_, handle, length, callback_));
|
| - audio_thread_.Start(audio_callback_.get(), socket_handle,
|
| - "AudioOutputDevice", true);
|
| + audio_thread_.reset(new AudioDeviceThread(
|
| + audio_callback_.get(), socket_handle, "AudioOutputDevice"));
|
| state_ = PAUSED;
|
|
|
| // We handle the case where Play() and/or Pause() may have been called
|
| @@ -436,6 +438,7 @@ AudioOutputDevice::AudioThreadCallback::AudioThreadCallback(
|
| int memory_length,
|
| AudioRendererSink::RenderCallback* render_callback)
|
| : AudioDeviceThread::Callback(audio_parameters, memory, memory_length, 1),
|
| + bytes_per_frame_(audio_parameters.GetBytesPerFrame()),
|
| render_callback_(render_callback),
|
| callback_num_(0) {}
|
|
|
|
|