From 8abe8b987944a18c2ef71c9db12b3caf6bd527d5 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 5 Dec 2017 18:22:14 -0800 Subject: [PATCH] move save logic to audioclient --- interface/src/scripting/Audio.cpp | 19 ++----------------- interface/src/scripting/Audio.h | 2 -- libraries/audio-client/src/AudioClient.cpp | 21 +++++++++++++++++++-- libraries/audio-client/src/AudioClient.h | 6 ++++++ 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/interface/src/scripting/Audio.cpp b/interface/src/scripting/Audio.cpp index 0d0a845a7a..be9b4280f7 100644 --- a/interface/src/scripting/Audio.cpp +++ b/interface/src/scripting/Audio.cpp @@ -58,19 +58,9 @@ Audio::Audio() : _devices(_contextIsHMD) { enableNoiseReduction(enableNoiseReductionSetting.get()); } -void Audio::onOutputBufferReceived(const QByteArray outputBuffer) { - _audioFileWav.addRawAudioChunk((char*)outputBuffer.data(), outputBuffer.size()); -} - bool Audio::startRecording(const QString& filepath) { auto client = DependencyManager::get().data(); - if (!_audioFileWav.create(client->getOutputFormat(), filepath)) { - qDebug() << "Error creating audio file: "+filepath; - return false; - } - connect(client, &AudioClient::outputBufferReceived, this, &Audio::onOutputBufferReceived); - client->setRecording(true); - return true; + return client->startRecording(filepath); } bool Audio::getRecording() { @@ -80,12 +70,7 @@ bool Audio::getRecording() { void Audio::stopRecording() { auto client = DependencyManager::get().data(); - disconnect(client, &AudioClient::outputBufferReceived, this, 0); - - if (client->getRecording()) { - client->setRecording(false); - _audioFileWav.close(); - } + client->stopRecording(); } void Audio::setMuted(bool isMuted) { diff --git a/interface/src/scripting/Audio.h b/interface/src/scripting/Audio.h index dbedb99a0d..0f0043510c 100644 --- a/interface/src/scripting/Audio.h +++ b/interface/src/scripting/Audio.h @@ -76,7 +76,6 @@ private slots: void onNoiseReductionChanged(); void onInputVolumeChanged(float volume); void onInputLoudnessChanged(float loudness); - void onOutputBufferReceived(const QByteArray outputBuffer); protected: // Audio must live on a separate thread from AudioClient to avoid deadlocks @@ -91,7 +90,6 @@ private: bool _contextIsHMD { false }; AudioDevices* getDevices() { return &_devices; } AudioDevices _devices; - AudioFileWav _audioFileWav; }; }; diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 7524641f37..af86499101 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -79,6 +79,7 @@ Setting::Handle staticJitterBufferFrames("staticJitterBufferFrames", using Mutex = std::mutex; using Lock = std::unique_lock; Mutex _deviceMutex; +Mutex _recordMutex; // thread-safe QList getAvailableDevices(QAudio::Mode mode) { @@ -1910,8 +1911,8 @@ qint64 AudioClient::AudioOutputIODevice::readData(char * data, qint64 maxSize) { // send output buffer for recording if (_audio->_isRecording) { - QByteArray outputBuffer(reinterpret_cast(scratchBuffer), bytesWritten); - emit _audio->outputBufferReceived(outputBuffer); + Lock lock(_recordMutex); + _audio->_audioFileWav.addRawAudioChunk(reinterpret_cast(scratchBuffer), bytesWritten); } @@ -1926,6 +1927,22 @@ qint64 AudioClient::AudioOutputIODevice::readData(char * data, qint64 maxSize) { return bytesWritten; } +bool AudioClient::startRecording(const QString& filepath) { + if (!_audioFileWav.create(_outputFormat, filepath)) { + qDebug() << "Error creating audio file: " + filepath; + return false; + } + _isRecording = true; + return true; +} + +void AudioClient::stopRecording() { + if (_isRecording) { + _isRecording = false; + _audioFileWav.close(); + } +} + void AudioClient::loadSettings() { _receivedAudioStream.setDynamicJitterBufferEnabled(dynamicJitterBufferEnabled.get()); _receivedAudioStream.setStaticJitterBufferFrames(staticJitterBufferFrames.get()); diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 5ec85aab0f..0ceb9c4dc3 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -161,6 +161,10 @@ public: void setRecording(bool isRecording) { _isRecording = isRecording; }; bool getRecording() { return _isRecording; }; + bool startRecording(const QString& filename); + void stopRecording(); + + #ifdef Q_OS_WIN static QString getWinDeviceName(wchar_t* guid); #endif @@ -402,6 +406,8 @@ private: QList _inputDevices; QList _outputDevices; + AudioFileWav _audioFileWav; + bool _hasReceivedFirstPacket { false }; QVector _activeLocalAudioInjectors;