18 #include <QtCore/QObject>
19 #include <QtCore/QSharedPointer>
20 #include <QtNetwork/QNetworkReply>
21 #include <QtCore/QSharedPointer>
23 #include <ResourceCache.h>
24 #include <ScriptValue.h>
26 #include "AudioConstants.h"
30 using AudioDataPointer = std::shared_ptr<const AudioData>;
32 Q_DECLARE_METATYPE(AudioDataPointer);
39 using AudioSample = AudioConstants::AudioSample;
42 static AudioDataPointer make(uint32_t numSamples, uint32_t numChannels,
43 const AudioSample* samples);
45 uint32_t getNumSamples()
const {
return _numSamples; }
46 uint32_t getNumChannels()
const {
return _numChannels; }
47 const AudioSample* data()
const {
return _data; }
48 const char* rawData()
const {
return reinterpret_cast<const char*
>(_data); }
50 float isStereo()
const {
return _numChannels == 2; }
51 float isAmbisonic()
const {
return _numChannels == 4; }
52 float getDuration()
const {
return (
float)_numSamples / (_numChannels * AudioConstants::SAMPLE_RATE); }
53 uint32_t getNumFrames()
const {
return _numSamples / _numChannels; }
54 uint32_t getNumBytes()
const {
return _numSamples *
sizeof(AudioSample); }
57 AudioData(uint32_t numSamples, uint32_t numChannels,
const AudioSample* samples);
59 const uint32_t _numSamples { 0 };
60 const uint32_t _numChannels { 0 };
61 const AudioSample*
const _data {
nullptr };
68 Sound(
const QUrl& url,
bool isStereo =
false,
bool isAmbisonic =
false);
69 Sound(
const Sound& other) :
Resource(other), _audioData(other._audioData), _numChannels(other._numChannels) {}
71 bool isReady()
const {
return (
bool)_audioData; }
73 bool isStereo()
const {
return _audioData ? _audioData->isStereo() :
false; }
74 bool isAmbisonic()
const {
return _audioData ? _audioData->isAmbisonic() :
false; }
75 float getDuration()
const {
return _audioData ? _audioData->getDuration() : 0.0f; }
77 AudioDataPointer getAudioData()
const {
return _audioData; }
79 int getNumChannels()
const {
return _numChannels; }
85 void soundProcessSuccess(AudioDataPointer audioData);
86 void soundProcessError(
int error, QString str);
89 virtual void downloadFinished(
const QByteArray& data)
override;
91 AudioDataPointer _audioData;
94 int _numChannels { 0 };
97 class SoundProcessor :
public QObject,
public QRunnable {
101 struct AudioProperties {
102 uint8_t numChannels { 0 };
103 uint32_t sampleRate { 0 };
106 SoundProcessor(QWeakPointer<Resource> sound, QByteArray data);
108 virtual void run()
override;
110 QByteArray downSample(
const QByteArray& rawAudioByteArray,
111 AudioProperties properties);
112 AudioProperties interpretAsWav(
const QByteArray& inputAudioByteArray,
113 QByteArray& outputAudioByteArray);
114 AudioProperties interpretAsMP3(
const QByteArray& inputAudioByteArray,
115 QByteArray& outputAudioByteArray);
118 void onSuccess(AudioDataPointer audioData);
119 void onError(
int error, QString str);
122 const QWeakPointer<Resource> _sound;
123 const QByteArray _data;
126 typedef QSharedPointer<Sound> SharedSoundPointer;
150 class SoundScriptingInterface :
public QObject {
153 Q_PROPERTY(
bool downloaded READ isReady)
154 Q_PROPERTY(
float duration READ getDuration)
157 SoundScriptingInterface(
const SharedSoundPointer& sound);
158 const SharedSoundPointer& getSound() {
return _sound; }
160 bool isReady()
const {
return _sound ? _sound->isReady() :
false; }
161 float getDuration() {
return _sound ? _sound->getDuration() : 0.0f; }
172 SharedSoundPointer _sound;
175 Q_DECLARE_METATYPE(SharedSoundPointer)
177 bool soundSharedPointerFromScriptValue(
const ScriptValue&
object, SharedSoundPointer& out);
Base class for resources.
Definition: ResourceCache.h:409
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40