#endif
#include <stdlib.h>
-#include <limits.h>
#include <stdio.h>
#include <errno.h>
-#include <string.h>
#include <pulse/xmalloc.h>
#include <pulse/timeval.h>
pa_client *client;
pa_memblockq *input_memblockq, *output_memblockq;
- pa_bool_t dead;
+ bool dead;
struct {
pa_memblock *current_memblock;
size_t memblock_index;
pa_atomic_t missing;
- pa_bool_t underrun;
+ bool underrun;
} playback;
} connection;
enum {
CONNECTION_MESSAGE_REQUEST_DATA, /* data requested from sink input from the main loop */
CONNECTION_MESSAGE_POST_DATA, /* data from source output to main loop */
- CONNECTION_MESSAGE_UNLINK_CONNECTION /* Please drop a aconnection now */
+ CONNECTION_MESSAGE_UNLINK_CONNECTION /* Please drop the connection now */
};
#define PLAYBACK_BUFFER_SECONDS (.5)
pa_memblock_unref(chunk.memblock);
if (r < 0) {
-
- if (errno == EINTR || errno == EAGAIN)
- return 0;
-
pa_log("write(): %s", pa_cstrerror(errno));
return -1;
}
pa_memblockq_drop(c->output_memblockq, (size_t) r);
- return 0;
+ return 1;
}
static void do_work(connection *c) {
if (!c->sink_input && pa_iochannel_is_hungup(c->io))
goto fail;
- if (pa_iochannel_is_writable(c->io))
- if (do_write(c) < 0)
+ while (pa_iochannel_is_writable(c->io)) {
+ int r = do_write(c);
+ if (r < 0)
goto fail;
+ if (r == 0)
+ break;
+ }
return;
if (c->sink_input) {
/* If there is a sink input, we first drain what we already have read before shutting down the connection */
- c->dead = TRUE;
+ c->dead = true;
pa_iochannel_free(c->io);
c->io = NULL;
if (pa_memblockq_is_readable(c->input_memblockq) && c->playback.underrun) {
pa_log_debug("Requesting rewind due to end of underrun.");
- pa_sink_input_request_rewind(c->sink_input, 0, FALSE, TRUE, FALSE);
+ pa_sink_input_request_rewind(c->sink_input, 0, false, true, false);
}
/* pa_log("got data, %u", pa_memblockq_get_length(c->input_memblockq)); */
if (pa_memblockq_peek(c->input_memblockq, chunk) < 0) {
- c->playback.underrun = TRUE;
+ c->playback.underrun = true;
if (c->dead && pa_sink_input_safe_to_remove(i))
pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(c), CONNECTION_MESSAGE_UNLINK_CONNECTION, NULL, 0, NULL, NULL);
chunk->length = PA_MIN(length, chunk->length);
- c->playback.underrun = FALSE;
+ c->playback.underrun = false;
pa_memblockq_drop(c->input_memblockq, chunk->length);
m = pa_memblockq_pop_missing(c->input_memblockq);
c->options = pa_simple_options_ref(o);
c->playback.current_memblock = NULL;
c->playback.memblock_index = 0;
- c->dead = FALSE;
- c->playback.underrun = TRUE;
+ c->dead = false;
+ c->playback.underrun = true;
pa_atomic_store(&c->playback.missing, 0);
pa_client_new_data_init(&client_data);
if (o->playback) {
pa_sink_input_new_data data;
+ pa_memchunk silence;
size_t l;
pa_sink *sink;
data.driver = __FILE__;
data.module = o->module;
data.client = c->client;
- data.sink = sink;
+ pa_sink_input_new_data_set_sink(&data, sink, false);
pa_proplist_update(data.proplist, PA_UPDATE_MERGE, c->client->proplist);
pa_sink_input_new_data_set_sample_spec(&data, &o->sample_spec);
pa_sink_input_set_requested_latency(c->sink_input, DEFAULT_SINK_LATENCY);
l = (size_t) ((double) pa_bytes_per_second(&o->sample_spec)*PLAYBACK_BUFFER_SECONDS);
+ pa_sink_input_get_silence(c->sink_input, &silence);
c->input_memblockq = pa_memblockq_new(
+ "simple protocol connection input_memblockq",
0,
l,
l,
- pa_frame_size(&o->sample_spec),
+ &o->sample_spec,
(size_t) -1,
l/PLAYBACK_BUFFER_FRAGMENTS,
0,
- NULL);
+ &silence);
+ pa_memblock_unref(silence.memblock);
+
pa_iochannel_socket_set_rcvbuf(io, l);
- pa_atomic_store(&c->playback.missing, (int) pa_memblockq_missing(c->input_memblockq));
+ pa_atomic_store(&c->playback.missing, (int) pa_memblockq_pop_missing(c->input_memblockq));
pa_sink_input_put(c->sink_input);
}
data.driver = __FILE__;
data.module = o->module;
data.client = c->client;
- data.source = source;
+ pa_source_output_new_data_set_source(&data, source, false);
pa_proplist_update(data.proplist, PA_UPDATE_MERGE, c->client->proplist);
pa_source_output_new_data_set_sample_spec(&data, &o->sample_spec);
l = (size_t) (pa_bytes_per_second(&o->sample_spec)*RECORD_BUFFER_SECONDS);
c->output_memblockq = pa_memblockq_new(
+ "simple protocol connection output_memblockq",
0,
l,
0,
- pa_frame_size(&o->sample_spec),
+ &o->sample_spec,
1,
0,
0,
while ((c = pa_idxset_first(p->connections, NULL)))
connection_unlink(c);
- pa_idxset_free(p->connections, NULL, NULL);
+ pa_idxset_free(p->connections, NULL);
pa_assert_se(pa_shared_remove(p->core, "simple-protocol") >= 0);
o = pa_xnew0(pa_simple_options, 1);
PA_REFCNT_INIT(o);
- o->record = FALSE;
- o->playback = TRUE;
+ o->record = false;
+ o->playback = true;
return o;
}
}
int pa_simple_options_parse(pa_simple_options *o, pa_core *c, pa_modargs *ma) {
- pa_bool_t enabled;
+ bool enabled;
pa_assert(o);
pa_assert(PA_REFCNT_VALUE(o) >= 1);