More audio fixes.

This commit is contained in:
matsukaze 2014-04-04 16:09:25 -07:00
parent 836fda2c05
commit 33718684e6
3 changed files with 30 additions and 32 deletions

View file

@ -623,9 +623,9 @@ unsigned int Audio::timeValToSampleTick(const quint64 time, int sampleRate) {
return sample; return sample;
} }
void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, const AudioRingBuffer& spatialAudio) { void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, QByteArray& spatialAudio, unsigned int numSamples) {
// Calculate the number of remaining samples available, the source spatial audio buffer will get // Calculate the number of remaining samples available. The source spatial audio buffer will get
// clipped if there are insufficient samples available in the accumulation buffer. // clipped if there are insufficient samples available in the accumulation buffer.
unsigned int remaining = _spatialAudioRingBuffer.getSampleCapacity() - _spatialAudioRingBuffer.samplesAvailable(); unsigned int remaining = _spatialAudioRingBuffer.getSampleCapacity() - _spatialAudioRingBuffer.samplesAvailable();
@ -635,9 +635,9 @@ void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, const AudioRingBuff
// Nothing in the spatial audio ring buffer yet // Nothing in the spatial audio ring buffer yet
// Just do a straight copy, clipping if necessary // Just do a straight copy, clipping if necessary
unsigned int sampleCt = (remaining < spatialAudio.samplesAvailable()) ? remaining : spatialAudio.samplesAvailable(); unsigned int sampleCt = (remaining < numSamples) ? remaining : numSamples;
if (sampleCt) { if (sampleCt) {
_spatialAudioRingBuffer.writeSamples(spatialAudio.getNextOutput(), sampleCt); _spatialAudioRingBuffer.writeSamples((int16_t*)spatialAudio.data(), sampleCt);
} }
_spatialAudioFinish = _spatialAudioStart + sampleCt / _desiredOutputFormat.channelCount(); _spatialAudioFinish = _spatialAudioStart + sampleCt / _desiredOutputFormat.channelCount();
@ -654,35 +654,37 @@ void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, const AudioRingBuff
// Recalculate the number of remaining samples // Recalculate the number of remaining samples
remaining -= silentCt; remaining -= silentCt;
unsigned int sampleCt = (remaining < spatialAudio.samplesAvailable()) ? remaining : spatialAudio.samplesAvailable(); unsigned int sampleCt = (remaining < numSamples) ? remaining : numSamples;
// Copy the new spatial audio to the accumulation ring buffer // Copy the new spatial audio to the accumulation ring buffer
if (sampleCt) { if (sampleCt) {
_spatialAudioRingBuffer.writeSamples(spatialAudio.getNextOutput(), sampleCt); _spatialAudioRingBuffer.writeSamples((int16_t*)spatialAudio.data(), sampleCt);
} }
_spatialAudioFinish += (sampleCt + silentCt) / _desiredOutputFormat.channelCount(); _spatialAudioFinish += (sampleCt + silentCt) / _desiredOutputFormat.channelCount();
} }
} else { } else {
// There is overlap between the spatial audio buffer and the new sample, // There is overlap between the spatial audio buffer and the new sample,
// acumulate the overlap // acumulate the overlap
// Calculate the offset from the buffer's current read position, which should be located at _spatialAudioStart
unsigned int offset = (sampleTime - _spatialAudioStart) * _desiredOutputFormat.channelCount(); unsigned int offset = (sampleTime - _spatialAudioStart) * _desiredOutputFormat.channelCount();
unsigned int accumulationCt = (_spatialAudioFinish - sampleTime) * _desiredOutputFormat.channelCount(); unsigned int accumulationCt = (_spatialAudioFinish - sampleTime) * _desiredOutputFormat.channelCount();
accumulationCt = (accumulationCt < spatialAudio.samplesAvailable()) ? accumulationCt : spatialAudio.samplesAvailable(); accumulationCt = (accumulationCt < numSamples) ? accumulationCt : numSamples;
int16_t* spatial = reinterpret_cast<int16_t*>(spatialAudio.data());
int j = 0; int j = 0;
for (int i = accumulationCt; --i >= 0; j++) { for (int i = accumulationCt; --i >= 0; j++) {
int tmp = _spatialAudioRingBuffer[j + offset] + spatialAudio[j]; int tmp = _spatialAudioRingBuffer[j + offset] + spatial[j];
_spatialAudioRingBuffer[j + offset] = _spatialAudioRingBuffer[j + offset] =
static_cast<int16_t>(glm::clamp<int>(tmp, std::numeric_limits<short>::min(), std::numeric_limits<short>::max())); static_cast<int16_t>(glm::clamp<int>(tmp, std::numeric_limits<short>::min(), std::numeric_limits<short>::max()));
} }
// Copy the remaining unoverlapped spatial audio to the accumulation buffer, if any // Copy the remaining unoverlapped spatial audio to the accumulation buffer, if any
unsigned int sampleCt = spatialAudio.samplesAvailable() - accumulationCt; unsigned int sampleCt = numSamples - accumulationCt;
sampleCt = (remaining < sampleCt) ? remaining : sampleCt; sampleCt = (remaining < sampleCt) ? remaining : sampleCt;
if (sampleCt) { if (sampleCt) {
_spatialAudioRingBuffer.writeSamples(spatialAudio.getNextOutput() + accumulationCt, sampleCt); _spatialAudioRingBuffer.writeSamples((int16_t*)spatialAudio.data() + accumulationCt, sampleCt);
_spatialAudioFinish += sampleCt / _desiredOutputFormat.channelCount(); _spatialAudioFinish += sampleCt / _desiredOutputFormat.channelCount();
} }
} }
@ -737,23 +739,29 @@ void Audio::processReceivedAudio(unsigned int sampleTime, AudioRingBuffer& ringB
//qDebug() << "pushing " << numNetworkOutputSamples; //qDebug() << "pushing " << numNetworkOutputSamples;
ringBuffer.setIsStarved(false); ringBuffer.setIsStarved(false);
int16_t* ringBufferSamples= new int16_t[numNetworkOutputSamples]; int16_t* ringBufferSamples = new int16_t[numNetworkOutputSamples];
if (_processSpatialAudio) { if (_processSpatialAudio) {
unsigned int sampleTime = _spatialAudioStart; unsigned int sampleTime = _spatialAudioStart;
QByteArray buffer;
buffer.resize(numDeviceOutputSamples * sizeof(int16_t));
ringBuffer.readSamples((int16_t*)buffer.data(), numDeviceOutputSamples);
// Accumulate direct transmission of audio from sender to receiver // Accumulate direct transmission of audio from sender to receiver
addSpatialAudioToBuffer(sampleTime, ringBuffer); addSpatialAudioToBuffer(sampleTime, buffer, numNetworkOutputSamples);
//addSpatialAudioToBuffer(sampleTime + 48000, ringBuffer); //addSpatialAudioToBuffer(sampleTime + 48000, ringBuffer);
// Send audio off for spatial processing // Send audio off for spatial processing
emit processSpatialAudio(sampleTime, QByteArray((char*)ringBuffer.getBuffer(), numNetworkOutputSamples), _desiredOutputFormat); emit processSpatialAudio(sampleTime, buffer, _desiredOutputFormat);
// copy the samples we'll resample from the spatial audio ring buffer - this also // copy the samples we'll resample from the spatial audio ring buffer - this also
// pushes the read pointer of the spatial audio ring buffer forwards // pushes the read pointer of the spatial audio ring buffer forwards
_spatialAudioRingBuffer.readSamples(ringBufferSamples, numNetworkOutputSamples); _spatialAudioRingBuffer.readSamples(ringBufferSamples, numNetworkOutputSamples);
int samples = ringBuffer.samplesAvailable();
_spatialAudioStart += samples / _desiredOutputFormat.channelCount(); // Advance the start point for the next packet of audio to arrive
_spatialAudioStart += numNetworkOutputSamples;
ringBuffer.reset(); // Advance the read position by the same amount
//ringBuffer.shiftReadPosition(numNetworkOutputSamples);
} else { } else {

View file

@ -78,7 +78,7 @@ public slots:
void start(); void start();
void stop(); void stop();
void addReceivedAudioToBuffer(const QByteArray& audioByteArray); void addReceivedAudioToBuffer(const QByteArray& audioByteArray);
void addSpatialAudioToBuffer(unsigned int sampleTime, const AudioRingBuffer& spatialAudio); void addSpatialAudioToBuffer(unsigned int sampleTime, QByteArray& spatialAudio, unsigned int numSamples);
void handleAudioInput(); void handleAudioInput();
void reset(); void reset();
void toggleMute(); void toggleMute();

View file

@ -130,10 +130,6 @@ void AudioReflector::calculateReflections(const glm::vec3& origin, const glm::ve
int16_t* attenuatedLeftSamplesData = (int16_t*)attenuatedLeftSamples.data(); int16_t* attenuatedLeftSamplesData = (int16_t*)attenuatedLeftSamples.data();
int16_t* attenuatedRightSamplesData = (int16_t*)attenuatedRightSamples.data(); int16_t* attenuatedRightSamplesData = (int16_t*)attenuatedRightSamples.data();
AudioRingBuffer attenuatedLeftBuffer(totalNumberOfSamples);
AudioRingBuffer attenuatedRightBuffer(totalNumberOfSamples);
for (int bounceNumber = 1; bounceNumber <= bounces; bounceNumber++) { for (int bounceNumber = 1; bounceNumber <= bounces; bounceNumber++) {
if (_voxels->findRayIntersection(start, direction, elementHit, distance, face)) { if (_voxels->findRayIntersection(start, direction, elementHit, distance, face)) {
glm::vec3 end = start + (direction * (distance * SLIGHTLY_SHORT)); glm::vec3 end = start + (direction * (distance * SLIGHTLY_SHORT));
@ -179,13 +175,8 @@ void AudioReflector::calculateReflections(const glm::vec3& origin, const glm::ve
//qDebug() << "sampleTimeLeft=" << sampleTimeLeft << "sampleTimeRight=" << sampleTimeRight; //qDebug() << "sampleTimeLeft=" << sampleTimeLeft << "sampleTimeRight=" << sampleTimeRight;
attenuatedLeftBuffer.writeSamples(attenuatedLeftSamplesData, totalNumberOfSamples); _audio->addSpatialAudioToBuffer(sampleTimeLeft, attenuatedLeftSamples, totalNumberOfSamples);
attenuatedRightBuffer.writeSamples(attenuatedRightSamplesData, totalNumberOfSamples); _audio->addSpatialAudioToBuffer(sampleTimeRight, attenuatedRightSamples, totalNumberOfSamples);
_audio->addSpatialAudioToBuffer(sampleTimeLeft, attenuatedLeftBuffer);
_audio->addSpatialAudioToBuffer(sampleTimeRight, attenuatedRightBuffer);
attenuatedLeftBuffer.reset();
attenuatedRightBuffer.reset();
} }
} }
} }
@ -195,7 +186,6 @@ void AudioReflector::processSpatialAudio(unsigned int sampleTime, const QByteArr
//qDebug() << "AudioReflector::processSpatialAudio()...sampleTime=" << sampleTime << " threadID=" << QThread::currentThreadId(); //qDebug() << "AudioReflector::processSpatialAudio()...sampleTime=" << sampleTime << " threadID=" << QThread::currentThreadId();
/*
int totalNumberOfSamples = samples.size() / (sizeof(int16_t)); int totalNumberOfSamples = samples.size() / (sizeof(int16_t));
int numFrameSamples = format.sampleRate() * format.channelCount(); int numFrameSamples = format.sampleRate() * format.channelCount();
@ -205,6 +195,7 @@ void AudioReflector::processSpatialAudio(unsigned int sampleTime, const QByteArr
qDebug() << " sizeof(int16_t)=" << sizeof(int16_t); qDebug() << " sizeof(int16_t)=" << sizeof(int16_t);
/*
AudioRingBuffer samplesRingBuffer(totalNumberOfSamples); AudioRingBuffer samplesRingBuffer(totalNumberOfSamples);
qint64 bytesCopied = samplesRingBuffer.writeData(samples.constData(),samples.size()); qint64 bytesCopied = samplesRingBuffer.writeData(samples.constData(),samples.size());
for(int i = 0; i < totalNumberOfSamples; i++) { for(int i = 0; i < totalNumberOfSamples; i++) {
@ -212,8 +203,7 @@ void AudioReflector::processSpatialAudio(unsigned int sampleTime, const QByteArr
} }
qDebug() << " bytesCopied=" << bytesCopied; qDebug() << " bytesCopied=" << bytesCopied;
_audio->addSpatialAudioToBuffer(sampleTime + 12000, samples, totalNumberOfSamples);
_audio->addSpatialAudioToBuffer(sampleTime + 12000, samplesRingBuffer);
return; return;
*/ */