mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	sink-input: Provide more information to client when format is lost
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.
This commit is contained in:
		
							parent
							
								
									d1f13fa781
								
							
						
					
					
						commit
						62f56a9f6b
					
				
					 2 changed files with 13 additions and 1 deletions
				
			
		| 
						 | 
					@ -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)
 | 
					    if (s->state != PA_STREAM_READY)
 | 
				
			||||||
        goto finish;
 | 
					        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)
 | 
					    if (s->event_callback)
 | 
				
			||||||
        s->event_callback(s, event, pl, s->event_userdata);
 | 
					        s->event_callback(s, event, pl, s->event_userdata);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
					        return -PA_ERR_NOTSUPPORTED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pa_sink_input_is_passthrough(i) && !pa_sink_check_format(dest, i->format)) {
 | 
					    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_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;
 | 
					        return -PA_ERR_NOTSUPPORTED;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue