Browse Source

Set libao sample format to 16 bits

Some plugins don't support 32 bit samples.
Anton Yabchinskiy 10 years ago
parent
commit
e58731ee01
1 changed files with 13 additions and 5 deletions
  1. 13 5
      drivers/ao/audio_driver_ao.cpp

+ 13 - 5
drivers/ao/audio_driver_ao.cpp

@@ -45,7 +45,7 @@ Error AudioDriverAO::init() {
 
 
 	ao_sample_format format;
 	ao_sample_format format;
 
 
-	format.bits = 32;
+	format.bits = 16;
 	format.rate = mix_rate;
 	format.rate = mix_rate;
 	format.channels = channels;
 	format.channels = channels;
 	format.byte_format = AO_FMT_LITTLE;
 	format.byte_format = AO_FMT_LITTLE;
@@ -68,19 +68,27 @@ Error AudioDriverAO::init() {
 void AudioDriverAO::thread_func(void* p_udata) {
 void AudioDriverAO::thread_func(void* p_udata) {
 	AudioDriverAO* ad = (AudioDriverAO*)p_udata;
 	AudioDriverAO* ad = (AudioDriverAO*)p_udata;
 
 
+	int16_t* samples_out = samples_in; // Overwrite samples on conversion
+	unsigned int n_samples = ad->buffer_size * ad->channels;
+	unsigned int n_bytes = n_samples * sizeof(int16_t);
+
 	while (!ad->exit_thread) {
 	while (!ad->exit_thread) {
 		if (ad->active) {
 		if (ad->active) {
 			ad->lock();
 			ad->lock();
 			ad->audio_server_process(ad->buffer_size, ad->samples_in);
 			ad->audio_server_process(ad->buffer_size, ad->samples_in);
 			ad->unlock();
 			ad->unlock();
-		};
+
+			for (unsigned int i = 0; i < n_samples; i++) {
+				samples_out[i] = ad->samples_in[i] >> 16;
+			}
+		} else {
+			memset(samples_out, 0, n_bytes);
+		}
 
 
 		if (ad->exit_thread)
 		if (ad->exit_thread)
 			break;
 			break;
 
 
-		if (!ao_play(ad->device, reinterpret_cast<char*>(ad->samples_in),
-				ad->buffer_size * ad->channels * sizeof(int32_t)))
-		{
+		if (!ao_play(ad->device, reinterpret_cast<char*>(samples_out), n_bytes) {
 			ERR_PRINT("ao_play() failed");
 			ERR_PRINT("ao_play() failed");
 		}
 		}
 	};
 	};