sink-input: Provide more information to client when format is lost
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Sun, 10 Apr 2011 10:54:33 +0000 (16:24 +0530)
committerArun Raghavan <arun.raghavan@collabora.co.uk>
Sun, 15 May 2011 04:39:35 +0000 (10:09 +0530)
When the sink format changes and we kill the stream, clients need a way
to know (a) what device they should reconnect to, and (b) what the
stream running time was when the stream got killed (pa_stream_get_time()
won't work after the stream has been killed). This adds these two bits
of information in the event callback's proplist parameter.

src/pulse/stream.c
src/pulsecore/sink-input.c

index bd2e6ca..6c055a5 100644 (file)
@@ -766,6 +766,14 @@ void pa_command_stream_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, p
     if (s->state != PA_STREAM_READY)
         goto finish;
 
+    if (pa_streq(event, PA_STREAM_EVENT_FORMAT_LOST)) {
+        /* Let client know what the running time was when the stream had to be
+         * killed  */
+        pa_usec_t time;
+        if (pa_stream_get_time(s, &time) == 0)
+            pa_proplist_setf(pl, "stream-time", "%llu", (unsigned long long) time);
+    }
+
     if (s->event_callback)
         s->event_callback(s, event, pl, s->event_userdata);
 
index f0558f4..b21cfae 100644 (file)
@@ -1594,8 +1594,12 @@ int pa_sink_input_finish_move(pa_sink_input *i, pa_sink *dest, pa_bool_t save) {
         return -PA_ERR_NOTSUPPORTED;
 
     if (pa_sink_input_is_passthrough(i) && !pa_sink_check_format(dest, i->format)) {
+        pa_proplist *p = pa_proplist_new();
         pa_log_debug("New sink doesn't support stream format, sending format-changed and killing");
-        pa_sink_input_send_event(i, PA_STREAM_EVENT_FORMAT_LOST, NULL);
+        /* Tell the client what device we want to be on if it is going to
+         * reconnect */
+        pa_proplist_sets(p, "device", dest->name);
+        pa_sink_input_send_event(i, PA_STREAM_EVENT_FORMAT_LOST, p);
         return -PA_ERR_NOTSUPPORTED;
     }