Fixed pipewire stream stopping after a few seconds

With the latest version of pipewire, the process callback is no longer automatically called. Instead, you should call pw_stream_trigger_process() when frames are ready, to have the processing callback happen.

Since the only processing we're doing is requesting a buffer, I'm calling that directly from the callback, since that is thread-safe for a single reader.
This commit is contained in:
Sam Lantinga 2022-02-03 14:10:43 -08:00 committed by Joshie
parent b4cf9d3203
commit ab4684078c
2 changed files with 5 additions and 18 deletions

View file

@ -50,7 +50,6 @@ static void request_buffer(struct pipewire_state *state)
struct pw_buffer *pw_buffer = pw_stream_dequeue_buffer(state->stream);
if (!pw_buffer) {
pwr_log.errorf("warning: out of buffers");
state->needs_buffer = true;
return;
}
@ -136,10 +135,6 @@ static void dispatch_nudge(struct pipewire_state *state, int fd)
} else {
destroy_buffer(buffer);
}
if (state->streaming) {
request_buffer(state);
}
}
}
@ -159,7 +154,6 @@ static void stream_handle_state_changed(void *data, enum pw_stream_state old_str
break;
case PW_STREAM_STATE_STREAMING:
state->streaming = true;
request_buffer(state);
break;
case PW_STREAM_STATE_ERROR:
case PW_STREAM_STATE_UNCONNECTED:
@ -215,16 +209,6 @@ static void stream_handle_param_changed(void *data, uint32_t id, const struct sp
}
}
static void stream_handle_process(void *data)
{
struct pipewire_state *state = (struct pipewire_state *) data;
if (state->needs_buffer) {
state->needs_buffer = false;
request_buffer(state);
}
}
static void randname(char *buf)
{
struct timespec ts;
@ -322,7 +306,7 @@ static const struct pw_stream_events stream_events = {
.param_changed = stream_handle_param_changed,
.add_buffer = stream_handle_add_buffer,
.remove_buffer = stream_handle_remove_buffer,
.process = stream_handle_process,
.process = nullptr,
};
enum event_type {
@ -456,6 +440,10 @@ uint32_t get_pipewire_stream_node_id(void)
struct pipewire_buffer *dequeue_pipewire_buffer(void)
{
struct pipewire_state *state = &pipewire_state;
if (state->streaming) {
request_buffer(state);
}
return out_buffer.exchange(nullptr);
}

View file

@ -15,7 +15,6 @@ struct pipewire_state {
struct pw_stream *stream;
uint32_t stream_node_id;
bool streaming;
bool needs_buffer;
struct spa_video_info_raw video_info;
int stride;
uint64_t seq;