Mercurial > sdl-ios-xcode
annotate src/audio/pulse/SDL_pulseaudio.c @ 4223:63fd67e17705 SDL-1.2
Fixed bug #727
Lorenzo Desole 2009-04-19 07:36:10 PDT
I am one of the developers of a multimedia application (My Media System MMS),
which uses SDL.
MMS is normally running in fullscreen mode but it switches it off before
launching external applications (mplayer, xine, etc.).
The problem with fullscreen is that when the latter is switched off either via
SDL_WM_ToggleFullScreen() or SDL_SetVideoMode(), SDL compares the current
screen sizes with the ones saved when the video system was initted, and if they
don't match, it calls XF86VidModeSwitchToMode() to switch to the old modeline.
This makes it impossible for external programs and for MMS itself to use RandR
to change the screen size, because next time fullscreen mode is turned off, it
bombs out with the following error:
X Error of failed request: BadValue (integer parameter out of range for
operation)
Major opcode of failed request: 136 (XFree86-VidModeExtension)
Minor opcode of failed request: 10 (XF86VidModeSwitchToMode)
[...]
Obviously this happens only if the new screen resolution is smaller than the
original one and XF86VidModeSwitchToMode() can't succeed.
I couldn't find any way to inform SDL that the screen resolution it uses as
reference is no longer valid.
This can be fixed by adding "save_mode(this)" to
./src/video/x11/SDL_x11modes.c, API X11_EnterFullScreen(_THIS), like this:
int X11_EnterFullScreen(_THIS)
{
int okay;
+ save_mode(this);
I can't rule out possible side effects, but I don't see any.
While I admit this is a minor issue for the general users, it is a major
showstopper for our program where the ability to change screen resolution and
refresh rate according to the movie being played, is very important.
Thanks in advance.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 21 Sep 2009 11:14:36 +0000 |
parents | 5b99971a27b4 |
children | 14f95e514408 |
rev | line source |
---|---|
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
1 /* |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
2 SDL - Simple DirectMedia Layer |
4159 | 3 Copyright (C) 1997-2009 Sam Lantinga |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
4 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
5 This library is free software; you can redistribute it and/or |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
7 License as published by the Free Software Foundation; either |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
9 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
10 This library is distributed in the hope that it will be useful, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
13 Lesser General Public License for more details. |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
14 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
18 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
19 Stéphan Kochen |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
20 stephan@kochen.nl |
4211 | 21 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
22 Based on parts of the ALSA and ESounD output drivers. |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
23 */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
24 #include "SDL_config.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
25 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
26 /* Allow access to an PulseAudio network stream mixing buffer */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
27 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
28 #include <sys/types.h> |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
29 #include <unistd.h> |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
30 #include <signal.h> |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
31 #include <errno.h> |
4216 | 32 #include <pulse/pulseaudio.h> |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
33 #include <pulse/simple.h> |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
34 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
35 #include "SDL_timer.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
36 #include "SDL_audio.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
37 #include "../SDL_audiomem.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
38 #include "../SDL_audio_c.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
39 #include "../SDL_audiodev_c.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
40 #include "SDL_pulseaudio.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
41 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
42 #ifdef SDL_AUDIO_DRIVER_PULSE_DYNAMIC |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
43 #include "SDL_name.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
44 #include "SDL_loadso.h" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
45 #else |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
46 #define SDL_NAME(X) X |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
47 #endif |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
48 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
49 /* The tag name used by the driver */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
50 #define PULSE_DRIVER_NAME "pulse" |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
51 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
52 /* Audio driver functions */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
53 static int PULSE_OpenAudio(_THIS, SDL_AudioSpec *spec); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
54 static void PULSE_WaitAudio(_THIS); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
55 static void PULSE_PlayAudio(_THIS); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
56 static Uint8 *PULSE_GetAudioBuf(_THIS); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
57 static void PULSE_CloseAudio(_THIS); |
4216 | 58 static void PULSE_WaitDone(_THIS); |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
59 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
60 #ifdef SDL_AUDIO_DRIVER_PULSE_DYNAMIC |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
61 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
62 static const char *pulse_library = SDL_AUDIO_DRIVER_PULSE_DYNAMIC; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
63 static void *pulse_handle = NULL; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
64 static int pulse_loaded = 0; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
65 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
66 static pa_simple* (*SDL_NAME(pa_simple_new))( |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
67 const char *server, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
68 const char *name, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
69 pa_stream_direction_t dir, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
70 const char *dev, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
71 const char *stream_name, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
72 const pa_sample_spec *ss, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
73 const pa_channel_map *map, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
74 const pa_buffer_attr *attr, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
75 int *error |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
76 ); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
77 static void (*SDL_NAME(pa_simple_free))(pa_simple *s); |
4216 | 78 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
79 static pa_channel_map* (*SDL_NAME(pa_channel_map_init_auto))( |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
80 pa_channel_map *m, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
81 unsigned channels, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
82 pa_channel_map_def_t def |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
83 ); |
4211 | 84 |
4216 | 85 pa_mainloop * (*SDL_NAME(pa_mainloop_new))(void); |
86 pa_mainloop_api * (*SDL_NAME(pa_mainloop_get_api))(pa_mainloop *m); | |
87 int (*SDL_NAME(pa_mainloop_iterate))(pa_mainloop *m, int block, int *retval); | |
88 void (*SDL_NAME(pa_mainloop_free))(pa_mainloop *m); | |
89 | |
90 pa_operation_state_t (*SDL_NAME(pa_operation_get_state))(pa_operation *o); | |
91 void (*SDL_NAME(pa_operation_cancel))(pa_operation *o); | |
92 void (*SDL_NAME(pa_operation_unref))(pa_operation *o); | |
93 | |
94 pa_context * (*SDL_NAME(pa_context_new))( | |
95 pa_mainloop_api *m, const char *name); | |
96 int (*SDL_NAME(pa_context_connect))( | |
97 pa_context *c, const char *server, | |
98 pa_context_flags_t flags, const pa_spawn_api *api); | |
99 pa_context_state_t (*SDL_NAME(pa_context_get_state))(pa_context *c); | |
100 void (*SDL_NAME(pa_context_disconnect))(pa_context *c); | |
101 void (*SDL_NAME(pa_context_unref))(pa_context *c); | |
102 | |
103 pa_stream * (*SDL_NAME(pa_stream_new))(pa_context *c, | |
104 const char *name, const pa_sample_spec *ss, const pa_channel_map *map); | |
105 int (*SDL_NAME(pa_stream_connect_playback))(pa_stream *s, const char *dev, | |
106 const pa_buffer_attr *attr, pa_stream_flags_t flags, | |
107 pa_cvolume *volume, pa_stream *sync_stream); | |
108 pa_stream_state_t (*SDL_NAME(pa_stream_get_state))(pa_stream *s); | |
109 size_t (*SDL_NAME(pa_stream_writable_size))(pa_stream *s); | |
110 int (*SDL_NAME(pa_stream_write))(pa_stream *s, const void *data, size_t nbytes, | |
111 pa_free_cb_t free_cb, int64_t offset, pa_seek_mode_t seek); | |
112 pa_operation * (*SDL_NAME(pa_stream_drain))(pa_stream *s, | |
113 pa_stream_success_cb_t cb, void *userdata); | |
114 int (*SDL_NAME(pa_stream_disconnect))(pa_stream *s); | |
115 void (*SDL_NAME(pa_stream_unref))(pa_stream *s); | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
116 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
117 static struct { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
118 const char *name; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
119 void **func; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
120 } pulse_functions[] = { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
121 { "pa_simple_new", |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
122 (void **)&SDL_NAME(pa_simple_new) }, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
123 { "pa_simple_free", |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
124 (void **)&SDL_NAME(pa_simple_free) }, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
125 { "pa_channel_map_init_auto", |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
126 (void **)&SDL_NAME(pa_channel_map_init_auto) }, |
4216 | 127 { "pa_mainloop_new", |
128 (void **)&SDL_NAME(pa_mainloop_new) }, | |
129 { "pa_mainloop_get_api", | |
130 (void **)&SDL_NAME(pa_mainloop_get_api) }, | |
131 { "pa_mainloop_iterate", | |
132 (void **)&SDL_NAME(pa_mainloop_iterate) }, | |
133 { "pa_mainloop_free", | |
134 (void **)&SDL_NAME(pa_mainloop_free) }, | |
135 { "pa_operation_get_state", | |
136 (void **)&SDL_NAME(pa_operation_get_state) }, | |
137 { "pa_operation_cancel", | |
138 (void **)&SDL_NAME(pa_operation_cancel) }, | |
139 { "pa_operation_unref", | |
140 (void **)&SDL_NAME(pa_operation_unref) }, | |
141 { "pa_context_new", | |
142 (void **)&SDL_NAME(pa_context_new) }, | |
143 { "pa_context_connect", | |
144 (void **)&SDL_NAME(pa_context_connect) }, | |
145 { "pa_context_get_state", | |
146 (void **)&SDL_NAME(pa_context_get_state) }, | |
147 { "pa_context_disconnect", | |
148 (void **)&SDL_NAME(pa_context_disconnect) }, | |
149 { "pa_context_unref", | |
150 (void **)&SDL_NAME(pa_context_unref) }, | |
151 { "pa_stream_new", | |
152 (void **)&SDL_NAME(pa_stream_new) }, | |
153 { "pa_stream_connect_playback", | |
154 (void **)&SDL_NAME(pa_stream_connect_playback) }, | |
155 { "pa_stream_get_state", | |
156 (void **)&SDL_NAME(pa_stream_get_state) }, | |
157 { "pa_stream_writable_size", | |
158 (void **)&SDL_NAME(pa_stream_writable_size) }, | |
159 { "pa_stream_write", | |
160 (void **)&SDL_NAME(pa_stream_write) }, | |
161 { "pa_stream_drain", | |
162 (void **)&SDL_NAME(pa_stream_drain) }, | |
163 { "pa_stream_disconnect", | |
164 (void **)&SDL_NAME(pa_stream_disconnect) }, | |
165 { "pa_stream_unref", | |
166 (void **)&SDL_NAME(pa_stream_unref) }, | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
167 }; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
168 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
169 static void UnloadPulseLibrary() |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
170 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
171 if ( pulse_loaded ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
172 SDL_UnloadObject(pulse_handle); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
173 pulse_handle = NULL; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
174 pulse_loaded = 0; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
175 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
176 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
177 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
178 static int LoadPulseLibrary(void) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
179 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
180 int i, retval = -1; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
181 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
182 pulse_handle = SDL_LoadObject(pulse_library); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
183 if ( pulse_handle ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
184 pulse_loaded = 1; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
185 retval = 0; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
186 for ( i=0; i<SDL_arraysize(pulse_functions); ++i ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
187 *pulse_functions[i].func = SDL_LoadFunction(pulse_handle, pulse_functions[i].name); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
188 if ( !*pulse_functions[i].func ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
189 retval = -1; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
190 UnloadPulseLibrary(); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
191 break; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
192 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
193 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
194 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
195 return retval; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
196 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
197 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
198 #else |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
199 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
200 static void UnloadPulseLibrary() |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
201 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
202 return; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
203 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
204 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
205 static int LoadPulseLibrary(void) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
206 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
207 return 0; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
208 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
209 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
210 #endif /* SDL_AUDIO_DRIVER_PULSE_DYNAMIC */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
211 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
212 /* Audio driver bootstrap functions */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
213 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
214 static int Audio_Available(void) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
215 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
216 pa_sample_spec paspec; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
217 pa_simple *connection; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
218 int available; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
219 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
220 available = 0; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
221 if ( LoadPulseLibrary() < 0 ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
222 return available; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
223 } |
4211 | 224 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
225 /* Connect with a dummy format. */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
226 paspec.format = PA_SAMPLE_U8; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
227 paspec.rate = 11025; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
228 paspec.channels = 1; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
229 connection = SDL_NAME(pa_simple_new)( |
4211 | 230 NULL, /* server */ |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
231 "Test stream", /* application name */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
232 PA_STREAM_PLAYBACK, /* playback mode */ |
4211 | 233 NULL, /* device on the server */ |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
234 "Simple DirectMedia Layer", /* stream description */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
235 &paspec, /* sample format spec */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
236 NULL, /* channel map */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
237 NULL, /* buffering attributes */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
238 NULL /* error code */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
239 ); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
240 if ( connection != NULL ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
241 available = 1; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
242 SDL_NAME(pa_simple_free)(connection); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
243 } |
4211 | 244 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
245 UnloadPulseLibrary(); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
246 return(available); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
247 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
248 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
249 static void Audio_DeleteDevice(SDL_AudioDevice *device) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
250 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
251 SDL_free(device->hidden); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
252 SDL_free(device); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
253 UnloadPulseLibrary(); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
254 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
255 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
256 static SDL_AudioDevice *Audio_CreateDevice(int devindex) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
257 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
258 SDL_AudioDevice *this; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
259 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
260 /* Initialize all variables that we clean on shutdown */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
261 LoadPulseLibrary(); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
262 this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice)); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
263 if ( this ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
264 SDL_memset(this, 0, (sizeof *this)); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
265 this->hidden = (struct SDL_PrivateAudioData *) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
266 SDL_malloc((sizeof *this->hidden)); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
267 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
268 if ( (this == NULL) || (this->hidden == NULL) ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
269 SDL_OutOfMemory(); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
270 if ( this ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
271 SDL_free(this); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
272 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
273 return(0); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
274 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
275 SDL_memset(this->hidden, 0, (sizeof *this->hidden)); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
276 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
277 /* Set the function pointers */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
278 this->OpenAudio = PULSE_OpenAudio; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
279 this->WaitAudio = PULSE_WaitAudio; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
280 this->PlayAudio = PULSE_PlayAudio; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
281 this->GetAudioBuf = PULSE_GetAudioBuf; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
282 this->CloseAudio = PULSE_CloseAudio; |
4216 | 283 this->WaitDone = PULSE_WaitDone; |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
284 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
285 this->free = Audio_DeleteDevice; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
286 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
287 return this; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
288 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
289 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
290 AudioBootStrap PULSE_bootstrap = { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
291 PULSE_DRIVER_NAME, "PulseAudio", |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
292 Audio_Available, Audio_CreateDevice |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
293 }; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
294 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
295 /* This function waits until it is possible to write a full sound buffer */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
296 static void PULSE_WaitAudio(_THIS) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
297 { |
4216 | 298 int size; |
299 while(1) { | |
300 if (SDL_NAME(pa_context_get_state)(context) != PA_CONTEXT_READY || | |
301 SDL_NAME(pa_stream_get_state)(stream) != PA_STREAM_READY || | |
302 SDL_NAME(pa_mainloop_iterate)(mainloop, 1, NULL) < 0) { | |
303 this->enabled = 0; | |
304 return; | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
305 } |
4216 | 306 size = SDL_NAME(pa_stream_writable_size)(stream); |
307 if (size >= mixlen) | |
308 return; | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
309 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
310 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
311 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
312 static void PULSE_PlayAudio(_THIS) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
313 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
314 /* Write the audio data */ |
4216 | 315 if (SDL_NAME(pa_stream_write)(stream, mixbuf, mixlen, NULL, 0LL, PA_SEEK_RELATIVE) < 0) |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
316 this->enabled = 0; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
317 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
318 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
319 static Uint8 *PULSE_GetAudioBuf(_THIS) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
320 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
321 return(mixbuf); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
322 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
323 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
324 static void PULSE_CloseAudio(_THIS) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
325 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
326 if ( mixbuf != NULL ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
327 SDL_FreeAudioMem(mixbuf); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
328 mixbuf = NULL; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
329 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
330 if ( stream != NULL ) { |
4216 | 331 SDL_NAME(pa_stream_disconnect)(stream); |
332 SDL_NAME(pa_stream_unref)(stream); | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
333 stream = NULL; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
334 } |
4216 | 335 if (context != NULL) { |
336 SDL_NAME(pa_context_disconnect)(context); | |
337 SDL_NAME(pa_context_unref)(context); | |
338 context = NULL; | |
339 } | |
340 if (mainloop != NULL) { | |
341 SDL_NAME(pa_mainloop_free)(mainloop); | |
342 mainloop = NULL; | |
343 } | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
344 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
345 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
346 /* Try to get the name of the program */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
347 static char *get_progname(void) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
348 { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
349 char *progname = NULL; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
350 #ifdef __LINUX__ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
351 FILE *fp; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
352 static char temp[BUFSIZ]; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
353 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
354 SDL_snprintf(temp, SDL_arraysize(temp), "/proc/%d/cmdline", getpid()); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
355 fp = fopen(temp, "r"); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
356 if ( fp != NULL ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
357 if ( fgets(temp, sizeof(temp)-1, fp) ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
358 progname = SDL_strrchr(temp, '/'); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
359 if ( progname == NULL ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
360 progname = temp; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
361 } else { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
362 progname = progname+1; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
363 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
364 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
365 fclose(fp); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
366 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
367 #endif |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
368 return(progname); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
369 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
370 |
4216 | 371 static void stream_drain_complete(pa_stream *s, int success, void *userdata) { |
372 } | |
373 | |
374 static void PULSE_WaitDone(_THIS) | |
375 { | |
376 pa_operation *o; | |
377 | |
378 o = SDL_NAME(pa_stream_drain)(stream, stream_drain_complete, NULL); | |
379 if (!o) | |
380 return; | |
381 | |
382 while (SDL_NAME(pa_operation_get_state)(o) != PA_OPERATION_DONE) { | |
383 if (SDL_NAME(pa_context_get_state)(context) != PA_CONTEXT_READY || | |
384 SDL_NAME(pa_stream_get_state)(stream) != PA_STREAM_READY || | |
385 SDL_NAME(pa_mainloop_iterate)(mainloop, 1, NULL) < 0) { | |
386 SDL_NAME(pa_operation_cancel)(o); | |
387 break; | |
388 } | |
389 } | |
390 SDL_NAME(pa_operation_unref)(o); | |
391 } | |
392 | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
393 static int PULSE_OpenAudio(_THIS, SDL_AudioSpec *spec) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
394 { |
4216 | 395 int state; |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
396 Uint16 test_format; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
397 pa_sample_spec paspec; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
398 pa_buffer_attr paattr; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
399 pa_channel_map pacmap; |
4216 | 400 pa_stream_flags_t flags = 0; |
4211 | 401 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
402 paspec.format = PA_SAMPLE_INVALID; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
403 for ( test_format = SDL_FirstAudioFormat(spec->format); test_format; ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
404 switch ( test_format ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
405 case AUDIO_U8: |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
406 paspec.format = PA_SAMPLE_U8; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
407 break; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
408 case AUDIO_S16LSB: |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
409 paspec.format = PA_SAMPLE_S16LE; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
410 break; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
411 case AUDIO_S16MSB: |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
412 paspec.format = PA_SAMPLE_S16BE; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
413 break; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
414 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
415 if ( paspec.format != PA_SAMPLE_INVALID ) |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
416 break; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
417 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
418 if (paspec.format == PA_SAMPLE_INVALID ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
419 SDL_SetError("Couldn't find any suitable audio formats"); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
420 return(-1); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
421 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
422 spec->format = test_format; |
4211 | 423 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
424 paspec.channels = spec->channels; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
425 paspec.rate = spec->freq; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
426 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
427 /* Calculate the final parameters for this audio specification */ |
4216 | 428 #ifdef PA_STREAM_ADJUST_LATENCY |
429 spec->samples /= 2; /* Mix in smaller chunck to avoid underruns */ | |
430 #endif | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
431 SDL_CalculateAudioSpec(spec); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
432 |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
433 /* Allocate mixing buffer */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
434 mixlen = spec->size; |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
435 mixbuf = (Uint8 *)SDL_AllocAudioMem(mixlen); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
436 if ( mixbuf == NULL ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
437 return(-1); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
438 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
439 SDL_memset(mixbuf, spec->silence, spec->size); |
4211 | 440 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
441 /* Reduced prebuffering compared to the defaults. */ |
4216 | 442 #ifdef PA_STREAM_ADJUST_LATENCY |
443 paattr.tlength = mixlen * 4; /* 2x original requested bufsize */ | |
444 paattr.prebuf = -1; | |
445 paattr.maxlength = -1; | |
446 paattr.minreq = mixlen; /* -1 can lead to pa_stream_writable_size() | |
447 >= mixlen never becoming true */ | |
448 flags = PA_STREAM_ADJUST_LATENCY; | |
449 #else | |
4211 | 450 paattr.tlength = mixlen*2; |
451 paattr.prebuf = mixlen*2; | |
452 paattr.maxlength = mixlen*2; | |
4216 | 453 paattr.minreq = mixlen; |
454 #endif | |
4211 | 455 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
456 /* The SDL ALSA output hints us that we use Windows' channel mapping */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
457 /* http://bugzilla.libsdl.org/show_bug.cgi?id=110 */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
458 SDL_NAME(pa_channel_map_init_auto)( |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
459 &pacmap, spec->channels, PA_CHANNEL_MAP_WAVEEX); |
4211 | 460 |
4216 | 461 /* Set up a new main loop */ |
462 if (!(mainloop = SDL_NAME(pa_mainloop_new)())) { | |
463 PULSE_CloseAudio(this); | |
464 SDL_SetError("pa_mainloop_new() failed"); | |
465 return(-1); | |
466 } | |
467 | |
468 mainloop_api = SDL_NAME(pa_mainloop_get_api)(mainloop); | |
469 if (!(context = SDL_NAME(pa_context_new)(mainloop_api, get_progname()))) { | |
470 PULSE_CloseAudio(this); | |
471 SDL_SetError("pa_context_new() failed"); | |
472 return(-1); | |
473 } | |
474 | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
475 /* Connect to the PulseAudio server */ |
4216 | 476 if (SDL_NAME(pa_context_connect)(context, NULL, 0, NULL) < 0) { |
477 PULSE_CloseAudio(this); | |
478 SDL_SetError("Could not setup connection to PulseAudio"); | |
479 return(-1); | |
480 } | |
481 | |
482 do { | |
483 if (SDL_NAME(pa_mainloop_iterate)(mainloop, 1, NULL) < 0) { | |
484 PULSE_CloseAudio(this); | |
485 SDL_SetError("pa_mainloop_iterate() failed"); | |
486 return(-1); | |
487 } | |
488 state = SDL_NAME(pa_context_get_state)(context); | |
489 if (!PA_CONTEXT_IS_GOOD(state)) { | |
490 PULSE_CloseAudio(this); | |
491 SDL_SetError("Could not connect to PulseAudio"); | |
492 return(-1); | |
493 } | |
494 } while (state != PA_CONTEXT_READY); | |
495 | |
496 stream = SDL_NAME(pa_stream_new)( | |
497 context, | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
498 "Simple DirectMedia Layer", /* stream description */ |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
499 &paspec, /* sample format spec */ |
4216 | 500 &pacmap /* channel map */ |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
501 ); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
502 if ( stream == NULL ) { |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
503 PULSE_CloseAudio(this); |
4216 | 504 SDL_SetError("Could not setup PulseAudio stream"); |
505 return(-1); | |
506 } | |
507 | |
508 if (SDL_NAME(pa_stream_connect_playback)(stream, NULL, &paattr, flags, | |
509 NULL, NULL) < 0) { | |
510 PULSE_CloseAudio(this); | |
511 SDL_SetError("Could not connect PulseAudio stream"); | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
512 return(-1); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
513 } |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
514 |
4216 | 515 do { |
516 if (SDL_NAME(pa_mainloop_iterate)(mainloop, 1, NULL) < 0) { | |
517 PULSE_CloseAudio(this); | |
518 SDL_SetError("pa_mainloop_iterate() failed"); | |
519 return(-1); | |
520 } | |
521 state = SDL_NAME(pa_stream_get_state)(stream); | |
522 if (!PA_STREAM_IS_GOOD(state)) { | |
523 PULSE_CloseAudio(this); | |
524 SDL_SetError("Could not create to PulseAudio stream"); | |
525 return(-1); | |
526 } | |
527 } while (state != PA_STREAM_READY); | |
4211 | 528 |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
529 return(0); |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
530 } |