]> code.delx.au - pulseaudio/blob - src/pulsecore/protocol-esound.c
Merge commit 'coling/lgpl21'
[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_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 return 0;
579 }
580
581 static int esd_proto_server_info(connection *c, esd_proto_t request, const void *data, size_t length) {
582 int32_t rate = 44100, format = ESD_STEREO|ESD_BITS16;
583 int32_t response;
584 pa_sink *sink;
585
586 connection_ref(c);
587 pa_assert(data);
588 pa_assert(length == sizeof(int32_t));
589
590 if ((sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK))) {
591 rate = (int32_t) sink->sample_spec.rate;
592 format = format_native2esd(&sink->sample_spec);
593 }
594
595 connection_write_prepare(c, sizeof(int32_t) * 3);
596
597 response = 0;
598 connection_write(c, &response, sizeof(int32_t));
599 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rate);
600 connection_write(c, &rate, sizeof(int32_t));
601 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format);
602 connection_write(c, &format, sizeof(int32_t));
603
604 return 0;
605 }
606
607 static int esd_proto_all_info(connection *c, esd_proto_t request, const void *data, size_t length) {
608 size_t t, k, s;
609 connection *conn;
610 uint32_t idx = PA_IDXSET_INVALID;
611 unsigned nsamples;
612 char terminator[sizeof(int32_t)*6+ESD_NAME_MAX];
613
614 connection_ref(c);
615 pa_assert(data);
616 pa_assert(length == sizeof(int32_t));
617
618 if (esd_proto_server_info(c, request, data, length) < 0)
619 return -1;
620
621 k = sizeof(int32_t)*5+ESD_NAME_MAX;
622 s = sizeof(int32_t)*6+ESD_NAME_MAX;
623 nsamples = pa_idxset_size(c->protocol->core->scache);
624 t = s*(nsamples+1) + k*(c->protocol->n_player+1);
625
626 connection_write_prepare(c, t);
627
628 memset(terminator, 0, sizeof(terminator));
629
630 for (conn = pa_idxset_first(c->protocol->connections, &idx); conn; conn = pa_idxset_next(c->protocol->connections, &idx)) {
631 int32_t id, format = ESD_BITS16 | ESD_STEREO, rate = 44100, lvolume = ESD_VOLUME_BASE, rvolume = ESD_VOLUME_BASE;
632 char name[ESD_NAME_MAX];
633
634 if (conn->state != ESD_STREAMING_DATA)
635 continue;
636
637 pa_assert(t >= k*2+s);
638
639 if (conn->sink_input) {
640 pa_cvolume volume = *pa_sink_input_get_volume(conn->sink_input);
641 rate = (int32_t) conn->sink_input->sample_spec.rate;
642 lvolume = (int32_t) ((volume.values[0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM);
643 rvolume = (int32_t) ((volume.values[volume.channels == 2 ? 1 : 0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM);
644 format = format_native2esd(&conn->sink_input->sample_spec);
645 }
646
647 /* id */
648 id = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) (conn->index+1));
649 connection_write(c, &id, sizeof(int32_t));
650
651 /* name */
652 memset(name, 0, ESD_NAME_MAX); /* don't leak old data */
653 if (conn->original_name)
654 strncpy(name, conn->original_name, ESD_NAME_MAX);
655 else if (conn->client && pa_proplist_gets(conn->client->proplist, PA_PROP_APPLICATION_NAME))
656 strncpy(name, pa_proplist_gets(conn->client->proplist, PA_PROP_APPLICATION_NAME), ESD_NAME_MAX);
657 connection_write(c, name, ESD_NAME_MAX);
658
659 /* rate */
660 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rate);
661 connection_write(c, &rate, sizeof(int32_t));
662
663 /* left */
664 lvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, lvolume);
665 connection_write(c, &lvolume, sizeof(int32_t));
666
667 /*right*/
668 rvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rvolume);
669 connection_write(c, &rvolume, sizeof(int32_t));
670
671 /*format*/
672 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format);
673 connection_write(c, &format, sizeof(int32_t));
674
675 t -= k;
676 }
677
678 pa_assert(t == s*(nsamples+1)+k);
679 t -= k;
680
681 connection_write(c, terminator, k);
682
683 if (nsamples) {
684 pa_scache_entry *ce;
685
686 idx = PA_IDXSET_INVALID;
687 for (ce = pa_idxset_first(c->protocol->core->scache, &idx); ce; ce = pa_idxset_next(c->protocol->core->scache, &idx)) {
688 int32_t id, rate, lvolume, rvolume, format, len;
689 char name[ESD_NAME_MAX];
690 pa_channel_map stereo = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } };
691 pa_cvolume volume;
692 pa_sample_spec ss;
693
694 pa_assert(t >= s*2);
695
696 if (ce->volume_is_set) {
697 volume = ce->volume;
698 pa_cvolume_remap(&volume, &ce->channel_map, &stereo);
699 } else
700 pa_cvolume_reset(&volume, 2);
701
702 if (ce->memchunk.memblock)
703 ss = ce->sample_spec;
704 else {
705 ss.format = PA_SAMPLE_S16NE;
706 ss.rate = 44100;
707 ss.channels = 2;
708 }
709
710 /* id */
711 id = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int) (ce->index+1));
712 connection_write(c, &id, sizeof(int32_t));
713
714 /* name */
715 memset(name, 0, ESD_NAME_MAX); /* don't leak old data */
716 if (strncmp(ce->name, SCACHE_PREFIX, sizeof(SCACHE_PREFIX)-1) == 0)
717 strncpy(name, ce->name+sizeof(SCACHE_PREFIX)-1, ESD_NAME_MAX);
718 else
719 pa_snprintf(name, ESD_NAME_MAX, "native.%s", ce->name);
720 connection_write(c, name, ESD_NAME_MAX);
721
722 /* rate */
723 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ss.rate);
724 connection_write(c, &rate, sizeof(int32_t));
725
726 /* left */
727 lvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ((volume.values[0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM));
728 connection_write(c, &lvolume, sizeof(int32_t));
729
730 /*right*/
731 rvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ((volume.values[1]*ESD_VOLUME_BASE)/PA_VOLUME_NORM));
732 connection_write(c, &rvolume, sizeof(int32_t));
733
734 /*format*/
735 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format_native2esd(&ss));
736 connection_write(c, &format, sizeof(int32_t));
737
738 /*length*/
739 len = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int) ce->memchunk.length);
740 connection_write(c, &len, sizeof(int32_t));
741
742 t -= s;
743 }
744 }
745
746 pa_assert(t == s);
747
748 connection_write(c, terminator, s);
749
750 return 0;
751 }
752
753 static int esd_proto_stream_pan(connection *c, esd_proto_t request, const void *data, size_t length) {
754 int32_t ok;
755 uint32_t idx, lvolume, rvolume;
756 connection *conn;
757
758 connection_assert_ref(c);
759 pa_assert(data);
760 pa_assert(length == sizeof(int32_t)*3);
761
762 memcpy(&idx, data, sizeof(uint32_t));
763 idx = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, idx) - 1;
764 data = (const char*)data + sizeof(uint32_t);
765
766 memcpy(&lvolume, data, sizeof(uint32_t));
767 lvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, lvolume);
768 data = (const char*)data + sizeof(uint32_t);
769
770 memcpy(&rvolume, data, sizeof(uint32_t));
771 rvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, rvolume);
772 data = (const char*)data + sizeof(uint32_t);
773
774 if ((conn = pa_idxset_get_by_index(c->protocol->connections, idx)) && conn->sink_input) {
775 pa_cvolume volume;
776 volume.values[0] = (lvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
777 volume.values[1] = (rvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
778 volume.channels = conn->sink_input->sample_spec.channels;
779
780 pa_sink_input_set_volume(conn->sink_input, &volume, TRUE);
781 ok = 1;
782 } else
783 ok = 0;
784
785 connection_write(c, &ok, sizeof(int32_t));
786
787 return 0;
788 }
789
790 static int esd_proto_sample_pan(connection *c, esd_proto_t request, const void *data, size_t length) {
791 int32_t ok = 0;
792 uint32_t idx, lvolume, rvolume;
793 pa_cvolume volume;
794 pa_scache_entry *ce;
795
796 connection_assert_ref(c);
797 pa_assert(data);
798 pa_assert(length == sizeof(int32_t)*3);
799
800 memcpy(&idx, data, sizeof(uint32_t));
801 idx = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, idx) - 1;
802 data = (const char*)data + sizeof(uint32_t);
803
804 memcpy(&lvolume, data, sizeof(uint32_t));
805 lvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, lvolume);
806 data = (const char*)data + sizeof(uint32_t);
807
808 memcpy(&rvolume, data, sizeof(uint32_t));
809 rvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, rvolume);
810 data = (const char*)data + sizeof(uint32_t);
811
812 volume.values[0] = (lvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
813 volume.values[1] = (rvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
814 volume.channels = 2;
815
816 if ((ce = pa_idxset_get_by_index(c->protocol->core->scache, idx))) {
817 pa_channel_map stereo = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } };
818
819 pa_cvolume_remap(&volume, &stereo, &ce->channel_map);
820 ce->volume = volume;
821 ce->volume_is_set = TRUE;
822 ok = 1;
823 }
824
825 connection_write(c, &ok, sizeof(int32_t));
826
827 return 0;
828 }
829
830 static int esd_proto_sample_cache(connection *c, esd_proto_t request, const void *data, size_t length) {
831 pa_sample_spec ss;
832 int32_t format, rate, sc_length;
833 uint32_t idx;
834 char name[ESD_NAME_MAX+sizeof(SCACHE_PREFIX)-1];
835
836 connection_assert_ref(c);
837 pa_assert(data);
838 pa_assert(length == (ESD_NAME_MAX+3*sizeof(int32_t)));
839
840 memcpy(&format, data, sizeof(int32_t));
841 format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format);
842 data = (const char*)data + sizeof(int32_t);
843
844 memcpy(&rate, data, sizeof(int32_t));
845 rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, rate);
846 data = (const char*)data + sizeof(int32_t);
847
848 ss.rate = (uint32_t) rate;
849 format_esd2native(format, c->swap_byte_order, &ss);
850
851 CHECK_VALIDITY(pa_sample_spec_valid(&ss), "Invalid sample specification.");
852
853 memcpy(&sc_length, data, sizeof(int32_t));
854 sc_length = PA_MAYBE_INT32_SWAP(c->swap_byte_order, sc_length);
855 data = (const char*)data + sizeof(int32_t);
856
857 CHECK_VALIDITY(sc_length <= MAX_CACHE_SAMPLE_SIZE, "Sample too large (%d bytes).", (int)sc_length);
858
859 strcpy(name, SCACHE_PREFIX);
860 pa_strlcpy(name+sizeof(SCACHE_PREFIX)-1, data, ESD_NAME_MAX);
861
862 CHECK_VALIDITY(pa_utf8_valid(name), "Invalid UTF8 in sample name.");
863
864 pa_assert(!c->scache.memchunk.memblock);
865 c->scache.memchunk.memblock = pa_memblock_new(c->protocol->core->mempool, (size_t) sc_length);
866 c->scache.memchunk.index = 0;
867 c->scache.memchunk.length = (size_t) sc_length;
868 c->scache.sample_spec = ss;
869 pa_assert(!c->scache.name);
870 c->scache.name = pa_xstrdup(name);
871
872 c->state = ESD_CACHING_SAMPLE;
873
874 pa_scache_add_item(c->protocol->core, c->scache.name, NULL, NULL, NULL, c->client->proplist, &idx);
875
876 idx += 1;
877 connection_write(c, &idx, sizeof(uint32_t));
878
879 return 0;
880 }
881
882 static int esd_proto_sample_get_id(connection *c, esd_proto_t request, const void *data, size_t length) {
883 int32_t ok;
884 uint32_t idx;
885 char name[ESD_NAME_MAX+sizeof(SCACHE_PREFIX)-1];
886
887 connection_assert_ref(c);
888 pa_assert(data);
889 pa_assert(length == ESD_NAME_MAX);
890
891 strcpy(name, SCACHE_PREFIX);
892 pa_strlcpy(name+sizeof(SCACHE_PREFIX)-1, data, ESD_NAME_MAX);
893
894 CHECK_VALIDITY(pa_utf8_valid(name), "Invalid UTF8 in sample name.");
895
896 ok = -1;
897 if ((idx = pa_scache_get_id_by_name(c->protocol->core, name)) != PA_IDXSET_INVALID)
898 ok = (int32_t) idx + 1;
899
900 connection_write(c, &ok, sizeof(int32_t));
901
902 return 0;
903 }
904
905 static int esd_proto_sample_free_or_play(connection *c, esd_proto_t request, const void *data, size_t length) {
906 int32_t ok;
907 const char *name;
908 uint32_t idx;
909
910 connection_assert_ref(c);
911 pa_assert(data);
912 pa_assert(length == sizeof(int32_t));
913
914 memcpy(&idx, data, sizeof(uint32_t));
915 idx = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, idx) - 1;
916
917 ok = 0;
918
919 if ((name = pa_scache_get_name_by_id(c->protocol->core, idx))) {
920 if (request == ESD_PROTO_SAMPLE_PLAY) {
921 pa_sink *sink;
922
923 if ((sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK)))
924 if (pa_scache_play_item(c->protocol->core, name, sink, PA_VOLUME_NORM, c->client->proplist, NULL) >= 0)
925 ok = (int32_t) idx + 1;
926 } else {
927 pa_assert(request == ESD_PROTO_SAMPLE_FREE);
928
929 if (pa_scache_remove_item(c->protocol->core, name) >= 0)
930 ok = (int32_t) idx + 1;
931 }
932 }
933
934 connection_write(c, &ok, sizeof(int32_t));
935
936 return 0;
937 }
938
939 static int esd_proto_standby_or_resume(connection *c, esd_proto_t request, const void *data, size_t length) {
940 int32_t ok = 1;
941
942 connection_assert_ref(c);
943
944 connection_write_prepare(c, sizeof(int32_t) * 2);
945 connection_write(c, &ok, sizeof(int32_t));
946
947 if (request == ESD_PROTO_STANDBY)
948 ok = pa_sink_suspend_all(c->protocol->core, TRUE) >= 0;
949 else {
950 pa_assert(request == ESD_PROTO_RESUME);
951 ok = pa_sink_suspend_all(c->protocol->core, FALSE) >= 0;
952 }
953
954 connection_write(c, &ok, sizeof(int32_t));
955
956 return 0;
957 }
958
959 static int esd_proto_standby_mode(connection *c, esd_proto_t request, const void *data, size_t length) {
960 int32_t mode;
961 pa_sink *sink, *source;
962
963 connection_assert_ref(c);
964
965 mode = ESM_RUNNING;
966
967 if ((sink = pa_namereg_get(c->protocol->core, c->options->default_sink, PA_NAMEREG_SINK)))
968 if (pa_sink_get_state(sink) == PA_SINK_SUSPENDED)
969 mode = ESM_ON_STANDBY;
970
971 if ((source = pa_namereg_get(c->protocol->core, c->options->default_source, PA_NAMEREG_SOURCE)))
972 if (pa_source_get_state(source) == PA_SOURCE_SUSPENDED)
973 mode = ESM_ON_STANDBY;
974
975 mode = PA_MAYBE_INT32_SWAP(c->swap_byte_order, mode);
976
977 connection_write(c, &mode, sizeof(mode));
978 return 0;
979 }
980
981 /*** client callbacks ***/
982
983 static void client_kill_cb(pa_client *c) {
984 pa_assert(c);
985
986 connection_unlink(CONNECTION(c->userdata));
987 }
988
989 /*** pa_iochannel callbacks ***/
990
991 static int do_read(connection *c) {
992 connection_assert_ref(c);
993
994 /* pa_log("READ"); */
995
996 if (c->state == ESD_NEXT_REQUEST) {
997 ssize_t r;
998 pa_assert(c->read_data_length < sizeof(c->request));
999
1000 if ((r = pa_iochannel_read(c->io,
1001 ((uint8_t*) &c->request) + c->read_data_length,
1002 sizeof(c->request) - c->read_data_length)) <= 0) {
1003
1004 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1005 return 0;
1006
1007 pa_log_debug("read(): %s", r < 0 ? pa_cstrerror(errno) : "EOF");
1008 return -1;
1009 }
1010
1011 c->read_data_length += (size_t) r;
1012
1013 if (c->read_data_length >= sizeof(c->request)) {
1014 struct proto_handler *handler;
1015
1016 c->request = PA_MAYBE_INT32_SWAP(c->swap_byte_order, c->request);
1017
1018 if (c->request < ESD_PROTO_CONNECT || c->request >= ESD_PROTO_MAX) {
1019 pa_log("recieved invalid request.");
1020 return -1;
1021 }
1022
1023 handler = proto_map+c->request;
1024
1025 /* pa_log("executing request #%u", c->request); */
1026
1027 if (!handler->proc) {
1028 pa_log("recieved unimplemented request #%u.", c->request);
1029 return -1;
1030 }
1031
1032 if (handler->data_length == 0) {
1033 c->read_data_length = 0;
1034
1035 if (handler->proc(c, c->request, NULL, 0) < 0)
1036 return -1;
1037
1038 } else {
1039 if (c->read_data_alloc < handler->data_length)
1040 c->read_data = pa_xrealloc(c->read_data, c->read_data_alloc = handler->data_length);
1041 pa_assert(c->read_data);
1042
1043 c->state = ESD_NEEDS_REQDATA;
1044 c->read_data_length = 0;
1045 }
1046 }
1047
1048 } else if (c->state == ESD_NEEDS_REQDATA) {
1049 ssize_t r;
1050 struct proto_handler *handler = proto_map+c->request;
1051
1052 pa_assert(handler->proc);
1053
1054 pa_assert(c->read_data && c->read_data_length < handler->data_length);
1055
1056 if ((r = pa_iochannel_read(c->io,
1057 (uint8_t*) c->read_data + c->read_data_length,
1058 handler->data_length - c->read_data_length)) <= 0) {
1059
1060 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1061 return 0;
1062
1063 pa_log_debug("read(): %s", r < 0 ? pa_cstrerror(errno) : "EOF");
1064 return -1;
1065 }
1066
1067 c->read_data_length += (size_t) r;
1068 if (c->read_data_length >= handler->data_length) {
1069 size_t l = c->read_data_length;
1070 pa_assert(handler->proc);
1071
1072 c->state = ESD_NEXT_REQUEST;
1073 c->read_data_length = 0;
1074
1075 if (handler->proc(c, c->request, c->read_data, l) < 0)
1076 return -1;
1077 }
1078 } else if (c->state == ESD_CACHING_SAMPLE) {
1079 ssize_t r;
1080 void *p;
1081
1082 pa_assert(c->scache.memchunk.memblock);
1083 pa_assert(c->scache.name);
1084 pa_assert(c->scache.memchunk.index < c->scache.memchunk.length);
1085
1086 p = pa_memblock_acquire(c->scache.memchunk.memblock);
1087 r = pa_iochannel_read(c->io, (uint8_t*) p+c->scache.memchunk.index, c->scache.memchunk.length-c->scache.memchunk.index);
1088 pa_memblock_release(c->scache.memchunk.memblock);
1089
1090 if (r <= 0) {
1091 if (r < 0 && (errno == EINTR || errno == EAGAIN))
1092 return 0;
1093
1094 pa_log_debug("read(): %s", r < 0 ? pa_cstrerror(errno) : "EOF");
1095 return -1;
1096 }
1097
1098 c->scache.memchunk.index += (size_t) r;
1099 pa_assert(c->scache.memchunk.index <= c->scache.memchunk.length);
1100
1101 if (c->scache.memchunk.index == c->scache.memchunk.length) {
1102 uint32_t idx;
1103
1104 c->scache.memchunk.index = 0;
1105 pa_scache_add_item(c->protocol->core, c->scache.name, &c->scache.sample_spec, NULL, &c->scache.memchunk, c->client->proplist, &idx);
1106
1107 pa_memblock_unref(c->scache.memchunk.memblock);
1108 c->scache.memchunk.memblock = NULL;
1109 c->scache.memchunk.index = c->scache.memchunk.length = 0;
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 switch (code) {
1294 case CONNECTION_MESSAGE_REQUEST_DATA:
1295 do_work(c);
1296 break;
1297
1298 case CONNECTION_MESSAGE_POST_DATA:
1299 /* pa_log("got data %u", chunk->length); */
1300 pa_memblockq_push_align(c->output_memblockq, chunk);
1301 do_work(c);
1302 break;
1303
1304 case CONNECTION_MESSAGE_UNLINK_CONNECTION:
1305 connection_unlink(c);
1306 break;
1307 }
1308
1309 return 0;
1310 }
1311
1312 /*** sink_input callbacks ***/
1313
1314 /* Called from thread context */
1315 static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
1316 pa_sink_input *i = PA_SINK_INPUT(o);
1317 connection*c;
1318
1319 pa_sink_input_assert_ref(i);
1320 c = CONNECTION(i->userdata);
1321 connection_assert_ref(c);
1322
1323 switch (code) {
1324
1325 case SINK_INPUT_MESSAGE_POST_DATA: {
1326 pa_assert(chunk);
1327
1328 /* New data from the main loop */
1329 pa_memblockq_push_align(c->input_memblockq, chunk);
1330
1331 if (pa_memblockq_is_readable(c->input_memblockq) && c->playback.underrun) {
1332 pa_log_debug("Requesting rewind due to end of underrun.");
1333 pa_sink_input_request_rewind(c->sink_input, 0, FALSE, TRUE, FALSE);
1334 }
1335
1336 /* pa_log("got data, %u", pa_memblockq_get_length(c->input_memblockq)); */
1337
1338 return 0;
1339 }
1340
1341 case SINK_INPUT_MESSAGE_DISABLE_PREBUF:
1342 pa_memblockq_prebuf_disable(c->input_memblockq);
1343 return 0;
1344
1345 case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
1346 pa_usec_t *r = userdata;
1347
1348 *r = pa_bytes_to_usec(pa_memblockq_get_length(c->input_memblockq), &c->sink_input->sample_spec);
1349
1350 /* Fall through, the default handler will add in the extra
1351 * latency added by the resampler */
1352 }
1353
1354 default:
1355 return pa_sink_input_process_msg(o, code, userdata, offset, chunk);
1356 }
1357 }
1358
1359 /* Called from thread context */
1360 static int sink_input_pop_cb(pa_sink_input *i, size_t length, pa_memchunk *chunk) {
1361 connection*c;
1362
1363 pa_sink_input_assert_ref(i);
1364 c = CONNECTION(i->userdata);
1365 connection_assert_ref(c);
1366 pa_assert(chunk);
1367
1368 if (pa_memblockq_peek(c->input_memblockq, chunk) < 0) {
1369
1370 c->playback.underrun = TRUE;
1371
1372 if (c->dead && pa_sink_input_safe_to_remove(i))
1373 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(c), CONNECTION_MESSAGE_UNLINK_CONNECTION, NULL, 0, NULL, NULL);
1374
1375 return -1;
1376 } else {
1377 size_t m;
1378
1379 chunk->length = PA_MIN(length, chunk->length);
1380
1381 c->playback.underrun = FALSE;
1382
1383 pa_memblockq_drop(c->input_memblockq, chunk->length);
1384 m = pa_memblockq_pop_missing(c->input_memblockq);
1385
1386 if (m > 0)
1387 if (pa_atomic_add(&c->playback.missing, (int) m) <= 0)
1388 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(c), CONNECTION_MESSAGE_REQUEST_DATA, NULL, 0, NULL, NULL);
1389
1390 return 0;
1391 }
1392 }
1393
1394 /* Called from thread context */
1395 static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
1396 connection *c;
1397
1398 pa_sink_input_assert_ref(i);
1399 c = CONNECTION(i->userdata);
1400 connection_assert_ref(c);
1401
1402 /* If we are in an underrun, then we don't rewind */
1403 if (i->thread_info.underrun_for > 0)
1404 return;
1405
1406 pa_memblockq_rewind(c->input_memblockq, nbytes);
1407 }
1408
1409 /* Called from thread context */
1410 static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
1411 connection *c;
1412
1413 pa_sink_input_assert_ref(i);
1414 c = CONNECTION(i->userdata);
1415 connection_assert_ref(c);
1416
1417 pa_memblockq_set_maxrewind(c->input_memblockq, nbytes);
1418 }
1419
1420 static void sink_input_kill_cb(pa_sink_input *i) {
1421 pa_sink_input_assert_ref(i);
1422
1423 connection_unlink(CONNECTION(i->userdata));
1424 }
1425
1426 /*** source_output callbacks ***/
1427
1428 /* Called from thread context */
1429 static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) {
1430 connection *c;
1431
1432 pa_source_output_assert_ref(o);
1433 c = CONNECTION(o->userdata);
1434 pa_assert(c);
1435 pa_assert(chunk);
1436
1437 pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(c), CONNECTION_MESSAGE_POST_DATA, NULL, 0, chunk, NULL);
1438 }
1439
1440 static void source_output_kill_cb(pa_source_output *o) {
1441 pa_source_output_assert_ref(o);
1442
1443 connection_unlink(CONNECTION(o->userdata));
1444 }
1445
1446 static pa_usec_t source_output_get_latency_cb(pa_source_output *o) {
1447 connection*c;
1448
1449 pa_source_output_assert_ref(o);
1450 c = CONNECTION(o->userdata);
1451 pa_assert(c);
1452
1453 return pa_bytes_to_usec(pa_memblockq_get_length(c->output_memblockq), &c->source_output->sample_spec);
1454 }
1455
1456 /*** entry points ***/
1457
1458 static void auth_timeout(pa_mainloop_api*m, pa_time_event *e, const struct timeval *tv, void *userdata) {
1459 connection *c = CONNECTION(userdata);
1460
1461 pa_assert(m);
1462 pa_assert(tv);
1463 connection_assert_ref(c);
1464 pa_assert(c->auth_timeout_event == e);
1465
1466 if (!c->authorized)
1467 connection_unlink(c);
1468 }
1469
1470 void pa_esound_protocol_connect(pa_esound_protocol *p, pa_iochannel *io, pa_esound_options *o) {
1471 connection *c;
1472 char pname[128];
1473 pa_client_new_data data;
1474 pa_client *client;
1475
1476 pa_assert(p);
1477 pa_assert(io);
1478 pa_assert(o);
1479
1480 if (pa_idxset_size(p->connections)+1 > MAX_CONNECTIONS) {
1481 pa_log("Warning! Too many connections (%u), dropping incoming connection.", MAX_CONNECTIONS);
1482 pa_iochannel_free(io);
1483 return;
1484 }
1485
1486 pa_client_new_data_init(&data);
1487 data.module = o->module;
1488 data.driver = __FILE__;
1489 pa_iochannel_socket_peer_to_string(io, pname, sizeof(pname));
1490 pa_proplist_setf(data.proplist, PA_PROP_APPLICATION_NAME, "EsounD client (%s)", pname);
1491 pa_proplist_sets(data.proplist, "esound-protocol.peer", pname);
1492 client = pa_client_new(p->core, &data);
1493 pa_client_new_data_done(&data);
1494
1495 if (!client)
1496 return;
1497
1498 c = pa_msgobject_new(connection);
1499 c->parent.parent.free = connection_free;
1500 c->parent.process_msg = connection_process_msg;
1501 c->protocol = p;
1502 c->io = io;
1503 pa_iochannel_set_callback(c->io, io_callback, c);
1504
1505 c->client = client;
1506 c->client->kill = client_kill_cb;
1507 c->client->userdata = c;
1508
1509 c->options = pa_esound_options_ref(o);
1510 c->authorized = FALSE;
1511 c->swap_byte_order = FALSE;
1512 c->dead = FALSE;
1513
1514 c->read_data_length = 0;
1515 c->read_data = pa_xmalloc(c->read_data_alloc = proto_map[ESD_PROTO_CONNECT].data_length);
1516
1517 c->write_data_length = c->write_data_index = c->write_data_alloc = 0;
1518 c->write_data = NULL;
1519
1520 c->state = ESD_NEEDS_REQDATA;
1521 c->request = ESD_PROTO_CONNECT;
1522
1523 c->sink_input = NULL;
1524 c->input_memblockq = NULL;
1525
1526 c->source_output = NULL;
1527 c->output_memblockq = NULL;
1528
1529 c->playback.current_memblock = NULL;
1530 c->playback.memblock_index = 0;
1531 c->playback.underrun = TRUE;
1532 pa_atomic_store(&c->playback.missing, 0);
1533
1534 pa_memchunk_reset(&c->scache.memchunk);
1535 c->scache.name = NULL;
1536
1537 c->original_name = NULL;
1538
1539 if (o->auth_anonymous) {
1540 pa_log_info("Client authenticated anonymously.");
1541 c->authorized = TRUE;
1542 }
1543
1544 if (!c->authorized &&
1545 o->auth_ip_acl &&
1546 pa_ip_acl_check(o->auth_ip_acl, pa_iochannel_get_recv_fd(io)) > 0) {
1547
1548 pa_log_info("Client authenticated by IP ACL.");
1549 c->authorized = TRUE;
1550 }
1551
1552 if (!c->authorized) {
1553 struct timeval tv;
1554 pa_gettimeofday(&tv);
1555 tv.tv_sec += AUTH_TIMEOUT;
1556 c->auth_timeout_event = p->core->mainloop->time_new(p->core->mainloop, &tv, auth_timeout, c);
1557 } else
1558 c->auth_timeout_event = NULL;
1559
1560 c->defer_event = p->core->mainloop->defer_new(p->core->mainloop, defer_callback, c);
1561 p->core->mainloop->defer_enable(c->defer_event, 0);
1562
1563 pa_idxset_put(p->connections, c, &c->index);
1564 }
1565
1566 void pa_esound_protocol_disconnect(pa_esound_protocol *p, pa_module *m) {
1567 connection *c;
1568 void *state = NULL;
1569
1570 pa_assert(p);
1571 pa_assert(m);
1572
1573 while ((c = pa_idxset_iterate(p->connections, &state, NULL)))
1574 if (c->options->module == m)
1575 connection_unlink(c);
1576 }
1577
1578 static pa_esound_protocol* esound_protocol_new(pa_core *c) {
1579 pa_esound_protocol *p;
1580
1581 pa_assert(c);
1582
1583 p = pa_xnew(pa_esound_protocol, 1);
1584 PA_REFCNT_INIT(p);
1585 p->core = c;
1586 p->connections = pa_idxset_new(NULL, NULL);
1587 p->n_player = 0;
1588
1589 pa_assert_se(pa_shared_set(c, "esound-protocol", p) >= 0);
1590
1591 return p;
1592 }
1593
1594 pa_esound_protocol* pa_esound_protocol_get(pa_core *c) {
1595 pa_esound_protocol *p;
1596
1597 if ((p = pa_shared_get(c, "esound-protocol")))
1598 return pa_esound_protocol_ref(p);
1599
1600 return esound_protocol_new(c);
1601 }
1602
1603 pa_esound_protocol* pa_esound_protocol_ref(pa_esound_protocol *p) {
1604 pa_assert(p);
1605 pa_assert(PA_REFCNT_VALUE(p) >= 1);
1606
1607 PA_REFCNT_INC(p);
1608
1609 return p;
1610 }
1611
1612 void pa_esound_protocol_unref(pa_esound_protocol *p) {
1613 connection *c;
1614 pa_assert(p);
1615 pa_assert(PA_REFCNT_VALUE(p) >= 1);
1616
1617 if (PA_REFCNT_DEC(p) > 0)
1618 return;
1619
1620 while ((c = pa_idxset_first(p->connections, NULL)))
1621 connection_unlink(c);
1622
1623 pa_idxset_free(p->connections, NULL, NULL);
1624
1625 pa_assert_se(pa_shared_remove(p->core, "esound-protocol") >= 0);
1626
1627 pa_xfree(p);
1628 }
1629
1630 pa_esound_options* pa_esound_options_new(void) {
1631 pa_esound_options *o;
1632
1633 o = pa_xnew0(pa_esound_options, 1);
1634 PA_REFCNT_INIT(o);
1635
1636 return o;
1637 }
1638
1639 pa_esound_options* pa_esound_options_ref(pa_esound_options *o) {
1640 pa_assert(o);
1641 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1642
1643 PA_REFCNT_INC(o);
1644
1645 return o;
1646 }
1647
1648 void pa_esound_options_unref(pa_esound_options *o) {
1649 pa_assert(o);
1650 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1651
1652 if (PA_REFCNT_DEC(o) > 0)
1653 return;
1654
1655 if (o->auth_ip_acl)
1656 pa_ip_acl_free(o->auth_ip_acl);
1657
1658 if (o->auth_cookie)
1659 pa_auth_cookie_unref(o->auth_cookie);
1660
1661 pa_xfree(o->default_sink);
1662 pa_xfree(o->default_source);
1663
1664 pa_xfree(o);
1665 }
1666
1667 int pa_esound_options_parse(pa_esound_options *o, pa_core *c, pa_modargs *ma) {
1668 pa_bool_t enabled;
1669 const char *acl;
1670
1671 pa_assert(o);
1672 pa_assert(PA_REFCNT_VALUE(o) >= 1);
1673 pa_assert(ma);
1674
1675 if (pa_modargs_get_value_boolean(ma, "auth-anonymous", &o->auth_anonymous) < 0) {
1676 pa_log("auth-anonymous= expects a boolean argument.");
1677 return -1;
1678 }
1679
1680 if ((acl = pa_modargs_get_value(ma, "auth-ip-acl", NULL))) {
1681 pa_ip_acl *ipa;
1682
1683 if (!(ipa = pa_ip_acl_new(acl))) {
1684 pa_log("Failed to parse IP ACL '%s'", acl);
1685 return -1;
1686 }
1687
1688 if (o->auth_ip_acl)
1689 pa_ip_acl_free(o->auth_ip_acl);
1690
1691 o->auth_ip_acl = ipa;
1692 }
1693
1694 enabled = TRUE;
1695 if (pa_modargs_get_value_boolean(ma, "auth-cookie-enabled", &enabled) < 0) {
1696 pa_log("auth-cookie-enabled= expects a boolean argument.");
1697 return -1;
1698 }
1699
1700 if (o->auth_cookie)
1701 pa_auth_cookie_unref(o->auth_cookie);
1702
1703 if (enabled) {
1704 const char *cn;
1705
1706 /* The new name for this is 'auth-cookie', for compat reasons
1707 * we check the old name too */
1708 if (!(cn = pa_modargs_get_value(ma, "auth-cookie", NULL)))
1709 if (!(cn = pa_modargs_get_value(ma, "cookie", NULL)))
1710 cn = DEFAULT_COOKIE_FILE;
1711
1712 if (!(o->auth_cookie = pa_auth_cookie_get(c, cn, ESD_KEY_LEN)))
1713 return -1;
1714
1715 } else
1716 o->auth_cookie = NULL;
1717
1718 pa_xfree(o->default_sink);
1719 o->default_sink = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
1720
1721 pa_xfree(o->default_source);
1722 o->default_source = pa_xstrdup(pa_modargs_get_value(ma, "source", NULL));
1723
1724 return 0;
1725 }