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

Unified Diff: media/audio/audio_manager_base.cc

Issue 11298006: Browser-wide audio mirroring for TabCapture API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review comments, some unit tests, move attach/detach into virtual audio output stream Created 8 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: media/audio/audio_manager_base.cc
diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc
index 7b79613774c2b66ad3031794daf7810f894a1ddf..bcf189efbe9dd5b96fd07e6ae3796f0f737f93f9 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,14 @@ AudioOutputStream* AudioManagerBase::MakeAudioOutputStream(
!HasAudioOutputDevices();
AudioOutputStream* stream = NULL;
- if (audio_output_disabled) {
+ if (virtual_audio_input_stream_ &&
+ params.format() != AudioParameters::AUDIO_FAKE) {
+ // TODO(justinlin): This seems to sometimes be called twice for 1 video.
Alpha Left Google 2012/11/28 01:04:47 What should this TODO do?
justinlin 2012/11/28 14:30:31 Right, I'll remove the TODO and fix this.
+ // They both attach, but then one of them detaches prematurely, and the
+ // other one doesn't detach which causes a DCHECK fail?
+ stream = VirtualAudioOutputStream::MakeStream(this, params,
+ virtual_audio_input_stream_);
+ } else if (audio_output_disabled) {
stream = FakeAudioOutputStream::MakeFakeStream(this, params);
} else if (params.format() == AudioParameters::AUDIO_PCM_LINEAR) {
stream = MakeLinearOutputStream(params);
@@ -130,7 +140,24 @@ AudioInputStream* AudioManagerBase::MakeAudioInputStream(
}
AudioInputStream* stream = NULL;
- if (params.format() == AudioParameters::AUDIO_FAKE) {
+ if (params.format() == AudioParameters::AUDIO_MIRROR_BROWSER) {
+ // TODO(justinlin): Currently, we can only support mirroring audio from 1
Alpha Left Google 2012/11/28 01:04:47 No need to mention tab. You can just mention the
justinlin 2012/11/28 14:30:31 Done.
+ // tab, so subsequent tab capture requests will just get fake audio.
+ // Maybe we should just return the same stream and ref-count, so that we
+ // only actually destroy the stream when there's no mirroring?
+ if (!virtual_audio_input_stream_) {
+ virtual_audio_input_stream_ =
+ VirtualAudioInputStream::MakeStream(this, params);
+ stream = virtual_audio_input_stream_;
+ message_loop_->PostTask(FROM_HERE, base::Bind(
Alpha Left Google 2012/11/28 01:04:47 What would this task do?
justinlin 2012/11/28 14:30:31 NotifyAllOutputChangeListeners needs to be called
+ &AudioManagerBase::NotifyAllOutputDeviceChangeListeners,
+ base::Unretained(this)));
+ } else {
+ // TODO(justinlin): Maybe we can return NULL if this doesn't cause the
Alpha Left Google 2012/11/28 01:04:47 This code doesn't need a TODO isn't it?
justinlin 2012/11/28 14:30:31 Done.
+ // media request to fail?
+ stream = FakeAudioInputStream::MakeFakeStream(this, params);
+ }
+ } 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);
@@ -233,6 +260,7 @@ void AudioManagerBase::GetAudioInputDeviceNames(
}
void AudioManagerBase::ReleaseOutputStream(AudioOutputStream* stream) {
+ DCHECK(message_loop_->BelongsToCurrentThread());
DCHECK(stream);
// TODO(xians) : Have a clearer destruction path for the AudioOutputStream.
// For example, pass the ownership to AudioManager so it can delete the
@@ -242,8 +270,16 @@ void AudioManagerBase::ReleaseOutputStream(AudioOutputStream* stream) {
}
void AudioManagerBase::ReleaseInputStream(AudioInputStream* stream) {
+ DCHECK(message_loop_->BelongsToCurrentThread());
DCHECK(stream);
// TODO(xians) : Have a clearer destruction path for the AudioInputStream.
+
+ if (virtual_audio_input_stream_ == stream) {
+ virtual_audio_input_stream_->Stop();
+ virtual_audio_input_stream_ = NULL;
+ NotifyAllOutputDeviceChangeListeners();
Alpha Left Google 2012/11/28 01:04:47 What should the output streams do? Write a comment
justinlin 2012/11/28 14:30:31 Done.
+ }
+
num_input_streams_--;
delete stream;
}

Powered by Google App Engine
This is Rietveld 408576698