diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/soundplayer.cc | 50 | 
1 files changed, 46 insertions, 4 deletions
| 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; | 
