Removals and renamings in the new audio mixer.
Removed the OutputMixer part of the new mixer and renamed the new
mixer from NewAudioConferenceMixer to AudioMixer.
NOTRY=True
Review-Url: https://codereview.webrtc.org/2249213005
Cr-Commit-Position: refs/heads/master@{#13883}
diff --git a/webrtc/modules/audio_mixer/BUILD.gn b/webrtc/modules/audio_mixer/BUILD.gn
index b6737cb..3dd5e01 100644
--- a/webrtc/modules/audio_mixer/BUILD.gn
+++ b/webrtc/modules/audio_mixer/BUILD.gn
@@ -7,55 +7,22 @@
# be found in the AUTHORS file in the root of the source tree.
config("audio_conference_mixer_config") {
- visibility = [ ":*" ] # Only targets in this file can depend on this.
- include_dirs = [
- "include",
- "../../modules/include",
- ]
+ include_dirs = [ "../../modules/include" ]
}
source_set("audio_mixer") {
sources = [
- "audio_mixer.cc",
- "audio_mixer.h",
- ]
- deps = [
- ":audio_conference_mixer",
- "../../voice_engine:voice_engine",
- ]
-
- if (is_win) {
- defines = [ "WEBRTC_DRIFT_COMPENSATION_SUPPORTED" ]
-
- cflags = [
- # TODO(kjellander): Bug 261: fix this warning.
- "/wd4373", # virtual function override.
- ]
- }
-
- configs += [ "../..:common_config" ]
- public_configs = [ "../..:common_inherited_config" ]
-
- if (is_clang) {
- # Suppress warnings from Chrome's Clang plugins.
- # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
- configs -= [ "//build/config/clang:find_bad_constructs" ]
- }
-}
-
-source_set("audio_conference_mixer") {
- sources = [
"audio_frame_manipulator.cc",
"audio_frame_manipulator.h",
+ "audio_mixer.h",
"audio_mixer_defines.h",
- "new_audio_conference_mixer.h",
- "new_audio_conference_mixer_impl.cc",
- "new_audio_conference_mixer_impl.h",
+ "audio_mixer_impl.cc",
+ "audio_mixer_impl.h",
]
public = [
"audio_mixer_defines.h",
- "new_audio_conference_mixer.h",
+ "audio_mixer.h",
]
configs += [ "../..:common_config" ]
diff --git a/webrtc/modules/audio_mixer/audio_mixer.cc b/webrtc/modules/audio_mixer/audio_mixer.cc
deleted file mode 100644
index 02c9e83..0000000
--- a/webrtc/modules/audio_mixer/audio_mixer.cc
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "webrtc/modules/audio_mixer/audio_mixer.h"
-
-#include "webrtc/base/format_macros.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/utility/include/audio_frame_operations.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/include/voe_external_media.h"
-#include "webrtc/voice_engine/statistics.h"
-#include "webrtc/voice_engine/utility.h"
-
-namespace webrtc {
-namespace voe {
-
-void AudioMixer::PlayNotification(int32_t id, uint32_t durationMs) {
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::PlayNotification(id=%d, durationMs=%d)", id,
- durationMs);
- // Not implement yet
-}
-
-void AudioMixer::RecordNotification(int32_t id, uint32_t durationMs) {
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::RecordNotification(id=%d, durationMs=%d)", id,
- durationMs);
-
- // Not implement yet
-}
-
-void AudioMixer::PlayFileEnded(int32_t id) {
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::PlayFileEnded(id=%d)", id);
-
- // not needed
-}
-
-void AudioMixer::RecordFileEnded(int32_t id) {
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::RecordFileEnded(id=%d)", id);
- RTC_DCHECK_EQ(id, _instanceId);
-
- rtc::CritScope cs(&_fileCritSect);
- _outputFileRecording = false;
- WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::RecordFileEnded() =>"
- "output file recorder module is shutdown");
-}
-
-int32_t AudioMixer::Create(AudioMixer*& mixer, uint32_t instanceId) {
- WEBRTC_TRACE(kTraceMemory, kTraceVoice, instanceId,
- "AudioMixer::Create(instanceId=%d)", instanceId);
- mixer = new AudioMixer(instanceId);
- if (mixer == NULL) {
- WEBRTC_TRACE(kTraceMemory, kTraceVoice, instanceId,
- "AudioMixer::Create() unable to allocate memory for"
- "mixer");
- return -1;
- }
- return 0;
-}
-
-AudioMixer::AudioMixer(uint32_t instanceId)
- : _mixerModule(*NewAudioConferenceMixer::Create(instanceId)),
- _audioLevel(),
- _instanceId(instanceId),
- _externalMediaCallbackPtr(NULL),
- _externalMedia(false),
- _panLeft(1.0f),
- _panRight(1.0f),
- _mixingFrequencyHz(8000),
- _outputFileRecording(false) {
- WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::AudioMixer() - ctor");
-}
-
-void AudioMixer::Destroy(AudioMixer*& mixer) {
- if (mixer) {
- delete mixer;
- mixer = NULL;
- }
-}
-
-AudioMixer::~AudioMixer() {
- WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::~AudioMixer() - dtor");
- if (_externalMedia) {
- DeRegisterExternalMediaProcessing();
- }
- {
- rtc::CritScope cs(&_fileCritSect);
- if (_outputFileRecorderPtr) {
- _outputFileRecorderPtr->RegisterModuleFileCallback(NULL);
- _outputFileRecorderPtr->StopRecording();
- }
- }
- delete &_mixerModule;
-}
-
-int32_t AudioMixer::SetEngineInformation(voe::Statistics& engineStatistics) {
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::SetEngineInformation()");
- _engineStatisticsPtr = &engineStatistics;
- return 0;
-}
-
-int32_t AudioMixer::SetAudioProcessingModule(
- AudioProcessing* audioProcessingModule) {
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::SetAudioProcessingModule("
- "audioProcessingModule=0x%x)",
- audioProcessingModule);
- _audioProcessingModulePtr = audioProcessingModule;
- return 0;
-}
-
-int AudioMixer::RegisterExternalMediaProcessing(
- VoEMediaProcess& proccess_object) {
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::RegisterExternalMediaProcessing()");
-
- rtc::CritScope cs(&_callbackCritSect);
- _externalMediaCallbackPtr = &proccess_object;
- _externalMedia = true;
-
- return 0;
-}
-
-int AudioMixer::DeRegisterExternalMediaProcessing() {
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::DeRegisterExternalMediaProcessing()");
-
- rtc::CritScope cs(&_callbackCritSect);
- _externalMedia = false;
- _externalMediaCallbackPtr = NULL;
-
- return 0;
-}
-
-int32_t AudioMixer::SetMixabilityStatus(MixerAudioSource& audio_source,
- bool mixable) {
- return _mixerModule.SetMixabilityStatus(&audio_source, mixable);
-}
-
-int32_t AudioMixer::SetAnonymousMixabilityStatus(MixerAudioSource& audio_source,
- bool mixable) {
- return _mixerModule.SetAnonymousMixabilityStatus(&audio_source, mixable);
-}
-
-int AudioMixer::GetSpeechOutputLevel(uint32_t& level) {
- int8_t currentLevel = _audioLevel.Level();
- level = static_cast<uint32_t>(currentLevel);
- WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, -1),
- "GetSpeechOutputLevel() => level=%u", level);
- return 0;
-}
-
-int AudioMixer::GetSpeechOutputLevelFullRange(uint32_t& level) {
- int16_t currentLevel = _audioLevel.LevelFullRange();
- level = static_cast<uint32_t>(currentLevel);
- WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, -1),
- "GetSpeechOutputLevelFullRange() => level=%u", level);
- return 0;
-}
-
-int AudioMixer::SetOutputVolumePan(float left, float right) {
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::SetOutputVolumePan()");
- _panLeft = left;
- _panRight = right;
- return 0;
-}
-
-int AudioMixer::GetOutputVolumePan(float& left, float& right) {
- left = _panLeft;
- right = _panRight;
- WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, -1),
- "GetOutputVolumePan() => left=%2.1f, right=%2.1f", left, right);
- return 0;
-}
-
-int AudioMixer::StartRecordingPlayout(const char* fileName,
- const CodecInst* codecInst) {
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::StartRecordingPlayout(fileName=%s)", fileName);
-
- if (_outputFileRecording) {
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
- "StartRecordingPlayout() is already recording");
- return 0;
- }
-
- FileFormats format;
- const uint32_t notificationTime(0);
- CodecInst dummyCodec = {100, "L16", 16000, 320, 1, 320000};
-
- if ((codecInst != NULL) &&
- ((codecInst->channels < 1) || (codecInst->channels > 2))) {
- _engineStatisticsPtr->SetLastError(
- VE_BAD_ARGUMENT, kTraceError,
- "StartRecordingPlayout() invalid compression");
- return (-1);
- }
- if (codecInst == NULL) {
- format = kFileFormatPcm16kHzFile;
- codecInst = &dummyCodec;
- } else if ((STR_CASE_CMP(codecInst->plname, "L16") == 0) ||
- (STR_CASE_CMP(codecInst->plname, "PCMU") == 0) ||
- (STR_CASE_CMP(codecInst->plname, "PCMA") == 0)) {
- format = kFileFormatWavFile;
- } else {
- format = kFileFormatCompressedFile;
- }
-
- rtc::CritScope cs(&_fileCritSect);
-
- if (_outputFileRecorderPtr) {
- _outputFileRecorderPtr->RegisterModuleFileCallback(NULL);
- }
-
- _outputFileRecorderPtr =
- FileRecorder::CreateFileRecorder(_instanceId, (const FileFormats)format);
- if (_outputFileRecorderPtr == NULL) {
- _engineStatisticsPtr->SetLastError(
- VE_INVALID_ARGUMENT, kTraceError,
- "StartRecordingPlayout() fileRecorder format isnot correct");
- return -1;
- }
-
- if (_outputFileRecorderPtr->StartRecordingAudioFile(
- fileName, (const CodecInst&)*codecInst, notificationTime) != 0) {
- _engineStatisticsPtr->SetLastError(
- VE_BAD_FILE, kTraceError,
- "StartRecordingAudioFile() failed to start file recording");
- _outputFileRecorderPtr->StopRecording();
- _outputFileRecorderPtr.reset();
- return -1;
- }
- _outputFileRecorderPtr->RegisterModuleFileCallback(this);
- _outputFileRecording = true;
-
- return 0;
-}
-
-int AudioMixer::StartRecordingPlayout(OutStream* stream,
- const CodecInst* codecInst) {
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::StartRecordingPlayout()");
-
- if (_outputFileRecording) {
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
- "StartRecordingPlayout() is already recording");
- return 0;
- }
-
- FileFormats format;
- const uint32_t notificationTime(0);
- CodecInst dummyCodec = {100, "L16", 16000, 320, 1, 320000};
-
- if (codecInst != NULL && codecInst->channels != 1) {
- _engineStatisticsPtr->SetLastError(
- VE_BAD_ARGUMENT, kTraceError,
- "StartRecordingPlayout() invalid compression");
- return (-1);
- }
- if (codecInst == NULL) {
- format = kFileFormatPcm16kHzFile;
- codecInst = &dummyCodec;
- } else if ((STR_CASE_CMP(codecInst->plname, "L16") == 0) ||
- (STR_CASE_CMP(codecInst->plname, "PCMU") == 0) ||
- (STR_CASE_CMP(codecInst->plname, "PCMA") == 0)) {
- format = kFileFormatWavFile;
- } else {
- format = kFileFormatCompressedFile;
- }
-
- rtc::CritScope cs(&_fileCritSect);
-
- if (_outputFileRecorderPtr) {
- _outputFileRecorderPtr->RegisterModuleFileCallback(NULL);
- }
-
- _outputFileRecorderPtr =
- FileRecorder::CreateFileRecorder(_instanceId, (const FileFormats)format);
- if (_outputFileRecorderPtr == NULL) {
- _engineStatisticsPtr->SetLastError(
- VE_INVALID_ARGUMENT, kTraceError,
- "StartRecordingPlayout() fileRecorder format isnot correct");
- return -1;
- }
-
- if (_outputFileRecorderPtr->StartRecordingAudioFile(stream, *codecInst,
- notificationTime) != 0) {
- _engineStatisticsPtr->SetLastError(
- VE_BAD_FILE, kTraceError,
- "StartRecordingAudioFile() failed to start file recording");
- _outputFileRecorderPtr->StopRecording();
- _outputFileRecorderPtr.reset();
- return -1;
- }
-
- _outputFileRecorderPtr->RegisterModuleFileCallback(this);
- _outputFileRecording = true;
-
- return 0;
-}
-
-int AudioMixer::StopRecordingPlayout() {
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::StopRecordingPlayout()");
-
- if (!_outputFileRecording) {
- WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, -1),
- "StopRecordingPlayout() file isnot recording");
- return -1;
- }
-
- rtc::CritScope cs(&_fileCritSect);
-
- if (_outputFileRecorderPtr->StopRecording() != 0) {
- _engineStatisticsPtr->SetLastError(
- VE_STOP_RECORDING_FAILED, kTraceError,
- "StopRecording(), could not stop recording");
- return -1;
- }
- _outputFileRecorderPtr->RegisterModuleFileCallback(NULL);
- _outputFileRecorderPtr.reset();
- _outputFileRecording = false;
-
- return 0;
-}
-
-int AudioMixer::GetMixedAudio(int sample_rate_hz,
- size_t num_channels,
- AudioFrame* frame) {
- WEBRTC_TRACE(
- kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::GetMixedAudio(sample_rate_hz=%d, num_channels=%" PRIuS ")",
- sample_rate_hz, num_channels);
-
- // --- Record playout if enabled
- {
- rtc::CritScope cs(&_fileCritSect);
- if (_outputFileRecording && _outputFileRecorderPtr)
- _outputFileRecorderPtr->RecordAudioToFile(_audioFrame);
- }
-
- _mixerModule.Mix(sample_rate_hz, num_channels, frame);
-
- return 0;
-}
-
-int32_t AudioMixer::DoOperationsOnCombinedSignal(bool feed_data_to_apm) {
- if (_audioFrame.sample_rate_hz_ != _mixingFrequencyHz) {
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
- "AudioMixer::DoOperationsOnCombinedSignal() => "
- "mixing frequency = %d",
- _audioFrame.sample_rate_hz_);
- _mixingFrequencyHz = _audioFrame.sample_rate_hz_;
- }
-
- // Scale left and/or right channel(s) if balance is active
- if (_panLeft != 1.0 || _panRight != 1.0) {
- if (_audioFrame.num_channels_ == 1) {
- AudioFrameOperations::MonoToStereo(&_audioFrame);
- } else {
- // Pure stereo mode (we are receiving a stereo signal).
- }
-
- RTC_DCHECK_EQ(_audioFrame.num_channels_, static_cast<size_t>(2));
- AudioFrameOperations::Scale(_panLeft, _panRight, _audioFrame);
- }
-
- // --- Far-end Voice Quality Enhancement (AudioProcessing Module)
- if (feed_data_to_apm) {
- if (_audioProcessingModulePtr->ProcessReverseStream(&_audioFrame) != 0) {
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
- "AudioProcessingModule::ProcessReverseStream() => error");
- RTC_DCHECK(false);
- }
- }
-
- // --- External media processing
- {
- rtc::CritScope cs(&_callbackCritSect);
- if (_externalMedia) {
- const bool is_stereo = (_audioFrame.num_channels_ == 2);
- if (_externalMediaCallbackPtr) {
- _externalMediaCallbackPtr->Process(
- -1, kPlaybackAllChannelsMixed,
- reinterpret_cast<int16_t*>(_audioFrame.data_),
- _audioFrame.samples_per_channel_, _audioFrame.sample_rate_hz_,
- is_stereo);
- }
- }
- }
-
- // --- Measure audio level (0-9) for the combined signal
- _audioLevel.ComputeLevel(_audioFrame);
-
- return 0;
-}
-} // namespace voe
-} // namespace webrtc
diff --git a/webrtc/modules/audio_mixer/audio_mixer.gypi b/webrtc/modules/audio_mixer/audio_mixer.gypi
index 38d5b91..26b314f 100644
--- a/webrtc/modules/audio_mixer/audio_mixer.gypi
+++ b/webrtc/modules/audio_mixer/audio_mixer.gypi
@@ -9,7 +9,7 @@
{
'targets': [
{
- 'target_name': 'new_audio_conference_mixer',
+ 'target_name': 'audio_mixer',
'type': 'static_library',
'dependencies': [
'audio_processing',
@@ -21,23 +21,10 @@
'sources': [
'audio_frame_manipulator.cc',
'audio_frame_manipulator.h',
- 'new_audio_conference_mixer.h',
- 'audio_mixer_defines.h',
- 'new_audio_conference_mixer_impl.cc',
- 'new_audio_conference_mixer_impl.h',
- ],
- },
- {
- 'target_name': 'audio_mixer',
- 'type': 'static_library',
- 'dependencies': [
- 'new_audio_conference_mixer',
- 'webrtc_utility',
- '<(webrtc_root)/system_wrappers/system_wrappers.gyp:system_wrappers',
- ],
- 'sources': [
'audio_mixer.h',
- 'audio_mixer.cc',
+ 'audio_mixer_defines.h',
+ 'audio_mixer_impl.cc',
+ 'audio_mixer_impl.h',
],
},
], # targets
diff --git a/webrtc/modules/audio_mixer/audio_mixer.h b/webrtc/modules/audio_mixer/audio_mixer.h
index f422f93..080fc14 100644
--- a/webrtc/modules/audio_mixer/audio_mixer.h
+++ b/webrtc/modules/audio_mixer/audio_mixer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
+ * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
@@ -13,108 +13,64 @@
#include <memory>
-#include "webrtc/base/criticalsection.h"
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_mixer/new_audio_conference_mixer.h"
#include "webrtc/modules/audio_mixer/audio_mixer_defines.h"
-#include "webrtc/modules/utility/include/file_recorder.h"
-#include "webrtc/voice_engine/level_indicator.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
+#include "webrtc/modules/include/module.h"
+#include "webrtc/modules/include/module_common_types.h"
namespace webrtc {
+class MixerAudioSource;
-class AudioProcessing;
-class FileWrapper;
-class VoEMediaProcess;
-
-namespace voe {
-class Statistics;
-
-// Note: this class is in the process of being rewritten and merged
-// with AudioConferenceMixer. Expect inheritance chains to be changed,
-// member functions removed or renamed.
-class AudioMixer : public FileCallback {
+class AudioMixer {
public:
- static int32_t Create(AudioMixer*& mixer, uint32_t instanceId); // NOLINT
+ static const int kMaximumAmountOfMixedAudioSources = 3;
+ enum Frequency {
+ kNbInHz = 8000,
+ kWbInHz = 16000,
+ kSwbInHz = 32000,
+ kFbInHz = 48000,
+ kLowestPossible = -1,
+ kDefaultFrequency = kWbInHz
+ };
- static void Destroy(AudioMixer*& mixer); // NOLINT
+ // Factory method. Constructor disabled.
+ static std::unique_ptr<AudioMixer> Create(int id);
+ virtual ~AudioMixer() {}
- int32_t SetEngineInformation(Statistics& engineStatistics); // NOLINT
+ // Add/remove audio sources as candidates for mixing.
+ virtual int32_t SetMixabilityStatus(MixerAudioSource* audio_source,
+ bool mixable) = 0;
+ // Returns true if an audio source is a candidate for mixing.
+ virtual bool MixabilityStatus(const MixerAudioSource& audio_source) const = 0;
- int32_t SetAudioProcessingModule(AudioProcessing* audioProcessingModule);
+ // Inform the mixer that the audio source should always be mixed and not
+ // count toward the number of mixed audio sources. Note that an audio source
+ // must have been added to the mixer (by calling SetMixabilityStatus())
+ // before this function can be successfully called.
+ virtual int32_t SetAnonymousMixabilityStatus(MixerAudioSource* audio_source,
+ bool mixable) = 0;
- // VoEExternalMedia
- int RegisterExternalMediaProcessing(VoEMediaProcess& // NOLINT
- proccess_object);
+ // Performs mixing by asking registered audio sources for audio. The
+ // mixed result is placed in the provided AudioFrame. Can only be
+ // called from a single thread. The rate and channels arguments
+ // specify the rate and number of channels of the mix result.
+ virtual void Mix(int sample_rate,
+ size_t number_of_channels,
+ AudioFrame* audio_frame_for_mixing) = 0;
- int DeRegisterExternalMediaProcessing();
+ // Returns true if the audio source is mixed anonymously.
+ virtual bool AnonymousMixabilityStatus(
+ const MixerAudioSource& audio_source) const = 0;
- int32_t DoOperationsOnCombinedSignal(bool feed_data_to_apm);
+ // Output level functions for VoEVolumeControl. Return value
+ // between 0 and 9 is returned by voe::AudioLevel.
+ virtual int GetOutputAudioLevel() = 0;
- int32_t SetMixabilityStatus(MixerAudioSource& audio_source, // NOLINT
- bool mixable);
+ // Return value between 0 and 0x7fff is returned by voe::AudioLevel.
+ virtual int GetOutputAudioLevelFullRange() = 0;
- int32_t SetAnonymousMixabilityStatus(
- MixerAudioSource& audio_source, // NOLINT
- bool mixable);
-
- int GetMixedAudio(int sample_rate_hz,
- size_t num_channels,
- AudioFrame* audioFrame);
-
- // VoEVolumeControl
- int GetSpeechOutputLevel(uint32_t& level); // NOLINT
-
- int GetSpeechOutputLevelFullRange(uint32_t& level); // NOLINT
-
- int SetOutputVolumePan(float left, float right);
-
- int GetOutputVolumePan(float& left, float& right); // NOLINT
-
- // VoEFile
- int StartRecordingPlayout(const char* fileName, const CodecInst* codecInst);
-
- int StartRecordingPlayout(OutStream* stream, const CodecInst* codecInst);
- int StopRecordingPlayout();
-
- virtual ~AudioMixer();
-
- // For file recording
- void PlayNotification(int32_t id, uint32_t durationMs);
-
- void RecordNotification(int32_t id, uint32_t durationMs);
-
- void PlayFileEnded(int32_t id);
- void RecordFileEnded(int32_t id);
-
- private:
- explicit AudioMixer(uint32_t instanceId);
-
- // uses
- Statistics* _engineStatisticsPtr;
- AudioProcessing* _audioProcessingModulePtr;
-
- rtc::CriticalSection _callbackCritSect;
- // protect the _outputFileRecorderPtr and _outputFileRecording
- rtc::CriticalSection _fileCritSect;
- NewAudioConferenceMixer& _mixerModule;
- AudioFrame _audioFrame;
- // Converts mixed audio to the audio processing rate.
- PushResampler<int16_t> audioproc_resampler_;
- AudioLevel _audioLevel; // measures audio level for the combined signal
- int _instanceId;
- VoEMediaProcess* _externalMediaCallbackPtr;
- bool _externalMedia;
- float _panLeft;
- float _panRight;
- int _mixingFrequencyHz;
- std::unique_ptr<FileRecorder> _outputFileRecorderPtr;
- bool _outputFileRecording;
+ protected:
+ AudioMixer() {}
};
-
-} // namespace voe
-
} // namespace webrtc
#endif // WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_H_
diff --git a/webrtc/modules/audio_mixer/new_audio_conference_mixer_impl.cc b/webrtc/modules/audio_mixer/audio_mixer_impl.cc
similarity index 90%
rename from webrtc/modules/audio_mixer/new_audio_conference_mixer_impl.cc
rename to webrtc/modules/audio_mixer/audio_mixer_impl.cc
index 96ce8ce..5a8d1eb 100644
--- a/webrtc/modules/audio_mixer/new_audio_conference_mixer_impl.cc
+++ b/webrtc/modules/audio_mixer/audio_mixer_impl.cc
@@ -8,7 +8,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "webrtc/modules/audio_mixer/new_audio_conference_mixer_impl.h"
+#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
#include <algorithm>
#include <functional>
@@ -119,16 +119,16 @@
is_mixed_ = false;
}
-NewAudioConferenceMixer* NewAudioConferenceMixer::Create(int id) {
- NewAudioConferenceMixerImpl* mixer = new NewAudioConferenceMixerImpl(id);
+std::unique_ptr<AudioMixer> AudioMixer::Create(int id) {
+ AudioMixerImpl* mixer = new AudioMixerImpl(id);
if (!mixer->Init()) {
delete mixer;
return NULL;
}
- return mixer;
+ return std::unique_ptr<AudioMixer>(mixer);
}
-NewAudioConferenceMixerImpl::NewAudioConferenceMixerImpl(int id)
+AudioMixerImpl::AudioMixerImpl(int id)
: id_(id),
output_frequency_(kDefaultFrequency),
sample_size_(0),
@@ -140,9 +140,9 @@
thread_checker_.DetachFromThread();
}
-NewAudioConferenceMixerImpl::~NewAudioConferenceMixerImpl() {}
+AudioMixerImpl::~AudioMixerImpl() {}
-bool NewAudioConferenceMixerImpl::Init() {
+bool AudioMixerImpl::Init() {
crit_.reset(CriticalSectionWrapper::CreateCriticalSection());
if (crit_.get() == NULL)
return false;
@@ -183,9 +183,9 @@
return true;
}
-void NewAudioConferenceMixerImpl::Mix(int sample_rate,
- size_t number_of_channels,
- AudioFrame* audio_frame_for_mixing) {
+void AudioMixerImpl::Mix(int sample_rate,
+ size_t number_of_channels,
+ AudioFrame* audio_frame_for_mixing) {
RTC_DCHECK(number_of_channels == 1 || number_of_channels == 2);
RTC_DCHECK(thread_checker_.CalledOnValidThread());
AudioFrameList mixList;
@@ -260,26 +260,23 @@
return;
}
-int32_t NewAudioConferenceMixerImpl::SetOutputFrequency(
- const Frequency& frequency) {
+int32_t AudioMixerImpl::SetOutputFrequency(const Frequency& frequency) {
CriticalSectionScoped cs(crit_.get());
output_frequency_ = frequency;
sample_size_ =
- static_cast<size_t>((output_frequency_ * kProcessPeriodicityInMs) / 1000);
+ static_cast<size_t>((output_frequency_ * kFrameDurationInMs) / 1000);
return 0;
}
-NewAudioConferenceMixer::Frequency
-NewAudioConferenceMixerImpl::OutputFrequency() const {
+AudioMixer::Frequency AudioMixerImpl::OutputFrequency() const {
CriticalSectionScoped cs(crit_.get());
return output_frequency_;
}
-int32_t NewAudioConferenceMixerImpl::SetMixabilityStatus(
- MixerAudioSource* audio_source,
- bool mixable) {
+int32_t AudioMixerImpl::SetMixabilityStatus(MixerAudioSource* audio_source,
+ bool mixable) {
if (!mixable) {
// Anonymous audio sources are in a separate list. Make sure that the
// audio source is in the _audioSourceList if it is being mixed.
@@ -323,13 +320,13 @@
return 0;
}
-bool NewAudioConferenceMixerImpl::MixabilityStatus(
+bool AudioMixerImpl::MixabilityStatus(
const MixerAudioSource& audio_source) const {
CriticalSectionScoped cs(cb_crit_.get());
return IsAudioSourceInList(audio_source, audio_source_list_);
}
-int32_t NewAudioConferenceMixerImpl::SetAnonymousMixabilityStatus(
+int32_t AudioMixerImpl::SetAnonymousMixabilityStatus(
MixerAudioSource* audio_source,
bool anonymous) {
CriticalSectionScoped cs(cb_crit_.get());
@@ -364,14 +361,13 @@
: -1;
}
-bool NewAudioConferenceMixerImpl::AnonymousMixabilityStatus(
+bool AudioMixerImpl::AnonymousMixabilityStatus(
const MixerAudioSource& audio_source) const {
CriticalSectionScoped cs(cb_crit_.get());
return IsAudioSourceInList(audio_source, additional_audio_source_list_);
}
-AudioFrameList NewAudioConferenceMixerImpl::UpdateToMix(
- size_t maxAudioFrameCounter) const {
+AudioFrameList AudioMixerImpl::UpdateToMix(size_t maxAudioFrameCounter) const {
AudioFrameList result;
std::vector<SourceFrame> audioSourceMixingDataList;
@@ -428,7 +424,7 @@
return result;
}
-void NewAudioConferenceMixerImpl::GetAdditionalAudio(
+void AudioMixerImpl::GetAdditionalAudio(
AudioFrameList* additionalFramesList) const {
WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
"GetAdditionalAudio(additionalFramesList)");
@@ -462,7 +458,7 @@
}
}
-bool NewAudioConferenceMixerImpl::IsAudioSourceInList(
+bool AudioMixerImpl::IsAudioSourceInList(
const MixerAudioSource& audio_source,
const MixerAudioSourceList& audioSourceList) const {
WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
@@ -471,7 +467,7 @@
&audio_source) != audioSourceList.end();
}
-bool NewAudioConferenceMixerImpl::AddAudioSourceToList(
+bool AudioMixerImpl::AddAudioSourceToList(
MixerAudioSource* audio_source,
MixerAudioSourceList* audioSourceList) const {
WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
@@ -482,7 +478,7 @@
return true;
}
-bool NewAudioConferenceMixerImpl::RemoveAudioSourceFromList(
+bool AudioMixerImpl::RemoveAudioSourceFromList(
MixerAudioSource* audio_source,
MixerAudioSourceList* audioSourceList) const {
WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
@@ -499,11 +495,10 @@
}
}
-int32_t NewAudioConferenceMixerImpl::MixFromList(
- AudioFrame* mixedAudio,
- const AudioFrameList& audioFrameList,
- int32_t id,
- bool use_limiter) {
+int32_t AudioMixerImpl::MixFromList(AudioFrame* mixedAudio,
+ const AudioFrameList& audioFrameList,
+ int32_t id,
+ bool use_limiter) {
WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id,
"MixFromList(mixedAudio, audioFrameList)");
if (audioFrameList.empty())
@@ -535,7 +530,7 @@
}
// TODO(andrew): consolidate this function with MixFromList.
-int32_t NewAudioConferenceMixerImpl::MixAnonomouslyFromList(
+int32_t AudioMixerImpl::MixAnonomouslyFromList(
AudioFrame* mixedAudio,
const AudioFrameList& audioFrameList) const {
WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
@@ -553,8 +548,7 @@
return 0;
}
-bool NewAudioConferenceMixerImpl::LimitMixedAudio(
- AudioFrame* mixedAudio) const {
+bool AudioMixerImpl::LimitMixedAudio(AudioFrame* mixedAudio) const {
if (!use_limiter_) {
return true;
}
@@ -583,14 +577,14 @@
return true;
}
-int NewAudioConferenceMixerImpl::GetOutputAudioLevel() {
+int AudioMixerImpl::GetOutputAudioLevel() {
const int level = audio_level_.Level();
WEBRTC_TRACE(kTraceStateInfo, kTraceAudioMixerServer, id_,
"GetAudioOutputLevel() => level=%d", level);
return level;
}
-int NewAudioConferenceMixerImpl::GetOutputAudioLevelFullRange() {
+int AudioMixerImpl::GetOutputAudioLevelFullRange() {
const int level = audio_level_.LevelFullRange();
WEBRTC_TRACE(kTraceStateInfo, kTraceAudioMixerServer, id_,
"GetAudioOutputLevelFullRange() => level=%d", level);
diff --git a/webrtc/modules/audio_mixer/new_audio_conference_mixer_impl.h b/webrtc/modules/audio_mixer/audio_mixer_impl.h
similarity index 90%
rename from webrtc/modules/audio_mixer/new_audio_conference_mixer_impl.h
rename to webrtc/modules/audio_mixer/audio_mixer_impl.h
index 4356ff7..6ddf9ca 100644
--- a/webrtc/modules/audio_mixer/new_audio_conference_mixer_impl.h
+++ b/webrtc/modules/audio_mixer/audio_mixer_impl.h
@@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#ifndef WEBRTC_MODULES_AUDIO_MIXER_NEW_AUDIO_CONFERENCE_MIXER_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_NEW_AUDIO_CONFERENCE_MIXER_IMPL_H_
+#ifndef WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
+#define WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
#include <list>
#include <map>
@@ -18,7 +18,7 @@
#include "webrtc/base/thread_checker.h"
#include "webrtc/engine_configurations.h"
-#include "webrtc/modules/audio_mixer/new_audio_conference_mixer.h"
+#include "webrtc/modules/audio_mixer/audio_mixer.h"
#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/voice_engine/level_indicator.h"
@@ -57,19 +57,19 @@
bool is_mixed_;
};
-class NewAudioConferenceMixerImpl : public NewAudioConferenceMixer {
+class AudioMixerImpl : public AudioMixer {
public:
// AudioProcessing only accepts 10 ms frames.
- enum { kProcessPeriodicityInMs = 10 };
+ static const int kFrameDurationInMs = 10;
- explicit NewAudioConferenceMixerImpl(int id);
+ explicit AudioMixerImpl(int id);
- ~NewAudioConferenceMixerImpl() override;
+ ~AudioMixerImpl() override;
// Must be called after ctor.
bool Init();
- // NewAudioConferenceMixer functions
+ // AudioMixer functions
int32_t SetMixabilityStatus(MixerAudioSource* audio_source,
bool mixable) override;
bool MixabilityStatus(const MixerAudioSource& audio_source) const override;
@@ -164,4 +164,4 @@
};
} // namespace webrtc
-#endif // WEBRTC_MODULES_AUDIO_MIXER_NEW_AUDIO_CONFERENCE_MIXER_IMPL_H_
+#endif // WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
diff --git a/webrtc/modules/audio_mixer/new_audio_conference_mixer.h b/webrtc/modules/audio_mixer/new_audio_conference_mixer.h
deleted file mode 100644
index 52d79ee..0000000
--- a/webrtc/modules/audio_mixer/new_audio_conference_mixer.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_MIXER_NEW_AUDIO_CONFERENCE_MIXER_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_NEW_AUDIO_CONFERENCE_MIXER_H_
-
-#include "webrtc/modules/audio_mixer/audio_mixer_defines.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-class MixerAudioSource;
-
-class NewAudioConferenceMixer {
- public:
- enum { kMaximumAmountOfMixedAudioSources = 3 };
- enum Frequency {
- kNbInHz = 8000,
- kWbInHz = 16000,
- kSwbInHz = 32000,
- kFbInHz = 48000,
- kLowestPossible = -1,
- kDefaultFrequency = kWbInHz
- };
-
- // Factory method. Constructor disabled.
- static NewAudioConferenceMixer* Create(int id);
- virtual ~NewAudioConferenceMixer() {}
-
- // Add/remove audio sources as candidates for mixing.
- virtual int32_t SetMixabilityStatus(MixerAudioSource* audio_source,
- bool mixable) = 0;
- // Returns true if an audio source is a candidate for mixing.
- virtual bool MixabilityStatus(const MixerAudioSource& audio_source) const = 0;
-
- // Inform the mixer that the audio source should always be mixed and not
- // count toward the number of mixed audio sources. Note that an audio source
- // must have been added to the mixer (by calling SetMixabilityStatus())
- // before this function can be successfully called.
- virtual int32_t SetAnonymousMixabilityStatus(MixerAudioSource* audio_source,
- bool mixable) = 0;
-
- // Performs mixing by asking registered audio sources for audio. The
- // mixed result is placed in the provided AudioFrame. Can only be
- // called from a single thread. The rate and channels arguments
- // specify the rate and number of channels of the mix result.
- virtual void Mix(int sample_rate,
- size_t number_of_channels,
- AudioFrame* audio_frame_for_mixing) = 0;
-
- // Returns true if the audio source is mixed anonymously.
- virtual bool AnonymousMixabilityStatus(
- const MixerAudioSource& audio_source) const = 0;
-
- // Output level functions for VoEVolumeControl. Return value
- // between 0 and 9 is returned by voe::AudioLevel.
- virtual int GetOutputAudioLevel() = 0;
-
- // Return value between 0 and 0x7fff is returned by voe::AudioLevel.
- virtual int GetOutputAudioLevelFullRange() = 0;
-
- protected:
- NewAudioConferenceMixer() {}
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_MIXER_NEW_AUDIO_CONFERENCE_MIXER_H_
diff --git a/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc b/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc
index 840ba9a..36bd7c4 100644
--- a/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc
+++ b/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc
@@ -13,7 +13,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "webrtc/modules/audio_mixer/audio_mixer_defines.h"
-#include "webrtc/modules/audio_mixer/new_audio_conference_mixer.h"
+#include "webrtc/modules/audio_mixer/audio_mixer.h"
using testing::_;
using testing::Exactly;
@@ -85,8 +85,7 @@
RTC_DCHECK(frames.size() == frame_info.size());
RTC_DCHECK(frame_info.size() == expected_status.size());
- std::unique_ptr<NewAudioConferenceMixer> mixer(
- NewAudioConferenceMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
std::vector<MockMixerAudioSource> participants(num_audio_sources);
for (int i = 0; i < num_audio_sources; i++) {
@@ -112,13 +111,10 @@
TEST(AudioMixer, AnonymousAndNamed) {
// Should not matter even if partipants are more than
// kMaximumAmountOfMixedAudioSources.
- constexpr int kNamed =
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources + 1;
- constexpr int kAnonymous =
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources + 1;
+ constexpr int kNamed = AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
+ constexpr int kAnonymous = AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
- std::unique_ptr<NewAudioConferenceMixer> mixer(
- NewAudioConferenceMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
MockMixerAudioSource named[kNamed];
MockMixerAudioSource anonymous[kAnonymous];
@@ -165,10 +161,9 @@
TEST(AudioMixer, LargestEnergyVadActiveMixed) {
constexpr int kAudioSources =
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources + 3;
+ AudioMixer::kMaximumAmountOfMixedAudioSources + 3;
- std::unique_ptr<NewAudioConferenceMixer> mixer(
- NewAudioConferenceMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
MockMixerAudioSource participants[kAudioSources];
@@ -197,8 +192,7 @@
for (int i = 0; i < kAudioSources; ++i) {
bool is_mixed = participants[i].IsMixed();
if (i == kAudioSources - 1 ||
- i < kAudioSources - 1 -
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources) {
+ i < kAudioSources - 1 - AudioMixer::kMaximumAmountOfMixedAudioSources) {
EXPECT_FALSE(is_mixed) << "Mixing status of AudioSource #" << i
<< " wrong.";
} else {
@@ -209,8 +203,7 @@
}
TEST(AudioMixer, ParticipantSampleRate) {
- std::unique_ptr<NewAudioConferenceMixer> mixer(
- NewAudioConferenceMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
MockMixerAudioSource participant;
ResetFrame(participant.fake_frame());
@@ -225,8 +218,7 @@
}
TEST(AudioMixer, ParticipantNumberOfChannels) {
- std::unique_ptr<NewAudioConferenceMixer> mixer(
- NewAudioConferenceMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
MockMixerAudioSource participant;
ResetFrame(participant.fake_frame());
@@ -243,8 +235,7 @@
// Test that the volume is reported as zero when the mixer input
// comprises only zero values.
TEST(AudioMixer, LevelIsZeroWhenMixingZeroes) {
- std::unique_ptr<NewAudioConferenceMixer> mixer(
- NewAudioConferenceMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
MockMixerAudioSource participant;
ResetFrame(participant.fake_frame());
@@ -263,8 +254,7 @@
// Test that the reported volume is maximal when the mixer
// input comprises frames with maximal values.
TEST(AudioMixer, LevelIsMaximalWhenMixingMaximalValues) {
- std::unique_ptr<NewAudioConferenceMixer> mixer(
- NewAudioConferenceMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
MockMixerAudioSource participant;
ResetFrame(participant.fake_frame());
@@ -296,10 +286,9 @@
// another participant with higher energy is added.
TEST(AudioMixer, RampedOutSourcesShouldNotBeMarkedMixed) {
constexpr int kAudioSources =
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources + 1;
+ AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
- std::unique_ptr<NewAudioConferenceMixer> mixer(
- NewAudioConferenceMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
MockMixerAudioSource participants[kAudioSources];
for (int i = 0; i < kAudioSources; i++) {
@@ -350,7 +339,7 @@
TEST(AudioMixer, MutedShouldMixAfterUnmuted) {
constexpr int kAudioSources =
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources + 1;
+ AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
std::vector<AudioFrame> frames(kAudioSources);
for (auto& frame : frames) {
@@ -368,7 +357,7 @@
TEST(AudioMixer, PassiveShouldMixAfterNormal) {
constexpr int kAudioSources =
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources + 1;
+ AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
std::vector<AudioFrame> frames(kAudioSources);
for (auto& frame : frames) {
@@ -386,7 +375,7 @@
TEST(AudioMixer, ActiveShouldMixBeforeLoud) {
constexpr int kAudioSources =
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources + 1;
+ AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
std::vector<AudioFrame> frames(kAudioSources);
for (auto& frame : frames) {
@@ -406,7 +395,7 @@
TEST(AudioMixer, UnmutedShouldMixBeforeLoud) {
constexpr int kAudioSources =
- NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources + 1;
+ AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
std::vector<AudioFrame> frames(kAudioSources);
for (auto& frame : frames) {