Index: content/browser/renderer_host/media/audio_renderer_host.cc |
diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc |
index 59bb56762a0913a17f800d45c3526188edc45859..0c8c310350bcfb86116470fc0889e092fdbd6d3e 100644 |
--- a/content/browser/renderer_host/media/audio_renderer_host.cc |
+++ b/content/browser/renderer_host/media/audio_renderer_host.cc |
@@ -12,12 +12,15 @@ |
#include "base/shared_memory.h" |
#include "content/browser/browser_main_loop.h" |
#include "content/browser/media/media_internals.h" |
+#include "content/browser/renderer_host/media/audio_input_device_manager.h" |
#include "content/browser/renderer_host/media/audio_mirroring_manager.h" |
#include "content/browser/renderer_host/media/audio_sync_reader.h" |
+#include "content/browser/renderer_host/media/media_stream_manager.h" |
#include "content/common/media/audio_messages.h" |
#include "content/public/browser/content_browser_client.h" |
#include "content/public/browser/media_observer.h" |
#include "content/public/common/content_switches.h" |
+#include "media/audio/audio_manager_base.h" |
#include "media/audio/shared_memory_util.h" |
#include "media/base/audio_bus.h" |
#include "media/base/limits.h" |
@@ -33,6 +36,7 @@ class AudioRendererHost::AudioEntry |
int stream_id, |
int render_view_id, |
const media::AudioParameters& params, |
+ const std::string& input_device_id, |
scoped_ptr<base::SharedMemory> shared_memory, |
scoped_ptr<media::AudioOutputController::SyncReader> reader); |
virtual ~AudioEntry(); |
@@ -84,13 +88,14 @@ class AudioRendererHost::AudioEntry |
AudioRendererHost::AudioEntry::AudioEntry( |
AudioRendererHost* host, int stream_id, int render_view_id, |
const media::AudioParameters& params, |
+ const std::string& input_device_id, |
scoped_ptr<base::SharedMemory> shared_memory, |
scoped_ptr<media::AudioOutputController::SyncReader> reader) |
: host_(host), |
stream_id_(stream_id), |
render_view_id_(render_view_id), |
controller_(media::AudioOutputController::Create( |
- host->audio_manager_, this, params, reader.get())), |
+ host->audio_manager_, this, params, input_device_id, reader.get())), |
shared_memory_(shared_memory.Pass()), |
reader_(reader.Pass()) { |
DCHECK(controller_.get()); |
@@ -104,12 +109,15 @@ AudioRendererHost::AudioRendererHost( |
int render_process_id, |
media::AudioManager* audio_manager, |
AudioMirroringManager* mirroring_manager, |
- MediaInternals* media_internals) |
+ MediaInternals* media_internals, |
+ MediaStreamManager* media_stream_manager) |
: render_process_id_(render_process_id), |
audio_manager_(audio_manager), |
mirroring_manager_(mirroring_manager), |
- media_internals_(media_internals) { |
+ media_internals_(media_internals), |
+ media_stream_manager_(media_stream_manager) { |
DCHECK(audio_manager_); |
+ DCHECK(media_stream_manager_); |
} |
AudioRendererHost::~AudioRendererHost() { |
@@ -265,12 +273,14 @@ bool AudioRendererHost::OnMessageReceived(const IPC::Message& message, |
} |
void AudioRendererHost::OnCreateStream( |
- int stream_id, int render_view_id, const media::AudioParameters& params) { |
+ int stream_id, int render_view_id, int session_id, |
+ const media::AudioParameters& params) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
DVLOG(1) << "AudioRendererHost@" << this |
<< "::OnCreateStream(stream_id=" << stream_id |
- << ", render_view_id=" << render_view_id << ")"; |
+ << ", render_view_id=" << render_view_id |
+ << ", session_id=" << session_id << ")"; |
DCHECK_GT(render_view_id, 0); |
// media::AudioParameters is validated in the deserializer. |
@@ -282,6 +292,22 @@ void AudioRendererHost::OnCreateStream( |
return; |
} |
+ // When the |input_channels| is valid, clients are trying to create a unified |
+ // IO stream which opens an input device mapping to the |session_id|. |
+ std::string input_device_id; |
+ if (input_channels > 0) { |
+ const StreamDeviceInfo* info = media_stream_manager_-> |
+ audio_input_device_manager()->GetOpenedDeviceInfoById(session_id); |
+ if (!info) { |
+ SendErrorMessage(stream_id); |
+ DLOG(WARNING) << "No permission has been granted to input stream with " |
+ << "session_id=" << session_id; |
+ return; |
+ } |
+ |
+ input_device_id = info->device.id; |
+ } |
+ |
// Calculate output and input memory size. |
int output_memory_size = AudioBus::CalculateMemorySize(params); |
int frames = params.frames_per_buffer(); |
@@ -308,7 +334,8 @@ void AudioRendererHost::OnCreateStream( |
} |
scoped_ptr<AudioEntry> entry(new AudioEntry( |
- this, stream_id, render_view_id, params, shared_memory.Pass(), |
+ this, stream_id, render_view_id, params, input_device_id, |
+ shared_memory.Pass(), |
reader.PassAs<media::AudioOutputController::SyncReader>())); |
if (mirroring_manager_) { |
mirroring_manager_->AddDiverter( |