From c31b04af4ccb3a1340fffd0028cf3202e5ff6bdc Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 26 Mar 2014 12:23:08 -0700 Subject: [PATCH 1/2] Fix for Windows initial device selection. --- interface/src/Audio.cpp | 24 ++++++++++++++---------- interface/src/Audio.h | 2 ++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 8bbd1bb35c..67050a5948 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -274,11 +274,11 @@ void Audio::start() { QAudioDeviceInfo inputDeviceInfo = defaultAudioDeviceForMode(QAudio::AudioInput); qDebug() << "The default audio input device is" << inputDeviceInfo.deviceName(); - bool inputFormatSupported = switchInputToAudioDevice(inputDeviceInfo.deviceName()); + bool inputFormatSupported = switchInputToAudioDevice(inputDeviceInfo); QAudioDeviceInfo outputDeviceInfo = defaultAudioDeviceForMode(QAudio::AudioOutput); qDebug() << "The default audio output device is" << outputDeviceInfo.deviceName(); - bool outputFormatSupported = switchOutputToAudioDevice(outputDeviceInfo.deviceName()); + bool outputFormatSupported = switchOutputToAudioDevice(outputDeviceInfo); if (!inputFormatSupported || !outputFormatSupported) { qDebug() << "Unable to set up audio I/O because of a problem with input or output formats."; @@ -298,8 +298,8 @@ QVector Audio::getDeviceNames(QAudio::Mode mode) { return deviceNames; } -bool Audio::switchInputToAudioDevice(const QString& inputDeviceName) { - bool supportedFormat = false; +bool Audio::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { + bool supportedFormat = false; // cleanup any previously initialized device if (_audioInput) { @@ -314,8 +314,6 @@ bool Audio::switchInputToAudioDevice(const QString& inputDeviceName) { _inputAudioDeviceName = ""; } - QAudioDeviceInfo inputDeviceInfo = getNamedAudioDeviceForMode(QAudio::AudioInput, inputDeviceName); - if (!inputDeviceInfo.isNull()) { qDebug() << "The audio input device " << inputDeviceInfo.deviceName() << "is available."; _inputAudioDeviceName = inputDeviceInfo.deviceName().trimmed(); @@ -340,8 +338,8 @@ bool Audio::switchInputToAudioDevice(const QString& inputDeviceName) { return supportedFormat; } -bool Audio::switchOutputToAudioDevice(const QString& outputDeviceName) { - bool supportedFormat = false; +bool Audio::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo) { + bool supportedFormat = false; // cleanup any previously initialized device if (_audioOutput) { @@ -363,8 +361,6 @@ bool Audio::switchOutputToAudioDevice(const QString& outputDeviceName) { _outputAudioDeviceName = ""; } - QAudioDeviceInfo outputDeviceInfo = getNamedAudioDeviceForMode(QAudio::AudioOutput, outputDeviceName); - if (!outputDeviceInfo.isNull()) { qDebug() << "The audio output device " << outputDeviceInfo.deviceName() << "is available."; _outputAudioDeviceName = outputDeviceInfo.deviceName().trimmed(); @@ -391,6 +387,14 @@ bool Audio::switchOutputToAudioDevice(const QString& outputDeviceName) { return supportedFormat; } +bool Audio::switchInputToAudioDevice(const QString& inputDeviceName) { + return switchInputToAudioDevice(getNamedAudioDeviceForMode(QAudio::AudioInput, inputDeviceName)); +} + +bool Audio::switchOutputToAudioDevice(const QString& outputDeviceName) { + return switchOutputToAudioDevice(getNamedAudioDeviceForMode(QAudio::AudioOutput, outputDeviceName)); +} + void Audio::handleAudioInput() { static char monoAudioDataPacket[MAX_PACKET_SIZE]; diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 7aa1ef5afe..cc5313561f 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -168,6 +168,8 @@ private: // Add sounds that we want the user to not hear themselves, by adding on top of mic input signal void addProceduralSounds(int16_t* monoInput, int numSamples); + bool switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo); + bool switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo); }; From c18d0ccf8fbcb35e37a4c4ccc2b6d63972242552 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 26 Mar 2014 12:34:46 -0700 Subject: [PATCH 2/2] Formatting fixes. --- interface/src/Audio.cpp | 178 ++++++++++++++++++++-------------------- interface/src/Audio.h | 4 +- 2 files changed, 91 insertions(+), 91 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 67050a5948..c2d5f535a7 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -298,95 +298,6 @@ QVector Audio::getDeviceNames(QAudio::Mode mode) { return deviceNames; } -bool Audio::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { - bool supportedFormat = false; - - // cleanup any previously initialized device - if (_audioInput) { - _audioInput->stop(); - disconnect(_inputDevice, 0, 0, 0); - _inputDevice = NULL; - - delete _audioInput; - _audioInput = NULL; - _numInputCallbackBytes = 0; - - _inputAudioDeviceName = ""; - } - - if (!inputDeviceInfo.isNull()) { - qDebug() << "The audio input device " << inputDeviceInfo.deviceName() << "is available."; - _inputAudioDeviceName = inputDeviceInfo.deviceName().trimmed(); - - if (adjustedFormatForAudioDevice(inputDeviceInfo, _desiredInputFormat, _inputFormat)) { - qDebug() << "The format to be used for audio input is" << _inputFormat; - - _audioInput = new QAudioInput(inputDeviceInfo, _inputFormat, this); - _numInputCallbackBytes = NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL * _inputFormat.channelCount() - * (_inputFormat.sampleRate() / SAMPLE_RATE) - / CALLBACK_ACCELERATOR_RATIO; - _audioInput->setBufferSize(_numInputCallbackBytes); - - // how do we want to handle input working, but output not working? - _inputRingBuffer.resizeForFrameSize(_numInputCallbackBytes * CALLBACK_ACCELERATOR_RATIO / sizeof(int16_t)); - _inputDevice = _audioInput->start(); - connect(_inputDevice, SIGNAL(readyRead()), this, SLOT(handleAudioInput())); - - supportedFormat = true; - } - } - return supportedFormat; -} - -bool Audio::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo) { - bool supportedFormat = false; - - // cleanup any previously initialized device - if (_audioOutput) { - _audioOutput->stop(); - disconnect(_outputDevice, 0, 0, 0); - _outputDevice = NULL; - - delete _audioOutput; - _audioOutput = NULL; - _numInputCallbackBytes = 0; - - _loopbackOutputDevice = NULL; - delete _loopbackAudioOutput; - _loopbackAudioOutput = NULL; - - _proceduralOutputDevice = NULL; - delete _proceduralAudioOutput; - _proceduralAudioOutput = NULL; - _outputAudioDeviceName = ""; - } - - if (!outputDeviceInfo.isNull()) { - qDebug() << "The audio output device " << outputDeviceInfo.deviceName() << "is available."; - _outputAudioDeviceName = outputDeviceInfo.deviceName().trimmed(); - - if (adjustedFormatForAudioDevice(outputDeviceInfo, _desiredOutputFormat, _outputFormat)) { - qDebug() << "The format to be used for audio output is" << _outputFormat; - - // setup our general output device for audio-mixer audio - _audioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this); - _audioOutput->setBufferSize(_ringBuffer.getSampleCapacity() * sizeof(int16_t)); - qDebug() << "Ring Buffer capacity in samples: " << _ringBuffer.getSampleCapacity(); - _outputDevice = _audioOutput->start(); - - // setup a loopback audio output device - _loopbackAudioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this); - - // setup a procedural audio output device - _proceduralAudioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this); - - gettimeofday(&_lastReceiveTime, NULL); - supportedFormat = true; - } - } - return supportedFormat; -} - bool Audio::switchInputToAudioDevice(const QString& inputDeviceName) { return switchInputToAudioDevice(getNamedAudioDeviceForMode(QAudio::AudioInput, inputDeviceName)); } @@ -882,3 +793,92 @@ void Audio::renderMuteIcon(int x, int y) { glDisable(GL_TEXTURE_2D); } + +bool Audio::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { + bool supportedFormat = false; + + // cleanup any previously initialized device + if (_audioInput) { + _audioInput->stop(); + disconnect(_inputDevice, 0, 0, 0); + _inputDevice = NULL; + + delete _audioInput; + _audioInput = NULL; + _numInputCallbackBytes = 0; + + _inputAudioDeviceName = ""; + } + + if (!inputDeviceInfo.isNull()) { + qDebug() << "The audio input device " << inputDeviceInfo.deviceName() << "is available."; + _inputAudioDeviceName = inputDeviceInfo.deviceName().trimmed(); + + if (adjustedFormatForAudioDevice(inputDeviceInfo, _desiredInputFormat, _inputFormat)) { + qDebug() << "The format to be used for audio input is" << _inputFormat; + + _audioInput = new QAudioInput(inputDeviceInfo, _inputFormat, this); + _numInputCallbackBytes = NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL * _inputFormat.channelCount() + * (_inputFormat.sampleRate() / SAMPLE_RATE) + / CALLBACK_ACCELERATOR_RATIO; + _audioInput->setBufferSize(_numInputCallbackBytes); + + // how do we want to handle input working, but output not working? + _inputRingBuffer.resizeForFrameSize(_numInputCallbackBytes * CALLBACK_ACCELERATOR_RATIO / sizeof(int16_t)); + _inputDevice = _audioInput->start(); + connect(_inputDevice, SIGNAL(readyRead()), this, SLOT(handleAudioInput())); + + supportedFormat = true; + } + } + return supportedFormat; +} + +bool Audio::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo) { + bool supportedFormat = false; + + // cleanup any previously initialized device + if (_audioOutput) { + _audioOutput->stop(); + disconnect(_outputDevice, 0, 0, 0); + _outputDevice = NULL; + + delete _audioOutput; + _audioOutput = NULL; + _numInputCallbackBytes = 0; + + _loopbackOutputDevice = NULL; + delete _loopbackAudioOutput; + _loopbackAudioOutput = NULL; + + _proceduralOutputDevice = NULL; + delete _proceduralAudioOutput; + _proceduralAudioOutput = NULL; + _outputAudioDeviceName = ""; + } + + if (!outputDeviceInfo.isNull()) { + qDebug() << "The audio output device " << outputDeviceInfo.deviceName() << "is available."; + _outputAudioDeviceName = outputDeviceInfo.deviceName().trimmed(); + + if (adjustedFormatForAudioDevice(outputDeviceInfo, _desiredOutputFormat, _outputFormat)) { + qDebug() << "The format to be used for audio output is" << _outputFormat; + + // setup our general output device for audio-mixer audio + _audioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this); + _audioOutput->setBufferSize(_ringBuffer.getSampleCapacity() * sizeof(int16_t)); + qDebug() << "Ring Buffer capacity in samples: " << _ringBuffer.getSampleCapacity(); + _outputDevice = _audioOutput->start(); + + // setup a loopback audio output device + _loopbackAudioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this); + + // setup a procedural audio output device + _proceduralAudioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this); + + gettimeofday(&_lastReceiveTime, NULL); + supportedFormat = true; + } + } + return supportedFormat; +} diff --git a/interface/src/Audio.h b/interface/src/Audio.h index cc5313561f..e1f2762ece 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -168,9 +168,9 @@ private: // Add sounds that we want the user to not hear themselves, by adding on top of mic input signal void addProceduralSounds(int16_t* monoInput, int numSamples); - bool switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo); + bool switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo); bool switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo); }; -#endif /* defined(__interface__audio__) */ \ No newline at end of file +#endif /* defined(__interface__audio__) */