From bd8b71a02af9b34a7359ad87ad3559692ecbe6f5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Nov 2014 11:05:01 -0800 Subject: [PATCH] complete handling of local audio loopback --- interface/src/Audio.cpp | 22 +++++++++++++++---- libraries/audio/src/AudioScriptingInterface.h | 4 ---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 4bd9f35887..3039b7adfb 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -184,9 +184,9 @@ QAudioDeviceInfo getNamedAudioDeviceForMode(QAudio::Mode mode, const QString& de QAudioDeviceInfo::defaultOutputDevice(); #else foreach(QAudioDeviceInfo audioDevice, QAudioDeviceInfo::availableDevices(mode)) { - qDebug() << audioDevice.deviceName() << " " << deviceName; if (audioDevice.deviceName().trimmed() == deviceName.trimmed()) { result = audioDevice; + break; } } #endif @@ -1332,9 +1332,21 @@ void Audio::startDrumSound(float volume, float frequency, float duration, float } void Audio::handleAudioByteArray(const QByteArray& audioByteArray, const AudioInjectorOptions& injectorOptions) { - // TODO: either create a new audio device (up to the limit of the sound card or a hard limit) - // or send to the mixer and use delayed loopback - + if (audioByteArray.size() > 0) { + QAudioFormat localFormat = _outputFormat; + + if (!injectorOptions.isStereo()) { + localFormat.setChannelCount(1); + } + + QAudioOutput* localSoundOutput = new QAudioOutput(getNamedAudioDeviceForMode(QAudio::AudioOutput, _outputAudioDeviceName), localFormat, this); + + QIODevice* localIODevice = localSoundOutput->start(); + qDebug() << "Writing" << audioByteArray.size() << "to" << localIODevice; + localIODevice->write(audioByteArray); + } else { + qDebug() << "Audio::handleAudioByteArray called with an empty byte array. Sound is likely still downloading."; + } } void Audio::renderToolBox(int x, int y, bool boxed) { @@ -1904,6 +1916,7 @@ bool Audio::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { } } } + return supportedFormat; } @@ -1962,6 +1975,7 @@ bool Audio::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo) supportedFormat = true; } } + return supportedFormat; } diff --git a/libraries/audio/src/AudioScriptingInterface.h b/libraries/audio/src/AudioScriptingInterface.h index 709b82323c..5cd0f9e99a 100644 --- a/libraries/audio/src/AudioScriptingInterface.h +++ b/libraries/audio/src/AudioScriptingInterface.h @@ -18,8 +18,6 @@ #include "AudioInjector.h" #include "Sound.h" -class AbstractAudioInterface; - const AudioInjectorOptions DEFAULT_INJECTOR_OPTIONS; class AudioScriptingInterface : public QObject { @@ -46,7 +44,5 @@ private: AudioScriptingInterface(); QList< QPointer > _activeInjectors; AbstractAudioInterface* _localLoopbackInterface; - - }; #endif // hifi_AudioScriptingInterface_h