Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: media/audio/audio_output_device.cc

Issue 12102004: Renderer side audio device change wip... Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/audio/audio_output_controller.cc ('k') | media/audio/audio_output_ipc.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/audio_output_device.h" 5 #include "media/audio/audio_output_device.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/threading/thread_restrictions.h" 9 #include "base/threading/thread_restrictions.h"
10 #include "base/time.h" 10 #include "base/time.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 RenderCallback* callback) { 66 RenderCallback* callback) {
67 DCHECK_GE(input_channels, 0); 67 DCHECK_GE(input_channels, 0);
68 DCHECK_LT(input_channels, limits::kMaxChannels); 68 DCHECK_LT(input_channels, limits::kMaxChannels);
69 input_channels_ = input_channels; 69 input_channels_ = input_channels;
70 Initialize(params, callback); 70 Initialize(params, callback);
71 } 71 }
72 72
73 AudioOutputDevice::~AudioOutputDevice() { 73 AudioOutputDevice::~AudioOutputDevice() {
74 // The current design requires that the user calls Stop() before deleting 74 // The current design requires that the user calls Stop() before deleting
75 // this class. 75 // this class.
76 LOG(ERROR) << "AudioOutputDevice::~@" << this;
76 DCHECK(audio_thread_.IsStopped()); 77 DCHECK(audio_thread_.IsStopped());
77 78
78 if (ipc_) 79 if (ipc_)
79 ipc_->RemoveDelegate(stream_id_); 80 ipc_->RemoveDelegate(stream_id_);
80 } 81 }
81 82
82 void AudioOutputDevice::Start() { 83 void AudioOutputDevice::Start() {
83 DCHECK(callback_) << "Initialize hasn't been called"; 84 DCHECK(callback_) << "Initialize hasn't been called";
84 message_loop()->PostTask(FROM_HERE, 85 message_loop()->PostTask(FROM_HERE,
85 base::Bind(&AudioOutputDevice::CreateStreamOnIOThread, this, 86 base::Bind(&AudioOutputDevice::CreateStreamOnIOThread, this,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 180
180 void AudioOutputDevice::SetVolumeOnIOThread(double volume) { 181 void AudioOutputDevice::SetVolumeOnIOThread(double volume) {
181 DCHECK(message_loop()->BelongsToCurrentThread()); 182 DCHECK(message_loop()->BelongsToCurrentThread());
182 if (state_ >= CREATING_STREAM) 183 if (state_ >= CREATING_STREAM)
183 ipc_->SetVolume(stream_id_, volume); 184 ipc_->SetVolume(stream_id_, volume);
184 } 185 }
185 186
186 void AudioOutputDevice::OnStateChanged(AudioOutputIPCDelegate::State state) { 187 void AudioOutputDevice::OnStateChanged(AudioOutputIPCDelegate::State state) {
187 DCHECK(message_loop()->BelongsToCurrentThread()); 188 DCHECK(message_loop()->BelongsToCurrentThread());
188 189
189 // Do nothing if the stream has been closed. 190 // Do nothing if the stream has been closed. Don't dereference the callback
190 if (state_ < CREATING_STREAM) 191 // object if the audio thread is stopped or stopping. That could mean that
192 // the callback object has been deleted.
193 // TODO(tommi): Add an explicit contract for clearing the callback object.
194 // Possibly require calling Initialize again or provide a callback object via
195 // Start() and clear it in Stop().
196 if (state_ < CREATING_STREAM || audio_thread_.IsStopped())
191 return; 197 return;
192 198
193 if (state == AudioOutputIPCDelegate::kError) { 199 if (state == AudioOutputIPCDelegate::kError) {
194 DLOG(WARNING) << "AudioOutputDevice::OnStateChanged(kError)"; 200 DLOG(WARNING) << "AudioOutputDevice::OnStateChanged(kError)";
195 // Don't dereference the callback object if the audio thread 201 // Don't dereference the callback object if the audio thread
196 // is stopped or stopping. That could mean that the callback 202 // is stopped or stopping. That could mean that the callback
197 // object has been deleted. 203 // object has been deleted.
198 // TODO(tommi): Add an explicit contract for clearing the callback 204 // TODO(tommi): Add an explicit contract for clearing the callback
199 // object. Possibly require calling Initialize again or provide 205 // object. Possibly require calling Initialize again or provide
200 // a callback object via Start() and clear it in Stop(). 206 // a callback object via Start() and clear it in Stop().
201 if (!audio_thread_.IsStopped()) 207 // if (!audio_thread_.IsStopped())
202 callback_->OnRenderError(); 208 // callback_->OnRenderError();
209 } else if (state == AudioOutputIPCDelegate::kDeviceChange) {
210 LOG(ERROR) << "AudioOutputDevice::kDeviceChange@" << this;
211 callback_->OnDeviceChange();
203 } 212 }
204 } 213 }
205 214
206 void AudioOutputDevice::OnStreamCreated( 215 void AudioOutputDevice::OnStreamCreated(
207 base::SharedMemoryHandle handle, 216 base::SharedMemoryHandle handle,
208 base::SyncSocket::Handle socket_handle, 217 base::SyncSocket::Handle socket_handle,
209 int length) { 218 int length) {
210 DCHECK(message_loop()->BelongsToCurrentThread()); 219 DCHECK(message_loop()->BelongsToCurrentThread());
211 #if defined(OS_WIN) 220 #if defined(OS_WIN)
212 DCHECK(handle); 221 DCHECK(handle);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 // TODO(dalecurtis): Technically this is not always correct. Due to channel 343 // TODO(dalecurtis): Technically this is not always correct. Due to channel
335 // padding for alignment, there may be more data available than this. We're 344 // padding for alignment, there may be more data available than this. We're
336 // relying on AudioSyncReader::Read() to parse this with that in mind. Rename 345 // relying on AudioSyncReader::Read() to parse this with that in mind. Rename
337 // these methods to Set/GetActualFrameCount(). 346 // these methods to Set/GetActualFrameCount().
338 SetActualDataSizeInBytes( 347 SetActualDataSizeInBytes(
339 &shared_memory_, memory_length_, 348 &shared_memory_, memory_length_,
340 num_frames * sizeof(*output_bus_->channel(0)) * output_bus_->channels()); 349 num_frames * sizeof(*output_bus_->channel(0)) * output_bus_->channels());
341 } 350 }
342 351
343 } // namespace media. 352 } // namespace media.
OLDNEW
« no previous file with comments | « media/audio/audio_output_controller.cc ('k') | media/audio/audio_output_ipc.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698