changeset 7908:dc96a3eb9fab

Check what we obtain in SDL_OpenAudio() - allows to build the correct audio filter chain if soundcard doesn't support what is requested. Checked by Arpi
author colin
date Fri, 25 Oct 2002 10:27:20 +0000
parents 4979eeaf0564
children 6f76eebc0318
files libao2/ao_sdl.c
diffstat 1 files changed, 33 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/libao2/ao_sdl.c	Fri Oct 25 09:45:31 2002 +0000
+++ b/libao2/ao_sdl.c	Fri Oct 25 10:27:20 2002 +0000
@@ -147,7 +147,7 @@
 static int init(int rate,int channels,int format,int flags){
 
 	/* SDL Audio Specifications */
-	SDL_AudioSpec aspec;
+	SDL_AudioSpec aspec, obtained;
 	
 	int i;
 	/* Allocate ring-buffer memory */
@@ -216,13 +216,41 @@
         }
 
 	/* Open the audio device and start playing sound! */
-	if(SDL_OpenAudio(&aspec, NULL) < 0) {
+	if(SDL_OpenAudio(&aspec, &obtained) < 0) {
         	printf("SDL: Unable to open audio: %s\n", SDL_GetError());
         	return(0);
 	} 
-	
-	if(verbose) printf("SDL: buf size = %d\n",aspec.size);
-	if(ao_data.buffersize==-1) ao_data.buffersize=aspec.size;
+
+	/* did we got what we wanted ? */
+	ao_data.channels=obtained.channels;
+	ao_data.samplerate=obtained.freq;
+
+	switch(obtained.format) {
+	    case AUDIO_U8 :
+		ao_data.format = AFMT_U8;
+	    break;
+	    case AUDIO_S16LSB :
+		ao_data.format = AFMT_S16_LE;
+	    break;
+	    case AUDIO_S16MSB :
+		ao_data.format = AFMT_S16_BE;
+	    break;
+	    case AUDIO_S8 :
+		ao_data.format = AFMT_S8;
+	    break;
+	    case AUDIO_U16LSB :
+		ao_data.format = AFMT_U16_LE;
+	    break;
+	    case AUDIO_U16MSB :
+		ao_data.format = AFMT_U16_BE;
+	    break;
+	    default:
+                printf("SDL: Unsupported SDL audio format: 0x%x.\n", obtained.format);
+                return 0;
+	}
+
+	if(verbose) printf("SDL: buf size = %d\n",obtained.size);
+	ao_data.buffersize=obtained.size;
 	
 	/* unsilence audio, if callback is ready */
 	SDL_PauseAudio(0);