Chromium Code Reviews| OLD | NEW |
|---|---|
| 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_manager_base.h" | 5 #include "media/audio/audio_manager_base.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/message_loop_proxy.h" | 10 #include "base/message_loop_proxy.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 56 #endif | 56 #endif |
| 57 #if defined(OS_MACOSX) | 57 #if defined(OS_MACOSX) |
| 58 // On Mac, use a UI loop to get native message pump so that CoreAudio property | 58 // On Mac, use a UI loop to get native message pump so that CoreAudio property |
| 59 // listener callbacks fire. | 59 // listener callbacks fire. |
| 60 CHECK(audio_thread_->StartWithOptions( | 60 CHECK(audio_thread_->StartWithOptions( |
| 61 base::Thread::Options(MessageLoop::TYPE_UI, 0))); | 61 base::Thread::Options(MessageLoop::TYPE_UI, 0))); |
| 62 #else | 62 #else |
| 63 CHECK(audio_thread_->Start()); | 63 CHECK(audio_thread_->Start()); |
| 64 #endif | 64 #endif |
| 65 message_loop_ = audio_thread_->message_loop_proxy(); | 65 message_loop_ = audio_thread_->message_loop_proxy(); |
| 66 | |
| 67 #if defined(OS_ANDROID) | |
| 68 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 69 jobject context = base::android::GetApplicationContext(); | |
| 70 DCHECK(context); | |
|
Ami GONE FROM CHROMIUM
2013/03/21 21:26:21
unnecessary- GAC() does this
leozwang1
2013/03/21 23:10:07
Done.
| |
| 71 j_audio_manager_.Reset( | |
| 72 Java_AudioManagerAndroid_createAudioManagerAndroid(env, context)); | |
| 73 #endif | |
| 66 } | 74 } |
| 67 | 75 |
| 68 AudioManagerBase::~AudioManagerBase() { | 76 AudioManagerBase::~AudioManagerBase() { |
| 69 // The platform specific AudioManager implementation must have already | 77 // The platform specific AudioManager implementation must have already |
| 70 // stopped the audio thread. Otherwise, we may destroy audio streams before | 78 // stopped the audio thread. Otherwise, we may destroy audio streams before |
| 71 // stopping the thread, resulting an unexpected behavior. | 79 // stopping the thread, resulting an unexpected behavior. |
| 72 // This way we make sure activities of the audio streams are all stopped | 80 // This way we make sure activities of the audio streams are all stopped |
| 73 // before we destroy them. | 81 // before we destroy them. |
| 74 CHECK(!audio_thread_.get()); | 82 CHECK(!audio_thread_.get()); |
| 75 // All the output streams should have been deleted. | 83 // All the output streams should have been deleted. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 stream = FakeAudioOutputStream::MakeFakeStream(this, params); | 129 stream = FakeAudioOutputStream::MakeFakeStream(this, params); |
| 122 break; | 130 break; |
| 123 default: | 131 default: |
| 124 stream = NULL; | 132 stream = NULL; |
| 125 break; | 133 break; |
| 126 } | 134 } |
| 127 | 135 |
| 128 if (stream) | 136 if (stream) |
| 129 ++num_output_streams_; | 137 ++num_output_streams_; |
| 130 | 138 |
| 139 #if defined(OS_ANDROID) | |
| 140 if (1 == num_output_streams_) | |
|
tommi (sloooow) - chröme
2013/03/21 20:58:16
To be on the safe side:
if (stream && 1 == num_ou
Ami GONE FROM CHROMIUM
2013/03/21 21:26:21
better yet, move this into the if at l.136 above?
leozwang1
2013/03/21 23:10:07
Done.
leozwang1
2013/03/21 23:10:07
Done.
leozwang1
2013/03/21 23:10:07
Done.
| |
| 141 RegisterHeadsetReceiver(); | |
| 142 #endif | |
| 143 | |
| 131 return stream; | 144 return stream; |
| 132 } | 145 } |
| 133 | 146 |
| 134 AudioInputStream* AudioManagerBase::MakeAudioInputStream( | 147 AudioInputStream* AudioManagerBase::MakeAudioInputStream( |
| 135 const AudioParameters& params, const std::string& device_id) { | 148 const AudioParameters& params, const std::string& device_id) { |
| 136 // TODO(miu): Fix ~20 call points across several unit test modules to call | 149 // TODO(miu): Fix ~20 call points across several unit test modules to call |
| 137 // this method on the audio thread, then uncomment the following: | 150 // this method on the audio thread, then uncomment the following: |
| 138 // DCHECK(message_loop_->BelongsToCurrentThread()); | 151 // DCHECK(message_loop_->BelongsToCurrentThread()); |
| 139 | 152 |
| 140 if (!params.IsValid() || (params.channels() > kMaxInputChannels) || | 153 if (!params.IsValid() || (params.channels() > kMaxInputChannels) || |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 163 break; | 176 break; |
| 164 default: | 177 default: |
| 165 stream = NULL; | 178 stream = NULL; |
| 166 break; | 179 break; |
| 167 } | 180 } |
| 168 | 181 |
| 169 if (stream) | 182 if (stream) |
| 170 ++num_input_streams_; | 183 ++num_input_streams_; |
| 171 | 184 |
| 172 #if defined(OS_ANDROID) | 185 #if defined(OS_ANDROID) |
| 173 if (num_input_streams_ == 1) | 186 if (1 == num_input_streams_) |
|
tommi (sloooow) - chröme
2013/03/21 20:58:16
same here
leozwang1
2013/03/21 23:10:07
Done.
| |
| 174 SetAudioMode(kAudioModeInCommunication); | 187 SetAudioMode(kAudioModeInCommunication); |
| 175 #endif | 188 #endif |
| 176 | 189 |
| 177 return stream; | 190 return stream; |
| 178 } | 191 } |
| 179 | 192 |
| 180 AudioOutputStream* AudioManagerBase::MakeAudioOutputStreamProxy( | 193 AudioOutputStream* AudioManagerBase::MakeAudioOutputStreamProxy( |
| 181 const AudioParameters& params) { | 194 const AudioParameters& params) { |
| 182 #if defined(OS_IOS) | 195 #if defined(OS_IOS) |
| 183 // IOS implements audio input only. | 196 // IOS implements audio input only. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 249 media::AudioDeviceNames* device_names) { | 262 media::AudioDeviceNames* device_names) { |
| 250 } | 263 } |
| 251 | 264 |
| 252 void AudioManagerBase::ReleaseOutputStream(AudioOutputStream* stream) { | 265 void AudioManagerBase::ReleaseOutputStream(AudioOutputStream* stream) { |
| 253 DCHECK(stream); | 266 DCHECK(stream); |
| 254 // TODO(xians) : Have a clearer destruction path for the AudioOutputStream. | 267 // TODO(xians) : Have a clearer destruction path for the AudioOutputStream. |
| 255 // For example, pass the ownership to AudioManager so it can delete the | 268 // For example, pass the ownership to AudioManager so it can delete the |
| 256 // streams. | 269 // streams. |
| 257 --num_output_streams_; | 270 --num_output_streams_; |
| 258 delete stream; | 271 delete stream; |
| 272 #if defined(OS_ANDROID) | |
| 273 if (!num_output_streams_) | |
| 274 UnregisterHeadsetReceiver(); | |
| 275 #endif | |
| 259 } | 276 } |
| 260 | 277 |
| 261 void AudioManagerBase::ReleaseInputStream(AudioInputStream* stream) { | 278 void AudioManagerBase::ReleaseInputStream(AudioInputStream* stream) { |
| 262 DCHECK(stream); | 279 DCHECK(stream); |
| 263 // TODO(xians) : Have a clearer destruction path for the AudioInputStream. | 280 // TODO(xians) : Have a clearer destruction path for the AudioInputStream. |
| 264 --num_input_streams_; | 281 --num_input_streams_; |
| 265 delete stream; | 282 delete stream; |
| 266 #if defined(OS_ANDROID) | 283 #if defined(OS_ANDROID) |
| 267 if (!num_input_streams_) | 284 if (!num_input_streams_) |
| 268 SetAudioMode(kAudioModeNormal); | 285 SetAudioMode(kAudioModeNormal); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 } | 381 } |
| 365 | 382 |
| 366 AudioParameters AudioManagerBase::GetInputStreamParameters( | 383 AudioParameters AudioManagerBase::GetInputStreamParameters( |
| 367 const std::string& device_id) { | 384 const std::string& device_id) { |
| 368 NOTREACHED(); | 385 NOTREACHED(); |
| 369 return AudioParameters(); | 386 return AudioParameters(); |
| 370 } | 387 } |
| 371 | 388 |
| 372 #if defined(OS_ANDROID) | 389 #if defined(OS_ANDROID) |
| 373 void AudioManagerBase::SetAudioMode(int mode) { | 390 void AudioManagerBase::SetAudioMode(int mode) { |
| 374 JNIEnv* env = base::android::AttachCurrentThread(); | 391 Java_AudioManagerAndroid_setMode( |
| 375 jobject context = base::android::GetApplicationContext(); | 392 base::android::AttachCurrentThread(), |
| 376 DCHECK(context); | 393 j_audio_manager_.obj(), mode); |
| 394 } | |
| 377 | 395 |
| 378 Java_AudioManagerAndroid_setMode(env, context, mode); | 396 void AudioManagerBase::RegisterHeadsetReceiver() { |
| 397 Java_AudioManagerAndroid_registerHeadsetReceiver( | |
| 398 base::android::AttachCurrentThread(), | |
| 399 j_audio_manager_.obj()); | |
| 379 } | 400 } |
| 380 #endif | 401 |
| 402 void AudioManagerBase::UnregisterHeadsetReceiver() { | |
| 403 Java_AudioManagerAndroid_unregisterHeadsetReceiver( | |
| 404 base::android::AttachCurrentThread(), | |
| 405 j_audio_manager_.obj()); | |
| 406 } | |
| 407 #endif // defined(OS_ANDROID) | |
| 381 | 408 |
| 382 } // namespace media | 409 } // namespace media |
| OLD | NEW |