Chromium Code Reviews| Index: media/audio/audio_manager_base.cc |
| diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc |
| index eca877311558b6d421ac59d0d83b3007177869ad..59f885695add792830a85ec0f012ad6cc0067322 100644 |
| --- a/media/audio/audio_manager_base.cc |
| +++ b/media/audio/audio_manager_base.cc |
| @@ -14,6 +14,8 @@ |
| #include "media/audio/audio_util.h" |
| #include "media/audio/fake_audio_input_stream.h" |
| #include "media/audio/fake_audio_output_stream.h" |
| +#include "media/audio/virtual_audio_input_stream.h" |
| +#include "media/audio/virtual_audio_output_stream.h" |
| #include "media/base/media_switches.h" |
| // TODO(dalecurtis): Temporarily disabled while switching pipeline to use float, |
| @@ -45,7 +47,8 @@ AudioManagerBase::AudioManagerBase() |
| max_num_input_streams_(kDefaultMaxInputStreams), |
| num_output_streams_(0), |
| num_input_streams_(0), |
| - audio_thread_(new base::Thread("AudioThread")) { |
| + audio_thread_(new base::Thread("AudioThread")), |
| + virtual_audio_input_stream_(NULL) { |
| #if defined(OS_WIN) |
| audio_thread_->init_com_with_mta(true); |
| #endif |
| @@ -100,7 +103,16 @@ AudioOutputStream* AudioManagerBase::MakeAudioOutputStream( |
| !HasAudioOutputDevices(); |
| AudioOutputStream* stream = NULL; |
| - if (audio_output_disabled) { |
| + if (virtual_audio_input_stream_) { |
| +#if defined(OS_IOS) |
| + // We do not currently support iOS. It does not link. |
| + NOTIMPLEMENTED(); |
| + return NULL; |
| +#else |
| + stream = VirtualAudioOutputStream::MakeStream(this, params, |
| + virtual_audio_input_stream_); |
| +#endif |
| + } else if (audio_output_disabled) { |
| stream = FakeAudioOutputStream::MakeFakeStream(this, params); |
| } else if (params.format() == AudioParameters::AUDIO_PCM_LINEAR) { |
| stream = MakeLinearOutputStream(params); |
| @@ -130,7 +142,31 @@ AudioInputStream* AudioManagerBase::MakeAudioInputStream( |
| } |
| AudioInputStream* stream = NULL; |
| - if (params.format() == AudioParameters::AUDIO_FAKE) { |
| + if (params.format() == AudioParameters::AUDIO_VIRTUAL) { |
| + #if defined(OS_IOS) |
|
DaleCurtis
2012/12/03 19:27:28
#if is never indented.
justinlin
2012/12/03 21:18:42
Done.
|
| + // We do not currently support iOS. |
| + NOTIMPLEMENTED(); |
| + return NULL; |
| + #else |
| + // TODO(justinlin): Currently, audio mirroring will only work for the first |
| + // request. Subsequent requests will not get audio. |
| + if (!virtual_audio_input_stream_) { |
| + virtual_audio_input_stream_ = |
| + VirtualAudioInputStream::MakeStream(this, params); |
| + stream = virtual_audio_input_stream_; |
| + DVLOG(1) << "Virtual audio input stream created."; |
| + |
| + // Make all current output streams recreate themselves as |
| + // VirtualAudioOutputStreams that will attach to the above |
| + // VirtualAudioInputStream. |
| + message_loop_->PostTask(FROM_HERE, base::Bind( |
| + &AudioManagerBase::NotifyAllOutputDeviceChangeListeners, |
|
DaleCurtis
2012/12/03 19:27:28
I mentioned this to Yuri, but FYI, we'll probably
justinlin
2012/12/03 21:18:42
Acknowledged.
DaleCurtis
2012/12/03 21:30:56
The previous style here was fine. You can always s
justinlin
2012/12/03 22:01:48
Done. OK, I see.
|
| + base::Unretained(this))); |
| + } else { |
| + stream = NULL; |
| + } |
| + #endif |
| + } else if (params.format() == AudioParameters::AUDIO_FAKE) { |
| stream = FakeAudioInputStream::MakeFakeStream(this, params); |
| } else if (params.format() == AudioParameters::AUDIO_PCM_LINEAR) { |
| stream = MakeLinearInputStream(params, device_id); |
| @@ -244,6 +280,17 @@ void AudioManagerBase::ReleaseOutputStream(AudioOutputStream* stream) { |
| void AudioManagerBase::ReleaseInputStream(AudioInputStream* stream) { |
| DCHECK(stream); |
| // TODO(xians) : Have a clearer destruction path for the AudioInputStream. |
| + |
| + if (virtual_audio_input_stream_ == stream) { |
| + DVLOG(1) << "Virtual audio input stream stopping."; |
| + virtual_audio_input_stream_->Stop(); |
| + virtual_audio_input_stream_ = NULL; |
| + |
| + // Make all audio output streams (which should be virtual) recreate |
| + // themselves as regular audio streams to return sound to hardware. |
| + NotifyAllOutputDeviceChangeListeners(); |
|
DaleCurtis
2012/12/03 19:27:28
Should this be PostTask'd?
justinlin
2012/12/03 21:18:42
No, I don't think so. We need the output streams t
|
| + } |
| + |
| num_input_streams_--; |
| delete stream; |
| } |