15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/audio_device_factory.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/audio_input_message_filter.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/audio_message_filter.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_input_device.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/audio/audio_output_device.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioDeviceFactory* AudioDeviceFactory::factory_ = NULL;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_refptr<media::AudioOutputDevice> AudioDeviceFactory::NewOutputDevice(
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_view_id, int render_frame_id) {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (factory_) {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    media::AudioOutputDevice* const device =
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        factory_->CreateOutputDevice(render_view_id);
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (device)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return device;
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AudioMessageFilter* const filter = AudioMessageFilter::Get();
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new media::AudioOutputDevice(
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      filter->CreateAudioOutputIPC(render_view_id, render_frame_id),
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      filter->io_message_loop());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_refptr<media::AudioInputDevice> AudioDeviceFactory::NewInputDevice(
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int render_view_id) {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (factory_) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    media::AudioInputDevice* const device =
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        factory_->CreateInputDevice(render_view_id);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (device)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return device;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AudioInputMessageFilter* const filter = AudioInputMessageFilter::Get();
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new media::AudioInputDevice(
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filter->CreateAudioInputIPC(render_view_id), filter->io_message_loop());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioDeviceFactory::AudioDeviceFactory() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!factory_) << "Can't register two factories at once.";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  factory_ = this;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioDeviceFactory::~AudioDeviceFactory() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  factory_ = NULL;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
59