mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
parent
e871b761fe
commit
498b4bd080
2 changed files with 55 additions and 9 deletions
|
|
@ -134,13 +134,18 @@ struct impl {
|
||||||
|
|
||||||
static int probe_device(struct device *device);
|
static int probe_device(struct device *device);
|
||||||
|
|
||||||
static struct node *alsa_find_node(struct device *device, uint32_t id)
|
static struct node *alsa_find_node(struct device *device, uint32_t id, const char *name)
|
||||||
{
|
{
|
||||||
struct node *node;
|
struct node *node;
|
||||||
|
const char *str;
|
||||||
|
|
||||||
spa_list_for_each(node, &device->node_list, link) {
|
spa_list_for_each(node, &device->node_list, link) {
|
||||||
if (node->id == id)
|
if (node->id == id)
|
||||||
return node;
|
return node;
|
||||||
|
if (name != NULL &&
|
||||||
|
(str = pw_properties_get(node->props, PW_KEY_NODE_NAME)) != NULL &&
|
||||||
|
strcmp(name, str) == 0)
|
||||||
|
return node;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -474,7 +479,7 @@ static void alsa_device_object_info(void *data, uint32_t id,
|
||||||
struct device *device = data;
|
struct device *device = data;
|
||||||
struct node *node;
|
struct node *node;
|
||||||
|
|
||||||
node = alsa_find_node(device, id);
|
node = alsa_find_node(device, id, NULL);
|
||||||
|
|
||||||
if (info == NULL) {
|
if (info == NULL) {
|
||||||
if (node == NULL) {
|
if (node == NULL) {
|
||||||
|
|
@ -502,7 +507,7 @@ static void alsa_device_event(void *data, const struct spa_event *event)
|
||||||
SPA_EVENT_DEVICE_Props, SPA_POD_OPT_Pod(&props)) < 0)
|
SPA_EVENT_DEVICE_Props, SPA_POD_OPT_Pod(&props)) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((node = alsa_find_node(device, id)) == NULL)
|
if ((node = alsa_find_node(device, id, NULL)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
|
@ -523,13 +528,18 @@ static const struct spa_device_events alsa_device_events = {
|
||||||
.event = alsa_device_event,
|
.event = alsa_device_event,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct device *alsa_find_device(struct impl *impl, uint32_t id)
|
static struct device *alsa_find_device(struct impl *impl, uint32_t id, const char *name)
|
||||||
{
|
{
|
||||||
struct device *device;
|
struct device *device;
|
||||||
|
const char *str;
|
||||||
|
|
||||||
spa_list_for_each(device, &impl->device_list, link) {
|
spa_list_for_each(device, &impl->device_list, link) {
|
||||||
if (device->id == id)
|
if (device->id == id)
|
||||||
return device;
|
return device;
|
||||||
|
if (name != NULL &&
|
||||||
|
(str = pw_properties_get(device->props, PW_KEY_DEVICE_NAME)) != NULL &&
|
||||||
|
strcmp(str, name) == 0)
|
||||||
|
return device;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -550,6 +560,7 @@ static int update_device_props(struct device *device)
|
||||||
struct pw_properties *p = device->props;
|
struct pw_properties *p = device->props;
|
||||||
const char *s, *d;
|
const char *s, *d;
|
||||||
char temp[32];
|
char temp[32];
|
||||||
|
int i;
|
||||||
|
|
||||||
s = pw_properties_get(p, SPA_KEY_DEVICE_NAME);
|
s = pw_properties_get(p, SPA_KEY_DEVICE_NAME);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
|
|
@ -562,6 +573,18 @@ static int update_device_props(struct device *device)
|
||||||
}
|
}
|
||||||
pw_properties_setf(p, PW_KEY_DEVICE_NAME, "alsa_card.%s", s);
|
pw_properties_setf(p, PW_KEY_DEVICE_NAME, "alsa_card.%s", s);
|
||||||
|
|
||||||
|
for (i = 2; i <= 99; i++) {
|
||||||
|
if ((d = pw_properties_get(p, PW_KEY_DEVICE_NAME)) == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (alsa_find_device(device->impl, SPA_ID_INVALID, d) == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
pw_properties_setf(p, PW_KEY_DEVICE_NAME, "alsa_card.%s.%d", s, i);
|
||||||
|
}
|
||||||
|
if (i == 99)
|
||||||
|
return -EEXIST;
|
||||||
|
|
||||||
if (pw_properties_get(p, PW_KEY_DEVICE_DESCRIPTION) == NULL) {
|
if (pw_properties_get(p, PW_KEY_DEVICE_DESCRIPTION) == NULL) {
|
||||||
d = NULL;
|
d = NULL;
|
||||||
|
|
||||||
|
|
@ -985,7 +1008,7 @@ static void alsa_udev_object_info(void *data, uint32_t id,
|
||||||
struct impl *impl = data;
|
struct impl *impl = data;
|
||||||
struct device *device;
|
struct device *device;
|
||||||
|
|
||||||
device = alsa_find_device(impl, id);
|
device = alsa_find_device(impl, id, NULL);
|
||||||
|
|
||||||
if (info == NULL) {
|
if (info == NULL) {
|
||||||
if (device == NULL)
|
if (device == NULL)
|
||||||
|
|
|
||||||
|
|
@ -90,13 +90,18 @@ struct impl {
|
||||||
struct spa_list device_list;
|
struct spa_list device_list;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct node *v4l2_find_node(struct device *dev, uint32_t id)
|
static struct node *v4l2_find_node(struct device *dev, uint32_t id, const char *name)
|
||||||
{
|
{
|
||||||
struct node *node;
|
struct node *node;
|
||||||
|
const char *str;
|
||||||
|
|
||||||
spa_list_for_each(node, &dev->node_list, link) {
|
spa_list_for_each(node, &dev->node_list, link) {
|
||||||
if (node->id == id)
|
if (node->id == id)
|
||||||
return node;
|
return node;
|
||||||
|
if (name != NULL &&
|
||||||
|
(str = pw_properties_get(node->props, PW_KEY_NODE_NAME)) != NULL &&
|
||||||
|
strcmp(name, str) == 0)
|
||||||
|
return node;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -203,7 +208,7 @@ static void v4l2_device_object_info(void *data, uint32_t id,
|
||||||
struct device *dev = data;
|
struct device *dev = data;
|
||||||
struct node *node;
|
struct node *node;
|
||||||
|
|
||||||
node = v4l2_find_node(dev, id);
|
node = v4l2_find_node(dev, id, NULL);
|
||||||
|
|
||||||
if (info == NULL) {
|
if (info == NULL) {
|
||||||
if (node == NULL) {
|
if (node == NULL) {
|
||||||
|
|
@ -224,13 +229,18 @@ static const struct spa_device_events v4l2_device_events = {
|
||||||
.object_info = v4l2_device_object_info
|
.object_info = v4l2_device_object_info
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct device *v4l2_find_device(struct impl *impl, uint32_t id)
|
static struct device *v4l2_find_device(struct impl *impl, uint32_t id, const char *name)
|
||||||
{
|
{
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
const char *str;
|
||||||
|
|
||||||
spa_list_for_each(dev, &impl->device_list, link) {
|
spa_list_for_each(dev, &impl->device_list, link) {
|
||||||
if (dev->id == id)
|
if (dev->id == id)
|
||||||
return dev;
|
return dev;
|
||||||
|
if (name != NULL &&
|
||||||
|
(str = pw_properties_get(dev->props, PW_KEY_DEVICE_NAME)) != NULL &&
|
||||||
|
strcmp(str, name) == 0)
|
||||||
|
return dev;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -251,6 +261,7 @@ static int v4l2_update_device_props(struct device *dev)
|
||||||
struct pw_properties *p = dev->props;
|
struct pw_properties *p = dev->props;
|
||||||
const char *s, *d;
|
const char *s, *d;
|
||||||
char temp[32];
|
char temp[32];
|
||||||
|
int i;
|
||||||
|
|
||||||
if ((s = pw_properties_get(p, SPA_KEY_DEVICE_NAME)) == NULL) {
|
if ((s = pw_properties_get(p, SPA_KEY_DEVICE_NAME)) == NULL) {
|
||||||
if ((s = pw_properties_get(p, SPA_KEY_DEVICE_BUS_ID)) == NULL) {
|
if ((s = pw_properties_get(p, SPA_KEY_DEVICE_BUS_ID)) == NULL) {
|
||||||
|
|
@ -262,6 +273,18 @@ static int v4l2_update_device_props(struct device *dev)
|
||||||
}
|
}
|
||||||
pw_properties_setf(p, PW_KEY_DEVICE_NAME, "v4l2_device.%s", s);
|
pw_properties_setf(p, PW_KEY_DEVICE_NAME, "v4l2_device.%s", s);
|
||||||
|
|
||||||
|
for (i = 2; i <= 99; i++) {
|
||||||
|
if ((d = pw_properties_get(p, PW_KEY_DEVICE_NAME)) == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (v4l2_find_device(dev->impl, SPA_ID_INVALID, d) == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
pw_properties_setf(p, PW_KEY_DEVICE_NAME, "v4l2_device.%s.%d", s, i);
|
||||||
|
}
|
||||||
|
if (i == 99)
|
||||||
|
return -EEXIST;
|
||||||
|
|
||||||
if (pw_properties_get(p, PW_KEY_DEVICE_DESCRIPTION) == NULL) {
|
if (pw_properties_get(p, PW_KEY_DEVICE_DESCRIPTION) == NULL) {
|
||||||
d = pw_properties_get(p, PW_KEY_DEVICE_PRODUCT_NAME);
|
d = pw_properties_get(p, PW_KEY_DEVICE_PRODUCT_NAME);
|
||||||
if (!d)
|
if (!d)
|
||||||
|
|
@ -425,7 +448,7 @@ static void v4l2_udev_object_info(void *data, uint32_t id,
|
||||||
struct impl *impl = data;
|
struct impl *impl = data;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
|
||||||
dev = v4l2_find_device(impl, id);
|
dev = v4l2_find_device(impl, id, NULL);
|
||||||
|
|
||||||
if (info == NULL) {
|
if (info == NULL) {
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue