mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	module-ffado: keep track of transfered data
When for some reason we don't manage to transfer data from the source or to the sink (timeout, scheduling problems..), try to do it when we get a timeout to avoid xruns.
This commit is contained in:
		
							parent
							
								
									1deffe757c
								
							
						
					
					
						commit
						1e9a557c06
					
				
					 1 changed files with 12 additions and 1 deletions
				
			
		| 
						 | 
					@ -192,6 +192,7 @@ struct stream {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int ready:1;
 | 
						unsigned int ready:1;
 | 
				
			||||||
	unsigned int running:1;
 | 
						unsigned int running:1;
 | 
				
			||||||
 | 
						unsigned int transfered:1;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct impl {
 | 
					struct impl {
 | 
				
			||||||
| 
						 | 
					@ -598,6 +599,7 @@ static void sink_process(void *d, struct spa_io_position *position)
 | 
				
			||||||
		p->cleared = false;
 | 
							p->cleared = false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ffado_streaming_transfer_playback_buffers(impl->dev);
 | 
						ffado_streaming_transfer_playback_buffers(impl->dev);
 | 
				
			||||||
 | 
						s->transfered = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (impl->mode == MODE_SINK) {
 | 
						if (impl->mode == MODE_SINK) {
 | 
				
			||||||
		pw_log_trace_fp("done %u", impl->frame_time);
 | 
							pw_log_trace_fp("done %u", impl->frame_time);
 | 
				
			||||||
| 
						 | 
					@ -617,6 +619,7 @@ static void silence_playback(struct impl *impl)
 | 
				
			||||||
			clear_port_buffer(p, impl->period_size);
 | 
								clear_port_buffer(p, impl->period_size);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ffado_streaming_transfer_playback_buffers(impl->dev);
 | 
						ffado_streaming_transfer_playback_buffers(impl->dev);
 | 
				
			||||||
 | 
						s->transfered = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void source_process(void *d, struct spa_io_position *position)
 | 
					static void source_process(void *d, struct spa_io_position *position)
 | 
				
			||||||
| 
						 | 
					@ -630,6 +633,8 @@ static void source_process(void *d, struct spa_io_position *position)
 | 
				
			||||||
	if (!impl->triggered) {
 | 
						if (!impl->triggered) {
 | 
				
			||||||
		pw_log_trace_fp("done %u", impl->frame_time);
 | 
							pw_log_trace_fp("done %u", impl->frame_time);
 | 
				
			||||||
		impl->done = true;
 | 
							impl->done = true;
 | 
				
			||||||
 | 
							if (!impl->sink.transfered)
 | 
				
			||||||
 | 
								silence_playback(impl);
 | 
				
			||||||
		set_timeout(impl, position->clock.nsec);
 | 
							set_timeout(impl, position->clock.nsec);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -637,6 +642,7 @@ static void source_process(void *d, struct spa_io_position *position)
 | 
				
			||||||
	impl->triggered = false;
 | 
						impl->triggered = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ffado_streaming_transfer_capture_buffers(impl->dev);
 | 
						ffado_streaming_transfer_capture_buffers(impl->dev);
 | 
				
			||||||
 | 
						s->transfered = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < s->n_ports; i++) {
 | 
						for (i = 0; i < s->n_ports; i++) {
 | 
				
			||||||
		struct port *p = s->ports[i];
 | 
							struct port *p = s->ports[i];
 | 
				
			||||||
| 
						 | 
					@ -975,8 +981,13 @@ again:
 | 
				
			||||||
	source_running = impl->source.running && impl->sink.ready;
 | 
						source_running = impl->source.running && impl->sink.ready;
 | 
				
			||||||
	sink_running = impl->sink.running && impl->source.ready;
 | 
						sink_running = impl->sink.running && impl->source.ready;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!source_running)
 | 
						impl->source.transfered = false;
 | 
				
			||||||
 | 
						impl->sink.transfered = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!source_running) {
 | 
				
			||||||
		ffado_streaming_transfer_capture_buffers(impl->dev);
 | 
							ffado_streaming_transfer_capture_buffers(impl->dev);
 | 
				
			||||||
 | 
							impl->source.transfered = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if (!sink_running)
 | 
						if (!sink_running)
 | 
				
			||||||
		silence_playback(impl);
 | 
							silence_playback(impl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue