Mercurial > sdl-ios-xcode
annotate src/audio/dsp/SDL_dspaudio.c @ 3846:66fb40445587 SDL-ryan-multiple-audio-device
Removed distinction between "available" and "init" in audio backends, since
both had to be checked for success as a pair at the higher level and several
of the Available methods were just always-succeed placeholders anyhow. Now
the availability check is done in the init code, and the higher level tries
all possible drivers until one manages to initialize successfully.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Tue, 17 Oct 2006 09:09:21 +0000 |
parents | 5b483ce86357 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1281
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1281
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1281
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 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 | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1281
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1281
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1281
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1281
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
248
diff
changeset
|
20 slouken@libsdl.org |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
21 |
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
22 Modified in Oct 2004 by Hannu Savolainen |
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
23 hannu@opensound.com |
0 | 24 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
25 #include "SDL_config.h" |
0 | 26 |
27 /* Allow access to a raw mixing buffer */ | |
28 | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
29 #include <stdio.h> /* For perror() */ |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
30 #include <string.h> /* For strerror() */ |
0 | 31 #include <errno.h> |
32 #include <unistd.h> | |
33 #include <fcntl.h> | |
34 #include <signal.h> | |
35 #include <sys/time.h> | |
36 #include <sys/ioctl.h> | |
37 #include <sys/stat.h> | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
38 |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
39 #if SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H |
94
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
93
diff
changeset
|
40 /* This is installed on some systems */ |
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
93
diff
changeset
|
41 #include <soundcard.h> |
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
93
diff
changeset
|
42 #else |
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
93
diff
changeset
|
43 /* This is recommended by OSS */ |
0 | 44 #include <sys/soundcard.h> |
94
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
93
diff
changeset
|
45 #endif |
0 | 46 |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1341
diff
changeset
|
47 #include "SDL_timer.h" |
0 | 48 #include "SDL_audio.h" |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
49 #include "../SDL_audiomem.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
50 #include "../SDL_audio_c.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
51 #include "../SDL_audiodev_c.h" |
0 | 52 #include "SDL_dspaudio.h" |
53 | |
54 /* The tag name used by DSP audio */ | |
55 #define DSP_DRIVER_NAME "dsp" | |
56 | |
57 /* Open the audio device for playback, and don't block if busy */ | |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
58 #define OPEN_FLAGS_OUTPUT (O_WRONLY|O_NONBLOCK) |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
59 #define OPEN_FLAGS_INPUT (O_RDONLY|O_NONBLOCK) |
0 | 60 |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
61 static char **outputDevices = NULL; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
62 static int outputDeviceCount = 0; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
63 static char **inputDevices = NULL; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
64 static int inputDeviceCount = 0; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
65 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
66 static inline void |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
67 free_device_list(char ***devs, int *count) |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
68 { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
69 SDL_FreeUnixAudioDevices(devs, count); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
70 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
71 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
72 static inline void |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
73 build_device_list(int iscapture, char ***devs, int *count) |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
74 { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
75 const int flags = ((iscapture) ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
76 free_device_list(devs, count); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
77 SDL_EnumUnixAudioDevices(flags, 0, NULL, devs, count); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
78 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
79 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
80 static inline void |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
81 build_device_lists(void) |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
82 { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
83 build_device_list(0, &outputDevices, &outputDeviceCount); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
84 build_device_list(1, &inputDevices, &inputDeviceCount); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
85 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
86 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
87 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
88 static inline void |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
89 free_device_lists(void) |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
90 { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
91 free_device_list(&outputDevices, &outputDeviceCount); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
92 free_device_list(&inputDevices, &inputDeviceCount); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
93 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
94 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
95 |
3820
1f156fd874fa
Moved more audio drivers to 1.3 API (all 5 MiNT backends, BSD, IRIX...), and
Ryan C. Gordon <icculus@icculus.org>
parents:
3817
diff
changeset
|
96 static void |
1f156fd874fa
Moved more audio drivers to 1.3 API (all 5 MiNT backends, BSD, IRIX...), and
Ryan C. Gordon <icculus@icculus.org>
parents:
3817
diff
changeset
|
97 DSP_Deinitialize(void) |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
98 { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
99 free_device_lists(); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
100 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
101 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
102 |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
103 static int |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
104 DSP_DetectDevices(int iscapture) |
0 | 105 { |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
106 if (iscapture) { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
107 build_device_list(1, &inputDevices, &inputDeviceCount); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
108 return inputDeviceCount; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
109 } else { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
110 build_device_list(0, &outputDevices, &outputDeviceCount); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
111 return outputDeviceCount; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
112 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
113 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
114 return 0; /* shouldn't ever hit this. */ |
0 | 115 } |
116 | |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
117 static const char * |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
118 DSP_GetDeviceName(int index, int iscapture) |
0 | 119 { |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
120 if ((iscapture) && (index < inputDeviceCount)) { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
121 return inputDevices[index]; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
122 } else if ((!iscapture) && (index < outputDeviceCount)) { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
123 return outputDevices[index]; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
124 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
125 |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
126 SDL_SetError("No such device"); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
127 return NULL; |
0 | 128 } |
129 | |
130 | |
3817 | 131 static void |
132 DSP_CloseDevice(_THIS) | |
133 { | |
134 if (this->hidden != NULL) { | |
135 if (this->hidden->mixbuf != NULL) { | |
136 SDL_FreeAudioMem(this->hidden->mixbuf); | |
137 this->hidden->mixbuf = NULL; | |
138 } | |
139 if (this->hidden->audio_fd >= 0) { | |
140 close(this->hidden->audio_fd); | |
141 this->hidden->audio_fd = -1; | |
142 } | |
143 SDL_free(this->hidden); | |
144 this->hidden = NULL; | |
145 } | |
146 } | |
147 | |
148 | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
149 static int |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
150 DSP_OpenDevice(_THIS, const char *devname, int iscapture) |
0 | 151 { |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
152 const int flags = ((iscapture) ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
153 int format; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
154 int value; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
155 int frag_spec; |
1982
3b4ce57c6215
First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents:
1895
diff
changeset
|
156 SDL_AudioFormat test_format; |
0 | 157 |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
158 /* We don't care what the devname is...we'll try to open anything. */ |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
159 /* ...but default to first name in the list... */ |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
160 if (devname == NULL) { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
161 if ( ((iscapture) && (inputDeviceCount == 0)) || |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
162 ((!iscapture) && (outputDeviceCount == 0)) ) { |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
163 SDL_SetError("No such audio device"); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
164 return 0; |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
165 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
166 devname = ((iscapture) ? inputDevices[0] : outputDevices[0]); |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
167 } |
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
168 |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
169 /* Initialize all variables that we clean on shutdown */ |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
170 this->hidden = (struct SDL_PrivateAudioData *) |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
171 SDL_malloc((sizeof *this->hidden)); |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
172 if (this->hidden == NULL) { |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
173 SDL_OutOfMemory(); |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
174 return 0; |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
175 } |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
176 SDL_memset(this->hidden, 0, (sizeof *this->hidden)); |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
177 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
178 /* Open the audio device */ |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
179 this->hidden->audio_fd = open(devname, flags, 0); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
180 if (this->hidden->audio_fd < 0) { |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
181 DSP_CloseDevice(this); |
3810
2c5387c0a642
Multiple audio device code is now working for dsp and dma targets.
Ryan C. Gordon <icculus@icculus.org>
parents:
3798
diff
changeset
|
182 SDL_SetError("Couldn't open %s: %s", devname, strerror(errno)); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
183 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
184 } |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
185 this->hidden->mixbuf = NULL; |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
186 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
187 /* Make the file descriptor use blocking writes with fcntl() */ |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
188 { |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
189 long ctlflags; |
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
190 ctlflags = fcntl(this->hidden->audio_fd, F_GETFL); |
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
191 ctlflags &= ~O_NONBLOCK; |
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
192 if (fcntl(this->hidden->audio_fd, F_SETFL, ctlflags) < 0) { |
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
193 DSP_CloseDevice(this); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
194 SDL_SetError("Couldn't set audio blocking mode"); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
195 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
196 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
197 } |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
198 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
199 /* Get a list of supported hardware formats */ |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
200 if (ioctl(this->hidden->audio_fd, SNDCTL_DSP_GETFMTS, &value) < 0) { |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
201 perror("SNDCTL_DSP_GETFMTS"); |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
202 DSP_CloseDevice(this); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
203 SDL_SetError("Couldn't get audio format list"); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
204 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
205 } |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
206 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
207 /* Try for a closest match on audio format */ |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
208 format = 0; |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
209 for (test_format = SDL_FirstAudioFormat(this->spec.format); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
210 !format && test_format;) { |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
211 #ifdef DEBUG_AUDIO |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
212 fprintf(stderr, "Trying format 0x%4.4x\n", test_format); |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
213 #endif |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
214 switch (test_format) { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
215 case AUDIO_U8: |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
216 if (value & AFMT_U8) { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
217 format = AFMT_U8; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
218 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
219 break; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
220 case AUDIO_S16LSB: |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
221 if (value & AFMT_S16_LE) { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
222 format = AFMT_S16_LE; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
223 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
224 break; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
225 case AUDIO_S16MSB: |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
226 if (value & AFMT_S16_BE) { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
227 format = AFMT_S16_BE; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
228 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
229 break; |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
230 #if 0 |
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
231 /* |
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
232 * These formats are not used by any real life systems so they are not |
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
233 * needed here. |
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
234 */ |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
235 case AUDIO_S8: |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
236 if (value & AFMT_S8) { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
237 format = AFMT_S8; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
238 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
239 break; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
240 case AUDIO_U16LSB: |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
241 if (value & AFMT_U16_LE) { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
242 format = AFMT_U16_LE; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
243 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
244 break; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
245 case AUDIO_U16MSB: |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
246 if (value & AFMT_U16_BE) { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
247 format = AFMT_U16_BE; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
248 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
249 break; |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
250 #endif |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
251 default: |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
252 format = 0; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
253 break; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
254 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
255 if (!format) { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
256 test_format = SDL_NextAudioFormat(); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
257 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
258 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
259 if (format == 0) { |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
260 DSP_CloseDevice(this); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
261 SDL_SetError("Couldn't find any hardware audio formats"); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
262 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
263 } |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
264 this->spec.format = test_format; |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
265 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
266 /* Set the audio format */ |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
267 value = format; |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
268 if ( (ioctl(this->hidden->audio_fd, SNDCTL_DSP_SETFMT, &value) < 0) || |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
269 (value != format) ) { |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
270 perror("SNDCTL_DSP_SETFMT"); |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
271 DSP_CloseDevice(this); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
272 SDL_SetError("Couldn't set audio format"); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
273 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
274 } |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
275 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
276 /* Set the number of channels of output */ |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
277 value = this->spec.channels; |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
278 if (ioctl(this->hidden->audio_fd, SNDCTL_DSP_CHANNELS, &value) < 0) { |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
279 perror("SNDCTL_DSP_CHANNELS"); |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
280 DSP_CloseDevice(this); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
281 SDL_SetError("Cannot set the number of channels"); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
282 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
283 } |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
284 this->spec.channels = value; |
968
4675910b0b7b
Date: Mon, 11 Oct 2004 15:17:27 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
960
diff
changeset
|
285 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
286 /* Set the DSP frequency */ |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
287 value = this->spec.freq; |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
288 if (ioctl(this->hidden->audio_fd, SNDCTL_DSP_SPEED, &value) < 0) { |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
289 perror("SNDCTL_DSP_SPEED"); |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
290 DSP_CloseDevice(this); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
291 SDL_SetError("Couldn't set audio frequency"); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
292 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
293 } |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
294 this->spec.freq = value; |
0 | 295 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
296 /* Calculate the final parameters for this audio specification */ |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
297 SDL_CalculateAudioSpec(&this->spec); |
0 | 298 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
299 /* Determine the power of two of the fragment size */ |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
300 for (frag_spec = 0; (0x01U << frag_spec) < this->spec.size; ++frag_spec); |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
301 if ((0x01U << frag_spec) != this->spec.size) { |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
302 DSP_CloseDevice(this); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
303 SDL_SetError("Fragment size must be a power of two"); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
304 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
305 } |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
306 frag_spec |= 0x00020000; /* two fragments, for low latency */ |
0 | 307 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
308 /* Set the audio buffering parameters */ |
0 | 309 #ifdef DEBUG_AUDIO |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
310 fprintf(stderr, "Requesting %d fragments of size %d\n", |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
311 (frag_spec >> 16), 1 << (frag_spec & 0xFFFF)); |
0 | 312 #endif |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
313 if (ioctl(this->hidden->audio_fd, SNDCTL_DSP_SETFRAGMENT, &frag_spec) < 0) { |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
314 perror("SNDCTL_DSP_SETFRAGMENT"); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
315 } |
0 | 316 #ifdef DEBUG_AUDIO |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
317 { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
318 audio_buf_info info; |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
319 ioctl(this->hidden->audio_fd, SNDCTL_DSP_GETOSPACE, &info); |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
320 fprintf(stderr, "fragments = %d\n", info.fragments); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
321 fprintf(stderr, "fragstotal = %d\n", info.fragstotal); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
322 fprintf(stderr, "fragsize = %d\n", info.fragsize); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
323 fprintf(stderr, "bytes = %d\n", info.bytes); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
324 } |
0 | 325 #endif |
326 | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
327 /* Allocate mixing buffer */ |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
328 this->hidden->mixlen = this->spec.size; |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
329 this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen); |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
330 if (this->hidden->mixbuf == NULL) { |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
331 DSP_CloseDevice(this); |
3826
5b483ce86357
Minor fixes in dsp driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
3820
diff
changeset
|
332 SDL_OutOfMemory(); |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
333 return 0; |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
334 } |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
335 SDL_memset(this->hidden->mixbuf, this->spec.silence, this->spec.size); |
0 | 336 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
337 /* We're ready to rock and roll. :-) */ |
3795
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
338 return 1; |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
339 } |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
340 |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
341 |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
342 static void |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
343 DSP_PlayDevice(_THIS) |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
344 { |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
345 const Uint8 *mixbuf = this->hidden->mixbuf; |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
346 const int mixlen = this->hidden->mixlen; |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
347 if (write(this->hidden->audio_fd, mixbuf, mixlen) == -1) { |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
348 perror("Audio write"); |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
349 this->enabled = 0; |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
350 } |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
351 #ifdef DEBUG_AUDIO |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
352 fprintf(stderr, "Wrote %d bytes of audio data\n", mixlen); |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
353 #endif |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
354 } |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
355 |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
356 static Uint8 * |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
357 DSP_GetDeviceBuf(_THIS) |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
358 { |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
359 return (this->hidden->mixbuf); |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
360 } |
589bc3d060cd
More 1.3 audio work...moved dsp and dma drivers over to new model. Untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1982
diff
changeset
|
361 |
3816
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
362 static int |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
363 DSP_Init(SDL_AudioDriverImpl *impl) |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
364 { |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
365 /* Set the function pointers */ |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
366 impl->DetectDevices = DSP_DetectDevices; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
367 impl->GetDeviceName = DSP_GetDeviceName; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
368 impl->OpenDevice = DSP_OpenDevice; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
369 impl->PlayDevice = DSP_PlayDevice; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
370 impl->GetDeviceBuf = DSP_GetDeviceBuf; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
371 impl->CloseDevice = DSP_CloseDevice; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
372 impl->Deinitialize = DSP_Deinitialize; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
373 |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
374 build_device_lists(); |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
375 return 1; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
376 } |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
377 |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
378 |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
379 AudioBootStrap DSP_bootstrap = { |
3846
66fb40445587
Removed distinction between "available" and "init" in audio backends, since
Ryan C. Gordon <icculus@icculus.org>
parents:
3826
diff
changeset
|
380 DSP_DRIVER_NAME, "OSS /dev/dsp standard audio", DSP_Init, 0 |
3816
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
381 }; |
9d070c1a45fa
Moved AudioBootstrap section in converted drivers to bottom of source, so I
Ryan C. Gordon <icculus@icculus.org>
parents:
3810
diff
changeset
|
382 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
383 /* vi: set ts=4 sw=4 expandtab: */ |