pulse-server: set pulse.corked on streams

Set the corked state on streams so that we can use this in sink-input
and source-output info without guessing.

The problem is that when a stream starts un-corked, the state is less
than RUNNING and so before this patch, pulse-server reports a corked
stream, which is not what pulseaudio reports.
This commit is contained in:
Wim Taymans 2024-09-30 15:02:08 +02:00
parent 404817592b
commit 9e932ec671
3 changed files with 28 additions and 4 deletions

View file

@ -1743,6 +1743,8 @@ static int do_create_playback_stream(struct client *client, uint32_t command, ui
stream->is_underrun = true; stream->is_underrun = true;
stream->underrun_for = -1; stream->underrun_for = -1;
pw_properties_set(props, "pulse.corked", corked ? "true" : "false");
if (rate != 0) { if (rate != 0) {
struct spa_fraction lat; struct spa_fraction lat;
fix_playback_buffer_attr(stream, &attr, ss_rate, &lat); fix_playback_buffer_attr(stream, &attr, ss_rate, &lat);
@ -2016,6 +2018,8 @@ static int do_create_record_stream(struct client *client, uint32_t command, uint
if (client->quirks & QUIRK_REMOVE_CAPTURE_DONT_MOVE) if (client->quirks & QUIRK_REMOVE_CAPTURE_DONT_MOVE)
no_move = false; no_move = false;
pw_properties_set(props, "pulse.corked", corked ? "true" : "false");
if (rate != 0) { if (rate != 0) {
struct spa_fraction lat; struct spa_fraction lat;
fix_record_buffer_attr(stream, &attr, ss_rate, &lat); fix_record_buffer_attr(stream, &attr, ss_rate, &lat);
@ -2625,8 +2629,7 @@ static int do_cork_stream(struct client *client, uint32_t command, uint32_t tag,
if (stream == NULL || stream->type == STREAM_TYPE_UPLOAD) if (stream == NULL || stream->type == STREAM_TYPE_UPLOAD)
return -ENOENT; return -ENOENT;
stream->corked = cork; stream_set_corked(stream, cork);
stream_set_paused(stream, cork, "cork request");
if (cork) { if (cork) {
stream->is_underrun = true; stream->is_underrun = true;
} else { } else {
@ -4012,6 +4015,7 @@ static int fill_sink_input_info(struct client *client, struct message *m,
uint32_t module_id = SPA_ID_INVALID, client_id = SPA_ID_INVALID; uint32_t module_id = SPA_ID_INVALID, client_id = SPA_ID_INVALID;
uint32_t peer_index; uint32_t peer_index;
struct device_info dev_info; struct device_info dev_info;
bool corked;
if (!pw_manager_object_is_sink_input(o) || info == NULL || info->props == NULL) if (!pw_manager_object_is_sink_input(o) || info == NULL || info->props == NULL)
return -ENOENT; return -ENOENT;
@ -4039,6 +4043,10 @@ static int fill_sink_input_info(struct client *client, struct message *m,
else else
peer_index = SPA_ID_INVALID; peer_index = SPA_ID_INVALID;
} }
if ((str = spa_dict_lookup(info->props, "pulse.corked")) != NULL)
corked = spa_atob(str);
else
corked = dev_info.state != STATE_RUNNING;
message_put(m, message_put(m,
TAG_U32, o->index, /* sink_input index */ TAG_U32, o->index, /* sink_input index */
@ -4064,7 +4072,7 @@ static int fill_sink_input_info(struct client *client, struct message *m,
TAG_INVALID); TAG_INVALID);
if (client->version >= 19) if (client->version >= 19)
message_put(m, message_put(m,
TAG_BOOLEAN, dev_info.state != STATE_RUNNING, /* corked */ TAG_BOOLEAN, corked, /* corked */
TAG_INVALID); TAG_INVALID);
if (client->version >= 20) if (client->version >= 20)
message_put(m, message_put(m,
@ -4091,6 +4099,7 @@ static int fill_source_output_info(struct client *client, struct message *m,
uint32_t module_id = SPA_ID_INVALID, client_id = SPA_ID_INVALID; uint32_t module_id = SPA_ID_INVALID, client_id = SPA_ID_INVALID;
uint32_t peer_index; uint32_t peer_index;
struct device_info dev_info; struct device_info dev_info;
bool corked;
if (!pw_manager_object_is_source_output(o) || info == NULL || info->props == NULL) if (!pw_manager_object_is_source_output(o) || info == NULL || info->props == NULL)
return -ENOENT; return -ENOENT;
@ -4118,6 +4127,10 @@ static int fill_source_output_info(struct client *client, struct message *m,
else else
peer_index = SPA_ID_INVALID; peer_index = SPA_ID_INVALID;
} }
if ((str = spa_dict_lookup(info->props, "pulse.corked")) != NULL)
corked = spa_atob(str);
else
corked = dev_info.state != STATE_RUNNING;
message_put(m, message_put(m,
TAG_U32, o->index, /* source_output index */ TAG_U32, o->index, /* source_output index */
@ -4138,7 +4151,7 @@ static int fill_source_output_info(struct client *client, struct message *m,
TAG_INVALID); TAG_INVALID);
if (client->version >= 19) if (client->version >= 19)
message_put(m, message_put(m,
TAG_BOOLEAN, dev_info.state != STATE_RUNNING, /* corked */ TAG_BOOLEAN, corked, /* corked */
TAG_INVALID); TAG_INVALID);
if (client->version >= 22) { if (client->version >= 22) {
struct format_info fi; struct format_info fi;

View file

@ -211,6 +211,16 @@ void stream_set_paused(struct stream *stream, bool paused, const char *reason)
pw_stream_set_active(stream->stream, !paused); pw_stream_set_active(stream->stream, !paused);
} }
void stream_set_corked(struct stream *stream, bool cork)
{
stream->corked = cork;
pw_log_info("cork %d", cork);
pw_stream_update_properties(stream->stream,
&SPA_DICT_ITEMS(
SPA_DICT_ITEM("pulse.corked", cork ? "true" : "false")));
stream_set_paused(stream, cork, "cork request");
}
int stream_send_underflow(struct stream *stream, int64_t offset) int stream_send_underflow(struct stream *stream, int64_t offset)
{ {
struct client *client = stream->client; struct client *client = stream->client;

View file

@ -107,6 +107,7 @@ void stream_free(struct stream *stream);
void stream_flush(struct stream *stream); void stream_flush(struct stream *stream);
uint32_t stream_pop_missing(struct stream *stream); uint32_t stream_pop_missing(struct stream *stream);
void stream_set_corked(struct stream *stream, bool corked);
void stream_set_paused(struct stream *stream, bool paused, const char *reason); void stream_set_paused(struct stream *stream, bool paused, const char *reason);
int stream_send_underflow(struct stream *stream, int64_t offset); int stream_send_underflow(struct stream *stream, int64_t offset);