0
+ − 1 /*
+ − 2 SDL - Simple DirectMedia Layer
+ − 3 Copyright (C) 1997, 1998, 1999, 2000, 2001 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@devolution.com
+ − 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 #define _PATH_DEV_DSP "/dev/dsp"
+ − 43 #endif
+ − 44 #ifndef _PATH_DEV_DSP24
+ − 45 #define _PATH_DEV_DSP24 "/dev/sound/dsp"
+ − 46 #endif
+ − 47 #ifndef _PATH_DEV_AUDIO
+ − 48 #define _PATH_DEV_AUDIO "/dev/audio"
+ − 49 #endif
+ − 50
+ − 51
+ − 52 int SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic)
+ − 53 {
+ − 54 const char *audiodev;
+ − 55 int audio_fd;
+ − 56 char audiopath[1024];
+ − 57
+ − 58 /* Figure out what our audio device is */
+ − 59 if ( ((audiodev=getenv("SDL_PATH_DSP")) == NULL) &&
+ − 60 ((audiodev=getenv("AUDIODEV")) == NULL) ) {
+ − 61 if ( classic ) {
+ − 62 audiodev = _PATH_DEV_AUDIO;
+ − 63 } else {
+ − 64 struct stat sb;
+ − 65
+ − 66 /* Added support for /dev/sound/\* in Linux 2.4 */
+ − 67 if ( (stat("/dev/sound", &sb) == 0) &&
+ − 68 S_ISDIR(sb.st_mode) ) {
+ − 69 audiodev = _PATH_DEV_DSP24;
+ − 70 } else {
+ − 71 audiodev = _PATH_DEV_DSP;
+ − 72 }
+ − 73 }
+ − 74 }
+ − 75 audio_fd = open(audiodev, flags, 0);
+ − 76
+ − 77 /* If the first open fails, look for other devices */
+ − 78 if ( (audio_fd < 0) && (strlen(audiodev) < (sizeof(audiopath)-3)) ) {
+ − 79 int exists, instance;
+ − 80 struct stat sb;
+ − 81
+ − 82 instance = 1;
+ − 83 do { /* Don't use errno ENOENT - it may not be thread-safe */
+ − 84 sprintf(audiopath, "%s%d", audiodev, instance++);
+ − 85 exists = 0;
+ − 86 if ( stat(audiopath, &sb) == 0 ) {
+ − 87 exists = 1;
+ − 88 audio_fd = open(audiopath, flags, 0);
+ − 89 }
+ − 90 } while ( exists && (audio_fd < 0) );
+ − 91 audiodev = audiopath;
+ − 92 }
+ − 93 if ( path != NULL ) {
+ − 94 strncpy(path, audiodev, maxlen);
+ − 95 path[maxlen-1] = '\0';
+ − 96 }
+ − 97 return(audio_fd);
+ − 98 }
+ − 99
+ − 100 #elif defined(_AIX)
+ − 101
+ − 102 /* Get the name of the audio device we use for output */
+ − 103
+ − 104 #include <stdlib.h>
+ − 105 #include <sys/types.h>
+ − 106 #include <sys/stat.h>
+ − 107 #include <string.h>
+ − 108
+ − 109 #include "SDL_audiodev_c.h"
+ − 110
+ − 111 #ifndef _PATH_DEV_DSP
+ − 112 #define _PATH_DEV_DSP "/dev/%caud%c/%c"
+ − 113 #endif
+ − 114
+ − 115 char devsettings[][3] =
+ − 116 {
+ − 117 { 'p', '0', '1' }, { 'p', '0', '2' }, { 'p', '0', '3' }, { 'p', '0', '4' },
+ − 118 { 'p', '1', '1' }, { 'p', '1', '2' }, { 'p', '1', '3' }, { 'p', '1', '4' },
+ − 119 { 'p', '2', '1' }, { 'p', '2', '2' }, { 'p', '2', '3' }, { 'p', '2', '4' },
+ − 120 { 'p', '3', '1' }, { 'p', '3', '2' }, { 'p', '3', '3' }, { 'p', '3', '4' },
+ − 121 { 'b', '0', '1' }, { 'b', '0', '2' }, { 'b', '0', '3' }, { 'b', '0', '4' },
+ − 122 { 'b', '1', '1' }, { 'b', '1', '2' }, { 'b', '1', '3' }, { 'b', '1', '4' },
+ − 123 { 'b', '2', '1' }, { 'b', '2', '2' }, { 'b', '2', '3' }, { 'b', '2', '4' },
+ − 124 { 'b', '3', '1' }, { 'b', '3', '2' }, { 'b', '3', '3' }, { 'b', '3', '4' },
+ − 125 { '\0', '\0', '\0' }
+ − 126 };
+ − 127
+ − 128 static int OpenUserDefinedDevice(char *path, int maxlen, int flags)
+ − 129 {
+ − 130 const char *audiodev;
+ − 131 int audio_fd;
+ − 132
+ − 133 /* Figure out what our audio device is */
+ − 134 if ((audiodev=getenv("SDL_PATH_DSP")) == NULL) {
+ − 135 audiodev=getenv("AUDIODEV");
+ − 136 }
+ − 137 if ( audiodev == NULL ) {
+ − 138 return -1;
+ − 139 }
+ − 140 audio_fd = open(audiodev, flags, 0);
+ − 141 if ( path != NULL ) {
+ − 142 strncpy(path, audiodev, maxlen);
+ − 143 path[maxlen-1] = '\0';
+ − 144 }
+ − 145 return audio_fd;
+ − 146 }
+ − 147
+ − 148 int SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic)
+ − 149 {
+ − 150 struct stat sb;
+ − 151 int audio_fd;
+ − 152 char audiopath[1024];
+ − 153 int cycle;
+ − 154
+ − 155 audio_fd = OpenUserDefinedDevice(path,maxlen,flags);
+ − 156 if ( audio_fd != -1 ) {
+ − 157 return audio_fd;
+ − 158 }
+ − 159
+ − 160 cycle = 0;
+ − 161 while( devsettings[cycle][0] != '\0' ) {
+ − 162 sprintf( audiopath,
+ − 163 _PATH_DEV_DSP,
+ − 164 devsettings[cycle][0],
+ − 165 devsettings[cycle][1],
+ − 166 devsettings[cycle][2]);
+ − 167
+ − 168 if ( stat(audiopath, &sb) == 0 ) {
+ − 169 audio_fd = open(audiopath, flags, 0);
+ − 170 if ( audio_fd > 0 ) {
+ − 171 if ( path != NULL ) {
+ − 172 strncpy( path, audiopath, maxlen );
+ − 173 path[maxlen-1] = '\0';
+ − 174 }
+ − 175 return audio_fd;
+ − 176 }
+ − 177 }
+ − 178 }
+ − 179 return -1;
+ − 180 }
+ − 181
+ − 182 #endif /* UNIX system */