mirror of
https://github.com/overte-org/overte.git
synced 2025-04-25 17:35:45 +02:00
first cut at local audio spatialization working
This commit is contained in:
parent
523cc4bdfe
commit
a46d3fd254
4 changed files with 36 additions and 20 deletions
|
@ -404,17 +404,6 @@ void Audio::handleAudioInput() {
|
||||||
|
|
||||||
QByteArray inputByteArray = _inputDevice->readAll();
|
QByteArray inputByteArray = _inputDevice->readAll();
|
||||||
|
|
||||||
// send our local loopback to any interested parties
|
|
||||||
if (_processSpatialAudio && !_muted && _audioOutput) {
|
|
||||||
if (false) {
|
|
||||||
// local audio is sent already resampled to match the output format, so processors
|
|
||||||
// can easily handle the audio in a format ready to post back to the audio device
|
|
||||||
//emit processLocalAudio(_spatialAudioStart, resampledInputByteArray, _outputFormat);
|
|
||||||
} else {
|
|
||||||
emit processLocalAudio(_spatialAudioStart, inputByteArray, _outputFormat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::EchoLocalAudio) && !_muted && _audioOutput) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::EchoLocalAudio) && !_muted && _audioOutput) {
|
||||||
// if this person wants local loopback add that to the locally injected audio
|
// if this person wants local loopback add that to the locally injected audio
|
||||||
|
|
||||||
|
@ -575,6 +564,26 @@ void Audio::handleAudioInput() {
|
||||||
_lastInputLoudness = 0;
|
_lastInputLoudness = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// at this point we have clean monoAudioSamples, which match our target output... this is what we should send
|
||||||
|
// to our interested listeners
|
||||||
|
// send our local loopback to any interested parties
|
||||||
|
if (_processSpatialAudio && !_muted && _audioOutput &&
|
||||||
|
(Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingProcessLocalAudio))) {
|
||||||
|
// local audio is sent already resampled to match the network input format, so processors
|
||||||
|
// can easily handle the audio in a format ready to post back to the audio device
|
||||||
|
const int NUM_CHANNELS = 2;
|
||||||
|
QByteArray stereoInputData;
|
||||||
|
stereoInputData.resize(NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL * NUM_CHANNELS * sizeof(int16_t));
|
||||||
|
int16_t* stereoSamples = (int16_t*)stereoInputData.data();
|
||||||
|
const float LOCAL_SIGNAL_ATTENUATION = 0.125f;
|
||||||
|
for (int i = 0; i < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; i++) {
|
||||||
|
stereoSamples[i* NUM_CHANNELS] = monoAudioSamples[i] * LOCAL_SIGNAL_ATTENUATION;
|
||||||
|
stereoSamples[(i * NUM_CHANNELS) + 1] = monoAudioSamples[i] * LOCAL_SIGNAL_ATTENUATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit processLocalAudio(_spatialAudioStart, stereoInputData, _desiredOutputFormat);
|
||||||
|
}
|
||||||
|
|
||||||
if (_proceduralAudioOutput) {
|
if (_proceduralAudioOutput) {
|
||||||
processProceduralAudio(monoAudioSamples, NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL);
|
processProceduralAudio(monoAudioSamples, NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -224,7 +224,7 @@ void AudioReflector::injectAudiblePoint(const AudiblePoint& audiblePoint,
|
||||||
_audio->addSpatialAudioToBuffer(sampleTimeRight, attenuatedRightSamples, totalNumberOfSamples);
|
_audio->addSpatialAudioToBuffer(sampleTimeRight, attenuatedRightSamples, totalNumberOfSamples);
|
||||||
}
|
}
|
||||||
void AudioReflector::processLocalAudio(unsigned int sampleTime, const QByteArray& samples, const QAudioFormat& format) {
|
void AudioReflector::processLocalAudio(unsigned int sampleTime, const QByteArray& samples, const QAudioFormat& format) {
|
||||||
// nothing yet, but will do local reflections too...
|
echoAudio(sampleTime, samples, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioReflector::processInboundAudio(unsigned int sampleTime, const QByteArray& samples, const QAudioFormat& format) {
|
void AudioReflector::processInboundAudio(unsigned int sampleTime, const QByteArray& samples, const QAudioFormat& format) {
|
||||||
|
|
|
@ -423,6 +423,10 @@ Menu::Menu() :
|
||||||
Qt::CTRL | Qt::SHIFT | Qt::Key_X,
|
Qt::CTRL | Qt::SHIFT | Qt::Key_X,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
|
addCheckableActionToQMenuAndActionHash(spatialAudioMenu, MenuOption::AudioSpatialProcessingProcessLocalAudio,
|
||||||
|
Qt::CTRL | Qt::SHIFT | Qt::Key_A,
|
||||||
|
true);
|
||||||
|
|
||||||
addActionToQMenuAndActionHash(developerMenu, MenuOption::PasteToVoxel,
|
addActionToQMenuAndActionHash(developerMenu, MenuOption::PasteToVoxel,
|
||||||
Qt::CTRL | Qt::SHIFT | Qt::Key_V,
|
Qt::CTRL | Qt::SHIFT | Qt::Key_V,
|
||||||
this,
|
this,
|
||||||
|
|
|
@ -237,15 +237,18 @@ namespace MenuOption {
|
||||||
const QString Atmosphere = "Atmosphere";
|
const QString Atmosphere = "Atmosphere";
|
||||||
const QString AudioNoiseReduction = "Audio Noise Reduction";
|
const QString AudioNoiseReduction = "Audio Noise Reduction";
|
||||||
const QString AudioToneInjection = "Inject Test Tone";
|
const QString AudioToneInjection = "Inject Test Tone";
|
||||||
|
|
||||||
const QString AudioSpatialProcessing = "Audio Spatial Processing";
|
const QString AudioSpatialProcessing = "Audio Spatial Processing";
|
||||||
const QString AudioSpatialProcessingIncudeOriginal = "Audio Spatial Processing includes Original";
|
const QString AudioSpatialProcessingHeadOriented = "Head Oriented";
|
||||||
const QString AudioSpatialProcessingSeparateEars = "Audio Spatial Processing separates ears";
|
const QString AudioSpatialProcessingIncudeOriginal = "Includes Network Original";
|
||||||
const QString AudioSpatialProcessingPreDelay = "Audio Spatial Processing add Pre-Delay";
|
const QString AudioSpatialProcessingPreDelay = "Add Pre-Delay";
|
||||||
const QString AudioSpatialProcessingStereoSource = "Audio Spatial Processing Stereo Source";
|
const QString AudioSpatialProcessingProcessLocalAudio = "Process Local Audio";
|
||||||
const QString AudioSpatialProcessingHeadOriented = "Audio Spatial Processing Head Oriented";
|
const QString AudioSpatialProcessingRenderPaths = "Render Paths";
|
||||||
const QString AudioSpatialProcessingWithDiffusions = "Audio Spatial Processing With Diffusions";
|
const QString AudioSpatialProcessingSeparateEars = "Separate Ears";
|
||||||
const QString AudioSpatialProcessingRenderPaths = "Audio Spatial Processing Render Paths";
|
const QString AudioSpatialProcessingSlightlyRandomSurfaces = "Slightly Random Surfaces";
|
||||||
const QString AudioSpatialProcessingSlightlyRandomSurfaces = "Audio Spatial Processing Slightly Random Surfaces";
|
const QString AudioSpatialProcessingStereoSource = "Stereo Source";
|
||||||
|
const QString AudioSpatialProcessingWithDiffusions = "With Diffusions";
|
||||||
|
|
||||||
const QString Avatars = "Avatars";
|
const QString Avatars = "Avatars";
|
||||||
const QString Bandwidth = "Bandwidth Display";
|
const QString Bandwidth = "Bandwidth Display";
|
||||||
const QString BandwidthDetails = "Bandwidth Details";
|
const QString BandwidthDetails = "Bandwidth Details";
|
||||||
|
|
Loading…
Reference in a new issue