mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
netjack2: keep per stream io_position
And handle the trigger failure with a warning and fallback.
This commit is contained in:
parent
3d6e77e96d
commit
40dbc5f00f
1 changed files with 14 additions and 7 deletions
|
|
@ -183,6 +183,8 @@ struct stream {
|
||||||
struct pw_filter *filter;
|
struct pw_filter *filter;
|
||||||
struct spa_hook listener;
|
struct spa_hook listener;
|
||||||
|
|
||||||
|
struct spa_io_position *position;
|
||||||
|
|
||||||
struct spa_audio_info_raw info;
|
struct spa_audio_info_raw info;
|
||||||
|
|
||||||
uint32_t n_midi;
|
uint32_t n_midi;
|
||||||
|
|
@ -202,8 +204,6 @@ struct follower {
|
||||||
struct spa_list link;
|
struct spa_list link;
|
||||||
struct impl *impl;
|
struct impl *impl;
|
||||||
|
|
||||||
struct spa_io_position *position;
|
|
||||||
|
|
||||||
struct stream source;
|
struct stream source;
|
||||||
struct stream sink;
|
struct stream sink;
|
||||||
|
|
||||||
|
|
@ -354,9 +354,8 @@ static void sink_process(void *d, struct spa_io_position *position)
|
||||||
pw_loop_update_io(s->impl->data_loop, follower->socket, SPA_IO_IN);
|
pw_loop_update_io(s->impl->data_loop, follower->socket, SPA_IO_IN);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void source_process(void *d, struct spa_io_position *position)
|
static inline void handle_source_process(struct stream *s, struct spa_io_position *position)
|
||||||
{
|
{
|
||||||
struct stream *s = d;
|
|
||||||
struct follower *follower = s->follower;
|
struct follower *follower = s->follower;
|
||||||
uint32_t nframes = position->clock.duration;
|
uint32_t nframes = position->clock.duration;
|
||||||
struct data_info midi[s->n_ports];
|
struct data_info midi[s->n_ports];
|
||||||
|
|
@ -369,6 +368,12 @@ static void source_process(void *d, struct spa_io_position *position)
|
||||||
netjack2_recv_data(&follower->peer, midi, n_midi, audio, n_audio);
|
netjack2_recv_data(&follower->peer, midi, n_midi, audio, n_audio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void source_process(void *d, struct spa_io_position *position)
|
||||||
|
{
|
||||||
|
struct stream *s = d;
|
||||||
|
handle_source_process(s, position);
|
||||||
|
}
|
||||||
|
|
||||||
static void follower_free(struct follower *follower)
|
static void follower_free(struct follower *follower)
|
||||||
{
|
{
|
||||||
struct impl *impl = follower->impl;
|
struct impl *impl = follower->impl;
|
||||||
|
|
@ -473,18 +478,20 @@ on_data_io(void *data, int fd, uint32_t mask)
|
||||||
if (mask & SPA_IO_IN) {
|
if (mask & SPA_IO_IN) {
|
||||||
pw_loop_update_io(impl->data_loop, follower->socket, 0);
|
pw_loop_update_io(impl->data_loop, follower->socket, 0);
|
||||||
|
|
||||||
pw_filter_trigger_process(follower->source.filter);
|
if (pw_filter_trigger_process(follower->source.filter) < 0) {
|
||||||
|
pw_log_warn("source not ready");
|
||||||
|
handle_source_process(&follower->source, follower->source.position);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stream_io_changed(void *data, void *port_data, uint32_t id, void *area, uint32_t size)
|
static void stream_io_changed(void *data, void *port_data, uint32_t id, void *area, uint32_t size)
|
||||||
{
|
{
|
||||||
struct stream *s = data;
|
struct stream *s = data;
|
||||||
struct follower *follower = s->follower;
|
|
||||||
if (port_data == NULL) {
|
if (port_data == NULL) {
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case SPA_IO_Position:
|
case SPA_IO_Position:
|
||||||
follower->position = area;
|
s->position = area;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue