Chromium Code Reviews| Index: content/renderer/media/audio_renderer_mixer_manager.cc |
| diff --git a/content/renderer/media/audio_renderer_mixer_manager.cc b/content/renderer/media/audio_renderer_mixer_manager.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8d4740d319041b14858ccfafe0cf14a5a32252d7 |
| --- /dev/null |
| +++ b/content/renderer/media/audio_renderer_mixer_manager.cc |
| @@ -0,0 +1,80 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/renderer/media/audio_renderer_mixer_manager.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/bind_helpers.h" |
| +#include "content/renderer/media/audio_device_factory.h" |
| +#include "media/audio/audio_util.h" |
| +#include "media/base/audio_renderer_mixer.h" |
| +#include "media/base/audio_renderer_mixer_input.h" |
| + |
| +namespace content { |
| + |
| +AudioRendererMixerManager::AudioRendererMixerManager() {} |
| + |
| +AudioRendererMixerManager::~AudioRendererMixerManager() { |
| + DCHECK(mixers_.empty()); |
| +} |
| + |
| +media::AudioParameters AudioRendererMixerManager::GetAudioHardwareParameters( |
| + const media::AudioParameters& params) { |
| + // Create output parameters based on the audio hardware configuration for |
| + // passing on to the output sink. Force to 16-bit output for now since we |
| + // know that works well for WebAudio and WebRTC. |
| + // TODO(dalecurtis): Set format and buffer size in AudioRendererImpl once |
| + // renderer side mixing is no longer behind a flag. |
| + // TODO(dalecurtis): Ideally we shouldn't be calling the GetAudioHardware* |
| + // methods directly, but pulling them from an AudioManager instance. For unit |
| + // tests we would setup a fake AudioManager with a fake hardware config. See |
| + // http://crbug.com/137326. |
| + return media::AudioParameters( |
| + media::AudioParameters::AUDIO_PCM_LOW_LATENCY, params.channel_layout(), |
| + media::GetAudioHardwareSampleRate(), 16, |
| + media::GetAudioHardwareBufferSize()); |
|
scherkus (not reviewing)
2012/07/16 20:52:59
Two things:
- This is kinda ugly
- I just reme
DaleCurtis
2012/07/16 22:25:59
SGTM. Done!
|
| +} |
| + |
| +media::AudioRendererMixerInput* AudioRendererMixerManager::CreateInput() { |
| + return new media::AudioRendererMixerInput( |
| + base::Bind( |
| + &AudioRendererMixerManager::GetMixer, base::Unretained(this)), |
| + base::Bind( |
| + &AudioRendererMixerManager::RemoveMixer, base::Unretained(this))); |
| +} |
| + |
| +media::AudioRendererMixer* AudioRendererMixerManager::GetMixer( |
| + const media::AudioParameters& params) { |
| + base::AutoLock auto_lock(mixers_lock_); |
| + |
| + AudioRendererMixerMap::iterator it = mixers_.find(params); |
| + if (it != mixers_.end()) { |
| + it->second.ref_count++; |
| + return it->second.mixer; |
| + } |
| + |
| + media::AudioRendererMixer* mixer = new media::AudioRendererMixer( |
| + params, GetAudioHardwareParameters(params), AudioDeviceFactory::Create()); |
| + |
| + AudioRendererMixerReference mixer_reference = { mixer, 1 }; |
| + mixers_[params] = mixer_reference; |
| + return mixer; |
| +} |
| + |
| +void AudioRendererMixerManager::RemoveMixer( |
| + const media::AudioParameters& params) { |
| + base::AutoLock auto_lock(mixers_lock_); |
| + |
| + AudioRendererMixerMap::iterator it = mixers_.find(params); |
| + DCHECK(it != mixers_.end()); |
| + |
| + // Only remove the mixer if AudioRendererMixerManager is the last owner. |
| + it->second.ref_count--; |
| + if (it->second.ref_count == 0) { |
| + delete it->second.mixer; |
| + mixers_.erase(it); |
| + } |
| +} |
| + |
| +} // namespace content |