mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -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 spa_hook listener;
|
||||
|
||||
struct spa_io_position *position;
|
||||
|
||||
struct spa_audio_info_raw info;
|
||||
|
||||
uint32_t n_midi;
|
||||
|
|
@ -202,8 +204,6 @@ struct follower {
|
|||
struct spa_list link;
|
||||
struct impl *impl;
|
||||
|
||||
struct spa_io_position *position;
|
||||
|
||||
struct stream source;
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
uint32_t nframes = position->clock.duration;
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
struct impl *impl = follower->impl;
|
||||
|
|
@ -473,18 +478,20 @@ on_data_io(void *data, int fd, uint32_t mask)
|
|||
if (mask & SPA_IO_IN) {
|
||||
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)
|
||||
{
|
||||
struct stream *s = data;
|
||||
struct follower *follower = s->follower;
|
||||
if (port_data == NULL) {
|
||||
switch (id) {
|
||||
case SPA_IO_Position:
|
||||
follower->position = area;
|
||||
s->position = area;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue