Mercurial > sdl-ios-xcode
annotate src/audio/arts/SDL_artsaudio.c @ 4170:092c0bc69155 SDL-1.2
Fixed bug #618
Description From Tim Angus 2008-08-30 12:23:56 (-) [reply]
As we all know SDL 1.2 doesn't handle dead keys well since one key press
potentially equals two (or more) characters. For example, on many layouts,
keying <backquote>,<space> results in <no character>,<backquote><space>. Since
the unicode member of the SDL_keysym struct only has room for one character,
only one can be returned.
On Linux, the first character is returned. On Windows however, unless the exact
number of characters generated by the keypress is 1, nothing is returned. The
following patch addresses this inconsistency.
Updated patch which includes a further fix to the handling of the numpad when
numlock is on. This further fix is courtesy Amanieu d'Antras.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 13 Apr 2009 08:42:09 +0000 |
parents | a1b03ba2fcd0 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
4159 | 3 Copyright (C) 1997-2009 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:
956
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:
956
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:
956
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:
956
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:
956
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:
956
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:
0
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* Allow access to a raw mixing buffer */ | |
25 | |
4015
7e878cc4250a
Fixed compiler warning (gcc w/ -Wall) for using getpid() and kill() without
Ryan C. Gordon <icculus@icculus.org>
parents:
3959
diff
changeset
|
26 #ifdef HAVE_SIGNAL_H |
7e878cc4250a
Fixed compiler warning (gcc w/ -Wall) for using getpid() and kill() without
Ryan C. Gordon <icculus@icculus.org>
parents:
3959
diff
changeset
|
27 #include <signal.h> |
7e878cc4250a
Fixed compiler warning (gcc w/ -Wall) for using getpid() and kill() without
Ryan C. Gordon <icculus@icculus.org>
parents:
3959
diff
changeset
|
28 #endif |
7e878cc4250a
Fixed compiler warning (gcc w/ -Wall) for using getpid() and kill() without
Ryan C. Gordon <icculus@icculus.org>
parents:
3959
diff
changeset
|
29 #include <unistd.h> |
7e878cc4250a
Fixed compiler warning (gcc w/ -Wall) for using getpid() and kill() without
Ryan C. Gordon <icculus@icculus.org>
parents:
3959
diff
changeset
|
30 |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
31 #include "SDL_timer.h" |
0 | 32 #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
|
33 #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
|
34 #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
|
35 #include "../SDL_audiodev_c.h" |
0 | 36 #include "SDL_artsaudio.h" |
37 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
38 #ifdef SDL_AUDIO_DRIVER_ARTS_DYNAMIC |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
39 #include "SDL_name.h" |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
40 #include "SDL_loadso.h" |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
41 #else |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
42 #define SDL_NAME(X) X |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
43 #endif |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
44 |
0 | 45 /* The tag name used by artsc audio */ |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
46 #define ARTS_DRIVER_NAME "arts" |
0 | 47 |
48 /* Audio driver functions */ | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
49 static int ARTS_OpenAudio(_THIS, SDL_AudioSpec *spec); |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
50 static void ARTS_WaitAudio(_THIS); |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
51 static void ARTS_PlayAudio(_THIS); |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
52 static Uint8 *ARTS_GetAudioBuf(_THIS); |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
53 static void ARTS_CloseAudio(_THIS); |
0 | 54 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
55 #ifdef SDL_AUDIO_DRIVER_ARTS_DYNAMIC |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
56 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
57 static const char *arts_library = SDL_AUDIO_DRIVER_ARTS_DYNAMIC; |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
58 static void *arts_handle = NULL; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
59 static int arts_loaded = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
60 |
301
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
61 static int (*SDL_NAME(arts_init))(void); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
62 static void (*SDL_NAME(arts_free))(void); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
63 static arts_stream_t (*SDL_NAME(arts_play_stream))(int rate, int bits, int channels, const char *name); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
64 static int (*SDL_NAME(arts_stream_set))(arts_stream_t s, arts_parameter_t param, int value); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
65 static int (*SDL_NAME(arts_stream_get))(arts_stream_t s, arts_parameter_t param); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
66 static int (*SDL_NAME(arts_write))(arts_stream_t s, const void *buffer, int count); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
67 static void (*SDL_NAME(arts_close_stream))(arts_stream_t s); |
3959
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
68 static int (*SDL_NAME(arts_suspended))(void); |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
69 static const char *(*SDL_NAME(arts_error_text))(int errorcode); |
301
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
70 |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
71 static struct { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
72 const char *name; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
73 void **func; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
74 } arts_functions[] = { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
75 { "arts_init", (void **)&SDL_NAME(arts_init) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
76 { "arts_free", (void **)&SDL_NAME(arts_free) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
77 { "arts_play_stream", (void **)&SDL_NAME(arts_play_stream) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
78 { "arts_stream_set", (void **)&SDL_NAME(arts_stream_set) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
79 { "arts_stream_get", (void **)&SDL_NAME(arts_stream_get) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
80 { "arts_write", (void **)&SDL_NAME(arts_write) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
81 { "arts_close_stream", (void **)&SDL_NAME(arts_close_stream) }, |
3959
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
82 { "arts_suspended", (void **)&SDL_NAME(arts_suspended) }, |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
83 { "arts_error_text", (void **)&SDL_NAME(arts_error_text) }, |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
84 }; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
85 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
86 static void UnloadARTSLibrary() |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
87 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
88 if ( arts_loaded ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
89 SDL_UnloadObject(arts_handle); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
90 arts_handle = NULL; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
91 arts_loaded = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
92 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
93 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
94 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
95 static int LoadARTSLibrary(void) |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
96 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
97 int i, retval = -1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
98 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
99 arts_handle = SDL_LoadObject(arts_library); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
100 if ( arts_handle ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
101 arts_loaded = 1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
102 retval = 0; |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
103 for ( i=0; i<SDL_arraysize(arts_functions); ++i ) { |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
104 *arts_functions[i].func = SDL_LoadFunction(arts_handle, arts_functions[i].name); |
864
0c892e99b65b
Date: Sun, 29 Feb 2004 20:28:27 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
105 if ( !*arts_functions[i].func ) { |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
106 retval = -1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
107 UnloadARTSLibrary(); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
108 break; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
109 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
110 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
111 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
112 return retval; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
113 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
114 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
115 #else |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
116 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
117 static void UnloadARTSLibrary() |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
118 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
119 return; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
120 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
121 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
122 static int LoadARTSLibrary(void) |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
123 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
124 return 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
125 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
126 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
127 #endif /* SDL_AUDIO_DRIVER_ARTS_DYNAMIC */ |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
128 |
0 | 129 /* Audio driver bootstrap functions */ |
130 | |
131 static int Audio_Available(void) | |
132 { | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
133 int available = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
134 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
135 if ( LoadARTSLibrary() < 0 ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
136 return available; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
137 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
138 if ( SDL_NAME(arts_init)() == 0 ) { |
3959
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
139 if ( SDL_NAME(arts_suspended)() ) { |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
140 /* Play a stream so aRts doesn't crash */ |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
141 arts_stream_t stream2; |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
142 stream2=SDL_NAME(arts_play_stream)(44100, 16, 2, "SDL"); |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
143 SDL_NAME(arts_write)(stream2, "", 0); |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
144 SDL_NAME(arts_close_stream)(stream2); |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
145 available = 1; |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
146 } |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
147 SDL_NAME(arts_free)(); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
148 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
149 UnloadARTSLibrary(); |
474
583a07ab5444
Doh! Patch by Joel Ray Holveck
Sam Lantinga <slouken@libsdl.org>
parents:
301
diff
changeset
|
150 |
583a07ab5444
Doh! Patch by Joel Ray Holveck
Sam Lantinga <slouken@libsdl.org>
parents:
301
diff
changeset
|
151 return available; |
0 | 152 } |
153 | |
154 static void Audio_DeleteDevice(SDL_AudioDevice *device) | |
155 { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
156 SDL_free(device->hidden); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
157 SDL_free(device); |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
158 UnloadARTSLibrary(); |
0 | 159 } |
160 | |
161 static SDL_AudioDevice *Audio_CreateDevice(int devindex) | |
162 { | |
163 SDL_AudioDevice *this; | |
164 | |
165 /* Initialize all variables that we clean on shutdown */ | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
166 LoadARTSLibrary(); |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
167 this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice)); |
0 | 168 if ( this ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
169 SDL_memset(this, 0, (sizeof *this)); |
0 | 170 this->hidden = (struct SDL_PrivateAudioData *) |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
171 SDL_malloc((sizeof *this->hidden)); |
0 | 172 } |
173 if ( (this == NULL) || (this->hidden == NULL) ) { | |
174 SDL_OutOfMemory(); | |
175 if ( this ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
176 SDL_free(this); |
0 | 177 } |
178 return(0); | |
179 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
180 SDL_memset(this->hidden, 0, (sizeof *this->hidden)); |
0 | 181 stream = 0; |
182 | |
183 /* Set the function pointers */ | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
184 this->OpenAudio = ARTS_OpenAudio; |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
185 this->WaitAudio = ARTS_WaitAudio; |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
186 this->PlayAudio = ARTS_PlayAudio; |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
187 this->GetAudioBuf = ARTS_GetAudioBuf; |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
188 this->CloseAudio = ARTS_CloseAudio; |
0 | 189 |
190 this->free = Audio_DeleteDevice; | |
191 | |
192 return this; | |
193 } | |
194 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
195 AudioBootStrap ARTS_bootstrap = { |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
196 ARTS_DRIVER_NAME, "Analog Realtime Synthesizer", |
0 | 197 Audio_Available, Audio_CreateDevice |
198 }; | |
199 | |
200 /* This function waits until it is possible to write a full sound buffer */ | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
201 static void ARTS_WaitAudio(_THIS) |
0 | 202 { |
203 Sint32 ticks; | |
204 | |
205 /* Check to see if the thread-parent process is still alive */ | |
206 { static int cnt = 0; | |
207 /* Note that this only works with thread implementations | |
208 that use a different process id for each thread. | |
209 */ | |
210 if (parent && (((++cnt)%10) == 0)) { /* Check every 10 loops */ | |
211 if ( kill(parent, 0) < 0 ) { | |
212 this->enabled = 0; | |
213 } | |
214 } | |
215 } | |
216 | |
217 /* Use timer for general audio synchronization */ | |
218 ticks = ((Sint32)(next_frame - SDL_GetTicks()))-FUDGE_TICKS; | |
219 if ( ticks > 0 ) { | |
220 SDL_Delay(ticks); | |
221 } | |
222 } | |
223 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
224 static void ARTS_PlayAudio(_THIS) |
0 | 225 { |
226 int written; | |
227 | |
228 /* Write the audio data */ | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
229 written = SDL_NAME(arts_write)(stream, mixbuf, mixlen); |
0 | 230 |
231 /* If timer synchronization is enabled, set the next write frame */ | |
232 if ( frame_ticks ) { | |
233 next_frame += frame_ticks; | |
234 } | |
235 | |
236 /* If we couldn't write, assume fatal error for now */ | |
237 if ( written < 0 ) { | |
238 this->enabled = 0; | |
239 } | |
240 #ifdef DEBUG_AUDIO | |
241 fprintf(stderr, "Wrote %d bytes of audio data\n", written); | |
242 #endif | |
243 } | |
244 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
245 static Uint8 *ARTS_GetAudioBuf(_THIS) |
0 | 246 { |
247 return(mixbuf); | |
248 } | |
249 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
250 static void ARTS_CloseAudio(_THIS) |
0 | 251 { |
252 if ( mixbuf != NULL ) { | |
253 SDL_FreeAudioMem(mixbuf); | |
254 mixbuf = NULL; | |
255 } | |
256 if ( stream ) { | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
257 SDL_NAME(arts_close_stream)(stream); |
0 | 258 stream = 0; |
259 } | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
260 SDL_NAME(arts_free)(); |
0 | 261 } |
262 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
263 static int ARTS_OpenAudio(_THIS, SDL_AudioSpec *spec) |
0 | 264 { |
265 int bits, frag_spec; | |
266 Uint16 test_format, format; | |
3959
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
267 int error_code; |
0 | 268 |
269 /* Reset the timer synchronization flag */ | |
270 frame_ticks = 0.0; | |
271 | |
272 mixbuf = NULL; | |
273 | |
274 /* Try for a closest match on audio format */ | |
275 format = 0; | |
276 bits = 0; | |
277 for ( test_format = SDL_FirstAudioFormat(spec->format); | |
278 ! format && test_format; ) { | |
279 #ifdef DEBUG_AUDIO | |
280 fprintf(stderr, "Trying format 0x%4.4x\n", test_format); | |
281 #endif | |
282 switch ( test_format ) { | |
283 case AUDIO_U8: | |
284 bits = 8; | |
285 format = 1; | |
286 break; | |
287 case AUDIO_S16LSB: | |
288 bits = 16; | |
289 format = 1; | |
290 break; | |
291 default: | |
292 format = 0; | |
293 break; | |
294 } | |
295 if ( ! format ) { | |
296 test_format = SDL_NextAudioFormat(); | |
297 } | |
298 } | |
299 if ( format == 0 ) { | |
300 SDL_SetError("Couldn't find any hardware audio formats"); | |
301 return(-1); | |
302 } | |
303 spec->format = test_format; | |
304 | |
3959
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
305 error_code = SDL_NAME(arts_init)(); |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
306 if ( error_code != 0 ) { |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
307 SDL_SetError("Unable to initialize ARTS: %s", SDL_NAME(arts_error_text)(error_code)); |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
308 return(-1); |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
309 } |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
310 if ( ! SDL_NAME(arts_suspended)() ) { |
33c248ea75f9
Prevent arts audio target from crashing/hanging SDL if the audio hardware
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
311 SDL_SetError("ARTS can not open audio device"); |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
312 return(-1); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
313 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
314 stream = SDL_NAME(arts_play_stream)(spec->freq, bits, spec->channels, "SDL"); |
0 | 315 |
316 /* Calculate the final parameters for this audio specification */ | |
317 SDL_CalculateAudioSpec(spec); | |
318 | |
319 /* Determine the power of two of the fragment size */ | |
320 for ( frag_spec = 0; (0x01<<frag_spec) < spec->size; ++frag_spec ); | |
321 if ( (0x01<<frag_spec) != spec->size ) { | |
322 SDL_SetError("Fragment size must be a power of two"); | |
323 return(-1); | |
324 } | |
325 frag_spec |= 0x00020000; /* two fragments, for low latency */ | |
326 | |
327 #ifdef ARTS_P_PACKET_SETTINGS | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
328 SDL_NAME(arts_stream_set)(stream, ARTS_P_PACKET_SETTINGS, frag_spec); |
0 | 329 #else |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
330 SDL_NAME(arts_stream_set)(stream, ARTS_P_PACKET_SIZE, frag_spec&0xffff); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
331 SDL_NAME(arts_stream_set)(stream, ARTS_P_PACKET_COUNT, frag_spec>>16); |
0 | 332 #endif |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
333 spec->size = SDL_NAME(arts_stream_get)(stream, ARTS_P_PACKET_SIZE); |
0 | 334 |
335 /* Allocate mixing buffer */ | |
336 mixlen = spec->size; | |
337 mixbuf = (Uint8 *)SDL_AllocAudioMem(mixlen); | |
338 if ( mixbuf == NULL ) { | |
339 return(-1); | |
340 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
341 SDL_memset(mixbuf, spec->silence, spec->size); |
0 | 342 |
343 /* Get the parent process id (we're the parent of the audio thread) */ | |
344 parent = getpid(); | |
345 | |
346 /* We're ready to rock and roll. :-) */ | |
347 return(0); | |
348 } |