pulse-server: use EnumFormat as fallback

Use a fixated format and position from EnumFormat as a fallback.
This commit is contained in:
Wim Taymans 2020-10-27 15:42:48 +01:00
parent 124b1221a6
commit 66cf4e68d5
3 changed files with 61 additions and 17 deletions

View file

@ -326,18 +326,19 @@ static int format_parse_param(const struct spa_pod *param, struct sample_spec *s
!SPA_AUDIO_FORMAT_IS_INTERLEAVED(info.info.raw.format)) { !SPA_AUDIO_FORMAT_IS_INTERLEAVED(info.info.raw.format)) {
return -ENOTSUP; return -ENOTSUP;
} }
if (ss) {
ss->format = format_id2pa(info.info.raw.format);
if (ss->format == SAMPLE_INVALID)
return -ENOTSUP;
ss->format = format_id2pa(info.info.raw.format); ss->rate = info.info.raw.rate;
if (ss->format == SAMPLE_INVALID) ss->channels = info.info.raw.channels;
return -ENOTSUP; }
if (map) {
ss->rate = info.info.raw.rate; map->channels = info.info.raw.channels;
ss->channels = info.info.raw.channels; for (i = 0; i < map->channels; i++)
map->map[i] = channel_id2pa(info.info.raw.position[i], &aux);
map->channels = info.info.raw.channels; }
for (i = 0; i < map->channels; i++)
map->map[i] = channel_id2pa(info.info.raw.position[i], &aux);
return 0; return 0;
} }

View file

