diff src/audio/dsp/SDL_dspaudio.c @ 1662:782fd950bd46 SDL-1.3

Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API. WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid. The code is now run through a consistent indent format: indent -i4 -nut -nsc -br -ce The headers are being converted to automatically generate doxygen documentation.
author Sam Lantinga <slouken@libsdl.org>
date Sun, 28 May 2006 13:04:16 +0000
parents 97d0966f4bf7
children 4da1ee79c9af
line wrap: on
line diff
--- a/src/audio/dsp/SDL_dspaudio.c	Sun May 21 17:27:13 2006 +0000
+++ b/src/audio/dsp/SDL_dspaudio.c	Sun May 28 13:04:16 2006 +0000
@@ -26,8 +26,8 @@
 
 /* Allow access to a raw mixing buffer */
 
-#include <stdio.h>	/* For perror() */
-#include <string.h>	/* For strerror() */
+#include <stdio.h>              /* For perror() */
+#include <string.h>             /* For strerror() */
 #include <errno.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -58,274 +58,284 @@
 #define OPEN_FLAGS	(O_WRONLY|O_NONBLOCK)
 
 /* Audio driver functions */
-static int DSP_OpenAudio(_THIS, SDL_AudioSpec *spec);
-static void DSP_WaitAudio(_THIS);
-static void DSP_PlayAudio(_THIS);
-static Uint8 *DSP_GetAudioBuf(_THIS);
-static void DSP_CloseAudio(_THIS);
+static int DSP_OpenAudio (_THIS, SDL_AudioSpec * spec);
+static void DSP_WaitAudio (_THIS);
+static void DSP_PlayAudio (_THIS);
+static Uint8 *DSP_GetAudioBuf (_THIS);
+static void DSP_CloseAudio (_THIS);
 
 /* Audio driver bootstrap functions */
 
-static int Audio_Available(void)
+static int
+Audio_Available (void)
 {
-	int fd;
-	int available;
+    int fd;
+    int available;
 
-	available = 0;
-	fd = SDL_OpenAudioPath(NULL, 0, OPEN_FLAGS, 0);
-	if ( fd >= 0 ) {
-		available = 1;
-		close(fd);
-	}
-	return(available);
+    available = 0;
+    fd = SDL_OpenAudioPath (NULL, 0, OPEN_FLAGS, 0);
+    if (fd >= 0) {
+        available = 1;
+        close (fd);
+    }
+    return (available);
 }
 
-static void Audio_DeleteDevice(SDL_AudioDevice *device)
+static void
+Audio_DeleteDevice (SDL_AudioDevice * device)
 {
-	SDL_free(device->hidden);
-	SDL_free(device);
+    SDL_free (device->hidden);
+    SDL_free (device);
 }
 
-static SDL_AudioDevice *Audio_CreateDevice(int devindex)
+static SDL_AudioDevice *
+Audio_CreateDevice (int devindex)
 {
-	SDL_AudioDevice *this;
+    SDL_AudioDevice *this;
 
-	/* Initialize all variables that we clean on shutdown */
-	this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice));
-	if ( this ) {
-		SDL_memset(this, 0, (sizeof *this));
-		this->hidden = (struct SDL_PrivateAudioData *)
-				SDL_malloc((sizeof *this->hidden));
-	}
-	if ( (this == NULL) || (this->hidden == NULL) ) {
-		SDL_OutOfMemory();
-		if ( this ) {
-			SDL_free(this);
-		}
-		return(0);
-	}
-	SDL_memset(this->hidden, 0, (sizeof *this->hidden));
-	audio_fd = -1;
+    /* Initialize all variables that we clean on shutdown */
+    this = (SDL_AudioDevice *) SDL_malloc (sizeof (SDL_AudioDevice));
+    if (this) {
+        SDL_memset (this, 0, (sizeof *this));
+        this->hidden = (struct SDL_PrivateAudioData *)
+            SDL_malloc ((sizeof *this->hidden));
+    }
+    if ((this == NULL) || (this->hidden == NULL)) {
+        SDL_OutOfMemory ();
+        if (this) {
+            SDL_free (this);
+        }
+        return (0);
+    }
+    SDL_memset (this->hidden, 0, (sizeof *this->hidden));
+    audio_fd = -1;
 
-	/* Set the function pointers */
-	this->OpenAudio = DSP_OpenAudio;
-	this->WaitAudio = DSP_WaitAudio;
-	this->PlayAudio = DSP_PlayAudio;
-	this->GetAudioBuf = DSP_GetAudioBuf;
-	this->CloseAudio = DSP_CloseAudio;
+    /* Set the function pointers */
+    this->OpenAudio = DSP_OpenAudio;
+    this->WaitAudio = DSP_WaitAudio;
+    this->PlayAudio = DSP_PlayAudio;
+    this->GetAudioBuf = DSP_GetAudioBuf;
+    this->CloseAudio = DSP_CloseAudio;
 
-	this->free = Audio_DeleteDevice;
+    this->free = Audio_DeleteDevice;
 
-	return this;
+    return this;
 }
 
 AudioBootStrap DSP_bootstrap = {
-	DSP_DRIVER_NAME, "OSS /dev/dsp standard audio",
-	Audio_Available, Audio_CreateDevice
+    DSP_DRIVER_NAME, "OSS /dev/dsp standard audio",
+    Audio_Available, Audio_CreateDevice
 };
 
 /* This function waits until it is possible to write a full sound buffer */
-static void DSP_WaitAudio(_THIS)
+static void
+DSP_WaitAudio (_THIS)
 {
-	/* Not needed at all since OSS handles waiting automagically */
+    /* Not needed at all since OSS handles waiting automagically */
 }
 
-static void DSP_PlayAudio(_THIS)
+static void
+DSP_PlayAudio (_THIS)
 {
-	if (write(audio_fd, mixbuf, mixlen)==-1)
-	{
-		perror("Audio write");
-		this->enabled = 0;
-	}
-
+    if (write (audio_fd, mixbuf, mixlen) == -1) {
+        perror ("Audio write");
+        this->enabled = 0;
+    }
 #ifdef DEBUG_AUDIO
-	fprintf(stderr, "Wrote %d bytes of audio data\n", mixlen);
+    fprintf (stderr, "Wrote %d bytes of audio data\n", mixlen);
 #endif
 }
 
-static Uint8 *DSP_GetAudioBuf(_THIS)
+static Uint8 *
+DSP_GetAudioBuf (_THIS)
 {
-	return(mixbuf);
+    return (mixbuf);
 }
 
-static void DSP_CloseAudio(_THIS)
+static void
+DSP_CloseAudio (_THIS)
 {
-	if ( mixbuf != NULL ) {
-		SDL_FreeAudioMem(mixbuf);
-		mixbuf = NULL;
-	}
-	if ( audio_fd >= 0 ) {
-		close(audio_fd);
-		audio_fd = -1;
-	}
+    if (mixbuf != NULL) {
+        SDL_FreeAudioMem (mixbuf);
+        mixbuf = NULL;
+    }
+    if (audio_fd >= 0) {
+        close (audio_fd);
+        audio_fd = -1;
+    }
 }
 
-static int DSP_OpenAudio(_THIS, SDL_AudioSpec *spec)
+static int
+DSP_OpenAudio (_THIS, SDL_AudioSpec * spec)
 {
-	char audiodev[1024];
-	int format;
-	int value;
-	int frag_spec;
-	Uint16 test_format;
+    char audiodev[1024];
+    int format;
+    int value;
+    int frag_spec;
+    Uint16 test_format;
 
-	/* Open the audio device */
-	audio_fd = SDL_OpenAudioPath(audiodev, sizeof(audiodev), OPEN_FLAGS, 0);
-	if ( audio_fd < 0 ) {
-		SDL_SetError("Couldn't open %s: %s", audiodev, strerror(errno));
-		return(-1);
-	}
-	mixbuf = NULL;
+    /* Open the audio device */
+    audio_fd = SDL_OpenAudioPath (audiodev, sizeof (audiodev), OPEN_FLAGS, 0);
+    if (audio_fd < 0) {
+        SDL_SetError ("Couldn't open %s: %s", audiodev, strerror (errno));
+        return (-1);
+    }
+    mixbuf = NULL;
 
-	/* Make the file descriptor use blocking writes with fcntl() */
-	{ long flags;
-		flags = fcntl(audio_fd, F_GETFL);
-		flags &= ~O_NONBLOCK;
-		if ( fcntl(audio_fd, F_SETFL, flags) < 0 ) {
-			SDL_SetError("Couldn't set audio blocking mode");
-			DSP_CloseAudio(this);
-			return(-1);
-		}
-	}
+    /* Make the file descriptor use blocking writes with fcntl() */
+    {
+        long flags;
+        flags = fcntl (audio_fd, F_GETFL);
+        flags &= ~O_NONBLOCK;
+        if (fcntl (audio_fd, F_SETFL, flags) < 0) {
+            SDL_SetError ("Couldn't set audio blocking mode");
+            DSP_CloseAudio (this);
+            return (-1);
+        }
+    }
 
-	/* Get a list of supported hardware formats */
-	if ( ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &value) < 0 ) {
-		perror("SNDCTL_DSP_GETFMTS");
-		SDL_SetError("Couldn't get audio format list");
-		DSP_CloseAudio(this);
-		return(-1);
-	}
+    /* Get a list of supported hardware formats */
+    if (ioctl (audio_fd, SNDCTL_DSP_GETFMTS, &value) < 0) {
+        perror ("SNDCTL_DSP_GETFMTS");
+        SDL_SetError ("Couldn't get audio format list");
+        DSP_CloseAudio (this);
+        return (-1);
+    }
 
-	/* Try for a closest match on audio format */
-	format = 0;
-	for ( test_format = SDL_FirstAudioFormat(spec->format);
-						! format && test_format; ) {
+    /* Try for a closest match on audio format */
+    format = 0;
+    for (test_format = SDL_FirstAudioFormat (spec->format);
+         !format && test_format;) {
 #ifdef DEBUG_AUDIO
-		fprintf(stderr, "Trying format 0x%4.4x\n", test_format);
+        fprintf (stderr, "Trying format 0x%4.4x\n", test_format);
 #endif
-		switch ( test_format ) {
-			case AUDIO_U8:
-				if ( value & AFMT_U8 ) {
-					format = AFMT_U8;
-				}
-				break;
-			case AUDIO_S16LSB:
-				if ( value & AFMT_S16_LE ) {
-					format = AFMT_S16_LE;
-				}
-				break;
-			case AUDIO_S16MSB:
-				if ( value & AFMT_S16_BE ) {
-					format = AFMT_S16_BE;
-				}
-				break;
+        switch (test_format) {
+        case AUDIO_U8:
+            if (value & AFMT_U8) {
+                format = AFMT_U8;
+            }
+            break;
+        case AUDIO_S16LSB:
+            if (value & AFMT_S16_LE) {
+                format = AFMT_S16_LE;
+            }
+            break;
+        case AUDIO_S16MSB:
+            if (value & AFMT_S16_BE) {
+                format = AFMT_S16_BE;
+            }
+            break;
 #if 0
 /*
  * These formats are not used by any real life systems so they are not 
  * needed here.
  */
-			case AUDIO_S8:
-				if ( value & AFMT_S8 ) {
-					format = AFMT_S8;
-				}
-				break;
-			case AUDIO_U16LSB:
-				if ( value & AFMT_U16_LE ) {
-					format = AFMT_U16_LE;
-				}
-				break;
-			case AUDIO_U16MSB:
-				if ( value & AFMT_U16_BE ) {
-					format = AFMT_U16_BE;
-				}
-				break;
+        case AUDIO_S8:
+            if (value & AFMT_S8) {
+                format = AFMT_S8;
+            }
+            break;
+        case AUDIO_U16LSB:
+            if (value & AFMT_U16_LE) {
+                format = AFMT_U16_LE;
+            }
+            break;
+        case AUDIO_U16MSB:
+            if (value & AFMT_U16_BE) {
+                format = AFMT_U16_BE;
+            }
+            break;
 #endif
-			default:
-				format = 0;
-				break;
-		}
-		if ( ! format ) {
-			test_format = SDL_NextAudioFormat();
-		}
-	}
-	if ( format == 0 ) {
-		SDL_SetError("Couldn't find any hardware audio formats");
-		DSP_CloseAudio(this);
-		return(-1);
-	}
-	spec->format = test_format;
+        default:
+            format = 0;
+            break;
+        }
+        if (!format) {
+            test_format = SDL_NextAudioFormat ();
+        }
+    }
+    if (format == 0) {
+        SDL_SetError ("Couldn't find any hardware audio formats");
+        DSP_CloseAudio (this);
+        return (-1);
+    }
+    spec->format = test_format;
 
-	/* Set the audio format */
-	value = format;
-	if ( (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &value) < 0) ||
-						(value != format) ) {
-		perror("SNDCTL_DSP_SETFMT");
-		SDL_SetError("Couldn't set audio format");
-		DSP_CloseAudio(this);
-		return(-1);
-	}
+    /* Set the audio format */
+    value = format;
+    if ((ioctl (audio_fd, SNDCTL_DSP_SETFMT, &value) < 0) ||
+        (value != format)) {
+        perror ("SNDCTL_DSP_SETFMT");
+        SDL_SetError ("Couldn't set audio format");
+        DSP_CloseAudio (this);
+        return (-1);
+    }
 
-	/* Set the number of channels of output */
-	value = spec->channels;
-	if ( ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &value) < 0 ) {
-		perror("SNDCTL_DSP_CHANNELS");
-		SDL_SetError("Cannot set the number of channels");
-		DSP_CloseAudio(this);
-		return(-1);
-	}
-	spec->channels = value;
+    /* Set the number of channels of output */
+    value = spec->channels;
+    if (ioctl (audio_fd, SNDCTL_DSP_CHANNELS, &value) < 0) {
+        perror ("SNDCTL_DSP_CHANNELS");
+        SDL_SetError ("Cannot set the number of channels");
+        DSP_CloseAudio (this);
+        return (-1);
+    }
+    spec->channels = value;
 
-	/* Set the DSP frequency */
-	value = spec->freq;
-	if ( ioctl(audio_fd, SNDCTL_DSP_SPEED, &value) < 0 ) {
-		perror("SNDCTL_DSP_SPEED");
-		SDL_SetError("Couldn't set audio frequency");
-		DSP_CloseAudio(this);
-		return(-1);
-	}
-	spec->freq = value;
+    /* Set the DSP frequency */
+    value = spec->freq;
+    if (ioctl (audio_fd, SNDCTL_DSP_SPEED, &value) < 0) {
+        perror ("SNDCTL_DSP_SPEED");
+        SDL_SetError ("Couldn't set audio frequency");
+        DSP_CloseAudio (this);
+        return (-1);
+    }
+    spec->freq = value;
 
-	/* Calculate the final parameters for this audio specification */
-	SDL_CalculateAudioSpec(spec);
+    /* Calculate the final parameters for this audio specification */
+    SDL_CalculateAudioSpec (spec);
 
-	/* Determine the power of two of the fragment size */
-	for ( frag_spec = 0; (0x01U<<frag_spec) < spec->size; ++frag_spec );
-	if ( (0x01U<<frag_spec) != spec->size ) {
-		SDL_SetError("Fragment size must be a power of two");
-		DSP_CloseAudio(this);
-		return(-1);
-	}
-	frag_spec |= 0x00020000;	/* two fragments, for low latency */
+    /* Determine the power of two of the fragment size */
+    for (frag_spec = 0; (0x01U << frag_spec) < spec->size; ++frag_spec);
+    if ((0x01U << frag_spec) != spec->size) {
+        SDL_SetError ("Fragment size must be a power of two");
+        DSP_CloseAudio (this);
+        return (-1);
+    }
+    frag_spec |= 0x00020000;    /* two fragments, for low latency */
 
-	/* Set the audio buffering parameters */
+    /* Set the audio buffering parameters */
 #ifdef DEBUG_AUDIO
-	fprintf(stderr, "Requesting %d fragments of size %d\n",
-		(frag_spec >> 16), 1<<(frag_spec&0xFFFF));
+    fprintf (stderr, "Requesting %d fragments of size %d\n",
+             (frag_spec >> 16), 1 << (frag_spec & 0xFFFF));
 #endif
-	if ( ioctl(audio_fd, SNDCTL_DSP_SETFRAGMENT, &frag_spec) < 0 ) {
-		perror("SNDCTL_DSP_SETFRAGMENT");
-	}
+    if (ioctl (audio_fd, SNDCTL_DSP_SETFRAGMENT, &frag_spec) < 0) {
+        perror ("SNDCTL_DSP_SETFRAGMENT");
+    }
 #ifdef DEBUG_AUDIO
-	{ audio_buf_info info;
-	  ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info);
-	  fprintf(stderr, "fragments = %d\n", info.fragments);
-	  fprintf(stderr, "fragstotal = %d\n", info.fragstotal);
-	  fprintf(stderr, "fragsize = %d\n", info.fragsize);
-	  fprintf(stderr, "bytes = %d\n", info.bytes);
-	}
+    {
+        audio_buf_info info;
+        ioctl (audio_fd, SNDCTL_DSP_GETOSPACE, &info);
+        fprintf (stderr, "fragments = %d\n", info.fragments);
+        fprintf (stderr, "fragstotal = %d\n", info.fragstotal);
+        fprintf (stderr, "fragsize = %d\n", info.fragsize);
+        fprintf (stderr, "bytes = %d\n", info.bytes);
+    }
 #endif
 
-	/* Allocate mixing buffer */
-	mixlen = spec->size;
-	mixbuf = (Uint8 *)SDL_AllocAudioMem(mixlen);
-	if ( mixbuf == NULL ) {
-		DSP_CloseAudio(this);
-		return(-1);
-	}
-	SDL_memset(mixbuf, spec->silence, spec->size);
+    /* Allocate mixing buffer */
+    mixlen = spec->size;
+    mixbuf = (Uint8 *) SDL_AllocAudioMem (mixlen);
+    if (mixbuf == NULL) {
+        DSP_CloseAudio (this);
+        return (-1);
+    }
+    SDL_memset (mixbuf, spec->silence, spec->size);
 
-	/* Get the parent process id (we're the parent of the audio thread) */
-	parent = getpid();
+    /* Get the parent process id (we're the parent of the audio thread) */
+    parent = getpid ();
 
-	/* We're ready to rock and roll. :-) */
-	return(0);
+    /* We're ready to rock and roll. :-) */
+    return (0);
 }
+
+/* vi: set ts=4 sw=4 expandtab: */