From 83529c1fed313ebee6c7fed182cf097cb7dd672e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 11 Nov 2014 14:45:33 -0800 Subject: [PATCH] fix QIODevice fail in AudioInjector by passing explicit size --- interface/src/Audio.cpp | 6 +++-- interface/src/Audio.h | 6 +---- libraries/audio/src/AbstractAudioInterface.h | 2 +- libraries/audio/src/AudioInjector.cpp | 25 +++++++++++++------- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 58c3972bcb..8fecb4ee8e 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -1334,11 +1334,13 @@ void Audio::startDrumSound(float volume, float frequency, float duration, float _drumSoundSample = 0; } -QIODevice* Audio::newLocalOutputDevice(bool isStereo) { +QIODevice* Audio::newLocalOutputDevice(bool isStereo, int numBytes, QObject* injector) { QAudioFormat localFormat = _desiredOutputFormat; localFormat.setChannelCount(isStereo ? 2 : 1); + QAudioOutput* localOutput = new QAudioOutput(getNamedAudioDeviceForMode(QAudio::AudioOutput, _outputAudioDeviceName), - localFormat); + localFormat, this); + localOutput->setBufferSize(numBytes); return localOutput->start(); } diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 83688cf84a..460be0a567 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -155,7 +155,7 @@ public slots: void selectAudioFilterBassCut(); void selectAudioFilterSmiley(); - virtual QIODevice* newLocalOutputDevice(bool isStereo); + virtual QIODevice* newLocalOutputDevice(bool isStereo, int numBytes, QObject* injector); void sendDownstreamAudioStatsPacket(); @@ -256,10 +256,6 @@ private: float _iconColor; qint64 _iconPulseTimeReference; - /// Audio callback in class context. - inline void performIO(int16_t* inputLeft, int16_t* outputLeft, int16_t* outputRight); - - bool _processSpatialAudio; /// Process received audio by spatial audio hooks unsigned int _spatialAudioStart; /// Start of spatial audio interval (in sample rate time base) unsigned int _spatialAudioFinish; /// End of spatial audio interval (in sample rate time base) diff --git a/libraries/audio/src/AbstractAudioInterface.h b/libraries/audio/src/AbstractAudioInterface.h index e413bfc8f1..5b42108430 100644 --- a/libraries/audio/src/AbstractAudioInterface.h +++ b/libraries/audio/src/AbstractAudioInterface.h @@ -25,7 +25,7 @@ public: virtual void startCollisionSound(float magnitude, float frequency, float noise, float duration, bool flashScreen) = 0; virtual void startDrumSound(float volume, float frequency, float duration, float decay) = 0; public slots: - virtual QIODevice* newLocalOutputDevice(bool isStereo) = 0; + virtual QIODevice* newLocalOutputDevice(bool isStereo, int numBytes, QObject* injector) = 0; }; Q_DECLARE_METATYPE(AbstractAudioInterface*) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 9b2720b90c..e83cd5350a 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -71,18 +71,27 @@ void AudioInjector::injectLocally() { QIODevice* localBuffer = NULL; - QMetaObject::invokeMethod(_localAudioInterface, "newLocalOutputDevice", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QIODevice*, localBuffer), - Q_ARG(bool, _options.stereo)); + const QByteArray& soundByteArray = _sound->getByteArray(); - if (localBuffer) { - // immediately write the byte array to the local device - localBuffer->write(_sound->getByteArray()); + if (soundByteArray.size() > 0) { + QMetaObject::invokeMethod(_localAudioInterface, "newLocalOutputDevice", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QIODevice*, localBuffer), + Q_ARG(bool, _options.stereo), + Q_ARG(int, soundByteArray.size()), + Q_ARG(QObject*, this)); + + if (localBuffer) { + // immediately write the byte array to the local device + qDebug() << "Writing" << localBuffer->write(soundByteArray) << "bytes to local audio device"; + } else { + qDebug() << "AudioInjector::injectLocally did not get a valid QIODevice from _localAudioInterface"; + } } else { - qDebug() << "AudioInject::injectLocally did not get a valid QIODevice from _localAudioInterface"; + qDebug() << "AudioInjector::injectLocally called without any data in Sound QByteArray"; } + } else { - qDebug() << "AudioInject::injectLocally cannot inject locally with no local audio interface present."; + qDebug() << "AudioInjector::injectLocally cannot inject locally with no local audio interface present."; } }