Mercurial > sdl-ios-xcode
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: */ |