From 32b5ac50204239e6c693107f6fcaf7f464b3a936 Mon Sep 17 00:00:00 2001 From: seefo Date: Thu, 25 May 2017 16:10:53 -0700 Subject: [PATCH] Moved audio asset processing to a separate thread --- libraries/audio/src/Sound.cpp | 37 ++++++++++++++++++++++++----------- libraries/audio/src/Sound.h | 29 +++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index d6607424db..b48ea1fed7 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -13,6 +13,8 @@ #include +#include +#include #include #include #include @@ -53,9 +55,25 @@ Sound::Sound(const QUrl& url, bool isStereo, bool isAmbisonic) : } void Sound::downloadFinished(const QByteArray& data) { + SoundProcessor* soundProcessor = new SoundProcessor(_url, data, this); + QThreadPool::globalInstance()->start(soundProcessor); +} + +void Sound::setReady(bool isReady) { + if (isReady) { + finishedLoading(true); + _isReady = true; + emit ready(); + qCDebug(audio) << "Setting ready state for audio asset" << _url; + } +} + +void SoundProcessor::run() { // replace our byte array with the downloaded data - QByteArray rawAudioByteArray = QByteArray(data); - QString fileName = getURL().fileName().toLower(); + QByteArray rawAudioByteArray = QByteArray(_data); + QString fileName = _url.fileName().toLower(); + + //Sound* sound = dynamic_cast(_sound); static const QString WAV_EXTENSION = ".wav"; static const QString RAW_EXTENSION = ".raw"; @@ -63,28 +81,25 @@ void Sound::downloadFinished(const QByteArray& data) { QByteArray outputAudioByteArray; - int sampleRate = interpretAsWav(rawAudioByteArray, outputAudioByteArray); + int sampleRate = _sound->interpretAsWav(rawAudioByteArray, outputAudioByteArray); if (sampleRate != 0) { - downSample(outputAudioByteArray, sampleRate); + _sound->downSample(outputAudioByteArray, sampleRate); } } else if (fileName.endsWith(RAW_EXTENSION)) { // check if this was a stereo raw file // since it's raw the only way for us to know that is if the file was called .stereo.raw if (fileName.toLower().endsWith("stereo.raw")) { - _isStereo = true; - qCDebug(audio) << "Processing sound of" << rawAudioByteArray.size() << "bytes from" << getURL() << "as stereo audio file."; + _sound->setStereo(true); + qCDebug(audio) << "Processing sound of" << rawAudioByteArray.size() << "bytes from" << _url << "as stereo audio file."; } // Process as 48khz RAW file - downSample(rawAudioByteArray, 48000); + _sound->downSample(rawAudioByteArray, 48000); } else { qCDebug(audio) << "Unknown sound file type"; } - finishedLoading(true); - - _isReady = true; - emit ready(); + _sound->setReady(true); } void Sound::downSample(const QByteArray& rawAudioByteArray, int sampleRate) { diff --git a/libraries/audio/src/Sound.h b/libraries/audio/src/Sound.h index 37d5b40e95..6ec099b071 100644 --- a/libraries/audio/src/Sound.h +++ b/libraries/audio/src/Sound.h @@ -12,6 +12,7 @@ #ifndef hifi_Sound_h #define hifi_Sound_h +#include #include #include #include @@ -28,10 +29,15 @@ public: bool isAmbisonic() const { return _isAmbisonic; } bool isReady() const { return _isReady; } float getDuration() const { return _duration; } - const QByteArray& getByteArray() const { return _byteArray; } + void setStereo(bool stereo) { _isStereo = stereo; } + void setReady(bool ready); + + void downSample(const QByteArray& rawAudioByteArray, int sampleRate); + int interpretAsWav(const QByteArray& inputAudioByteArray, QByteArray& outputAudioByteArray); + signals: void ready(); @@ -42,12 +48,27 @@ private: bool _isReady; float _duration; // In seconds - void downSample(const QByteArray& rawAudioByteArray, int sampleRate); - int interpretAsWav(const QByteArray& inputAudioByteArray, QByteArray& outputAudioByteArray); - virtual void downloadFinished(const QByteArray& data) override; }; +class SoundProcessor : public QObject, public QRunnable { + Q_OBJECT + +public: + SoundProcessor(const QUrl& url, const QByteArray& data, Sound* sound) + : _url(url), _data(data), _sound(sound) + { + } + + virtual void run() override; + +private: + QUrl _url; + QByteArray _data; + Sound* _sound; + +}; + typedef QSharedPointer SharedSoundPointer; class SoundScriptingInterface : public QObject {