[vorbis-dev] libao: IRIX patch

Michael Pruett michael at 68k.org
Thu Apr 11 21:32:58 PDT 2002



Here's a patch for the current CVS version of libao which makes the IRIX
plug-in compile and work properly.

Michael

--- ./src/plugins/irix/ao_irix.c	Fri Aug  3 19:56:17 2001
+++ ../libao-0.8.2/./src/plugins/irix/ao_irix.c	Thu Apr 11 20:16:41 2002
@@ -36,12 +36,13 @@
 
 #include <ao/ao.h>
 
+#define AO_IRIX_BUFFER_SIZE 32768
 
 typedef struct ao_irix_internal {
-	static ALport alport = 0;
-	static ALconfig alconfig = 0;
-	static int bytesPerWord = 1;
-	static int nChannels = 2;
+	ALport alport;
+	ALconfig alconfig;
+	int bytesPerSample;
+	int channels;
 } ao_irix_internal;
 
 
@@ -51,7 +52,7 @@
         "Irix audio output ",
         "irix",
         "Jim Miller <???@sgi.com>",
-	"WARNING: This driver is untested!"
+	"Outputs to the IRIX Audio Library.",
         AO_FMT_NATIVE,
         20,
         NULL,
@@ -58,14 +59,13 @@
         1
 };
 
-
-int ao_plugin_test()
+int ao_plugin_test(void)
 {
         char *dev_path;
         ALport port;
 
 
-	if ( !(port = alOpenPort("libao test", "w", 0)) )
+	if ((port = alOpenPort("libao test", "w", NULL)) == NULL)
                 return 0; /* Cannot use this plugin with default parameters */
         else {
                 alClosePort(port);
@@ -73,7 +73,6 @@
         }
 }
 
-
 ao_info *ao_plugin_driver_info(void)
 {
         return &ao_irix_info;
@@ -86,122 +85,124 @@
 
         internal = (ao_irix_internal *) malloc(sizeof(ao_irix_internal));
 
-	if (internal == NULL)	
-		return 0; /* Could not initialize device memory */
+	if (internal == NULL)
+		/* Could not allocate memory for device-specific data. */
+		return 0;
 
         internal->alconfig = alNewConfig();
-		
+	internal->alport = NULL;
+	internal->bytesPerSample = 2;
+	internal->channels = 2;
+
         device->internal = internal;
 
-	return 1; /* Memory alloc successful */
+	/* Device-specific initialization was successful. */
+	return 1;
 }
 
-
 int ao_plugin_set_option(ao_device *device, const char *key, const char *value)
 {
         return 1; /* No options */
 }
 
