stream: fix connect by name

Look up the node id for the given device name and use that to connect.
This commit is contained in:
Wim Taymans 2018-09-21 16:46:51 +02:00
parent 6df567e6d4
commit 520a9831e7
3 changed files with 12 additions and 3 deletions

View file

@ -261,6 +261,7 @@ struct pa_context {
}; };
struct global *pa_context_find_global(pa_context *c, uint32_t id); struct global *pa_context_find_global(pa_context *c, uint32_t id);
struct global *pa_context_find_global_by_name(pa_context *c, uint32_t mask, const char *name);
#define MAX_BUFFERS 64 #define MAX_BUFFERS 64
#define MASK_BUFFERS (MAX_BUFFERS-1) #define MASK_BUFFERS (MAX_BUFFERS-1)

View file

@ -157,6 +157,7 @@ static void sink_callback(struct sink_data *d)
ii[0].encoding = PA_ENCODING_PCM; ii[0].encoding = PA_ENCODING_PCM;
ii[0].plist = pa_proplist_new(); ii[0].plist = pa_proplist_new();
ip[0] = ii; ip[0] = ii;
pa_channel_map_init_auto(&i.channel_map, 2, PA_CHANNEL_MAP_DEFAULT);
i.formats = ip; i.formats = ip;
d->cb(d->context, &i, 0, d->userdata); d->cb(d->context, &i, 0, d->userdata);
} }
@ -169,7 +170,7 @@ static void sink_info(pa_operation *o, void *userdata)
pa_operation_done(o); pa_operation_done(o);
} }
static struct global *find_type_by_name(pa_context *c, uint32_t mask, const char *name) struct global *pa_context_find_global_by_name(pa_context *c, uint32_t mask, const char *name)
{ {
struct global *g; struct global *g;
const char *str; const char *str;
@ -200,7 +201,7 @@ pa_operation* pa_context_get_sink_info_by_name(pa_context *c, const char *name,
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE); PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID); PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
if ((g = find_type_by_name(c, PA_SUBSCRIPTION_MASK_SINK, name)) == NULL) if ((g = pa_context_find_global_by_name(c, PA_SUBSCRIPTION_MASK_SINK, name)) == NULL)
return NULL; return NULL;
ensure_global(c, g); ensure_global(c, g);

View file

@ -178,6 +178,7 @@ static void dump_buffer_attr(pa_stream *s, pa_buffer_attr *attr)
static void configure_buffers(pa_stream *s) static void configure_buffers(pa_stream *s)
{ {
s->buffer_attr.maxlength = s->maxsize; s->buffer_attr.maxlength = s->maxsize;
if (s->buffer_attr.prebuf == -1)
s->buffer_attr.prebuf = s->buffer_attr.minreq; s->buffer_attr.prebuf = s->buffer_attr.minreq;
s->buffer_attr.fragsize = s->buffer_attr.minreq; s->buffer_attr.fragsize = s->buffer_attr.minreq;
dump_buffer_attr(s, &s->buffer_attr); dump_buffer_attr(s, &s->buffer_attr);
@ -772,6 +773,8 @@ static int create_stream(pa_stream_direction_t direction,
struct pw_properties *props; struct pw_properties *props;
uint32_t sample_rate = 0, stride = 0; uint32_t sample_rate = 0, stride = 0;
const char *str; const char *str;
char devid[16];
struct global *g;
spa_assert(s); spa_assert(s);
spa_assert(s->refcount >= 1); spa_assert(s->refcount >= 1);
@ -831,6 +834,10 @@ static int create_stream(pa_stream_direction_t direction,
if (dev == NULL) if (dev == NULL)
dev = getenv("PIPEWIRE_NODE"); dev = getenv("PIPEWIRE_NODE");
else if ((g = pa_context_find_global_by_name(s->context, PA_SUBSCRIPTION_MASK_SINK, dev)) != NULL) {
snprintf(devid, 15, "%d", g->id);
dev = devid;
}
props = (struct pw_properties *) pw_stream_get_properties(s->stream); props = (struct pw_properties *) pw_stream_get_properties(s->stream);
pw_properties_setf(props, "node.latency", "%u/%u", pw_properties_setf(props, "node.latency", "%u/%u",