summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kaiman.pro2
-rw-r--r--src/soundplayer.cc50
2 files changed, 47 insertions, 5 deletions
diff --git a/kaiman.pro b/kaiman.pro
index a57c8ca..1ae8abf 100644
--- a/kaiman.pro
+++ b/kaiman.pro
@@ -37,7 +37,7 @@ unix {
packagesExist(lua5.1) {
PKGCONFIG += lua5.1
}
- LIBS += -lao -lsndfile
+ LIBS += -lao -lsndfile -lsamplerate
}
HEADERS += \
diff --git a/src/soundplayer.cc b/src/soundplayer.cc
index e5feebc..2570f31 100644
--- a/src/soundplayer.cc
+++ b/src/soundplayer.cc
@@ -29,6 +29,7 @@
#include <ao/ao.h>
#include <sndfile.h>
+#include <samplerate.h>
#define BUFSZ 512
@@ -40,7 +41,7 @@ SoundPlayer::SoundPlayer()
SoundPlayer::~SoundPlayer()
{
running = false;
- wait();
+ wait();
}
void SoundPlayer::run()
@@ -52,7 +53,7 @@ void SoundPlayer::run()
ao_sample_format sf;
memset(&sf, 0, sizeof(sf));
sf.bits = 16;
- sf.rate = 44100;
+ sf.rate = 48000;
sf.channels = 2;
sf.byte_format = AO_FMT_NATIVE;
@@ -67,7 +68,6 @@ void SoundPlayer::run()
QMutexLocker lock(&mutex);
while(queue.size())
{
- printf(" - New sound\n");
active.append(queue.front());
queue.pop_front();
}
@@ -121,9 +121,51 @@ void SoundPlayer::playFile(QString file)
size_t size = sf_info.frames * sf_info.channels;
float *data = new float[size];
sf_read_float(fh, data, size);
-
sf_close(fh);
+ if(sf_info.channels != 2)
+ {
+ float* stereo_data = new float[sf_info.frames * 2];
+ for(int i = 0; i < sf_info.frames; ++i)
+ {
+ int c = 0;
+ for(;c < sf_info.channels && c < 2; ++c)
+ {
+ stereo_data[i * 2 + c] = data[i * sf_info.channels + c];
+ }
+ int last = c - 1;
+ for(;c < 2; ++c)
+ {
+ stereo_data[i * 2 + c] = data[i * sf_info.channels + last];
+ }
+ }
+ delete[] data;
+ data = stereo_data;
+ size = sf_info.frames * 2;
+ }
+
+ if(sf_info.samplerate != 48000)
+ {
+ double ratio = 48000.0 / sf_info.samplerate;
+ std::size_t resampled_size = sf_info.frames * 2 * ratio;
+ float *resampled_data = new float[resampled_size + 1];
+
+ SRC_DATA s{};
+ s.data_in = data;
+ s.input_frames = sf_info.frames;
+
+ s.data_out = resampled_data;
+ s.output_frames = resampled_size + 1;
+
+ s.src_ratio = ratio;
+
+ src_simple(&s, SRC_SINC_BEST_QUALITY, 2);
+ delete[] data;
+ data = resampled_data;
+ size = s.output_frames_gen * 2;
+ printf("size: %d\n", (int)size);
+ }
+
QueueItem qi;
qi.samples = data;
qi.pos = 0;