comparison src/audio/SDL_audiodev.c @ 2049:5f6550e5184f

Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
author Ryan C. Gordon <icculus@icculus.org>
date Tue, 17 Oct 2006 09:15:21 +0000
parents c121d94672cb
children 866052b01ee5
comparison
equal deleted inserted replaced
2048:6067c7f9a672 2049:5f6550e5184f
44 #endif 44 #endif
45 #ifndef _PATH_DEV_AUDIO 45 #ifndef _PATH_DEV_AUDIO
46 #define _PATH_DEV_AUDIO "/dev/audio" 46 #define _PATH_DEV_AUDIO "/dev/audio"
47 #endif 47 #endif
48 48
49 static inline void
50 test_device(const char *fname, int flags, int (*test)(int fd),
51 char ***devices, int *devCount)
52 {
53 struct stat sb;
54 if ( (stat(fname, &sb) == 0) && (S_ISCHR(sb.st_mode)) ) {
55 int audio_fd = open(fname, flags, 0);
56 if ( (audio_fd >= 0) && (test(audio_fd)) ) {
57 void *p = SDL_realloc(*devices, ((*devCount)+1) * sizeof (char *));
58 if (p != NULL) {
59 size_t len = strlen(fname) + 1;
60 char *str = (char *) SDL_malloc(len);
61 *devices = (char **) p;
62 if (str != NULL) {
63 SDL_strlcpy(str, fname, len);
64 (*devices)[(*devCount)++] = str;
65 }
66 }
67 close(audio_fd);
68 }
69 }
70 }
49 71
50 int 72 void
51 SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic) 73 SDL_FreeUnixAudioDevices(char ***devices, int *devCount)
74 {
75 int i = *devCount;
76 if ((i > 0) && (*devices != NULL)) {
77 while (i--) {
78 SDL_free( (*devices)[*devCount] );
79 }
80 }
81
82 if (*devices != NULL) {
83 SDL_free(*devices);
84 }
85
86 *devices = NULL;
87 *devCount = 0;
88 }
89
90 static int
91 test_stub(int fd)
92 {
93 return 1;
94 }
95
96 void
97 SDL_EnumUnixAudioDevices(int flags, int classic, int (*test)(int fd),
98 char ***devices, int *devCount)
52 { 99 {
53 const char *audiodev; 100 const char *audiodev;
54 int audio_fd;
55 char audiopath[1024]; 101 char audiopath[1024];
102
103 if (test == NULL)
104 test = test_stub;
56 105
57 /* Figure out what our audio device is */ 106 /* Figure out what our audio device is */
58 if (((audiodev = SDL_getenv("SDL_PATH_DSP")) == NULL) && 107 if (((audiodev = SDL_getenv("SDL_PATH_DSP")) == NULL) &&
59 ((audiodev = SDL_getenv("AUDIODEV")) == NULL)) { 108 ((audiodev = SDL_getenv("AUDIODEV")) == NULL)) {
60 if (classic) { 109 if (classic) {
70 } else { 119 } else {
71 audiodev = _PATH_DEV_DSP; 120 audiodev = _PATH_DEV_DSP;
72 } 121 }
73 } 122 }
74 } 123 }
75 audio_fd = open(audiodev, flags, 0); 124 test_device(audiodev, flags, test, devices, devCount);
76 125
77 /* If the first open fails, look for other devices */ 126 if (SDL_strlen(audiodev) < (sizeof(audiopath) - 3)) {
78 if ((audio_fd < 0) && (SDL_strlen(audiodev) < (sizeof(audiopath) - 3))) { 127 int instance = 0;
79 int exists, instance; 128 while (instance++ <= 64) {
80 struct stat sb;
81
82 instance = 1;
83 do { /* Don't use errno ENOENT - it may not be thread-safe */
84 SDL_snprintf(audiopath, SDL_arraysize(audiopath), 129 SDL_snprintf(audiopath, SDL_arraysize(audiopath),
85 "%s%d", audiodev, instance++); 130 "%s%d", audiodev, instance);
86 exists = 0; 131 test_device(audiopath, flags, test, devices, devCount);
87 if (stat(audiopath, &sb) == 0) {
88 exists = 1;
89 audio_fd = open(audiopath, flags, 0);
90 }
91 }
92 while (exists && (audio_fd < 0));
93 audiodev = audiopath;
94 }
95 if (path != NULL) {
96 SDL_strlcpy(path, audiodev, maxlen);
97 path[maxlen - 1] = '\0';
98 }
99 return (audio_fd);
100 }
101
102 #elif SDL_AUDIO_DRIVER_PAUD
103
104 /* Get the name of the audio device we use for output */
105
106 #include <sys/types.h>
107 #include <sys/stat.h>
108
109 #include "SDL_stdinc.h"
110 #include "SDL_audiodev_c.h"
111
112 #ifndef _PATH_DEV_DSP
113 #define _PATH_DEV_DSP "/dev/%caud%c/%c"
114 #endif
115
116 char devsettings[][3] = {
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
129 OpenUserDefinedDevice(char *path, int maxlen, int flags)
130 {
131 const char *audiodev;
132 int audio_fd;
133
134 /* Figure out what our audio device is */
135 if ((audiodev = SDL_getenv("SDL_PATH_DSP")) == NULL) {
136 audiodev = SDL_getenv("AUDIODEV");
137 }
138 if (audiodev == NULL) {
139 return -1;
140 }
141 audio_fd = open(audiodev, flags, 0);
142 if (path != NULL) {
143 SDL_strlcpy(path, audiodev, maxlen);
144 path[maxlen - 1] = '\0';
145 }
146 return audio_fd;
147 }
148
149 int
150 SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic)
151 {
152 struct stat sb;
153 int audio_fd;
154 char audiopath[1024];
155 int cycle;
156
157 audio_fd = OpenUserDefinedDevice(path, maxlen, flags);
158 if (audio_fd != -1) {
159 return audio_fd;
160 }
161
162 cycle = 0;
163 while (devsettings[cycle][0] != '\0') {
164 SDL_snprintf(audiopath, SDL_arraysize(audiopath),
165 _PATH_DEV_DSP,
166 devsettings[cycle][0],
167 devsettings[cycle][1], devsettings[cycle][2]);
168
169 if (stat(audiopath, &sb) == 0) {
170 audio_fd = open(audiopath, flags, 0);
171 if (audio_fd > 0) {
172 if (path != NULL) {
173 SDL_strlcpy(path, audiopath, maxlen);
174 }
175 return audio_fd;
176 }
177 } 132 }
178 } 133 }
179 return -1;
180 } 134 }
181 135
182 #endif /* Audio driver selection */ 136 #endif /* Audio driver selection */
183 /* vi: set ts=4 sw=4 expandtab: */ 137 /* vi: set ts=4 sw=4 expandtab: */