Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions Plugin~/WebRTCPlugin/Context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,11 +244,10 @@ namespace webrtc

rtc::scoped_refptr<AudioSourceInterface> Context::CreateAudioSource()
{
// avoid optimization specially for voice
cricket::AudioOptions audioOptions;
audioOptions.auto_gain_control = false;
audioOptions.noise_suppression = false;
audioOptions.noise_suppression = true;
audioOptions.highpass_filter = false;
audioOptions.auto_gain_control = true;
return UnityAudioTrackSource::Create(audioOptions);
}

Expand Down
35 changes: 35 additions & 0 deletions Plugin~/WebRTCPlugin/UnityAudioTrackSource.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "pch.h"

#include <common_audio/include/audio_util.h>
#include <modules/audio_processing/include/audio_processing.h>
#include <rtc_base/ref_counted_object.h>

#include "UnityAudioTrackSource.h"
Expand Down Expand Up @@ -68,6 +69,16 @@ namespace webrtc

while (_convertedAudioData.size() >= nNumSamplesFor10ms)
{
if (_audioProcessing)
{
StreamConfig streamConfig(nSampleRate, nNumChannels);
_audioProcessing->ProcessStream(
_convertedAudioData.data(),
streamConfig,
streamConfig,
_convertedAudioData.data());
}

for (auto sink : _arrSink)
sink->OnData(_convertedAudioData.data(), nBitPerSample, nSampleRate, nNumChannels, nNumFramesFor10ms);
_convertedAudioData.erase(_convertedAudioData.begin(), _convertedAudioData.begin() + nNumSamplesFor10ms);
Expand All @@ -78,6 +89,30 @@ namespace webrtc
UnityAudioTrackSource::UnityAudioTrackSource(const cricket::AudioOptions& audio_options)
: _options(audio_options)
{
// Build and configure the APM so that the options are actually applied.
// cricket::AudioOptions are stored as metadata by LocalAudioSource but are
// never wired into any real processing — PushAudioData() bypasses the WebRTC
// voice engine entirely, so we must drive the APM ourselves here.
AudioProcessing::Config apmConfig;

apmConfig.noise_suppression.enabled =
audio_options.noise_suppression.value_or(true);
apmConfig.noise_suppression.level =
AudioProcessing::Config::NoiseSuppression::kHigh;

apmConfig.gain_controller1.enabled =
audio_options.auto_gain_control.value_or(true);
apmConfig.gain_controller1.mode =
AudioProcessing::Config::GainController1::kAdaptiveDigital;

apmConfig.high_pass_filter.enabled =
audio_options.highpass_filter.value_or(false);

apmConfig.echo_canceller.enabled =
audio_options.echo_cancellation.value_or(false);

_audioProcessing = AudioProcessingBuilder().Create();
_audioProcessing->ApplyConfig(apmConfig);
}

UnityAudioTrackSource::~UnityAudioTrackSource() { }
Expand Down
2 changes: 2 additions & 0 deletions Plugin~/WebRTCPlugin/UnityAudioTrackSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <mutex>

#include <api/media_stream_interface.h>
#include <modules/audio_processing/include/audio_processing.h>
#include <pc/local_audio_source.h>

namespace unity
Expand Down Expand Up @@ -34,6 +35,7 @@ namespace webrtc
std::vector<AudioTrackSinkInterface*> _arrSink;
std::mutex _mutex;
cricket::AudioOptions _options;
rtc::scoped_refptr<AudioProcessing> _audioProcessing;
int _sampleRate = 0;
size_t _numChannels = 0;
size_t _numFrames = 0;
Expand Down