@ -529,8 +529,6 @@ struct pw_manager *pw_manager_new(struct pw_core *core)
&m->registry_listener, &m->registry_listener,
&registry_events, m); &registry_events, m);
core_sync(m);
return &m->this; return &m->this;
} }
@ -540,6 +538,7 @@ void pw_manager_add_listener(struct pw_manager *manager,
{ {
struct manager *m = SPA_CONTAINER_OF(manager, struct manager, this); struct manager *m = SPA_CONTAINER_OF(manager, struct manager, this);
spa_hook_list_append(&m->hooks, listener, events, data); spa_hook_list_append(&m->hooks, listener, events, data);
core_sync(m);
} }
struct pw_manager_object *pw_manager_find_object(struct pw_manager *manager, struct pw_manager_object *pw_manager_find_object(struct pw_manager *manager,

View file

@ -1067,7 +1067,6 @@ static int reply_create_playback_stream(struct stream *stream)
peer_name = NULL; peer_name = NULL;
peer_suspended = false; peer_suspended = false;
} }
pw_log_info("peer:%p id:%d name:%s", peer, peer_id, peer_name);
if (client->version >= 9) { if (client->version >= 9) {
message_put(reply, message_put(reply,
@ -1179,7 +1178,6 @@ static int reply_create_record_stream(struct stream *stream)
peer_name = NULL; peer_name = NULL;
peer_suspended = false; peer_suspended = false;
} }
pw_log_info("peer:%p id:%d name:%s", peer, peer_id, peer_name);
if (client->version >= 9) { if (client->version >= 9) {
message_put(reply, message_put(reply,
@ -1928,8 +1926,6 @@ static int do_create_record_stream(struct client *client, uint32_t command, uint
if (no_move) if (no_move)
flags |= PW_STREAM_FLAG_DONT_RECONNECT; flags |= PW_STREAM_FLAG_DONT_RECONNECT;
pw_log_info("direct %u", direct_on_input_idx);
if (direct_on_input_idx != SPA_ID_INVALID) { if (direct_on_input_idx != SPA_ID_INVALID) {
source_index = direct_on_input_idx; source_index = direct_on_input_idx;
} else if (source_name != NULL) { } else if (source_name != NULL) {
@ -2917,11 +2913,23 @@ static int fill_sink_info(struct client *client, struct message *m,
spa_list_for_each(p, &o->param_list, link) { spa_list_for_each(p, &o->param_list, link) {
switch (p->id) { switch (p->id) {
case SPA_PARAM_EnumFormat:
{
struct spa_pod *copy = spa_pod_copy(p->param);
spa_pod_fixate(copy);
format_parse_param(copy, &ss, &map);
free(copy);
break;
}
case SPA_PARAM_Format: case SPA_PARAM_Format:
format_parse_param(p->param, &ss, &map); format_parse_param(p->param, &ss, &map);
break; break;
} }
} }
if (ss.channels != map.channels)
ss.channels = map.channels;
if (volume_info.volume.channels != map.channels)
volume_info.volume.channels = map.channels;
message_put(m, message_put(m,
TAG_U32, o->id, /* sink index */ TAG_U32, o->id, /* sink index */
@ -3010,11 +3018,23 @@ static int fill_source_info(struct client *client, struct message *m,
spa_list_for_each(p, &o->param_list, link) { spa_list_for_each(p, &o->param_list, link) {
switch (p->id) { switch (p->id) {
case SPA_PARAM_EnumFormat:
{
struct spa_pod *copy = spa_pod_copy(p->param);
spa_pod_fixate(copy);
format_parse_param(copy, &ss, &map);
free(copy);
break;
}
case SPA_PARAM_Format: case SPA_PARAM_Format:
format_parse_param(p->param, &ss, &map); format_parse_param(p->param, &ss, &map);
break; break;
} }
} }
if (ss.channels != map.channels)
ss.channels = map.channels;
if (volume_info.volume.channels != map.channels)
volume_info.volume.channels = map.channels;
message_put(m, message_put(m,
TAG_U32, is_monitor ? o->id | 0x10000 : o->id, /* source index */ TAG_U32, is_monitor ? o->id | 0x10000 : o->id, /* source index */
@ -3088,6 +3108,14 @@ static int fill_sink_input_info(struct client *client, struct message *m,
spa_list_for_each(p, &o->param_list, link) { spa_list_for_each(p, &o->param_list, link) {
switch (p->id) { switch (p->id) {
case SPA_PARAM_EnumFormat:
{
struct spa_pod *copy = spa_pod_copy(p->param);
spa_pod_fixate(copy);
format_parse_param(copy, &ss, &map);
free(copy);
break;
}
case SPA_PARAM_Format: case SPA_PARAM_Format:
format_parse_param(p->param, &ss, &map); format_parse_param(p->param, &ss, &map);
break; break;
@ -3096,6 +3124,10 @@ static int fill_sink_input_info(struct client *client, struct message *m,
break; break;
} }
} }
if (ss.channels != map.channels)
ss.channels = map.channels;
if (volume_info.volume.channels != map.channels)
volume_info.volume.channels = map.channels;
peer = find_linked(client, o->id, PW_DIRECTION_OUTPUT); peer = find_linked(client, o->id, PW_DIRECTION_OUTPUT);
@ -3164,6 +3196,14 @@ static int fill_source_output_info(struct client *client, struct message *m,
spa_list_for_each(p, &o->param_list, link) { spa_list_for_each(p, &o->param_list, link) {
switch (p->id) { switch (p->id) {
case SPA_PARAM_EnumFormat:
{
struct spa_pod *copy = spa_pod_copy(p->param);
spa_pod_fixate(copy);
format_parse_param(copy, &ss, &map);
free(copy);
break;
}
case SPA_PARAM_Format: case SPA_PARAM_Format:
format_parse_param(p->param, &ss, &map); format_parse_param(p->param, &ss, &map);
break; break;
@ -3172,6 +3212,10 @@ static int fill_source_output_info(struct client *client, struct message *m,
break; break;
} }
} }
if (ss.channels != map.channels)
ss.channels = map.channels;
if (volume_info.volume.channels != map.channels)
volume_info.volume.channels = map.channels;
peer = find_linked(client, o->id, PW_DIRECTION_INPUT); peer = find_linked(client, o->id, PW_DIRECTION_INPUT);
if (peer && is_source_or_monitor(peer)) { if (peer && is_source_or_monitor(peer)) {