3 This file is part of PulseAudio.
5 Copyright 2004-2006 Lennart Poettering
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 2.1 of the License,
10 or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
31 #include <pulse/pulseaudio.h>
32 #include <pulse/thread-mainloop.h>
33 #include <pulse/xmalloc.h>
35 #include <pulsecore/native-common.h>
36 #include <pulsecore/log.h>
37 #include <pulsecore/macro.h>
42 pa_threaded_mainloop *mainloop;
45 pa_stream_direction_t direction;
47 const void *read_data;
48 size_t read_index, read_length;
50 int operation_success;
53 #define CHECK_VALIDITY_RETURN_ANY(rerror, expression, error, ret) \
55 if (!(expression)) { \
62 #define CHECK_SUCCESS_GOTO(p, rerror, expression, label) \
64 if (!(expression)) { \
66 *(rerror) = pa_context_errno((p)->context); \
71 #define CHECK_DEAD_GOTO(p, rerror, label) \
73 if (!(p)->context || !PA_CONTEXT_IS_GOOD(pa_context_get_state((p)->context)) || \
74 !(p)->stream || !PA_STREAM_IS_GOOD(pa_stream_get_state((p)->stream))) { \
75 if (((p)->context && pa_context_get_state((p)->context) == PA_CONTEXT_FAILED) || \
76 ((p)->stream && pa_stream_get_state((p)->stream) == PA_STREAM_FAILED)) { \
78 *(rerror) = pa_context_errno((p)->context); \
81 *(rerror) = PA_ERR_BADSTATE; \
86 static void context_state_cb(pa_context *c, void *userdata) {
87 pa_simple *p = userdata;
91 switch (pa_context_get_state(c)) {
92 case PA_CONTEXT_READY:
93 case PA_CONTEXT_TERMINATED:
94 case PA_CONTEXT_FAILED:
95 pa_threaded_mainloop_signal(p->mainloop, 0);
98 case PA_CONTEXT_UNCONNECTED:
99 case PA_CONTEXT_CONNECTING:
100 case PA_CONTEXT_AUTHORIZING:
101 case PA_CONTEXT_SETTING_NAME:
106 static void stream_state_cb(pa_stream *s, void * userdata) {
107 pa_simple *p = userdata;
111 switch (pa_stream_get_state(s)) {
113 case PA_STREAM_READY:
114 case PA_STREAM_FAILED:
115 case PA_STREAM_TERMINATED:
116 pa_threaded_mainloop_signal(p->mainloop, 0);
119 case PA_STREAM_UNCONNECTED:
120 case PA_STREAM_CREATING:
125 static void stream_request_cb(pa_stream *s, size_t length, void *userdata) {
126 pa_simple *p = userdata;
129 pa_threaded_mainloop_signal(p->mainloop, 0);
132 static void stream_latency_update_cb(pa_stream *s, void *userdata) {
133 pa_simple *p = userdata;
137 pa_threaded_mainloop_signal(p->mainloop, 0);
140 pa_simple* pa_simple_new(
143 pa_stream_direction_t dir,
145 const char *stream_name,
146 const pa_sample_spec *ss,
147 const pa_channel_map *map,
148 const pa_buffer_attr *attr,
152 int error = PA_ERR_INTERNAL, r;
154 CHECK_VALIDITY_RETURN_ANY(rerror, !server || *server, PA_ERR_INVALID, NULL);
155 CHECK_VALIDITY_RETURN_ANY(rerror, dir == PA_STREAM_PLAYBACK || dir == PA_STREAM_RECORD, PA_ERR_INVALID, NULL);
156 CHECK_VALIDITY_RETURN_ANY(rerror, !dev || *dev, PA_ERR_INVALID, NULL);
157 CHECK_VALIDITY_RETURN_ANY(rerror, ss && pa_sample_spec_valid(ss), PA_ERR_INVALID, NULL);
158 CHECK_VALIDITY_RETURN_ANY(rerror, !map || (pa_channel_map_valid(map) && map->channels == ss->channels), PA_ERR_INVALID, NULL)
160 p = pa_xnew0(pa_simple, 1);
163 if (!(p->mainloop = pa_threaded_mainloop_new()))
166 if (!(p->context = pa_context_new(pa_threaded_mainloop_get_api(p->mainloop), name)))
169 pa_context_set_state_callback(p->context, context_state_cb, p);
171 if (pa_context_connect(p->context, server, 0, NULL) < 0) {
172 error = pa_context_errno(p->context);
176 pa_threaded_mainloop_lock(p->mainloop);
178 if (pa_threaded_mainloop_start(p->mainloop) < 0)
179 goto unlock_and_fail;
182 pa_context_state_t state;
184 state = pa_context_get_state(p->context);
186 if (state == PA_CONTEXT_READY)
189 if (!PA_CONTEXT_IS_GOOD(state)) {
190 error = pa_context_errno(p->context);
191 goto unlock_and_fail;
194 /* Wait until the context is ready */
195 pa_threaded_mainloop_wait(p->mainloop);
198 if (!(p->stream = pa_stream_new(p->context, stream_name, ss, map))) {
199 error = pa_context_errno(p->context);
200 goto unlock_and_fail;
203 pa_stream_set_state_callback(p->stream, stream_state_cb, p);
204 pa_stream_set_read_callback(p->stream, stream_request_cb, p);
205 pa_stream_set_write_callback(p->stream, stream_request_cb, p);
206 pa_stream_set_latency_update_callback(p->stream, stream_latency_update_cb, p);
208 if (dir == PA_STREAM_PLAYBACK)
209 r = pa_stream_connect_playback(p->stream, dev, attr,
210 PA_STREAM_INTERPOLATE_TIMING
211 |PA_STREAM_ADJUST_LATENCY
212 |PA_STREAM_AUTO_TIMING_UPDATE, NULL, NULL);
214 r = pa_stream_connect_record(p->stream, dev, attr,
215 PA_STREAM_INTERPOLATE_TIMING
216 |PA_STREAM_ADJUST_LATENCY
217 |PA_STREAM_AUTO_TIMING_UPDATE);
220 error = pa_context_errno(p->context);
221 goto unlock_and_fail;
225 pa_stream_state_t state;
227 state = pa_stream_get_state(p->stream);
229 if (state == PA_STREAM_READY)
232 if (!PA_STREAM_IS_GOOD(state)) {
233 error = pa_context_errno(p->context);
234 goto unlock_and_fail;
237 /* Wait until the stream is ready */
238 pa_threaded_mainloop_wait(p->mainloop);
241 pa_threaded_mainloop_unlock(p->mainloop);
246 pa_threaded_mainloop_unlock(p->mainloop);
255 void pa_simple_free(pa_simple *s) {
259 pa_threaded_mainloop_stop(s->mainloop);
262 pa_stream_unref(s->stream);
265 pa_context_disconnect(s->context);
266 pa_context_unref(s->context);
270 pa_threaded_mainloop_free(s->mainloop);
275 int pa_simple_write(pa_simple *p, const void*data, size_t length, int *rerror) {
278 CHECK_VALIDITY_RETURN_ANY(rerror, p->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE, -1);
279 CHECK_VALIDITY_RETURN_ANY(rerror, data && length, PA_ERR_INVALID, -1);
281 pa_threaded_mainloop_lock(p->mainloop);
283 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
289 while (!(l = pa_stream_writable_size(p->stream))) {
290 pa_threaded_mainloop_wait(p->mainloop);
291 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
294 CHECK_SUCCESS_GOTO(p, rerror, l != (size_t) -1, unlock_and_fail);
299 r = pa_stream_write(p->stream, data, l, NULL, 0LL, PA_SEEK_RELATIVE);
300 CHECK_SUCCESS_GOTO(p, rerror, r >= 0, unlock_and_fail);
302 data = (const uint8_t*) data + l;
306 pa_threaded_mainloop_unlock(p->mainloop);
310 pa_threaded_mainloop_unlock(p->mainloop);
314 int pa_simple_read(pa_simple *p, void*data, size_t length, int *rerror) {
317 CHECK_VALIDITY_RETURN_ANY(rerror, p->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE, -1);
318 CHECK_VALIDITY_RETURN_ANY(rerror, data && length, PA_ERR_INVALID, -1);
320 pa_threaded_mainloop_lock(p->mainloop);
322 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
327 while (!p->read_data) {
330 r = pa_stream_peek(p->stream, &p->read_data, &p->read_length);
331 CHECK_SUCCESS_GOTO(p, rerror, r == 0, unlock_and_fail);
334 pa_threaded_mainloop_wait(p->mainloop);
335 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
340 l = p->read_length < length ? p->read_length : length;
341 memcpy(data, (const uint8_t*) p->read_data+p->read_index, l);
343 data = (uint8_t*) data + l;
349 if (!p->read_length) {
352 r = pa_stream_drop(p->stream);
357 CHECK_SUCCESS_GOTO(p, rerror, r == 0, unlock_and_fail);
361 pa_threaded_mainloop_unlock(p->mainloop);
365 pa_threaded_mainloop_unlock(p->mainloop);
369 static void success_cb(pa_stream *s, int success, void *userdata) {
370 pa_simple *p = userdata;
375 p->operation_success = success;
376 pa_threaded_mainloop_signal(p->mainloop, 0);
379 int pa_simple_drain(pa_simple *p, int *rerror) {
380 pa_operation *o = NULL;
384 CHECK_VALIDITY_RETURN_ANY(rerror, p->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE, -1);
386 pa_threaded_mainloop_lock(p->mainloop);
387 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
389 o = pa_stream_drain(p->stream, success_cb, p);
390 CHECK_SUCCESS_GOTO(p, rerror, o, unlock_and_fail);
392 p->operation_success = 0;
393 while (pa_operation_get_state(o) != PA_OPERATION_DONE) {
394 pa_threaded_mainloop_wait(p->mainloop);
395 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
397 CHECK_SUCCESS_GOTO(p, rerror, p->operation_success, unlock_and_fail);
399 pa_operation_unref(o);
400 pa_threaded_mainloop_unlock(p->mainloop);
407 pa_operation_cancel(o);
408 pa_operation_unref(o);
411 pa_threaded_mainloop_unlock(p->mainloop);
415 int pa_simple_flush(pa_simple *p, int *rerror) {
416 pa_operation *o = NULL;
420 CHECK_VALIDITY_RETURN_ANY(rerror, p->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE, -1);
422 pa_threaded_mainloop_lock(p->mainloop);
423 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
425 o = pa_stream_flush(p->stream, success_cb, p);
426 CHECK_SUCCESS_GOTO(p, rerror, o, unlock_and_fail);
428 p->operation_success = 0;
429 while (pa_operation_get_state(o) != PA_OPERATION_DONE) {
430 pa_threaded_mainloop_wait(p->mainloop);
431 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
433 CHECK_SUCCESS_GOTO(p, rerror, p->operation_success, unlock_and_fail);
435 pa_operation_unref(o);
436 pa_threaded_mainloop_unlock(p->mainloop);
443 pa_operation_cancel(o);
444 pa_operation_unref(o);
447 pa_threaded_mainloop_unlock(p->mainloop);
451 pa_usec_t pa_simple_get_latency(pa_simple *p, int *rerror) {
457 pa_threaded_mainloop_lock(p->mainloop);
460 CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
462 if (pa_stream_get_latency(p->stream, &t, &negative) >= 0)
465 CHECK_SUCCESS_GOTO(p, rerror, pa_context_errno(p->context) == PA_ERR_NODATA, unlock_and_fail);
467 /* Wait until latency data is available again */
468 pa_threaded_mainloop_wait(p->mainloop);
471 pa_threaded_mainloop_unlock(p->mainloop);
473 return negative ? 0 : t;
477 pa_threaded_mainloop_unlock(p->mainloop);
478 return (pa_usec_t) -1;