mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	module-ffado: separate rt booleans from non-rt
This commit is contained in:
		
							parent
							
								
									bcd2062dcf
								
							
						
					
					
						commit
						d6d08997bb
					
				
					 1 changed files with 44 additions and 36 deletions
				
			
		| 
						 | 
					@ -192,7 +192,10 @@ struct stream {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int ready:1;
 | 
						unsigned int ready:1;
 | 
				
			||||||
	unsigned int running:1;
 | 
						unsigned int running:1;
 | 
				
			||||||
	unsigned int transfered:1;
 | 
					
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							unsigned int transfered:1;
 | 
				
			||||||
 | 
						} rt;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct impl {
 | 
					struct impl {
 | 
				
			||||||
| 
						 | 
					@ -244,8 +247,6 @@ struct impl {
 | 
				
			||||||
	uint32_t output_latency;
 | 
						uint32_t output_latency;
 | 
				
			||||||
	uint32_t quantum_limit;
 | 
						uint32_t quantum_limit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint32_t pw_xrun;
 | 
					 | 
				
			||||||
	uint32_t ffado_xrun;
 | 
					 | 
				
			||||||
	uint32_t frame_time;
 | 
						uint32_t frame_time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int do_disconnect:1;
 | 
						unsigned int do_disconnect:1;
 | 
				
			||||||
| 
						 | 
					@ -254,9 +255,13 @@ struct impl {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pthread_t thread;
 | 
						pthread_t thread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int done:1;
 | 
						struct {
 | 
				
			||||||
	unsigned int triggered:1;
 | 
							unsigned int done:1;
 | 
				
			||||||
	unsigned int new_xrun:1;
 | 
							unsigned int triggered:1;
 | 
				
			||||||
 | 
							unsigned int new_xrun:1;
 | 
				
			||||||
 | 
							uint32_t pw_xrun;
 | 
				
			||||||
 | 
							uint32_t ffado_xrun;
 | 
				
			||||||
 | 
						} rt;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int stop_ffado_device(struct impl *impl);
 | 
					static int stop_ffado_device(struct impl *impl);
 | 
				
			||||||
| 
						 | 
					@ -573,9 +578,9 @@ static void sink_process(void *d, struct spa_io_position *position)
 | 
				
			||||||
	struct impl *impl = s->impl;
 | 
						struct impl *impl = s->impl;
 | 
				
			||||||
	uint32_t i, n_samples = position->clock.duration;
 | 
						uint32_t i, n_samples = position->clock.duration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_trace_fp("process %d", impl->triggered);
 | 
						pw_log_trace_fp("process %d", impl->rt.triggered);
 | 
				
			||||||
	if (impl->mode == MODE_SINK && impl->triggered) {
 | 
						if (impl->mode == MODE_SINK && impl->rt.triggered) {
 | 
				
			||||||
		impl->triggered = false;
 | 
							impl->rt.triggered = false;
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -599,11 +604,11 @@ 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;
 | 
						s->rt.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);
 | 
				
			||||||
		impl->done = true;
 | 
							impl->rt.done = true;
 | 
				
			||||||
		set_timeout(impl, position->clock.nsec);
 | 
							set_timeout(impl, position->clock.nsec);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -619,7 +624,7 @@ static void silence_playback(struct impl *impl)
 | 
				
			||||||
			clear_port_buffer(p, impl->device_options.period_size);
 | 
								clear_port_buffer(p, impl->device_options.period_size);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ffado_streaming_transfer_playback_buffers(impl->dev);
 | 
						ffado_streaming_transfer_playback_buffers(impl->dev);
 | 
				
			||||||
	s->transfered = true;
 | 
						s->rt.transfered = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void source_process(void *d, struct spa_io_position *position)
 | 
					static void source_process(void *d, struct spa_io_position *position)
 | 
				
			||||||
| 
						 | 
					@ -628,21 +633,24 @@ static void source_process(void *d, struct spa_io_position *position)
 | 
				
			||||||
	struct impl *impl = s->impl;
 | 
						struct impl *impl = s->impl;
 | 
				
			||||||
	uint32_t i, n_samples = position->clock.duration;
 | 
						uint32_t i, n_samples = position->clock.duration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_trace_fp("process %d", impl->triggered);
 | 
						pw_log_trace_fp("process %d", impl->rt.triggered);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!impl->triggered) {
 | 
						if (SPA_FLAG_IS_SET(impl->position->clock.flags, SPA_IO_CLOCK_FLAG_XRUN_RECOVER))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!impl->rt.triggered) {
 | 
				
			||||||
		pw_log_trace_fp("done %u", impl->frame_time);
 | 
							pw_log_trace_fp("done %u", impl->frame_time);
 | 
				
			||||||
		impl->done = true;
 | 
							impl->rt.done = true;
 | 
				
			||||||
		if (!impl->sink.transfered)
 | 
							if (!impl->sink.rt.transfered)
 | 
				
			||||||
			silence_playback(impl);
 | 
								silence_playback(impl);
 | 
				
			||||||
		set_timeout(impl, position->clock.nsec);
 | 
							set_timeout(impl, position->clock.nsec);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	impl->triggered = false;
 | 
						impl->rt.triggered = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ffado_streaming_transfer_capture_buffers(impl->dev);
 | 
						ffado_streaming_transfer_capture_buffers(impl->dev);
 | 
				
			||||||
	s->transfered = true;
 | 
						s->rt.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];
 | 
				
			||||||
| 
						 | 
					@ -972,11 +980,11 @@ static void on_ffado_timeout(void *data, uint64_t expirations)
 | 
				
			||||||
	uint64_t nsec;
 | 
						uint64_t nsec;
 | 
				
			||||||
	ffado_wait_response response;
 | 
						ffado_wait_response response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_trace_fp("wakeup %d", impl->done);
 | 
						pw_log_trace_fp("wakeup %d", impl->rt.done);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!impl->done) {
 | 
						if (!impl->rt.done) {
 | 
				
			||||||
		impl->pw_xrun++;
 | 
							impl->rt.pw_xrun++;
 | 
				
			||||||
		impl->new_xrun = true;
 | 
							impl->rt.new_xrun = true;
 | 
				
			||||||
		ffado_streaming_reset(impl->dev);
 | 
							ffado_streaming_reset(impl->dev);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
again:
 | 
					again:
 | 
				
			||||||
| 
						 | 
					@ -989,8 +997,8 @@ again:
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case ffado_wait_xrun:
 | 
						case ffado_wait_xrun:
 | 
				
			||||||
		pw_log_debug("FFADO xrun");
 | 
							pw_log_debug("FFADO xrun");
 | 
				
			||||||
		impl->ffado_xrun++;
 | 
							impl->rt.ffado_xrun++;
 | 
				
			||||||
		impl->new_xrun = true;
 | 
							impl->rt.new_xrun = true;
 | 
				
			||||||
		goto again;
 | 
							goto again;
 | 
				
			||||||
	case ffado_wait_shutdown:
 | 
						case ffado_wait_shutdown:
 | 
				
			||||||
		pw_log_info("FFADO shutdown");
 | 
							pw_log_info("FFADO shutdown");
 | 
				
			||||||
| 
						 | 
					@ -1003,12 +1011,12 @@ 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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	impl->source.transfered = false;
 | 
						impl->source.rt.transfered = false;
 | 
				
			||||||
	impl->sink.transfered = false;
 | 
						impl->sink.rt.transfered = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!source_running) {
 | 
						if (!source_running) {
 | 
				
			||||||
		ffado_streaming_transfer_capture_buffers(impl->dev);
 | 
							ffado_streaming_transfer_capture_buffers(impl->dev);
 | 
				
			||||||
		impl->source.transfered = true;
 | 
							impl->source.rt.transfered = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (!sink_running)
 | 
						if (!sink_running)
 | 
				
			||||||
		silence_playback(impl);
 | 
							silence_playback(impl);
 | 
				
			||||||
| 
						 | 
					@ -1017,10 +1025,10 @@ again:
 | 
				
			||||||
			impl->device_options.period_size, source_running,
 | 
								impl->device_options.period_size, source_running,
 | 
				
			||||||
			sink_running, impl->position, impl->frame_time, nsec);
 | 
								sink_running, impl->position, impl->frame_time, nsec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (impl->new_xrun) {
 | 
						if (impl->rt.new_xrun) {
 | 
				
			||||||
		pw_log_warn("Xrun FFADO:%u PipeWire:%u source:%d sink:%d",
 | 
							pw_log_warn("Xrun FFADO:%u PipeWire:%u source:%d sink:%d",
 | 
				
			||||||
				impl->ffado_xrun, impl->pw_xrun, source_running, sink_running);
 | 
									impl->rt.ffado_xrun, impl->rt.pw_xrun, source_running, sink_running);
 | 
				
			||||||
		impl->new_xrun = false;
 | 
							impl->rt.new_xrun = false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (impl->position) {
 | 
						if (impl->position) {
 | 
				
			||||||
| 
						 | 
					@ -1053,17 +1061,17 @@ again:
 | 
				
			||||||
		c->target_duration = c->duration;
 | 
							c->target_duration = c->duration;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (impl->mode & MODE_SOURCE && source_running) {
 | 
						if (impl->mode & MODE_SOURCE && source_running) {
 | 
				
			||||||
		impl->done = false;
 | 
							impl->rt.done = false;
 | 
				
			||||||
		impl->triggered = true;
 | 
							impl->rt.triggered = true;
 | 
				
			||||||
		set_timeout(impl, nsec + SPA_NSEC_PER_SEC);
 | 
							set_timeout(impl, nsec + SPA_NSEC_PER_SEC);
 | 
				
			||||||
		pw_filter_trigger_process(impl->source.filter);
 | 
							pw_filter_trigger_process(impl->source.filter);
 | 
				
			||||||
	} else if (impl->mode == MODE_SINK && sink_running) {
 | 
						} else if (impl->mode == MODE_SINK && sink_running) {
 | 
				
			||||||
		impl->done = false;
 | 
							impl->rt.done = false;
 | 
				
			||||||
		impl->triggered = true;
 | 
							impl->rt.triggered = true;
 | 
				
			||||||
		set_timeout(impl, nsec + SPA_NSEC_PER_SEC);
 | 
							set_timeout(impl, nsec + SPA_NSEC_PER_SEC);
 | 
				
			||||||
		pw_filter_trigger_process(impl->sink.filter);
 | 
							pw_filter_trigger_process(impl->sink.filter);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		impl->done = true;
 | 
							impl->rt.done = true;
 | 
				
			||||||
		set_timeout(impl, nsec);
 | 
							set_timeout(impl, nsec);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1254,7 +1262,7 @@ static int start_ffado_device(struct impl *impl)
 | 
				
			||||||
	pw_log_info("FFADO started streaming");
 | 
						pw_log_info("FFADO started streaming");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	impl->started = true;
 | 
						impl->started = true;
 | 
				
			||||||
	impl->done = true;
 | 
						impl->rt.done = true;
 | 
				
			||||||
	set_timeout(impl, get_time_ns(impl));
 | 
						set_timeout(impl, get_time_ns(impl));
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue