diff options
| author | Lennart Poettering <lennart@poettering.net> | 2007-08-06 16:13:32 +0000 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2007-08-06 16:13:32 +0000 | 
| commit | 62790ccdb4ee529974315c45e11714d56f2a9afa (patch) | |
| tree | 2e2db51f6ec9d25965f4c70e82fa1191da12f229 /src | |
| parent | c306b835255e576e46194c47782939b6f915ae3a (diff) | |
fix playback over native protocol
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1581 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src')
| -rw-r--r-- | src/pulsecore/protocol-native.c | 35 | 
1 files changed, 25 insertions, 10 deletions
| diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c index 89849858..4d7dd634 100644 --- a/src/pulsecore/protocol-native.c +++ b/src/pulsecore/protocol-native.c @@ -321,8 +321,8 @@ static void upload_stream_unlink(upload_stream *s) {          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) { @@ -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); -    record_stream_unref(s);          s->connection = NULL; +    record_stream_unref(s);      }  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_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) { @@ -531,7 +531,7 @@ static int playback_stream_process_msg(pa_msgobject *o, int code, void*userdata,              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;          } @@ -729,16 +729,22 @@ static void connection_free(pa_object *o) {  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); @@ -812,6 +818,7 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int          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: { @@ -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);              } +            request_bytes(s); +              s->underrun = 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_request = 1;              } +            request_bytes(s);              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:              pa_memblockq_prebuf_force(s->memblockq); +            request_bytes(s);              break;          case PA_SINK_INPUT_MESSAGE_GET_LATENCY: { @@ -921,11 +932,13 @@ static int sink_input_peek_cb(pa_sink_input *i, pa_memchunk *chunk) {      }      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;  } @@ -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, 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 */ @@ -2158,11 +2173,11 @@ static void command_trigger_or_flush_or_prebuf_playback_stream(PA_GCC_UNUSED pa_              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: | 
