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..7057c7d0e090df9ebea772c3d7784b14f35bc76c |
| --- /dev/null |
| +++ b/content/renderer/media/audio_renderer_mixer_manager.cc |
| @@ -0,0 +1,71 @@ |
| +// 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(mixer_map_.empty()); |
| +} |
| + |
| +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(mixer_map_lock_); |
| + |
| + AudioRendererMixerMap::iterator it = mixer_map_.find(params); |
| + if (it != mixer_map_.end()) { |
| + it->second.ref_count++; |
| + return it->second.mixer; |
| + } |
| + |
| + // Create output parameters for passing on to the output sink. |
| + // TODO(dalecurtis): Set format and buffer size in AudioRendererImpl. |
| + // TODO(dalecurtis): We don't care about the hardware in the ARMM tests, but |
| + // is it okay for unit tests to call these methods? |
|
scherkus (not reviewing)
2012/07/13 23:17:38
as discussed offline you can change this to refere
DaleCurtis
2012/07/14 00:39:26
Done.
|
| + AudioRendererMixerReference mixer_reference = { |
| + new media::AudioRendererMixer( |
|
scherkus (not reviewing)
2012/07/13 23:17:38
nit for code clarity -- can you break out these ob
DaleCurtis
2012/07/14 00:39:26
Done.
|
| + params, media::AudioParameters( |
| + media::AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| + params.channel_layout(), media::GetAudioHardwareSampleRate(), 16, |
| + media::GetAudioHardwareBufferSize()), |
| + AudioDeviceFactory::Create()), |
| + 1}; |
| + mixer_map_[params] = mixer_reference; |
| + return mixer_reference.mixer; |
| +} |
| + |
| +void AudioRendererMixerManager::RemoveMixer( |
| + const media::AudioParameters& params) { |
| + base::AutoLock auto_lock(mixer_map_lock_); |
| + |
| + AudioRendererMixerMap::iterator it = mixer_map_.find(params); |
| + DCHECK(it != mixer_map_.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; |
| + mixer_map_.erase(it); |
| + } |
| +} |
| + |
| +} // namespace content |