first cut at local audio spatialization working

This commit is contained in:
ZappoMan 2014-04-15 19:57:37 -07:00
parent 523cc4bdfe
commit a46d3fd254
4 changed files with 36 additions and 20 deletions

View file

@ -404,17 +404,6 @@ void Audio::handleAudioInput() {
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 this person wants local loopback add that to the locally injected audio
@ -575,6 +564,26 @@ void Audio::handleAudioInput() {
_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) {
processProceduralAudio(monoAudioSamples, NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL);
}

View file

@ -224,7 +224,7 @@ void AudioReflector::injectAudiblePoint(const AudiblePoint& audiblePoint,
_audio->addSpatialAudioToBuffer(sampleTimeRight, attenuatedRightSamples, totalNumberOfSamples);
}
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) {

View file

@ -423,6 +423,10 @@ Menu::Menu() :
Qt::CTRL | Qt::SHIFT | Qt::Key_X,
true);
addCheckableActionToQMenuAndActionHash(spatialAudioMenu, MenuOption::AudioSpatialProcessingProcessLocalAudio,
Qt::CTRL | Qt::SHIFT | Qt::Key_A,
true);
addActionToQMenuAndActionHash(developerMenu, MenuOption::PasteToVoxel,
Qt::CTRL | Qt::SHIFT | Qt::Key_V,
this,

View file

@ -237,15 +237,18 @@ namespace MenuOption {
const QString Atmosphere = "Atmosphere";
const QString AudioNoiseReduction = "Audio Noise Reduction";
const QString AudioToneInjection = "Inject Test Tone";
const QString AudioSpatialProcessing = "Audio Spatial Processing";
const QString AudioSpatialProcessingIncudeOriginal = "Audio Spatial Processing includes Original";
const QString AudioSpatialProcessingSeparateEars = "Audio Spatial Processing separates ears";
const QString AudioSpatialProcessingPreDelay = "Audio Spatial Processing add Pre-Delay";
const QString AudioSpatialProcessingStereoSource = "Audio Spatial Processing Stereo Source";
const QString AudioSpatialProcessingHeadOriented = "Audio Spatial Processing Head Oriented";
const QString AudioSpatialProcessingWithDiffusions = "Audio Spatial Processing With Diffusions";
const QString AudioSpatialProcessingRenderPaths = "Audio Spatial Processing Render Paths";
const QString AudioSpatialProcessingSlightlyRandomSurfaces = "Audio Spatial Processing Slightly Random Surfaces";
const QString AudioSpatialProcessingHeadOriented = "Head Oriented";
const QString AudioSpatialProcessingIncudeOriginal = "Includes Network Original";
const QString AudioSpatialProcessingPreDelay = "Add Pre-Delay";
const QString AudioSpatialProcessingProcessLocalAudio = "Process Local Audio";
const QString AudioSpatialProcessingRenderPaths = "Render Paths";
const QString AudioSpatialProcessingSeparateEars = "Separate Ears";
const QString AudioSpatialProcessingSlightlyRandomSurfaces = "Slightly Random Surfaces";
const QString AudioSpatialProcessingStereoSource = "Stereo Source";
const QString AudioSpatialProcessingWithDiffusions = "With Diffusions";
const QString Avatars = "Avatars";
const QString Bandwidth = "Bandwidth Display";
const QString BandwidthDetails = "Bandwidth Details";