src/audio/SDL_audiodev.c
author Sam Lantinga <slouken@libsdl.org>
Wed, 12 Jan 2005 06:04:48 +0000
changeset 1026 0f3aa6ab3341
parent 769 b8d311d90021
child 1035 974ba6ae0fa3
permissions -rw-r--r--
Select patches included from The NetBSD Package Collection (www.pkgsrc.org)
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2004 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Library General Public
     7     License as published by the Free Software Foundation; either
     8     version 2 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Library General Public License for more details.
    14 
    15     You should have received a copy of the GNU Library General Public
    16     License along with this library; if not, write to the Free
    17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 
    23 #ifdef SAVE_RCSID
    24 static char rcsid =
    25  "@(#) $Id$";
    26 #endif
    27 
    28 /* Get the name of the audio device we use for output */
    29 
    30 #if defined(unix) || defined(__unix__)
    31 
    32 #include <stdlib.h>
    33 #include <stdio.h>
    34 #include <fcntl.h>
    35 #include <sys/types.h>
    36 #include <sys/stat.h>
    37 #include <string.h>
    38 
    39 #include "SDL_audiodev_c.h"
    40 
    41 #ifndef _PATH_DEV_DSP
    42 #if defined(__NetBSD__) || defined(__OpenBSD__)
    43 #define _PATH_DEV_DSP  "/dev/audio"
    44 #else
    45 #define _PATH_DEV_DSP  "/dev/dsp"
    46 #endif
    47 #endif
    48 #ifndef _PATH_DEV_DSP24
    49 #define _PATH_DEV_DSP24	"/dev/sound/dsp"
    50 #endif
    51 #ifndef _PATH_DEV_AUDIO
    52 #define _PATH_DEV_AUDIO	"/dev/audio"
    53 #endif
    54 
    55 
    56 int SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic)
    57 {
    58 	const char *audiodev;
    59 	int audio_fd;
    60 	char audiopath[1024];
    61 
    62 	/* Figure out what our audio device is */
    63 	if ( ((audiodev=getenv("SDL_PATH_DSP")) == NULL) &&
    64 	     ((audiodev=getenv("AUDIODEV")) == NULL) ) {
    65 		if ( classic ) {
    66 			audiodev = _PATH_DEV_AUDIO;
    67 		} else {
    68 			struct stat sb;
    69 
    70 			/* Added support for /dev/sound/\* in Linux 2.4 */
    71 			if ( (stat("/dev/sound", &sb) == 0) &&
    72 			     S_ISDIR(sb.st_mode) ) {
    73 				audiodev = _PATH_DEV_DSP24;
    74 			} else {
    75 				audiodev = _PATH_DEV_DSP;
    76 			}
    77 		}
    78 	}
    79 	audio_fd = open(audiodev, flags, 0);
    80 
    81 	/* If the first open fails, look for other devices */
    82 	if ( (audio_fd < 0) && (strlen(audiodev) < (sizeof(audiopath)-3)) ) {
    83 		int exists, instance;
    84 		struct stat sb;
    85 
    86 		instance = 1;
    87 		do { /* Don't use errno ENOENT - it may not be thread-safe */
    88 			sprintf(audiopath, "%s%d", audiodev, instance++);
    89 			exists = 0;
    90 			if ( stat(audiopath, &sb) == 0 ) {
    91 				exists = 1;
    92 				audio_fd = open(audiopath, flags, 0); 
    93 			}
    94 		} while ( exists && (audio_fd < 0) );
    95 		audiodev = audiopath;
    96 	}
    97 	if ( path != NULL ) {
    98 		strncpy(path, audiodev, maxlen);
    99 		path[maxlen-1] = '\0';
   100 	}
   101 	return(audio_fd);
   102 }
   103 
   104 #elif defined(_AIX)
   105 
   106 /* Get the name of the audio device we use for output */
   107 
   108 #include <stdlib.h>
   109 #include <sys/types.h>
   110 #include <sys/stat.h>
   111 #include <string.h>
   112 
   113 #include "SDL_audiodev_c.h"
   114 
   115 #ifndef _PATH_DEV_DSP
   116 #define _PATH_DEV_DSP	"/dev/%caud%c/%c"
   117 #endif
   118 
   119 char devsettings[][3] =
   120 {
   121     { 'p', '0', '1' }, { 'p', '0', '2' }, { 'p', '0', '3' }, { 'p', '0', '4' },
   122     { 'p', '1', '1' }, { 'p', '1', '2' }, { 'p', '1', '3' }, { 'p', '1', '4' },
   123     { 'p', '2', '1' }, { 'p', '2', '2' }, { 'p', '2', '3' }, { 'p', '2', '4' },
   124     { 'p', '3', '1' }, { 'p', '3', '2' }, { 'p', '3', '3' }, { 'p', '3', '4' },
   125     { 'b', '0', '1' }, { 'b', '0', '2' }, { 'b', '0', '3' }, { 'b', '0', '4' },
   126     { 'b', '1', '1' }, { 'b', '1', '2' }, { 'b', '1', '3' }, { 'b', '1', '4' },
   127     { 'b', '2', '1' }, { 'b', '2', '2' }, { 'b', '2', '3' }, { 'b', '2', '4' },
   128     { 'b', '3', '1' }, { 'b', '3', '2' }, { 'b', '3', '3' }, { 'b', '3', '4' },
   129     { '\0', '\0', '\0' }
   130 };
   131 
   132 static int OpenUserDefinedDevice(char *path, int maxlen, int flags)
   133 {
   134 	const char *audiodev;
   135 	int  audio_fd;
   136 
   137 	/* Figure out what our audio device is */
   138 	if ((audiodev=getenv("SDL_PATH_DSP")) == NULL) {
   139 	    audiodev=getenv("AUDIODEV");
   140 	}
   141 	if ( audiodev == NULL ) {
   142 	    return -1;
   143 	}
   144 	audio_fd = open(audiodev, flags, 0);
   145 	if ( path != NULL ) {
   146 		strncpy(path, audiodev, maxlen);
   147 		path[maxlen-1] = '\0';
   148 	}
   149 	return audio_fd;
   150 }
   151 
   152 int SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic)
   153 {
   154     struct stat sb;
   155     int         audio_fd;
   156     char        audiopath[1024];
   157     int         cycle;
   158 
   159     audio_fd = OpenUserDefinedDevice(path,maxlen,flags);
   160     if ( audio_fd != -1 ) {
   161         return audio_fd;
   162     }
   163 
   164     cycle    = 0;
   165     while( devsettings[cycle][0] != '\0' ) {
   166         sprintf( audiopath,
   167                  _PATH_DEV_DSP,
   168                  devsettings[cycle][0],
   169                  devsettings[cycle][1],
   170                  devsettings[cycle][2]);
   171 
   172 	if ( stat(audiopath, &sb) == 0 ) {
   173 	    audio_fd = open(audiopath, flags, 0);
   174 	    if ( audio_fd > 0 ) {
   175 		if ( path != NULL ) {
   176 		    strncpy( path, audiopath, maxlen );
   177 		    path[maxlen-1] = '\0';
   178 		}
   179 	        return audio_fd;
   180 	    }
   181 	}
   182     }
   183     return -1;
   184 }
   185 
   186 #endif /* UNIX system */