-
-/*
- * open the audio device for writing to
- */
+/* Open the audio device for writing. */
 int ao_plugin_open(ao_device *device, ao_sample_format *format)
 {
         ao_irix_internal *internal = (ao_irix_internal *) device->internal;
-	ALpv params[2];
+	ALpv params;
         int  dev = AL_DEFAULT_OUTPUT;
         int  wsize = AL_SAMPLE_16;
 
-
-	internal->nChannels = channels;
-
-	if (alSetQueueSize(internal->alconfig, BUFFER_SIZE) < 0) {
-		fprintf(stderr, "alSetQueueSize failed: %s\n", 
-		alGetErrorString(oserror()));
+	if (alSetQueueSize(internal->alconfig, AO_IRIX_BUFFER_SIZE) < 0) {
+		fprintf(stderr, "alSetQueueSize failed: %s\n",
+			alGetErrorString(oserror()));
                 return 0;
         }
 
-	if (alSetChannels(internal->alconfig, channels) < 0) {
-		fprintf(stderr, "alSetChannels(%d) failed: %s\n", 
-		channels, alGetErrorString(oserror()));
+	if (alSetChannels(internal->alconfig, format->channels) < 0) {
+		fprintf(stderr, "alSetChannels(%d) failed: %s\n",
+			format->channels, alGetErrorString(oserror()));
                 return 0;
         }
-	
+
+	internal->channels = format->channels;
+
         if (alSetDevice(internal->alconfig, dev) < 0) {
-		fprintf(stderr, "alSetDevice failed: %s\n", 
-		alGetErrorString(oserror()));
+		fprintf(stderr, "alSetDevice failed: %s\n",
+			alGetErrorString(oserror()));
                 return 0;
         }
-	
+
         if (alSetSampFmt(internal->alconfig, AL_SAMPFMT_TWOSCOMP) < 0) {
-		fprintf(stderr, "alSetSampFmt failed: %s\n", 
-		alGetErrorString(oserror()));
+		fprintf(stderr, "alSetSampFmt failed: %s\n",
+			alGetErrorString(oserror()));
                 return 0;
         }
 
         switch (format->bits) {
-	case 8:         
-		internal->bytesPerWord = 1;
+	case 8:
+		internal->bytesPerSample = 1;
                 wsize = AL_SAMPLE_8;
                 break;
-		
-	case 16: 
-		internal->bytesPerWord = 2;
+
+	case 16:
+		internal->bytesPerSample = 2;
                 wsize = AL_SAMPLE_16;
                 break;
-		
+
         case 24:
-		internal->bytesPerWord = 4;
+		internal->bytesPerSample = 4;
                 wsize = AL_SAMPLE_24;
                 break;
-		
+
         default:
-	    fprintf(stderr,"Irix audio: unsupported bit with %d\n", bits);
+		fprintf(stderr, "Irix audio: unsupported bit with %d\n",
+			format->bits);
                 break;
         }
 
-
-	internal->alport = alOpenPort("libao", "w", 0);
-
-	if (!internal->alport) {
-		fprintf(stderr, "alOpenPort failed: %s\n", 
+	if (alSetWidth(internal->alconfig, wsize) < 0) {
+		fprintf(stderr, "alSetWidth failed: %s\n",
                         alGetErrorString(oserror()));
+		alClosePort(internal->alport);
                 return 0;
         }
 
-
-	if (alSetWidth(internal->alconfig, wsize) < 0) {
-		fprintf(stderr, "alSetWidth failed: %s\n", alGetErrorString(oserror()));
-		alClosePort(internal->alport);
+	internal->alport = alOpenPort("libao", "w", internal->alconfig);
+	if (internal->alport == NULL)
+	{
+		fprintf(stderr, "alOpenPort failed: %s\n",
+			alGetErrorString(oserror()));
                 return 0;
         }
-	
-	params[0].param = AL_RATE;
-	params[0].value.ll = alDoubleToFixed((double)rate);
-	params[1].param = AL_MASTER_CLOCK;
-	params[1].value.i = AL_CRYSTAL_MCLK_TYPE;
-	if ( alSetParams(dev, params, 1) < 0) {
+
+	params.param = AL_RATE;
+	params.value.ll = alDoubleToFixed((double) format->rate);
+	if (alSetParams(dev, &params, 1) < 0)
+	{
                 printf("alSetParams() failed: %s\n", alGetErrorString(oserror()));
                 alClosePort(internal->alport);
                 return 0;
         }
-	
+
         device->driver_byte_format = AO_FMT_NATIVE;
-	
+
         return 1;
 }
 
-/*
- * play the sample to the already opened file descriptor
- */
-int ao_plugin_play(ao_device *device, const char *output_samples, 
+/* Play the sampled audio data to the already opened device. */
+int ao_plugin_play(ao_device *device, const char *output_samples,
                 uint_32 num_bytes)
 {
+	uint_32 num_frames;
         ao_irix_internal *internal = (ao_irix_internal *) device->internal;
-	
-	alWriteFrames(internal->alport, output_samples, num_bytes); 
+
+	num_frames = num_bytes;
+	num_frames /= internal->bytesPerSample;
+	num_frames /= internal->channels;
 
+	alWriteFrames(internal->alport, output_samples, num_frames);
+
         return 1; /* FIXME: Need to check if the above function failed */
 }
 
@@ -213,7 +214,6 @@
 
         return 1;
 }
-
 
 void ao_plugin_device_clear(ao_device *device)
 {

--- >8 ----
List archives:  http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'vorbis-dev-request at xiph.org'
containing only the word 'unsubscribe' in the body.  No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.



More information about the Vorbis-dev mailing list