diff --git a/spa/plugins/alsa/alsa-sink.c b/spa/plugins/alsa/alsa-sink.c index b638193c0..7159b63b4 100644 --- a/spa/plugins/alsa/alsa-sink.c +++ b/spa/plugins/alsa/alsa-sink.c @@ -545,7 +545,7 @@ static int impl_node_process_input(struct spa_node *node) input = this->io; spa_return_val_if_fail(input != NULL, SPA_RESULT_WRONG_STATE); - if (input->status == SPA_RESULT_HAVE_BUFFER && input->buffer_id != SPA_ID_INVALID) { + if (input->status == SPA_RESULT_HAVE_BUFFER && input->buffer_id < this->n_buffers) { struct buffer *b = &this->buffers[input->buffer_id]; if (!b->outstanding) { diff --git a/spa/plugins/alsa/alsa-source.c b/spa/plugins/alsa/alsa-source.c index a40b56af2..282316049 100644 --- a/spa/plugins/alsa/alsa-source.c +++ b/spa/plugins/alsa/alsa-source.c @@ -573,7 +573,7 @@ static int impl_node_process_output(struct spa_node *node) if (io->status == SPA_RESULT_HAVE_BUFFER) return SPA_RESULT_HAVE_BUFFER; - if (io->buffer_id != SPA_ID_INVALID) { + if (io->buffer_id < this->n_buffers) { recycle_buffer(this, io->buffer_id); io->buffer_id = SPA_ID_INVALID; } diff --git a/spa/plugins/audiomixer/audiomixer.c b/spa/plugins/audiomixer/audiomixer.c index 14a94c903..bd98ddefb 100644 --- a/spa/plugins/audiomixer/audiomixer.c +++ b/spa/plugins/audiomixer/audiomixer.c @@ -732,11 +732,11 @@ static int impl_node_process_input(struct spa_node *node) struct port *inport = GET_IN_PORT(this, i); struct spa_port_io *inio; - if ((inio = inport->io) == NULL || inport->n_buffers == 0) + if ((inio = inport->io) == NULL) continue; if (inport->queued_bytes == 0 && - inio->status == SPA_RESULT_HAVE_BUFFER && inio->buffer_id != SPA_ID_INVALID) { + inio->status == SPA_RESULT_HAVE_BUFFER && inio->buffer_id < inport->n_buffers) { struct buffer *b = &inport->buffers[inio->buffer_id]; if (!b->outstanding) { @@ -788,7 +788,7 @@ static int impl_node_process_output(struct spa_node *node) return SPA_RESULT_HAVE_BUFFER; /* recycle */ - if (outio->buffer_id != SPA_ID_INVALID) { + if (outio->buffer_id < outport->n_buffers) { recycle_buffer(this, outio->buffer_id); outio->buffer_id = SPA_ID_INVALID; } diff --git a/spa/plugins/audiotestsrc/audiotestsrc.c b/spa/plugins/audiotestsrc/audiotestsrc.c index 2c66777f0..b49ca7acc 100644 --- a/spa/plugins/audiotestsrc/audiotestsrc.c +++ b/spa/plugins/audiotestsrc/audiotestsrc.c @@ -862,7 +862,7 @@ static int impl_node_process_output(struct spa_node *node) if (io->status == SPA_RESULT_HAVE_BUFFER) return SPA_RESULT_HAVE_BUFFER; - if (io->buffer_id != SPA_ID_INVALID) { + if (io->buffer_id < this->n_buffers) { reuse_buffer(this, this->io->buffer_id); this->io->buffer_id = SPA_ID_INVALID; } diff --git a/spa/plugins/test/fakesink.c b/spa/plugins/test/fakesink.c index 5a2e849a6..8d131b4b0 100644 --- a/spa/plugins/test/fakesink.c +++ b/spa/plugins/test/fakesink.c @@ -656,7 +656,7 @@ static int impl_node_process_input(struct spa_node *node) input = this->io; spa_return_val_if_fail(input != NULL, SPA_RESULT_WRONG_STATE); - if (input->status == SPA_RESULT_HAVE_BUFFER && input->buffer_id != SPA_ID_INVALID) { + if (input->status == SPA_RESULT_HAVE_BUFFER && input->buffer_id < this->n_buffers) { struct buffer *b = &this->buffers[input->buffer_id]; if (!b->outstanding) { diff --git a/spa/plugins/test/fakesrc.c b/spa/plugins/test/fakesrc.c index 8ab60f331..b097a1647 100644 --- a/spa/plugins/test/fakesrc.c +++ b/spa/plugins/test/fakesrc.c @@ -711,7 +711,7 @@ static int impl_node_process_output(struct spa_node *node) if (io->status == SPA_RESULT_HAVE_BUFFER) return SPA_RESULT_HAVE_BUFFER; - if (io->buffer_id != SPA_ID_INVALID) { + if (io->buffer_id < this->n_buffers) { reuse_buffer(this, this->io->buffer_id); this->io->buffer_id = SPA_ID_INVALID; } diff --git a/spa/plugins/v4l2/v4l2-source.c b/spa/plugins/v4l2/v4l2-source.c index c0b79fe36..027d84eed 100644 --- a/spa/plugins/v4l2/v4l2-source.c +++ b/spa/plugins/v4l2/v4l2-source.c @@ -816,7 +816,7 @@ static int impl_node_process_output(struct spa_node *node) if (io->status == SPA_RESULT_HAVE_BUFFER) return SPA_RESULT_HAVE_BUFFER; - if (io->buffer_id != SPA_ID_INVALID) { + if (io->buffer_id < this->out_ports[0].n_buffers) { res = spa_v4l2_buffer_recycle(this, io->buffer_id); io->buffer_id = SPA_ID_INVALID; } diff --git a/spa/plugins/videotestsrc/videotestsrc.c b/spa/plugins/videotestsrc/videotestsrc.c index 352a1150c..45b566e9e 100644 --- a/spa/plugins/videotestsrc/videotestsrc.c +++ b/spa/plugins/videotestsrc/videotestsrc.c @@ -806,7 +806,7 @@ static int impl_node_process_output(struct spa_node *node) if (io->status == SPA_RESULT_HAVE_BUFFER) return SPA_RESULT_HAVE_BUFFER; - if (io->buffer_id != SPA_ID_INVALID) { + if (io->buffer_id < this->n_buffers) { reuse_buffer(this, this->io->buffer_id); this->io->buffer_id = SPA_ID_INVALID; } diff --git a/spa/plugins/volume/volume.c b/spa/plugins/volume/volume.c index f29a43095..41fff99d3 100644 --- a/spa/plugins/volume/volume.c +++ b/spa/plugins/volume/volume.c @@ -750,7 +750,7 @@ static int impl_node_process_output(struct spa_node *node) return SPA_RESULT_HAVE_BUFFER; /* recycle */ - if (output->buffer_id != SPA_ID_INVALID) { + if (output->buffer_id < out_port->n_buffers) { recycle_buffer(this, output->buffer_id); output->buffer_id = SPA_ID_INVALID; } diff --git a/src/modules/module-jack/shared.h b/src/modules/module-jack/shared.h index da26c6e1c..6301ed318 100644 --- a/src/modules/module-jack/shared.h +++ b/src/modules/module-jack/shared.h @@ -1000,6 +1000,16 @@ jack_engine_control_reset_rolling_usecs(struct jack_engine_control *ctrl) ctrl->rolling_interval = floor((JACK_ENGINE_ROLLING_INTERVAL * 1000.f) / ctrl->period_usecs); } +static inline uint64_t calc_computation(jack_nframes_t buffer_size) +{ + if (buffer_size < 128) + return 500; + else if (buffer_size < 256) + return 300; + else + return 100; +} + static inline struct jack_engine_control * jack_engine_control_alloc(const char* name) { @@ -1040,9 +1050,8 @@ jack_engine_control_alloc(const char* name) jack_engine_control_reset_rolling_usecs(ctrl); ctrl->CPU_load = 0.f; - ctrl->period = 0; - ctrl->computation = 0; - ctrl->constraint = 0; + ctrl->period = ctrl->constraint = ctrl->period_usecs * 1000; + ctrl->computation = calc_computation(ctrl->buffer_size) * 1000; return ctrl; } diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 3f58ac62e..ce370df16 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -657,7 +657,7 @@ struct spa_format *pw_core_find_format(struct pw_core *core, } else if (in_state == PW_PORT_STATE_CONFIGURE && out_state == PW_PORT_STATE_CONFIGURE) { again: /* both ports need a format */ - pw_log_debug("core %p: finding best format", core); + pw_log_debug("core %p: do enum input %d", core, iidx); if ((res = spa_node_port_enum_formats(input->node->node, input->direction, input->port_id, &filter, NULL, iidx)) < 0) { if (res == SPA_RESULT_ENUM_END && iidx != 0) { @@ -665,7 +665,7 @@ struct spa_format *pw_core_find_format(struct pw_core *core, goto error; } } - pw_log_debug("Try filter: %p", filter); + pw_log_debug("enum output %d with filter: %p", oidx, filter); if (pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG)) spa_debug_format(filter); diff --git a/src/pipewire/link.c b/src/pipewire/link.c index e345f5a91..985639327 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -1115,10 +1115,10 @@ struct pw_link *pw_link_new(struct pw_core *core, spa_list_insert(core->link_list.prev, &this->link); - this->info.output_node_id = output ? output_node->global->id : -1; - this->info.output_port_id = output ? output->port_id : -1; - this->info.input_node_id = input ? input_node->global->id : -1; - this->info.input_port_id = input ? input->port_id : -1; + this->info.output_node_id = output_node->global->id; + this->info.output_port_id = output->port_id; + this->info.input_node_id = input_node->global->id; + this->info.input_port_id = input->port_id; this->info.format = NULL; spa_graph_port_init(&this->rt.out_port, @@ -1135,11 +1135,10 @@ struct pw_link *pw_link_new(struct pw_core *core, this->rt.in_port.callbacks_data = this; this->rt.out_port.callbacks_data = this; - pw_loop_invoke(output_node->data_loop, - do_add_link, + /* nodes can be in different data loops so we do this twice */ + pw_loop_invoke(output_node->data_loop, do_add_link, SPA_ID_INVALID, sizeof(struct pw_port *), &output, false, this); - pw_loop_invoke(input_node->data_loop, - do_add_link, + pw_loop_invoke(input_node->data_loop, do_add_link, SPA_ID_INVALID, sizeof(struct pw_port *), &input, false, this); spa_hook_list_call(&output->listener_list, struct pw_port_events, link_added, this);