Stereo flag + specific resample in Sound class

This commit is contained in:
Atlante45 2014-09-25 18:11:48 -07:00
parent 7f4ece2be1
commit 453869c8e9
3 changed files with 24 additions and 8 deletions

View file

@ -13,6 +13,9 @@
AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) { AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) {
if (sound->isStereo()) {
const_cast<AudioInjectorOptions*>(injectorOptions)->setIsStereo(true);
}
AudioInjector* injector = new AudioInjector(sound, *injectorOptions); AudioInjector* injector = new AudioInjector(sound, *injectorOptions);
QThread* injectorThread = new QThread(); QThread* injectorThread = new QThread();

View file

@ -31,7 +31,8 @@
// procedural audio version of Sound // procedural audio version of Sound
Sound::Sound(float volume, float frequency, float duration, float decay, QObject* parent) : Sound::Sound(float volume, float frequency, float duration, float decay, QObject* parent) :
QObject(parent) QObject(parent),
_isStereo(false)
{ {
static char monoAudioData[MAX_PACKET_SIZE]; static char monoAudioData[MAX_PACKET_SIZE];
static int16_t* monoAudioSamples = (int16_t*)(monoAudioData); static int16_t* monoAudioSamples = (int16_t*)(monoAudioData);
@ -69,8 +70,9 @@ Sound::Sound(float volume, float frequency, float duration, float decay, QObject
} }
} }
Sound::Sound(const QUrl& sampleURL, QObject* parent) : Sound::Sound(const QUrl& sampleURL, bool isStereo, QObject* parent) :
QObject(parent), QObject(parent),
_isStereo(isStereo),
_hasDownloaded(false) _hasDownloaded(false)
{ {
// assume we have a QApplication or QCoreApplication instance and use the // assume we have a QApplication or QCoreApplication instance and use the
@ -88,6 +90,7 @@ Sound::Sound(const QUrl& sampleURL, QObject* parent) :
Sound::Sound(const QByteArray byteArray, QObject* parent) : Sound::Sound(const QByteArray byteArray, QObject* parent) :
QObject(parent), QObject(parent),
_byteArray(byteArray), _byteArray(byteArray),
_isStereo(false),
_hasDownloaded(true) _hasDownloaded(true)
{ {
} }
@ -149,11 +152,19 @@ void Sound::downSample(const QByteArray& rawAudioByteArray) {
int16_t* sourceSamples = (int16_t*) rawAudioByteArray.data(); int16_t* sourceSamples = (int16_t*) rawAudioByteArray.data();
int16_t* destinationSamples = (int16_t*) _byteArray.data(); int16_t* destinationSamples = (int16_t*) _byteArray.data();
for (int i = 1; i < numSourceSamples; i += 2) {
if (i + 1 >= numSourceSamples) { if (_isStereo) {
destinationSamples[(i - 1) / 2] = (sourceSamples[i - 1] / 2) + (sourceSamples[i] / 2); for (int i = 0; i < numSourceSamples; i += 4) {
} else { destinationSamples[i / 2] = (sourceSamples[i] / 2) + (sourceSamples[i + 2] / 2);
destinationSamples[(i - 1) / 2] = (sourceSamples[i - 1] / 4) + (sourceSamples[i] / 2) + (sourceSamples[i + 1] / 4); destinationSamples[(i / 2) + 1] = (sourceSamples[i + 1] / 2) + (sourceSamples[i + 3] / 2);
}
} else {
for (int i = 1; i < numSourceSamples; i += 2) {
if (i + 1 >= numSourceSamples) {
destinationSamples[(i - 1) / 2] = (sourceSamples[i - 1] / 2) + (sourceSamples[i] / 2);
} else {
destinationSamples[(i - 1) / 2] = (sourceSamples[i - 1] / 4) + (sourceSamples[i] / 2) + (sourceSamples[i + 1] / 4);
}
} }
} }
} }

View file

@ -20,17 +20,19 @@ class Sound : public QObject {
Q_PROPERTY(bool downloaded READ hasDownloaded) Q_PROPERTY(bool downloaded READ hasDownloaded)
public: public:
Sound(const QUrl& sampleURL, QObject* parent = NULL); Sound(const QUrl& sampleURL, bool isStereo = false, QObject* parent = NULL);
Sound(float volume, float frequency, float duration, float decay, QObject* parent = NULL); Sound(float volume, float frequency, float duration, float decay, QObject* parent = NULL);
Sound(const QByteArray byteArray, QObject* parent = NULL); Sound(const QByteArray byteArray, QObject* parent = NULL);
void append(const QByteArray byteArray); void append(const QByteArray byteArray);
bool isStereo() const { return _isStereo; }
bool hasDownloaded() const { return _hasDownloaded; } bool hasDownloaded() const { return _hasDownloaded; }
const QByteArray& getByteArray() { return _byteArray; } const QByteArray& getByteArray() { return _byteArray; }
private: private:
QByteArray _byteArray; QByteArray _byteArray;
bool _isStereo;
bool _hasDownloaded; bool _hasDownloaded;
void trimFrames(); void trimFrames();