mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-12 13:30:10 -05:00
fix playback over native protocol
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1581 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
c306b83525
commit
62790ccdb4
1 changed files with 25 additions and 10 deletions
|
|
@ -321,8 +321,8 @@ static void upload_stream_unlink(upload_stream *s) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pa_assert_se(pa_idxset_remove_by_data(s->connection->output_streams, s, NULL) == s);
|
pa_assert_se(pa_idxset_remove_by_data(s->connection->output_streams, s, NULL) == s);
|
||||||
upload_stream_unref(s);
|
|
||||||
s->connection = NULL;
|
s->connection = NULL;
|
||||||
|
upload_stream_unref(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void upload_stream_free(pa_object *o) {
|
static void upload_stream_free(pa_object *o) {
|
||||||
|
|
@ -379,8 +379,8 @@ static void record_stream_unlink(record_stream *s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_assert_se(pa_idxset_remove_by_data(s->connection->record_streams, s, NULL) == s);
|
pa_assert_se(pa_idxset_remove_by_data(s->connection->record_streams, s, NULL) == s);
|
||||||
record_stream_unref(s);
|
|
||||||
s->connection = NULL;
|
s->connection = NULL;
|
||||||
|
record_stream_unref(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void record_stream_free(pa_object *o) {
|
static void record_stream_free(pa_object *o) {
|
||||||
|
|
@ -496,8 +496,8 @@ static void playback_stream_unlink(playback_stream *s) {
|
||||||
pa_pstream_send_error(s->connection->pstream, s->drain_tag, PA_ERR_NOENTITY);
|
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);
|
pa_assert_se(pa_idxset_remove_by_data(s->connection->output_streams, s, NULL) == s);
|
||||||
playback_stream_unref(s);
|
|
||||||
s->connection = NULL;
|
s->connection = NULL;
|
||||||
|
playback_stream_unref(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void playback_stream_free(pa_object* o) {
|
static void playback_stream_free(pa_object* o) {
|
||||||
|
|
@ -531,7 +531,7 @@ static int playback_stream_process_msg(pa_msgobject *o, int code, void*userdata,
|
||||||
pa_tagstruct_putu32(t, l);
|
pa_tagstruct_putu32(t, l);
|
||||||
pa_pstream_send_tagstruct(s->connection->pstream, t);
|
pa_pstream_send_tagstruct(s->connection->pstream, t);
|
||||||
|
|
||||||
/* pa_log("Requesting %u bytes", l); */
|
/* pa_log("Requesting %u bytes", l); */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -729,16 +729,22 @@ static void connection_free(pa_object *o) {
|
||||||
static void request_bytes(playback_stream *s) {
|
static void request_bytes(playback_stream *s) {
|
||||||
size_t new_missing, delta, previous_missing;
|
size_t new_missing, delta, previous_missing;
|
||||||
|
|
||||||
|
|
||||||
|
/* pa_log("request_bytes()"); */
|
||||||
playback_stream_assert_ref(s);
|
playback_stream_assert_ref(s);
|
||||||
|
|
||||||
new_missing = pa_memblockq_missing(s->memblockq);
|
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;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
delta = new_missing - s->last_missing;
|
delta = new_missing - s->last_missing;
|
||||||
s->last_missing = new_missing;
|
s->last_missing = new_missing;
|
||||||
|
|
||||||
|
/* pa_log("request_bytes(%u)", delta); */
|
||||||
|
|
||||||
previous_missing = pa_atomic_add(&s->missing, 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))
|
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);
|
pa_asyncmsgq_post(s->connection->protocol->core->asyncmsgq, PA_MSGOBJECT(s), PLAYBACK_STREAM_MESSAGE_REQUEST_DATA, NULL, 0, NULL, NULL);
|
||||||
|
|
@ -812,6 +818,7 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
|
||||||
|
|
||||||
case SINK_INPUT_MESSAGE_SEEK:
|
case SINK_INPUT_MESSAGE_SEEK:
|
||||||
pa_memblockq_seek(s->memblockq, offset, PA_PTR_TO_UINT(userdata));
|
pa_memblockq_seek(s->memblockq, offset, PA_PTR_TO_UINT(userdata));
|
||||||
|
request_bytes(s);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case SINK_INPUT_MESSAGE_POST_DATA: {
|
case SINK_INPUT_MESSAGE_POST_DATA: {
|
||||||
|
|
@ -824,6 +831,8 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
|
||||||
pa_memblockq_seek(s->memblockq, chunk->length, PA_SEEK_RELATIVE);
|
pa_memblockq_seek(s->memblockq, chunk->length, PA_SEEK_RELATIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
request_bytes(s);
|
||||||
|
|
||||||
s->underrun = 0;
|
s->underrun = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -838,6 +847,7 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
|
||||||
s->drain_tag = PA_PTR_TO_UINT(userdata);
|
s->drain_tag = PA_PTR_TO_UINT(userdata);
|
||||||
s->drain_request = 1;
|
s->drain_request = 1;
|
||||||
}
|
}
|
||||||
|
request_bytes(s);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -891,6 +901,7 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
|
||||||
case PA_SINK_INPUT_MESSAGE_SET_STATE:
|
case PA_SINK_INPUT_MESSAGE_SET_STATE:
|
||||||
|
|
||||||
pa_memblockq_prebuf_force(s->memblockq);
|
pa_memblockq_prebuf_force(s->memblockq);
|
||||||
|
request_bytes(s);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
|
case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
|
||||||
|
|
@ -927,6 +938,8 @@ static int sink_input_peek_cb(pa_sink_input *i, pa_memchunk *chunk) {
|
||||||
|
|
||||||
/* pa_log("peek: %u", chunk->length); */
|
/* pa_log("peek: %u", chunk->length); */
|
||||||
|
|
||||||
|
request_bytes(s);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1083,6 +1096,8 @@ static void command_create_playback_stream(PA_GCC_UNUSED pa_pdispatch *pd, PA_GC
|
||||||
pa_tagstruct_putu32(reply, s->sink_input->index);
|
pa_tagstruct_putu32(reply, s->sink_input->index);
|
||||||
pa_tagstruct_putu32(reply, missing);
|
pa_tagstruct_putu32(reply, missing);
|
||||||
|
|
||||||
|
/* pa_log("initial request is %u", missing); */
|
||||||
|
|
||||||
if (c->version >= 9) {
|
if (c->version >= 9) {
|
||||||
/* Since 0.9 we support sending the buffer metrics back to the client */
|
/* Since 0.9 we support sending the buffer metrics back to the client */
|
||||||
|
|
||||||
|
|
@ -2158,11 +2173,11 @@ static void command_trigger_or_flush_or_prebuf_playback_stream(PA_GCC_UNUSED pa_
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PA_COMMAND_PREBUF_PLAYBACK_STREAM:
|
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;
|
break;
|
||||||
|
|
||||||
case PA_COMMAND_TRIGGER_PLAYBACK_STREAM:
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue