mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
Stereo flag + specific resample in Sound class
This commit is contained in:
parent
7f4ece2be1
commit
453869c8e9
3 changed files with 24 additions and 8 deletions
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue