Mercurial > sdl-ios-xcode
diff src/audio/paudio/SDL_paudio.c @ 3809:7852b5b78af5 SDL-ryan-multiple-audio-device
Cleaning out SDL_audiodev.c and related references ...
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Thu, 05 Oct 2006 01:13:47 +0000 |
parents | c8b3d3d13ed1 |
children | ca74a71063ac |
line wrap: on
line diff
--- a/src/audio/paudio/SDL_paudio.c Thu Oct 05 01:06:06 2006 +0000 +++ b/src/audio/paudio/SDL_paudio.c Thu Oct 05 01:13:47 2006 +0000 @@ -30,13 +30,14 @@ #include <fcntl.h> #include <sys/time.h> #include <sys/ioctl.h> +#include <sys/types.h> #include <sys/stat.h> #include "SDL_timer.h" #include "SDL_audio.h" +#include "SDL_stdinc.h" #include "../SDL_audiomem.h" #include "../SDL_audio_c.h" -#include "../SDL_audiodev_c.h" #include "SDL_paudio.h" #define DEBUG_AUDIO 1 @@ -61,6 +62,81 @@ static Uint8 *Paud_GetAudioBuf(_THIS); static void Paud_CloseAudio(_THIS); + +/* Get the name of the audio device we use for output */ + +#ifndef _PATH_DEV_DSP +#define _PATH_DEV_DSP "/dev/%caud%c/%c" +#endif + +static char devsettings[][3] = { + {'p', '0', '1'}, {'p', '0', '2'}, {'p', '0', '3'}, {'p', '0', '4'}, + {'p', '1', '1'}, {'p', '1', '2'}, {'p', '1', '3'}, {'p', '1', '4'}, + {'p', '2', '1'}, {'p', '2', '2'}, {'p', '2', '3'}, {'p', '2', '4'}, + {'p', '3', '1'}, {'p', '3', '2'}, {'p', '3', '3'}, {'p', '3', '4'}, + {'b', '0', '1'}, {'b', '0', '2'}, {'b', '0', '3'}, {'b', '0', '4'}, + {'b', '1', '1'}, {'b', '1', '2'}, {'b', '1', '3'}, {'b', '1', '4'}, + {'b', '2', '1'}, {'b', '2', '2'}, {'b', '2', '3'}, {'b', '2', '4'}, + {'b', '3', '1'}, {'b', '3', '2'}, {'b', '3', '3'}, {'b', '3', '4'}, + {'\0', '\0', '\0'} +}; + +static int +OpenUserDefinedDevice(char *path, int maxlen, int flags) +{ + const char *audiodev; + int audio_fd; + + /* Figure out what our audio device is */ + if ((audiodev = SDL_getenv("SDL_PATH_DSP")) == NULL) { + audiodev = SDL_getenv("AUDIODEV"); + } + if (audiodev == NULL) { + return -1; + } + audio_fd = open(audiodev, flags, 0); + if (path != NULL) { + SDL_strlcpy(path, audiodev, maxlen); + path[maxlen - 1] = '\0'; + } + return audio_fd; +} + +int +OpenAudioPath(char *path, int maxlen, int flags, int classic) +{ + struct stat sb; + int audio_fd; + char audiopath[1024]; + int cycle; + + audio_fd = OpenUserDefinedDevice(path, maxlen, flags); + if (audio_fd != -1) { + return audio_fd; + } + + cycle = 0; + /* !!! FIXME: do we really need a table here? */ + while (devsettings[cycle][0] != '\0') { + SDL_snprintf(audiopath, SDL_arraysize(audiopath), + _PATH_DEV_DSP, + devsettings[cycle][0], + devsettings[cycle][1], devsettings[cycle][2]); + + if (stat(audiopath, &sb) == 0) { + audio_fd = open(audiopath, flags, 0); + if (audio_fd > 0) { + if (path != NULL) { + SDL_strlcpy(path, audiopath, maxlen); + } + return audio_fd; + } + } + } + return -1; +} + + /* Audio driver bootstrap functions */ static int @@ -70,7 +146,7 @@ int available; available = 0; - fd = SDL_OpenAudioPath(NULL, 0, OPEN_FLAGS, 0); + fd = OpenAudioPath(NULL, 0, OPEN_FLAGS, 0); if (fd >= 0) { available = 1; close(fd); @@ -255,7 +331,7 @@ frame_ticks = 0.0; /* Open the audio device */ - audio_fd = SDL_OpenAudioPath(audiodev, sizeof(audiodev), OPEN_FLAGS, 0); + audio_fd = OpenAudioPath(audiodev, sizeof(audiodev), OPEN_FLAGS, 0); if (audio_fd < 0) { SDL_SetError("Couldn't open %s: %s", audiodev, strerror(errno)); return -1;