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

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

Issue 9255017: Add thread safety to AudioManagerBase to protect access to the audio thread member variable. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 11 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_proxy.h" 5 #include "media/audio/audio_output_proxy.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "media/audio/audio_manager.h" 9 #include "media/audio/audio_manager.h"
10 #include "media/audio/audio_output_dispatcher.h" 10 #include "media/audio/audio_output_dispatcher.h"
11 11
12 AudioOutputProxy::AudioOutputProxy(AudioOutputDispatcher* dispatcher) 12 AudioOutputProxy::AudioOutputProxy(AudioOutputDispatcher* dispatcher)
13 : dispatcher_(dispatcher), 13 : dispatcher_(dispatcher),
14 state_(kCreated), 14 state_(kCreated),
15 physical_stream_(NULL), 15 physical_stream_(NULL),
16 volume_(1.0) { 16 volume_(1.0) {
17 DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); 17 DCHECK(dispatcher_->CurrentThreadIsAudioThread());
18 } 18 }
19 19
20 AudioOutputProxy::~AudioOutputProxy() { 20 AudioOutputProxy::~AudioOutputProxy() {
21 DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); 21 DCHECK(dispatcher_->CurrentThreadIsAudioThread());
22 DCHECK(state_ == kCreated || state_ == kClosed); 22 DCHECK(state_ == kCreated || state_ == kClosed);
23 DCHECK(!physical_stream_); 23 DCHECK(!physical_stream_);
24 } 24 }
25 25
26 bool AudioOutputProxy::Open() { 26 bool AudioOutputProxy::Open() {
27 DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); 27 DCHECK(dispatcher_->CurrentThreadIsAudioThread());
28 DCHECK_EQ(state_, kCreated); 28 DCHECK_EQ(state_, kCreated);
29 29
30 if (!dispatcher_->StreamOpened()) { 30 if (!dispatcher_->StreamOpened()) {
31 state_ = kError; 31 state_ = kError;
32 return false; 32 return false;
33 } 33 }
34 34
35 state_ = kOpened; 35 state_ = kOpened;
36 return true; 36 return true;
37 } 37 }
38 38
39 void AudioOutputProxy::Start(AudioSourceCallback* callback) { 39 void AudioOutputProxy::Start(AudioSourceCallback* callback) {
40 DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); 40 DCHECK(dispatcher_->CurrentThreadIsAudioThread());
41 DCHECK(physical_stream_ == NULL); 41 DCHECK(physical_stream_ == NULL);
42 DCHECK_EQ(state_, kOpened); 42 DCHECK_EQ(state_, kOpened);
43 43
44 physical_stream_= dispatcher_->StreamStarted(); 44 physical_stream_= dispatcher_->StreamStarted();
45 if (!physical_stream_) { 45 if (!physical_stream_) {
46 state_ = kError; 46 state_ = kError;
47 callback->OnError(this, 0); 47 callback->OnError(this, 0);
48 return; 48 return;
49 } 49 }
50 50
51 physical_stream_->SetVolume(volume_); 51 physical_stream_->SetVolume(volume_);
52 physical_stream_->Start(callback); 52 physical_stream_->Start(callback);
53 state_ = kPlaying; 53 state_ = kPlaying;
54 } 54 }
55 55
56 void AudioOutputProxy::Stop() { 56 void AudioOutputProxy::Stop() {
57 DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); 57 DCHECK(dispatcher_->CurrentThreadIsAudioThread());
58 if (state_ != kPlaying) 58 if (state_ != kPlaying)
59 return; 59 return;
60 60
61 DCHECK(physical_stream_); 61 DCHECK(physical_stream_);
62 physical_stream_->Stop(); 62 physical_stream_->Stop();
63 dispatcher_->StreamStopped(physical_stream_); 63 dispatcher_->StreamStopped(physical_stream_);
64 physical_stream_ = NULL; 64 physical_stream_ = NULL;
65 state_ = kOpened; 65 state_ = kOpened;
66 } 66 }
67 67
68 void AudioOutputProxy::SetVolume(double volume) { 68 void AudioOutputProxy::SetVolume(double volume) {
69 DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); 69 DCHECK(dispatcher_->CurrentThreadIsAudioThread());
70 volume_ = volume; 70 volume_ = volume;
71 if (physical_stream_) { 71 if (physical_stream_) {
72 physical_stream_->SetVolume(volume); 72 physical_stream_->SetVolume(volume);
73 } 73 }
74 } 74 }
75 75
76 void AudioOutputProxy::GetVolume(double* volume) { 76 void AudioOutputProxy::GetVolume(double* volume) {
77 DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); 77 DCHECK(dispatcher_->CurrentThreadIsAudioThread());
78 *volume = volume_; 78 *volume = volume_;
79 } 79 }
80 80
81 void AudioOutputProxy::Close() { 81 void AudioOutputProxy::Close() {
82 DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); 82 DCHECK(dispatcher_->CurrentThreadIsAudioThread());
83 DCHECK(state_ == kCreated || state_ == kError || state_ == kOpened); 83 DCHECK(state_ == kCreated || state_ == kError || state_ == kOpened);
84 DCHECK(!physical_stream_); 84 DCHECK(!physical_stream_);
85 85
86 if (state_ != kCreated) 86 if (state_ != kCreated)
87 dispatcher_->StreamClosed(); 87 dispatcher_->StreamClosed();
88 88
89 state_ = kClosed; 89 state_ = kClosed;
90 90
91 // Delete the object now like is done in the Close() implementation of 91 // Delete the object now like is done in the Close() implementation of
92 // physical stream objects. If we delete the object via DeleteSoon, we 92 // physical stream objects. If we delete the object via DeleteSoon, we
93 // unnecessarily complicate the Shutdown procedure of the 93 // unnecessarily complicate the Shutdown procedure of the
94 // dispatcher+audio manager. 94 // dispatcher+audio manager.
95 delete this; 95 delete this;
96 } 96 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698