return;
pa_assert_se(pa_idxset_remove_by_data(s->connection->output_streams, s, NULL) == s);
- upload_stream_unref(s);
s->connection = NULL;
+ upload_stream_unref(s);
}
static void upload_stream_free(pa_object *o) {
}
pa_assert_se(pa_idxset_remove_by_data(s->connection->record_streams, s, NULL) == s);
- record_stream_unref(s);
s->connection = NULL;
+ record_stream_unref(s);
}
static void record_stream_free(pa_object *o) {
pa_pstream_send_error(s->connection->pstream, s->drain_tag, PA_ERR_NOENTITY);
pa_assert_se(pa_idxset_remove_by_data(s->connection->output_streams, s, NULL) == s);
- playback_stream_unref(s);
s->connection = NULL;
+ playback_stream_unref(s);
}
static void playback_stream_free(pa_object* o) {
pa_tagstruct_putu32(t, l);
pa_pstream_send_tagstruct(s->connection->pstream, t);
- /* pa_log("Requesting %u bytes", l); */
+/* pa_log("Requesting %u bytes", l); */
break;
}
static void request_bytes(playback_stream *s) {
size_t new_missing, delta, previous_missing;
+
+/* pa_log("request_bytes()"); */
playback_stream_assert_ref(s);
new_missing = pa_memblockq_missing(s->memblockq);
-
- if (new_missing <= s->last_missing)
+
+ if (new_missing <= s->last_missing) {
+ s->last_missing = new_missing;
return;
+ }
delta = new_missing - s->last_missing;
s->last_missing = new_missing;
+/* pa_log("request_bytes(%u)", delta); */
+
previous_missing = pa_atomic_add(&s->missing, delta);
if (previous_missing < pa_memblockq_get_minreq(s->memblockq) && previous_missing+delta >= pa_memblockq_get_minreq(s->memblockq))
pa_asyncmsgq_post(s->connection->protocol->core->asyncmsgq, PA_MSGOBJECT(s), PLAYBACK_STREAM_MESSAGE_REQUEST_DATA, NULL, 0, NULL, NULL);
case SINK_INPUT_MESSAGE_SEEK:
pa_memblockq_seek(s->memblockq, offset, PA_PTR_TO_UINT(userdata));
+ request_bytes(s);
return 0;
case SINK_INPUT_MESSAGE_POST_DATA: {
pa_memblockq_seek(s->memblockq, chunk->length, PA_SEEK_RELATIVE);
}
+ request_bytes(s);
+
s->underrun = 0;
return 0;
}
s->drain_tag = PA_PTR_TO_UINT(userdata);
s->drain_request = 1;
}
+ request_bytes(s);
return 0;
}
case PA_SINK_INPUT_MESSAGE_SET_STATE:
pa_memblockq_prebuf_force(s->memblockq);
+ request_bytes(s);
break;
case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
}
if (pa_memblockq_peek(s->memblockq, chunk) < 0) {
-/* pa_log("peek: failure"); */
+/* pa_log("peek: failure"); */
return -1;
}
-/* pa_log("peek: %u", chunk->length); */
+/* pa_log("peek: %u", chunk->length); */
+
+ request_bytes(s);
return 0;
}
pa_tagstruct_putu32(reply, s->sink_input->index);
pa_tagstruct_putu32(reply, missing);
+/* pa_log("initial request is %u", missing); */
+
if (c->version >= 9) {
/* Since 0.9 we support sending the buffer metrics back to the client */
break;
case PA_COMMAND_PREBUF_PLAYBACK_STREAM:
- pa_asyncmsgq_send(s->sink_input->sink->asyncmsgq, PA_MSGOBJECT(s->sink_input), SINK_INPUT_MESSAGE_TRIGGER, NULL, 0, NULL);
+ pa_asyncmsgq_send(s->sink_input->sink->asyncmsgq, PA_MSGOBJECT(s->sink_input), SINK_INPUT_MESSAGE_PREBUF_FORCE, NULL, 0, NULL);
break;
case PA_COMMAND_TRIGGER_PLAYBACK_STREAM:
- pa_asyncmsgq_send(s->sink_input->sink->asyncmsgq, PA_MSGOBJECT(s->sink_input), SINK_INPUT_MESSAGE_PREBUF_FORCE, NULL, 0, NULL);
+ pa_asyncmsgq_send(s->sink_input->sink->asyncmsgq, PA_MSGOBJECT(s->sink_input), SINK_INPUT_MESSAGE_TRIGGER, NULL, 0, NULL);
break;
default: