| Index: media/audio/audio_input_device.cc
|
| diff --git a/media/audio/audio_input_device.cc b/media/audio/audio_input_device.cc
|
| index fc6b39285ad363aeb2e7591eacfcd77b8d97bfbb..cee639bb68073055d8dab39ff8306086e9c2cfbb 100644
|
| --- a/media/audio/audio_input_device.cc
|
| +++ b/media/audio/audio_input_device.cc
|
| @@ -44,6 +44,7 @@ class AudioInputDevice::AudioThreadCallback
|
| void Process(uint32_t pending_data) override;
|
|
|
| private:
|
| + const double bytes_per_ms_;
|
| int current_segment_id_;
|
| uint32_t last_buffer_id_;
|
| ScopedVector<media::AudioBus> audio_buses_;
|
| @@ -94,7 +95,7 @@ void AudioInputDevice::Stop() {
|
|
|
| {
|
| base::AutoLock auto_lock(audio_thread_lock_);
|
| - audio_thread_.Stop(base::MessageLoop::current());
|
| + audio_thread_.reset();
|
| stopping_hack_ = true;
|
| }
|
|
|
| @@ -143,11 +144,12 @@ void AudioInputDevice::OnStreamCreated(
|
| if (stopping_hack_)
|
| return;
|
|
|
| - DCHECK(audio_thread_.IsStopped());
|
| + DCHECK(!audio_callback_);
|
| + DCHECK(!audio_thread_);
|
| audio_callback_.reset(new AudioInputDevice::AudioThreadCallback(
|
| audio_parameters_, handle, length, total_segments, callback_));
|
| - audio_thread_.Start(
|
| - audio_callback_.get(), socket_handle, "AudioInputDevice", true);
|
| + audio_thread_.reset(new AudioDeviceThread(audio_callback_.get(),
|
| + socket_handle, "AudioInputDevice"));
|
|
|
| state_ = RECORDING;
|
| ipc_->RecordStream();
|
| @@ -182,9 +184,13 @@ void AudioInputDevice::OnStateChanged(
|
| // 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_->OnCaptureError(
|
| - "AudioInputDevice::OnStateChanged - audio thread still running");
|
| + {
|
| + base::AutoLock auto_lock_(audio_thread_lock_);
|
| + if (audio_thread_) {
|
| + callback_->OnCaptureError(
|
| + "AudioInputDevice::OnStateChanged - audio thread still running");
|
| + }
|
| + }
|
| break;
|
| default:
|
| NOTREACHED();
|
| @@ -198,11 +204,7 @@ void AudioInputDevice::OnIPCClosed() {
|
| ipc_.reset();
|
| }
|
|
|
| -AudioInputDevice::~AudioInputDevice() {
|
| - // TODO(henrika): The current design requires that the user calls
|
| - // Stop before deleting this class.
|
| - DCHECK(audio_thread_.IsStopped());
|
| -}
|
| +AudioInputDevice::~AudioInputDevice() {}
|
|
|
| void AudioInputDevice::StartUpOnIOThread() {
|
| DCHECK(task_runner()->BelongsToCurrentThread());
|
| @@ -241,7 +243,7 @@ void AudioInputDevice::ShutDownOnIOThread() {
|
| // and can't not 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;
|
| }
|
| @@ -277,12 +279,15 @@ AudioInputDevice::AudioThreadCallback::AudioThreadCallback(
|
| int memory_length,
|
| int total_segments,
|
| CaptureCallback* capture_callback)
|
| - : AudioDeviceThread::Callback(audio_parameters, memory, memory_length,
|
| + : AudioDeviceThread::Callback(audio_parameters,
|
| + memory,
|
| + memory_length,
|
| total_segments),
|
| + bytes_per_ms_(static_cast<double>(audio_parameters.GetBytesPerSecond()) /
|
| + base::Time::kMillisecondsPerSecond),
|
| current_segment_id_(0),
|
| last_buffer_id_(UINT32_MAX),
|
| - capture_callback_(capture_callback) {
|
| -}
|
| + capture_callback_(capture_callback) {}
|
|
|
| AudioInputDevice::AudioThreadCallback::~AudioThreadCallback() {
|
| }
|
|
|