]> code.delx.au - pulseaudio/blob - src/pulsecore/protocol-esound.c
fix misplace _ref() calls that should have been _assert_ref()
[pulseaudio] / src / pulsecore / protocol-esound.c
1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
6
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.
11
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.
16
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
20 USA.
21 ***/
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <errno.h>
28 #include <string.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <limits.h>
32
33 #include <pulse/sample.h>
34 #include <pulse/timeval.h>
35 #include <pulse/utf8.h>
36 #include <pulse/xmalloc.h>
37 #include <pulse/proplist.h>
38
39 #include <pulsecore/esound.h>
40 #include <pulsecore/memblock.h>
41 #include <pulsecore/client.h>
42 #include <pulsecore/sink-input.h>
43 #include <pulsecore/sink.h>
44 #include <pulsecore/source-output.h>
45 #include <pulsecore/source.h>
46 #include <pulsecore/core-scache.h>
47 #include <pulsecore/sample-util.h>
48 #include <pulsecore/authkey.h>
49 #include <pulsecore/namereg.h>
50 #include <pulsecore/log.h>
51 #include <pulsecore/core-util.h>
52 #include <pulsecore/core-error.h>
53 #include <pulsecore/ipacl.h>
54 #include <pulsecore/macro.h>
55 #include <pulsecore/thread-mq.h>
56 #include <pulsecore/shared.h>
57
58 #include "endianmacros.h"
59
60 #include "protocol-esound.h"
61
62 /* Don't accept more connection than this */
63 #define MAX_CONNECTIONS 64
64
65 /* Kick a client if it doesn't authenticate within this time */
66 #define AUTH_TIMEOUT 5
67
68 #define DEFAULT_COOKIE_FILE ".esd_auth"
69
70 #define PLAYBACK_BUFFER_SECONDS (.25)
71 #define PLAYBACK_BUFFER_FRAGMENTS (10)
72 #define RECORD_BUFFER_SECONDS (5)
73
74 #define MAX_CACHE_SAMPLE_SIZE (2048000)
75
76 #define DEFAULT_SINK_LATENCY (150*PA_USEC_PER_MSEC)
77 #define DEFAULT_SOURCE_LATENCY (150*PA_USEC_PER_MSEC)
78
79 #define SCACHE_PREFIX "esound."
80
81 /* This is heavily based on esound's code */
82
83 typedef struct connection {
84 pa_msgobject parent;
85
86 uint32_t index;
87 pa_bool_t dead;
88 pa_esound_protocol *protocol;
89 pa_esound_options *options;
90 pa_iochannel *io;
91 pa_client *client;
92 pa_bool_t authorized, swap_byte_order;
93 void *write_data;
94 size_t write_data_alloc, write_data_index, write_data_length;
95 void *read_data;
96 size_t read_data_alloc, read_data_length;
97 esd_proto_t request;
98 esd_client_state_t state;
99 pa_sink_input *sink_input;
100 pa_source_output *source_output;
101 pa_memblockq *input_memblockq, *output_memblockq;
102 pa_defer_event *defer_event;
103
104 char *original_name;
105
106 struct {
107 pa_memblock *current_memblock;
108 size_t memblock_index;
109 pa_atomic_t missing;
110 pa_bool_t underrun;
111 } playback;
112
113 struct {
114 pa_memchunk memchunk;
115 char *name;
116 pa_sample_spec sample_spec;
117 } scache;
118
119 pa_time_event *auth_timeout_event;
120 } connection;
121
122 PA_DECLARE_CLASS(connection);
123 #define CONNECTION(o) (connection_cast(o))
124 static PA_DEFINE_CHECK_TYPE(connection, pa_msgobject);
125
126 struct pa_esound_protocol {
127 PA_REFCNT_DECLARE;
128
129 pa_core *core;
130 pa_idxset *connections;
131 unsigned n_player;
132 };
133
134 enum {
135 SINK_INPUT_MESSAGE_POST_DATA = PA_SINK_INPUT_MESSAGE_MAX, /* data from main loop to sink input */
136 SINK_INPUT_MESSAGE_DISABLE_PREBUF
137 };
138
139 enum {
140 CONNECTION_MESSAGE_REQUEST_DATA,
141 CONNECTION_MESSAGE_POST_DATA,
142 CONNECTION_MESSAGE_UNLINK_CONNECTION
143 };
144
145 typedef struct proto_handler {
146 size_t data_length;
147 int (*proc)(connection *c, esd_proto_t request, const void *data, size_t length);
148 const char *description;
149 } esd_proto_handler_info_t;
150
151 static int sink_input_pop_cb(pa_sink_input *i, size_t length, pa_memchunk *chunk);
152 static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes);
153 static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes);
154 static void sink_input_kill_cb(pa_sink_input *i);
155 static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk);
156 static pa_usec_t source_output_get_latency_cb(pa_source_output *o);
157
158 static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk);
159 static void source_output_kill_cb(pa_source_output *o);
160
161 static int esd_proto_connect(connection *c, esd_proto_t request, const void *data, size_t length);
162 static int esd_proto_stream_play(connection *c, esd_proto_t request, const void *data, size_t length);
163 static int esd_proto_stream_record(connection *c, esd_proto_t request, const void *data, size_t length);
164 static int esd_proto_get_latency(connection *c, esd_proto_t request, const void *data, size_t length);
165 static int esd_proto_server_info(connection *c, esd_proto_t request, const void *data, size_t length);
166 static int esd_proto_all_info(connection *c, esd_proto_t request, const void *data, size_t length);
167 static int esd_proto_stream_pan(connection *c, esd_proto_t request, const void *data, size_t length);
168 static int esd_proto_sample_pan(connection *c, esd_proto_t request, const void *data, size_t length);
169 static int esd_proto_sample_cache(connection *c, esd_proto_t request, const void *data, size_t length);
170 static int esd_proto_sample_free_or_play(connection *c, esd_proto_t request, const void *data, size_t length);
171 static int esd_proto_sample_get_id(connection *c, esd_proto_t request, const void *data, size_t length);
172 static int esd_proto_standby_or_resume(connection *c, esd_proto_t request, const void *data, size_t length);
173 static int esd_proto_standby_mode(connection *c, esd_proto_t request, const void *data, size_t length);
174
175 /* the big map of protocol handler info */
176 static struct proto_handler proto_map[ESD_PROTO_MAX] = {
177 { ESD_KEY_LEN + sizeof(int), esd_proto_connect, "connect" },
178 { ESD_KEY_LEN + sizeof(int), NULL, "lock" },
179 { ESD_KEY_LEN + sizeof(int), NULL, "unlock" },
180
181 { ESD_NAME_MAX + 2 * sizeof(int), esd_proto_stream_play, "stream play" },
182 { ESD_NAME_MAX + 2 * sizeof(int), esd_proto_stream_record, "stream rec" },
183 { ESD_NAME_MAX + 2 * sizeof(int), esd_proto_stream_record, "stream mon" },
184
185 { ESD_NAME_MAX + 3 * sizeof(int), esd_proto_sample_cache, "sample cache" }, /* 6 */
186 { sizeof(int), esd_proto_sample_free_or_play, "sample free" },
187 { sizeof(int), esd_proto_sample_free_or_play, "sample play" }, /* 8 */
188 { sizeof(int), NULL, "sample loop" },
189 { sizeof(int), NULL, "sample stop" },
190 { (size_t) -1, NULL, "TODO: sample kill" },
191
192 { ESD_KEY_LEN + sizeof(int), esd_proto_standby_or_resume, "standby" },
193 { ESD_KEY_LEN + sizeof(int), esd_proto_standby_or_resume, "resume" }, /* 13 */
194
195 { ESD_NAME_MAX, esd_proto_sample_get_id, "sample getid" }, /* 14 */
196 { ESD_NAME_MAX + 2 * sizeof(int), NULL, "stream filter" },
197
198 { sizeof(int), esd_proto_server_info, "server info" },
199 { sizeof(int), esd_proto_all_info, "all info" },
200 { (size_t) -1, NULL, "TODO: subscribe" },
201 { (size_t) -1, NULL, "TODO: unsubscribe" },
202
203 { 3 * sizeof(int), esd_proto_stream_pan, "stream pan"},
204 { 3 * sizeof(int), esd_proto_sample_pan, "sample pan" },
205
206 { sizeof(int), esd_proto_standby_mode, "standby mode" },
207 { 0, esd_proto_get_latency, "get latency" }
208 };
209
210 static void connection_unlink(connection *c) {
211 pa_assert(c);
212
213 if (!c->protocol)
214 return;
215
216 if (c->options) {
217 pa_esound_options_unref(c->options);
218 c->options = NULL;
219 }
220
221 if (c->sink_input) {
222 pa_sink_input_unlink(c->sink_input);
223 pa_sink_input_unref(c->sink_input);
224 c->sink_input = NULL;
225 }
226
227 if (c->source_output) {
228 pa_source_output_unlink(c->source_output);
229 pa_source_output_unref(c->source_output);
230 c->source_output = NULL;
231 }
232
233 if (c->client) {
234 pa_client_free(c->client);
235 c->client = NULL;
236 }
237
238 if (c->state == ESD_STREAMING_DATA)
239 c->protocol->n_player--;
240
241 if (c->io) {
242 pa_iochannel_free(c->io);
243 c->io = NULL;
244 }
245
246 if (c->defer_event) {
247 c->protocol->core->mainloop->defer_free(c->defer_event);
248 c->defer_event = NULL;
249 }
250
251 if (c->auth_timeout_event) {
252 c->protocol->core->mainloop->time_free(c->auth_timeout_event);
253 c->auth_timeout_event = NULL;
254 }
255
256 pa_assert_se(pa_idxset_remove_by_data(c->protocol->connections, c, NULL) == c);
257 c->protocol = NULL;
258 connection_unref(c);
259 }
260
261 static void connection_free(pa_object *obj) {
262 connection *c = CONNECTION(obj);
263 pa_assert(c);
264
265 if (c->input_memblockq)
266 pa_memblockq_free(c->input_memblockq);
267 if (c->output_memblockq)
268 pa_memblockq_free(c->output_memblockq);
269
270 if (c->playback.current_memblock)
271 pa_memblock_unref(c->playback.current_memblock);
272
273 pa_xfree(c->read_data);
274 pa_xfree(c->write_data);
275
276 if (c->scache.memchunk.memblock)
277 pa_memblock_unref(c->scache.memchunk.memblock);
278 pa_xfree(c->scache.name);
279
280 pa_xfree(c->original_name);
281 pa_xfree(c);
282 }
283
284 static void connection_write_prepare(connection *c, size_t length) {
285 size_t t;
286 pa_assert(c);
287
288 t = c->write_data_length+length;
289
290 if (c->write_data_alloc < t)
291 c->write_data = pa_xrealloc(c->write_data, c->write_data_alloc = t);
292
293 pa_assert(c->write_data);
294 }
295
296 static void connection_write(connection *c, const void *data, size_t length) {
297 size_t i;
298 pa_assert(c);
299
300 c->protocol->core->mainloop->defer_enable(c->defer_event, 1);
301
302 connection_write_prepare(c, length);
303
304 pa_assert(c->write_data);
305
306 i = c->write_data_length;
307 c->write_data_length += length;
308
309 memcpy((uint8_t*) c->write_data + i, data, length);
310 }
311
312 static void format_esd2native(int format, pa_bool_t swap_bytes, pa_sample_spec *ss) {
313 pa_assert(ss);
314
315 ss->channels = (uint8_t) (((format & ESD_MASK_CHAN) == ESD_STEREO) ? 2 : 1);
316 if ((format & ESD_MASK_BITS) == ESD_BITS16)
317 ss->format = swap_bytes ? PA_SAMPLE_S16RE : PA_SAMPLE_S16NE;
318 else
319 ss->format = PA_SAMPLE_U8;
320 }
321
322 static int format_native2esd(pa_sample_spec *ss) {
323 int format = 0;
324
325 format = (ss->format == PA_SAMPLE_U8) ? ESD_BITS8 : ESD_BITS16;
326 format |= (ss->channels >= 2) ? ESD_STEREO : ESD_MONO;
327
328 return format;
329 }
330
331 #define CHECK_VALIDITY(expression, ...) do { \
332 if (!(expression)) { \
333 pa_log_warn(__FILE__ ": " __VA_ARGS__); \
334 return -1; \
335 } \
336 } while(0);
337
338 /*** esound commands ***/
339
340 static int esd_proto_connect(connection *c, esd_proto_t request, const void *data, size_t length) {
341 uint32_t ekey;
342 int ok;
343
344 connection_assert_ref(c);
345 pa_assert(data);
346 pa_assert(length == (ESD_KEY_LEN + sizeof(uint32_t)));
347
348 if (!c->authorized && c->options->auth_cookie) {
349 const uint8_t*key;
350
351 if ((key = pa_auth_cookie_read(c->options->auth_cookie, ESD_KEY_LEN)))
352 if (memcmp(data, key, ESD_KEY_LEN) == 0)
353 c->authorized = TRUE;
354 }
355
356 if (!c->authorized) {
357 pa_log("Kicked client with invalid authorization key.");
358 return -1;
359 }
360
361 if (c->auth_timeout_event) {
362 c->protocol->core->mainloop->time_free(c->auth_timeout_event);
363 c->auth_timeout_event = NULL;
364 }
365
366 data = (const char*)data + ESD_KEY_LEN;
367
368 memcpy(&ekey, data, sizeof(uint32_t));
369 if (ekey == ESD_ENDIAN_KEY)
370 c->swap_byte_order = FALSE;
371 else if (ekey == ESD_SWAP_ENDIAN_KEY)
372 c->swap_byte_order = TRUE;
373 else {
374 pa_log_warn("Client sent invalid endian key");
375 return -1;
376 }
377
378 pa_proplist_sets(c->client->proplist, "esound.byte_order", c->swap_byte_order ? "reverse" : "native");
379
380 ok = 1;
381 connection_write(c, &ok, sizeof(int));
382 return 0;
383 }
384
385 static int esd_proto_stream_play(connection *c, esd_proto_t request, const void *data, size_t length) {
386 char name[ESD_NAME_MAX], *utf8_name;
387 int32_t format, rate;
388 pa_sample_spec ss;
389 size_t l;
390 pa_sink *sink = NULL;
391 pa_sink_input_new_data sdata;
392
393 connection_assert_ref(c);
394 pa_assert(data);
395 pa_assert(length == (sizeof(int32_t)*2+ESD_NAME_MAX));
396
397 memcpy(&format, data, sizeof(int32_t));
398 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format);
399 data = (const char*) data + sizeof(int32_t);
400
401 memcpy(&rate, data, sizeof(int32_t));
402 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rate);
403 data = (const char*) data + sizeof(int32_t);
404
405 ss.rate = (uint32_t) rate;
406 format_esd2native(format, c->swap_byte_order, &ss);
407
408 CHECK_VALIDITY(pa_sample_spec_valid(&ss), "Invalid sample specification");
409
410 if (c->options->default_sink) {
411 sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK);
412 CHECK_VALIDITY(sink, "No such sink: %s", pa_strnull(c->options->default_sink));
413 }
414
415 pa_strlcpy(name, data, sizeof(name));
416
417 utf8_name = pa_utf8_filter(name);
418 pa_client_set_name(c->client, utf8_name);
419 pa_xfree(utf8_name);
420
421 c->original_name = pa_xstrdup(name);
422
423 pa_assert(!c->sink_input && !c->input_memblockq);
424
425 pa_sink_input_new_data_init(&sdata);
426 sdata.driver = __FILE__;
427 sdata.module = c->options->module;
428 sdata.client = c->client;
429 sdata.sink = sink;
430 pa_sink_input_new_data_set_sample_spec(&sdata, &ss);
431
432 pa_sink_input_new(&c->sink_input, c->protocol->core, &sdata, 0);
433 pa_sink_input_new_data_done(&sdata);
434
435 CHECK_VALIDITY(c->sink_input, "Failed to create sink input.");
436
437 l = (size_t) ((double) pa_bytes_per_second(&ss)*PLAYBACK_BUFFER_SECONDS);
438 c->input_memblockq = pa_memblockq_new(
439 0,
440 l,
441 l,
442 pa_frame_size(&ss),
443 (size_t) -1,
444 l/PLAYBACK_BUFFER_FRAGMENTS,
445 0,
446 NULL);
447 pa_iochannel_socket_set_rcvbuf(c->io, l);
448
449 c->sink_input->parent.process_msg = sink_input_process_msg;
450 c->sink_input->pop = sink_input_pop_cb;
451 c->sink_input->process_rewind = sink_input_process_rewind_cb;
452 c->sink_input->update_max_rewind = sink_input_update_max_rewind_cb;
453 c->sink_input->kill = sink_input_kill_cb;
454 c->sink_input->userdata = c;
455
456 pa_sink_input_set_requested_latency(c->sink_input, DEFAULT_SINK_LATENCY);
457
458 c->state = ESD_STREAMING_DATA;
459
460 c->protocol->n_player++;
461
462 pa_atomic_store(&c->playback.missing, (int) pa_memblockq_missing(c->input_memblockq));
463
464 pa_sink_input_put(c->sink_input);
465
466 return 0;
467 }
468
469 static int esd_proto_stream_record(connection *c, esd_proto_t request, const void *data, size_t length) {
470 char name[ESD_NAME_MAX], *utf8_name;
471 int32_t format, rate;
472 pa_source *source = NULL;
473 pa_sample_spec ss;
474 size_t l;
475 pa_source_output_new_data sdata;
476
477 connection_assert_ref(c);
478 pa_assert(data);
479 pa_assert(length == (sizeof(int32_t)*2+ESD_NAME_MAX));
480
481 memcpy(&format, data, sizeof(int32_t));
482 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format);
483 data = (const char*) data + sizeof(int32_t);
484
485 memcpy(&rate, data, sizeof(int32_t));
486 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rate);
487 data = (const char*) data + sizeof(int32_t);
488
489 ss.rate = (uint32_t) rate;
490 format_esd2native(format, c->swap_byte_order, &ss);
491
492 CHECK_VALIDITY(pa_sample_spec_valid(&ss), "Invalid sample specification.");
493
494 if (request == ESD_PROTO_STREAM_MON) {
495 pa_sink* sink;
496
497 sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK);
498 CHECK_VALIDITY(sink, "No such sink: %s", pa_strnull(c->options->default_sink));
499
500 source = sink->monitor_source;
501 CHECK_VALIDITY(source, "No such source.");
502 } else {
503 pa_assert(request == ESD_PROTO_STREAM_REC);
504
505 if (c->options->default_source) {
506 source = pa_namereg_get(c->protocol->core, c->options->default_source, PA_NAMEREG_SOURCE);
507 CHECK_VALIDITY(source, "No such source: %s", pa_strnull(c->options->default_source));
508 }
509 }
510
511 pa_strlcpy(name, data, sizeof(name));
512
513 utf8_name = pa_utf8_filter(name);
514 pa_client_set_name(c->client, utf8_name);
515 pa_xfree(utf8_name);
516
517 c->original_name = pa_xstrdup(name);
518
519 pa_assert(!c->output_memblockq && !c->source_output);
520
521 pa_source_output_new_data_init(&sdata);
522 sdata.driver = __FILE__;
523 sdata.module = c->options->module;
524 sdata.client = c->client;
525 sdata.source = source;
526 pa_source_output_new_data_set_sample_spec(&sdata, &ss);
527
528 pa_source_output_new(&c->source_output, c->protocol->core, &sdata, 0);
529 pa_source_output_new_data_done(&sdata);
530
531 CHECK_VALIDITY(c->source_output, "Failed to create source output.");
532
533 l = (size_t) (pa_bytes_per_second(&ss)*RECORD_BUFFER_SECONDS);
534 c->output_memblockq = pa_memblockq_new(
535 0,
536 l,
537 l,
538 pa_frame_size(&ss),
539 1,
540 0,
541 0,
542 NULL);
543 pa_iochannel_socket_set_sndbuf(c->io, l);
544
545 c->source_output->push = source_output_push_cb;
546 c->source_output->kill = source_output_kill_cb;
547 c->source_output->get_latency = source_output_get_latency_cb;
548 c->source_output->userdata = c;
549
550 pa_source_output_set_requested_latency(c->source_output, DEFAULT_SOURCE_LATENCY);
551
552 c->state = ESD_STREAMING_DATA;
553
554 c->protocol->n_player++;
555
556 pa_source_output_put(c->source_output);
557
558 return 0;
559 }
560
561 static int esd_proto_get_latency(connection *c, esd_proto_t request, const void *data, size_t length) {
562 pa_sink *sink;
563 int32_t latency;
564
565 connection_assert_ref(c);
566 pa_assert(!data);
567 pa_assert(length == 0);
568
569 if (!(sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK)))
570 latency = 0;
571 else {
572 double usec = (double) pa_sink_get_requested_latency(sink);
573 latency = (int) ((usec*44100)/1000000);
574 }
575
576 latency = PA_MAYBE_INT32_SWAP(c->swap_byte_order, latency);
577 connection_write(c, &latency, sizeof(int32_t));
578
579 return 0;
580 }
581
582 static int esd_proto_server_info(connection *c, esd_proto_t request, const void *data, size_t length) {
583 int32_t rate = 44100, format = ESD_STEREO|ESD_BITS16;
584 int32_t response;
585 pa_sink *sink;
586
587 connection_assert_ref(c);
588 pa_assert(data);
589 pa_assert(length == sizeof(int32_t));
590
591 if ((sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK))) {
592 rate = (int32_t) sink->sample_spec.rate;
593 format = format_native2esd(&sink->sample_spec);
594 }
595
596 connection_write_prepare(c, sizeof(int32_t) * 3);
597
598 response = 0;
599 connection_write(c, &response, sizeof(int32_t));
600 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rate);
601 connection_write(c, &rate, sizeof(int32_t));
602 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format);
603 connection_write(c, &format, sizeof(int32_t));
604
605 return 0;
606 }
607
608 static int esd_proto_all_info(connection *c, esd_proto_t request, const void *data, size_t length) {
609 size_t t, k, s;
610 connection *conn;
611 uint32_t idx = PA_IDXSET_INVALID;
612 unsigned nsamples;
613 char terminator[sizeof(int32_t)*6+ESD_NAME_MAX];
614
615 connection_assert_ref(c);
616 pa_assert(data);
617 pa_assert(length == sizeof(int32_t));
618
619 if (esd_proto_server_info(c, request, data, length) < 0)
620 return -1;
621
622 k = sizeof(int32_t)*5+ESD_NAME_MAX;
623 s = sizeof(int32_t)*6+ESD_NAME_MAX;
624 nsamples = pa_idxset_size(c->protocol->core->scache);
625 t = s*(nsamples+1) + k*(c->protocol->n_player+1);
626
627 connection_write_prepare(c, t);
628
629 memset(terminator, 0, sizeof(terminator));
630
631 for (conn = pa_idxset_first(c->protocol->connections, &idx); conn; conn = pa_idxset_next(c->protocol->connections, &idx)) {
632 int32_t id, format = ESD_BITS16 | ESD_STEREO, rate = 44100, lvolume = ESD_VOLUME_BASE, rvolume = ESD_VOLUME_BASE;
633 char name[ESD_NAME_MAX];
634
635 if (conn->state != ESD_STREAMING_DATA)
636 continue;
637
638 pa_assert(t >= k*2+s);
639
640 if (conn->sink_input) {
641 pa_cvolume volume = *pa_sink_input_get_volume(conn->sink_input);
642 rate = (int32_t) conn->sink_input->sample_spec.rate;
643 lvolume = (int32_t) ((volume.values[0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM);
644 rvolume = (int32_t) ((volume.values[volume.channels == 2 ? 1 : 0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM);
645 format = format_native2esd(&conn->sink_input->sample_spec);
646 }
647
648 /* id */
649 id = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) (conn->index+1));
650 connection_write(c, &id, sizeof(int32_t));
651
652 /* name */
653 memset(name, 0, ESD_NAME_MAX); /* don't leak old data */
654 if (conn->original_name)
655 strncpy(name, conn->original_name, ESD_NAME_MAX);
656 else if (conn->client && pa_proplist_gets(conn->client->proplist, PA_PROP_APPLICATION_NAME))
657 strncpy(name, pa_proplist_gets(conn->client->proplist, PA_PROP_APPLICATION_NAME), ESD_NAME_MAX);
658 connection_write(c, name, ESD_NAME_MAX);
659
660 /* rate */
661 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rate);
662 connection_write(c, &rate, sizeof(int32_t));
663
664 /* left */
665 lvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, lvolume);
666 connection_write(c, &lvolume, sizeof(int32_t));
667
668 /*right*/
669 rvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rvolume);
670 connection_write(c, &rvolume, sizeof(int32_t));
671
672 /*format*/
673 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format);
674 connection_write(c, &format, sizeof(int32_t));
675
676 t -= k;
677 }
678
679 pa_assert(t == s*(nsamples+1)+k);
680 t -= k;
681
682 connection_write(c, terminator, k);
683
684 if (nsamples) {
685 pa_scache_entry *ce;
686
687 idx = PA_IDXSET_INVALID;
688 for (ce = pa_idxset_first(c->protocol->core->scache, &idx); ce; ce = pa_idxset_next(c->protocol->core->scache, &idx)) {
689 int32_t id, rate, lvolume, rvolume, format, len;
690 char name[ESD_NAME_MAX];
691 pa_channel_map stereo = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } };
692 pa_cvolume volume;
693 pa_sample_spec ss;
694
695 pa_assert(t >= s*2);
696
697 if (ce->volume_is_set) {
698 volume = ce->volume;
699 pa_cvolume_remap(&volume, &ce->channel_map, &stereo);
700 } else
701 pa_cvolume_reset(&volume, 2);
702
703 if (ce->memchunk.memblock)
704 ss = ce->sample_spec;
705 else {
706 ss.format = PA_SAMPLE_S16NE;
707 ss.rate = 44100;
708 ss.channels = 2;
709 }
710
711 /* id */
712 id = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int) (ce->index+1));
713 connection_write(c, &id, sizeof(int32_t));
714
715 /* name */
716 memset(name, 0, ESD_NAME_MAX); /* don't leak old data */
717 if (strncmp(ce->name, SCACHE_PREFIX, sizeof(SCACHE_PREFIX)-1) == 0)
718 strncpy(name, ce->name+sizeof(SCACHE_PREFIX)-1, ESD_NAME_MAX);
719 else
720 pa_snprintf(name, ESD_NAME_MAX, "native.%s", ce->name);
721 connection_write(c, name, ESD_NAME_MAX);
722
723 /* rate */
724 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ss.rate);
725 connection_write(c, &rate, sizeof(int32_t));
726
727 /* left */
728 lvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ((volume.values[0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM));
729 connection_write(c, &lvolume, sizeof(int32_t));
730
731 /*right*/
732 rvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ((volume.values[1]*ESD_VOLUME_BASE)/PA_VOLUME_NORM));
733 connection_write(c, &rvolume, sizeof(int32_t));
734
735 /*format*/
736 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format_native2esd(&ss));
737 connection_write(c, &format, sizeof(int32_t));
738
739 /*length*/
740 len = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int) ce->memchunk.length);
741 connection_write(c, &len, sizeof(int32_t));
742
743 t -= s;
744 }
745 }
746
747 pa_assert(t == s);
748
749 connection_write(c, terminator, s);
750
751 return 0;
752 }
753
754 static int esd_proto_stream_pan(connection *c, esd_proto_t request, const void *data, size_t length) {
755 int32_t ok;
756 uint32_t idx, lvolume, rvolume;
757 connection *conn;
758
759 connection_assert_ref(c);
760 pa_assert(data);
761 pa_assert(length == sizeof(int32_t)*3);
762
763 memcpy(&idx, data, sizeof(uint32_t));
764 idx = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, idx) - 1;
765 data = (const char*)data + sizeof(uint32_t);
766
767 memcpy(&lvolume, data, sizeof(uint32_t));
768 lvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, lvolume);
769 data = (const char*)data + sizeof(uint32_t);
770
771 memcpy(&rvolume, data, sizeof(uint32_t));
772 rvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, rvolume);
773 data = (const char*)data + sizeof(uint32_t);
774
775 if ((conn = pa_idxset_get_by_index(c->protocol->connections, idx)) && conn->sink_input) {
776 pa_cvolume volume;
777 volume.values[0] = (lvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
778 volume.values[1] = (rvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
779 volume.channels = conn->sink_input->sample_spec.channels;
780
781 pa_sink_input_set_volume(conn->sink_input, &volume, TRUE);
782 ok = 1;
783 } else
784 ok = 0;
785
786 connection_write(c, &ok, sizeof(int32_t));
787
788 return 0;
789 }
790
791 static int esd_proto_sample_pan(connection *c, esd_proto_t request, const void *data, size_t length) {
792 int32_t ok = 0;
793 uint32_t idx, lvolume, rvolume;
794 pa_cvolume volume;
795 pa_scache_entry *ce;
796
797 connection_assert_ref(c);
798 pa_assert(data);
799 pa_assert(length == sizeof(int32_t)*3);
800
801 memcpy(&idx, data, sizeof(uint32_t));
802 idx = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, idx) - 1;
803 data = (const char*)data + sizeof(uint32_t);
804
805 memcpy(&lvolume, data, sizeof(uint32_t));
806 lvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, lvolume);
807 data = (const char*)data + sizeof(uint32_t);
808
809 memcpy(&rvolume, data, sizeof(uint32_t));
810 rvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, rvolume);
811 data = (const char*)data + sizeof(uint32_t);
812
813 volume.values[0] = (lvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
814 volume.values[1] = (rvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
815 volume.channels = 2;
816
817 if ((ce = pa_idxset_get_by_index(c->protocol->core->scache, idx))) {
818 pa_channel_map stereo = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } };
819
820 pa_cvolume_remap(&volume, &stereo, &ce->channel_map);
821 ce->volume = volume;
822 ce->volume_is_set = TRUE;
823 ok = 1;
824 }
825
826 connection_write(c, &ok, sizeof(int32_t));
827
828 return 0;
829 }
830
831 static int esd_proto_sample_cache(connection *c, esd_proto_t request, const void *data, size_t length) {
832 pa_sample_spec ss;
833 int32_t format, rate, sc_length;
834 uint32_t idx;
835 char name[ESD_NAME_MAX+sizeof(SCACHE_PREFIX)-1];
836
837 connection_assert_ref(c);
838 pa_assert(data);
839 pa_assert(length == (ESD_NAME_MAX+3*sizeof(int32_t)));
840
841 memcpy(&format, data, sizeof(int32_t));
842 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format);
843 data = (const char*)data + sizeof(int32_t);
844
845 memcpy(&rate, data, sizeof(int32_t));
846 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rate);
847 data = (const char*)data + sizeof(int32_t);
848
849 ss.rate = (uint32_t) rate;
850 format_esd2native(format, c->swap_byte_order, &ss);
851
852 CHECK_VALIDITY(pa_sample_spec_valid(&ss), "Invalid sample specification.");
853
854 memcpy(&sc_length, data, sizeof(int32_t));
855 sc_length = PA_MAYBE_INT32_SWAP(c->swap_byte_order, sc_length);
856 data = (const char*)data + sizeof(int32_t);
857
858 CHECK_VALIDITY(sc_length <= MAX_CACHE_SAMPLE_SIZE, "Sample too large (%d bytes).", (int)sc_length);
859
860 strcpy(name, SCACHE_PREFIX);
861 pa_strlcpy(name+sizeof(SCACHE_PREFIX)-1, data, ESD_NAME_MAX);
862
863 CHECK_VALIDITY(pa_utf8_valid(name), "Invalid UTF8 in sample name.");
864
865 pa_assert(!c->scache.memchunk.memblock);
866 c->scache.memchunk.memblock = pa_memblock_new(c->protocol->core->mempool, (size_t) sc_length);
867 c->scache.memchunk.index = 0;
868 c->scache.memchunk.length = (size_t) sc_length;
869 c->scache.sample_spec = ss;
870 pa_assert(!c->scache.name);
871 c->scache.name = pa_xstrdup(name);
872
873 c->state = ESD_CACHING_SAMPLE;
874
875 pa_scache_add_item(c->protocol->core, c->scache.name, NULL, NULL, NULL, c->client->proplist, &idx);
876
877 idx += 1;
878 connection_write(c, &idx, sizeof(uint32_t));
879
880 return 0;
881 }
882
883 static int esd_proto_sample_get_id(connection *c, esd_proto_t request, const void *data, size_t length) {
884 int32_t ok;
885 uint32_t idx;
886 char name[ESD_NAME_MAX+sizeof(SCACHE_PREFIX)-1];
887
888 connection_assert_ref(c);
889 pa_assert(data);
890 pa_assert(length == ESD_NAME_MAX);
891
892 strcpy(name, SCACHE_PREFIX);
893 pa_strlcpy(name+sizeof(SCACHE_PREFIX)-1, data, ESD_NAME_MAX);
894
895 CHECK_VALIDITY(pa_utf8_valid(name), "Invalid UTF8 in sample name.");
896
897 ok = -1;
898 if ((idx = pa_scache_get_id_by_name(c->protocol->core, name)) != PA_IDXSET_INVALID)
899 ok = (int32_t) idx + 1;
900
901 connection_write(c, &ok, sizeof(int32_t));
902
903 return 0;
904 }
905
906 static int esd_proto_sample_free_or_play(connection *c, esd_proto_t request, const void *data, size_t length) {
907 int32_t ok;
908 const char *name;
909 uint32_t idx;
910
911 connection_assert_ref(c);
912 pa_assert(data);
913 pa_assert(length == sizeof(int32_t));
914
915 memcpy(&idx, data, sizeof(uint32_t));
916 idx = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, idx) - 1;
917
918 ok = 0;
919
920 if ((name = pa_scache_get_name_by_id(c->protocol->core, idx))) {
921 if (request == ESD_PROTO_SAMPLE_PLAY) {
922 pa_sink *sink;
923
924 if ((sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK)))
925 if (pa_scache_play_item(c->protocol->core, name, sink, PA_VOLUME_NORM, c->client->proplist, NULL) >= 0)
926 ok = (int32_t) idx + 1;
927 } else {
928 pa_assert(request == ESD_PROTO_SAMPLE_FREE);
929
930 if (pa_scache_remove_item(c->protocol->core, name) >= 0)
931 ok = (int32_t) idx + 1;
932 }
933 }
934
935 connection_write(c, &ok, sizeof(int32_t));
936
937 return 0;
938 }
939
940 static int esd_proto_standby_or_resume(connection *c, esd_proto_t request, const void *data, size_t length) {
941 int32_t ok = 1;
942
943 connection_assert_ref(c);
944
945 connection_write_prepare(c, sizeof(int32_t) * 2);
946 connection_write(c, &ok, sizeof(int32_t));
947
948 if (request == ESD_PROTO_STANDBY)
949 ok = pa_sink_suspend_all(c->protocol->core, TRUE) >= 0;
950 else {
951 pa_assert(request == ESD_PROTO_RESUME);
952 ok = pa_sink_suspend_all(c->protocol->core, FALSE) >= 0;
953 }
954
955 connection_write(c, &ok, sizeof(int32_t));
956
957 return 0;
958 }
959
960 static int esd_proto_standby_mode(connection *c, esd_proto_t request, const void *data, size_t length) {
961 int32_t mode;
962 pa_sink *sink, *source;
963
964 connection_assert_ref(c);
965
966 mode = ESM_RUNNING;
967
968 if ((sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK)))
969 if (pa_sink_get_state(sink) == PA_SINK_SUSPENDED)
970 mode = ESM_ON_STANDBY;
971
972 if ((source = pa_namereg_get(c->protocol->core, c->options->default_source, PA_NAMEREG_SOURCE)))
973 if (pa_source_get_state(source) == PA_SOURCE_SUSPENDED)
974 mode = ESM_ON_STANDBY;
975
976 mode = PA_MAYBE_INT32_SWAP(c->swap_byte_order, mode);
977
978 connection_write(c, &mode, sizeof(mode));
979 return 0;
980 }
981
982 /*** client callbacks ***/
983
984 static void client_kill_cb(pa_client *c) {
985 pa_assert(c);
986
987 connection_unlink(CONNECTION(c->userdata));
988 }
989
990 /*** pa_iochannel callbacks ***/
991
992 static int do_read(connection *c) {
993 connection_assert_ref(c);
994
995 /* pa_log("READ"); */
996
997 if (c->state == ESD_NEXT_REQUEST) {
998 ssize_t r;
999 pa_assert(c->read_data_length < sizeof(c->request));
1000
1001 if ((r = pa_iochannel_read(c->io,
1002 ((uint8_t*) &c->request) + c->read_data_length,
1003 sizeof(c->request) - c->read_data_length)) <= 0) {
1004
1005 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1006 return 0;
1007
1008 pa_log_debug("read(): %s", r < 0 ? pa_cstrerror(errno) : "EOF");
1009 return -1;
1010 }
1011
1012 c->read_data_length += (size_t) r;
1013
1014 if (c->read_data_length >= sizeof(c->request)) {
1015 struct proto_handler *handler;
1016
1017 c->request = PA_MAYBE_INT32_SWAP(c->swap_byte_order, c->request);
1018
1019 if (c->request < ESD_PROTO_CONNECT || c->request >= ESD_PROTO_MAX) {
1020 pa_log("recieved invalid request.");
1021 return -1;
1022 }
1023
1024 handler = proto_map+c->request;
1025
1026 /* pa_log("executing request #%u", c->request); */
1027
1028 if (!handler->proc) {
1029 pa_log("recieved unimplemented request #%u.", c->request);
1030 return -1;
1031 }
1032
1033 if (handler->data_length == 0) {
1034 c->read_data_length = 0;
1035
1036 if (handler->proc(c, c->request, NULL, 0) < 0)
1037 return -1;
1038
1039 } else {
1040 if (c->read_data_alloc < handler->data_length)
1041 c->read_data = pa_xrealloc(c->read_data, c->read_data_alloc = handler->data_length);
1042 pa_assert(c->read_data);
1043
1044 c->state = ESD_NEEDS_REQDATA;
1045 c->read_data_length = 0;
1046 }
1047 }
1048
1049 } else if (c->state == ESD_NEEDS_REQDATA) {
1050 ssize_t r;
1051 struct proto_handler *handler = proto_map+c->request;
1052
1053 pa_assert(handler->proc);
1054
1055 pa_assert(c->read_data && c->read_data_length < handler->data_length);
1056
1057 if ((r = pa_iochannel_read(c->io,
1058 (uint8_t*) c->read_data + c->read_data_length,
1059 handler->data_length - c->read_data_length)) <= 0) {
1060
1061 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1062 return 0;
1063
1064 pa_log_debug("read(): %s", r < 0 ? pa_cstrerror(errno) : "EOF");
1065 return -1;
1066 }
1067
1068 c->read_data_length += (size_t) r;
1069 if (c->read_data_length >= handler->data_length) {
1070 size_t l = c->read_data_length;
1071 pa_assert(handler->proc);
1072
1073 c->state = ESD_NEXT_REQUEST;
1074 c->read_data_length = 0;
1075
1076 if (handler->proc(c, c->request, c->read_data, l) < 0)
1077 return -1;
1078 }
1079 } else if (c->state == ESD_CACHING_SAMPLE) {
1080 ssize_t r;
1081 void *p;
1082
1083 pa_assert(c->scache.memchunk.memblock);
1084 pa_assert(c->scache.name);
1085 pa_assert(c->scache.memchunk.index < c->scache.memchunk.length);
1086
1087 p = pa_memblock_acquire(c->scache.memchunk.memblock);
1088 r = pa_iochannel_read(c->io, (uint8_t*) p+c->scache.memchunk.index, c->scache.memchunk.length-c->scache.memchunk.index);
1089 pa_memblock_release(c->scache.memchunk.memblock);
1090
1091 if (r <= 0) {
1092 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1093 return 0;
1094
1095 pa_log_debug("read(): %s", r < 0 ? pa_cstrerror(errno) : "EOF");
1096 return -1;
1097 }
1098
1099 c->scache.memchunk.index += (size_t) r;
1100 pa_assert(c->scache.memchunk.index <= c->scache.memchunk.length);
1101
1102 if (c->scache.memchunk.index == c->scache.memchunk.length) {
1103 uint32_t idx;
1104
1105 c->scache.memchunk.index = 0;
1106 pa_scache_add_item(c->protocol->core, c->scache.name, &c->scache.sample_spec, NULL, &c->scache.memchunk, c->client->proplist, &idx);
1107
1108 pa_memblock_unref(c->scache.memchunk.memblock);
1109 pa_memchunk_reset(&c->scache.memchunk);
1110
1111 pa_xfree(c->scache.name);
1112 c->scache.name = NULL;
1113
1114 c->state = ESD_NEXT_REQUEST;
1115
1116 idx += 1;
1117 connection_write(c, &idx, sizeof(uint32_t));
1118 }
1119
1120 } else if (c->state == ESD_STREAMING_DATA && c->sink_input) {
1121 pa_memchunk chunk;
1122 ssize_t r;
1123 size_t l;
1124 void *p;
1125 size_t space;
1126
1127 pa_assert(c->input_memblockq);
1128
1129 /* pa_log("STREAMING_DATA"); */
1130
1131 if (!(l = (size_t) pa_atomic_load(&c->playback.missing)))
1132 return 0;
1133
1134 if (c->playback.current_memblock) {
1135
1136 space = pa_memblock_get_length(c->playback.current_memblock) - c->playback.memblock_index;
1137
1138 if (space <= 0) {
1139 pa_memblock_unref(c->playback.current_memblock);
1140 c->playback.current_memblock = NULL;
1141 }
1142 }
1143
1144 if (!c->playback.current_memblock) {
1145 pa_assert_se(c->playback.current_memblock = pa_memblock_new(c->protocol->core->mempool, (size_t) -1));
1146 c->playback.memblock_index = 0;
1147
1148 space = pa_memblock_get_length(c->playback.current_memblock);
1149 }
1150
1151 if (l > space)
1152 l = space;
1153
1154 p = pa_memblock_acquire(c->playback.current_memblock);
1155 r = pa_iochannel_read(c->io, (uint8_t*) p+c->playback.memblock_index, l);
1156 pa_memblock_release(c->playback.current_memblock);
1157
1158 if (r <= 0) {
1159
1160 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1161 return 0;
1162
1163 pa_log_debug("read(): %s", r < 0 ? pa_cstrerror(errno) : "EOF");
1164 return -1;
1165 }
1166
1167 chunk.memblock = c->playback.current_memblock;
1168 chunk.index = c->playback.memblock_index;
1169 chunk.length = (size_t) r;
1170
1171 c->playback.memblock_index += (size_t) r;
1172
1173 pa_asyncmsgq_post(c->sink_input->sink->asyncmsgq, PA_MSGOBJECT(c->sink_input), SINK_INPUT_MESSAGE_POST_DATA, NULL, 0, &chunk, NULL);
1174 pa_atomic_sub(&c->playback.missing, (int) r);
1175 }
1176
1177 return 0;
1178 }
1179
1180 static int do_write(connection *c) {
1181 connection_assert_ref(c);
1182
1183 /* pa_log("WRITE"); */
1184
1185 if (c->write_data_length) {
1186 ssize_t r;
1187
1188 pa_assert(c->write_data_index < c->write_data_length);
1189 if ((r = pa_iochannel_write(c->io, (uint8_t*) c->write_data+c->write_data_index, c->write_data_length-c->write_data_index)) < 0) {
1190
1191 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1192 return 0;
1193
1194 pa_log("write(): %s", pa_cstrerror(errno));
1195 return -1;
1196 }
1197
1198 c->write_data_index += (size_t) r;
1199 if (c->write_data_index >= c->write_data_length)
1200 c->write_data_length = c->write_data_index = 0;
1201
1202 } else if (c->state == ESD_STREAMING_DATA && c->source_output) {
1203 pa_memchunk chunk;
1204 ssize_t r;
1205 void *p;
1206
1207 if (pa_memblockq_peek(c->output_memblockq, &chunk) < 0)
1208 return 0;
1209
1210 pa_assert(chunk.memblock);
1211 pa_assert(chunk.length);
1212
1213 p = pa_memblock_acquire(chunk.memblock);
1214 r = pa_iochannel_write(c->io, (uint8_t*) p+chunk.index, chunk.length);
1215 pa_memblock_release(chunk.memblock);
1216
1217 pa_memblock_unref(chunk.memblock);
1218
1219 if (r < 0) {
1220
1221 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1222 return 0;
1223
1224 pa_log("write(): %s", pa_cstrerror(errno));
1225 return -1;
1226 }
1227
1228 pa_memblockq_drop(c->output_memblockq, (size_t) r);
1229 }
1230
1231 return 0;
1232 }
1233
1234 static void do_work(connection *c) {
1235 connection_assert_ref(c);
1236
1237 c->protocol->core->mainloop->defer_enable(c->defer_event, 0);
1238
1239 if (c->dead)
1240 return;
1241
1242 if (pa_iochannel_is_readable(c->io))
1243 if (do_read(c) < 0)
1244 goto fail;
1245
1246 if (c->state == ESD_STREAMING_DATA && !c->sink_input && pa_iochannel_is_hungup(c->io))
1247 /* In case we are in capture mode we will never call read()
1248 * on the socket, hence we need to detect the hangup manually
1249 * here, instead of simply waiting for read() to return 0. */
1250 goto fail;
1251
1252 if (pa_iochannel_is_writable(c->io))
1253 if (do_write(c) < 0)
1254 goto fail;
1255
1256 return;
1257
1258 fail:
1259
1260 if (c->state == ESD_STREAMING_DATA && c->sink_input) {
1261 c->dead = TRUE;
1262
1263 pa_iochannel_free(c->io);
1264 c->io = NULL;
1265
1266 pa_asyncmsgq_post(c->sink_input->sink->asyncmsgq, PA_MSGOBJECT(c->sink_input), SINK_INPUT_MESSAGE_DISABLE_PREBUF, NULL, 0, NULL, NULL);
1267 } else
1268 connection_unlink(c);
1269 }
1270
1271 static void io_callback(pa_iochannel*io, void *userdata) {
1272 connection *c = CONNECTION(userdata);
1273
1274 connection_assert_ref(c);
1275 pa_assert(io);
1276
1277 do_work(c);
1278 }
1279
1280 static void defer_callback(pa_mainloop_api*a, pa_defer_event *e, void *userdata) {
1281 connection *c = CONNECTION(userdata);
1282
1283 connection_assert_ref(c);
1284 pa_assert(e);
1285
1286 do_work(c);
1287 }
1288
1289 static int connection_process_msg(pa_msgobject *o, int code, void*userdata, int64_t offset, pa_memchunk *chunk) {
1290 connection *c = CONNECTION(o);
1291 connection_assert_ref(c);
1292
1293 if (!c->protocol)
1294 return -1;
1295
1296 switch (code) {
1297 case CONNECTION_MESSAGE_REQUEST_DATA:
1298 do_work(c);
1299 break;
1300
1301 case CONNECTION_MESSAGE_POST_DATA:
1302 /* pa_log("got data %u", chunk->length); */
1303 pa_memblockq_push_align(c->output_memblockq, chunk);
1304 do_work(c);
1305 break;
1306
1307 case CONNECTION_MESSAGE_UNLINK_CONNECTION:
1308 connection_unlink(c);
1309 break;
1310 }
1311
1312 return 0;
1313 }
1314
1315 /*** sink_input callbacks ***/
1316
1317 /* Called from thread context */
1318 static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
1319 pa_sink_input *i = PA_SINK_INPUT(o);
1320 connection*c;
1321
1322 pa_sink_input_assert_ref(i);
1323 c = CONNECTION(i->userdata);
1324 connection_assert_ref(c);
1325
1326 switch (code) {
1327
1328 case SINK_INPUT_MESSAGE_POST_DATA: {
1329 pa_assert(chunk);
1330
1331 /* New data from the main loop */
1332 pa_memblockq_push_align(c->input_memblockq, chunk);
1333
1334 if (pa_memblockq_is_readable(c->input_memblockq) && c->playback.underrun) {
1335 pa_log_debug("Requesting rewind due to end of underrun.");
1336 pa_sink_input_request_rewind(c->sink_input, 0, FALSE, TRUE, FALSE);
1337 }
1338
1339 /* pa_log("got data, %u", pa_memblockq_get_length(c->input_memblockq)); */
1340
1341 return 0;
1342 }
1343
1344 case SINK_INPUT_MESSAGE_DISABLE_PREBUF:
1345 pa_memblockq_prebuf_disable(c->input_memblockq);
1346 return 0;
1347
1348 case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
1349 pa_usec_t *r = userdata;
1350
1351 *r = pa_bytes_to_usec(pa_memblockq_get_length(c->input_memblockq), &c->sink_input->sample_spec);
1352
1353 /* Fall through, the default handler will add in the extra
1354 * latency added by the resampler */
1355 }
1356
1357 default:
1358 return pa_sink_input_process_msg(o, code, userdata, offset, chunk);
1359 }
1360 }
1361
1362 /* Called from thread context */
1363 static int sink_input_pop_cb(pa_sink_input *i, size_t length, pa_memchunk *chunk) {
1364 connection*c;
1365
1366 pa_sink_input_assert_ref(i);
1367 c = CONNECTION(i->userdata);
1368 connection_assert_ref(c);
1369 pa_assert(chunk);
1370
1371 if (pa_memblockq_peek(c->input_memblockq, chunk) < 0) {
1372
1373 c->playback.underrun = TRUE;
1374
1375 if (c->dead && pa_sink_input_safe_to_remove(i))
1376 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(c), CONNECTION_MESSAGE_UNLINK_CONNECTION, NULL, 0, NULL, NULL);
1377
1378 return -1;
1379 } else {
1380 size_t m;
1381
1382 chunk->length = PA_MIN(length, chunk->length);
1383
1384 c->playback.underrun = FALSE;
1385
1386 pa_memblockq_drop(c->input_memblockq, chunk->length);
1387 m = pa_memblockq_pop_missing(c->input_memblockq);
1388
1389 if (m > 0)
1390 if (pa_atomic_add(&c->playback.missing, (int) m) <= 0)
1391 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(c), CONNECTION_MESSAGE_REQUEST_DATA, NULL, 0, NULL, NULL);
1392
1393 return 0;
1394 }
1395 }
1396
1397 /* Called from thread context */
1398 static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
1399 connection *c;
1400
1401 pa_sink_input_assert_ref(i);
1402 c = CONNECTION(i->userdata);
1403 connection_assert_ref(c);
1404
1405 /* If we are in an underrun, then we don't rewind */
1406 if (i->thread_info.underrun_for > 0)
1407 return;
1408
1409 pa_memblockq_rewind(c->input_memblockq, nbytes);
1410 }
1411
1412 /* Called from thread context */
1413 static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
1414 connection *c;
1415
1416 pa_sink_input_assert_ref(i);
1417 c = CONNECTION(i->userdata);
1418 connection_assert_ref(c);
1419
1420 pa_memblockq_set_maxrewind(c->input_memblockq, nbytes);
1421 }
1422
1423 static void sink_input_kill_cb(pa_sink_input *i) {
1424 pa_sink_input_assert_ref(i);
1425
1426 connection_unlink(CONNECTION(i->userdata));
1427 }
1428
1429 /*** source_output callbacks ***/
1430
1431 /* Called from thread context */
1432 static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) {
1433 connection *c;
1434
1435 pa_source_output_assert_ref(o);
1436 c = CONNECTION(o->userdata);
1437 pa_assert(c);
1438 pa_assert(chunk);
1439
1440 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(c), CONNECTION_MESSAGE_POST_DATA, NULL, 0, chunk, NULL);
1441 }
1442
1443 static void source_output_kill_cb(pa_source_output *o) {
1444 pa_source_output_assert_ref(o);
1445
1446 connection_unlink(CONNECTION(o->userdata));
1447 }
1448
1449 static pa_usec_t source_output_get_latency_cb(pa_source_output *o) {
1450 connection*c;
1451
1452 pa_source_output_assert_ref(o);
1453 c = CONNECTION(o->userdata);
1454 pa_assert(c);
1455
1456 return pa_bytes_to_usec(pa_memblockq_get_length(c->output_memblockq), &c->source_output->sample_spec);
1457 }
1458
1459 /*** entry points ***/
1460
1461 static void auth_timeout(pa_mainloop_api*m, pa_time_event *e, const struct timeval *tv, void *userdata) {
1462 connection *c = CONNECTION(userdata);
1463
1464 pa_assert(m);
1465 pa_assert(tv);
1466 connection_assert_ref(c);
1467 pa_assert(c->auth_timeout_event == e);
1468
1469 if (!c->authorized)
1470 connection_unlink(c);
1471 }
1472
1473 void pa_esound_protocol_connect(pa_esound_protocol *p, pa_iochannel *io, pa_esound_options *o) {
1474 connection *c;
1475 char pname[128];
1476 pa_client_new_data data;
1477 pa_client *client;
1478
1479 pa_assert(p);
1480 pa_assert(io);
1481 pa_assert(o);
1482
1483 if (pa_idxset_size(p->connections)+1 > MAX_CONNECTIONS) {
1484 pa_log("Warning! Too many connections (%u), dropping incoming connection.", MAX_CONNECTIONS);
1485 pa_iochannel_free(io);
1486 return;
1487 }
1488
1489 pa_client_new_data_init(&data);
1490 data.module = o->module;
1491 data.driver = __FILE__;
1492 pa_iochannel_socket_peer_to_string(io, pname, sizeof(pname));
1493 pa_proplist_setf(data.proplist, PA_PROP_APPLICATION_NAME, "EsounD client (%s)", pname);
1494 pa_proplist_sets(data.proplist, "esound-protocol.peer", pname);
1495 client = pa_client_new(p->core, &data);
1496 pa_client_new_data_done(&data);
1497
1498 if (!client)
1499 return;
1500
1501 c = pa_msgobject_new(connection);
1502 c->parent.parent.free = connection_free;
1503 c->parent.process_msg = connection_process_msg;
1504 c->protocol = p;
1505 c->io = io;
1506 pa_iochannel_set_callback(c->io, io_callback, c);
1507
1508 c->client = client;
1509 c->client->kill = client_kill_cb;
1510 c->client->userdata = c;
1511
1512 c->options = pa_esound_options_ref(o);
1513 c->authorized = FALSE;
1514 c->swap_byte_order = FALSE;
1515 c->dead = FALSE;
1516
1517 c->read_data_length = 0;
1518 c->read_data = pa_xmalloc(c->read_data_alloc = proto_map[ESD_PROTO_CONNECT].data_length);
1519
1520 c->write_data_length = c->write_data_index = c->write_data_alloc = 0;
1521 c->write_data = NULL;
1522
1523 c->state = ESD_NEEDS_REQDATA;
1524 c->request = ESD_PROTO_CONNECT;
1525
1526 c->sink_input = NULL;
1527 c->input_memblockq = NULL;
1528
1529 c->source_output = NULL;
1530 c->output_memblockq = NULL;
1531
1532 c->playback.current_memblock = NULL;
1533 c->playback.memblock_index = 0;
1534 c->playback.underrun = TRUE;
1535 pa_atomic_store(&c->playback.missing, 0);
1536
1537 pa_memchunk_reset(&c->scache.memchunk);
1538 c->scache.name = NULL;
1539
1540 c->original_name = NULL;
1541
1542 if (o->auth_anonymous) {
1543 pa_log_info("Client authenticated anonymously.");
1544 c->authorized = TRUE;
1545 }
1546
1547 if (!c->authorized &&
1548 o->auth_ip_acl &&
1549 pa_ip_acl_check(o->auth_ip_acl, pa_iochannel_get_recv_fd(io)) > 0) {
1550
1551 pa_log_info("Client authenticated by IP ACL.");
1552 c->authorized = TRUE;
1553 }
1554
1555 if (!c->authorized) {
1556 struct timeval tv;
1557 pa_gettimeofday(&tv);
1558 tv.tv_sec += AUTH_TIMEOUT;
1559 c->auth_timeout_event = p->core->mainloop->time_new(p->core->mainloop, &tv, auth_timeout, c);
1560 } else
1561 c->auth_timeout_event = NULL;
1562
1563 c->defer_event = p->core->mainloop->defer_new(p->core->mainloop, defer_callback, c);
1564 p->core->mainloop->defer_enable(c->defer_event, 0);
1565
1566 pa_idxset_put(p->connections, c, &c->index);
1567 }
1568
1569 void pa_esound_protocol_disconnect(pa_esound_protocol *p, pa_module *m) {
1570 connection *c;
1571 void *state = NULL;
1572
1573 pa_assert(p);
1574 pa_assert(m);
1575
1576 while ((c = pa_idxset_iterate(p->connections, &state, NULL)))
1577 if (c->options->module == m)
1578 connection_unlink(c);
1579 }
1580
1581 static pa_esound_protocol* esound_protocol_new(pa_core *c) {
1582 pa_esound_protocol *p;
1583
1584 pa_assert(c);
1585
1586 p = pa_xnew(pa_esound_protocol, 1);
1587 PA_REFCNT_INIT(p);
1588 p->core = c;
1589 p->connections = pa_idxset_new(NULL, NULL);
1590 p->n_player = 0;
1591
1592 pa_assert_se(pa_shared_set(c, "esound-protocol", p) >= 0);
1593
1594 return p;
1595 }
1596
1597 pa_esound_protocol* pa_esound_protocol_get(pa_core *c) {
1598 pa_esound_protocol *p;
1599
1600 if ((p = pa_shared_get(c, "esound-protocol")))
1601 return pa_esound_protocol_ref(p);
1602
1603 return esound_protocol_new(c);
1604 }
1605
1606 pa_esound_protocol* pa_esound_protocol_ref(pa_esound_protocol *p) {
1607 pa_assert(p);
1608 pa_assert(PA_REFCNT_VALUE(p) >= 1);
1609
1610 PA_REFCNT_INC(p);
1611
1612 return p;
1613 }
1614
1615 void pa_esound_protocol_unref(pa_esound_protocol *p) {
1616 connection *c;
1617 pa_assert(p);
1618 pa_assert(PA_REFCNT_VALUE(p) >= 1);
1619
1620 if (PA_REFCNT_DEC(p) > 0)
1621 return;
1622
1623 while ((c = pa_idxset_first(p->connections, NULL)))
1624 connection_unlink(c);
1625
1626 pa_idxset_free(p->connections, NULL, NULL);
1627
1628 pa_assert_se(pa_shared_remove(p->core, "esound-protocol") >= 0);
1629
1630 pa_xfree(p);
1631 }
1632
1633 pa_esound_options* pa_esound_options_new(void) {
1634 pa_esound_options *o;
1635
1636 o = pa_xnew0(pa_esound_options, 1);
1637 PA_REFCNT_INIT(o);
1638
1639 return o;
1640 }
1641
1642 pa_esound_options* pa_esound_options_ref(pa_esound_options *o) {
1643 pa_assert(o);
1644 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1645
1646 PA_REFCNT_INC(o);
1647
1648 return o;
1649 }
1650
1651 void pa_esound_options_unref(pa_esound_options *o) {
1652 pa_assert(o);
1653 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1654
1655 if (PA_REFCNT_DEC(o) > 0)
1656 return;
1657
1658 if (o->auth_ip_acl)
1659 pa_ip_acl_free(o->auth_ip_acl);
1660
1661 if (o->auth_cookie)
1662 pa_auth_cookie_unref(o->auth_cookie);
1663
1664 pa_xfree(o->default_sink);
1665 pa_xfree(o->default_source);
1666
1667 pa_xfree(o);
1668 }
1669
1670 int pa_esound_options_parse(pa_esound_options *o, pa_core *c, pa_modargs *ma) {
1671 pa_bool_t enabled;
1672 const char *acl;
1673
1674 pa_assert(o);
1675 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1676 pa_assert(ma);
1677
1678 if (pa_modargs_get_value_boolean(ma, "auth-anonymous", &o->auth_anonymous) < 0) {
1679 pa_log("auth-anonymous= expects a boolean argument.");
1680 return -1;
1681 }
1682
1683 if ((acl = pa_modargs_get_value(ma, "auth-ip-acl", NULL))) {
1684 pa_ip_acl *ipa;
1685
1686 if (!(ipa = pa_ip_acl_new(acl))) {
1687 pa_log("Failed to parse IP ACL '%s'", acl);
1688 return -1;
1689 }
1690
1691 if (o->auth_ip_acl)
1692 pa_ip_acl_free(o->auth_ip_acl);
1693
1694 o->auth_ip_acl = ipa;
1695 }
1696
1697 enabled = TRUE;
1698 if (pa_modargs_get_value_boolean(ma, "auth-cookie-enabled", &enabled) < 0) {
1699 pa_log("auth-cookie-enabled= expects a boolean argument.");
1700 return -1;
1701 }
1702
1703 if (o->auth_cookie)
1704 pa_auth_cookie_unref(o->auth_cookie);
1705
1706 if (enabled) {
1707 const char *cn;
1708
1709 /* The new name for this is 'auth-cookie', for compat reasons
1710 * we check the old name too */
1711 if (!(cn = pa_modargs_get_value(ma, "auth-cookie", NULL)))
1712 if (!(cn = pa_modargs_get_value(ma, "cookie", NULL)))
1713 cn = DEFAULT_COOKIE_FILE;
1714
1715 if (!(o->auth_cookie = pa_auth_cookie_get(c, cn, ESD_KEY_LEN)))
1716 return -1;
1717
1718 } else
1719 o->auth_cookie = NULL;
1720
1721 pa_xfree(o->default_sink);
1722 o->default_sink = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
1723
1724 pa_xfree(o->default_source);
1725 o->default_source = pa_xstrdup(pa_modargs_get_value(ma, "source", NULL));
1726
1727 return 0;
1728 }