pw-cat: also list additional targets in record mode

Also list the sink and output stream nodes because we can also record
from them.

Fixes #1952
This commit is contained in:
Wim Taymans 2022-01-03 16:57:28 +01:00
parent effa0ca124
commit 2f4c589d5b

View file

@ -90,6 +90,10 @@ typedef int (*fill_fn)(struct data *d, void *dest, unsigned int n_frames);
struct target { struct target {
struct spa_list link; struct spa_list link;
uint32_t id; uint32_t id;
#define TARGET_TYPE_SINK 0
#define TARGET_TYPE_SOURCE 1
#define TARGET_TYPE_STREAM 2
uint32_t type;
char *name; char *name;
char *desc; char *desc;
int prio; int prio;
@ -619,7 +623,7 @@ target_destroy(struct target *target)
} }
static struct target * static struct target *
target_create(uint32_t id, const char *name, const char *desc, int prio) target_create(uint32_t id, uint32_t type, const char *name, const char *desc, int prio)
{ {
struct target *target; struct target *target;
@ -627,6 +631,7 @@ target_create(uint32_t id, const char *name, const char *desc, int prio)
if (!target) if (!target)
return NULL; return NULL;
target->id = id; target->id = id;
target->type = type;
target->name = strdup(name); target->name = strdup(name);
target->desc = strdup(desc ? : ""); target->desc = strdup(desc ? : "");
target->prio = prio; target->prio = prio;
@ -737,8 +742,8 @@ static void registry_event_global(void *userdata, uint32_t id,
const struct spa_dict_item *item; const struct spa_dict_item *item;
const char *name, *desc, *media_class, *prio_session; const char *name, *desc, *media_class, *prio_session;
int prio; int prio;
enum mode mode = mode_none;
struct target *target; struct target *target;
uint32_t ttype;
/* only once */ /* only once */
if (data->targets_listed) if (data->targets_listed)
@ -773,15 +778,27 @@ static void registry_event_global(void *userdata, uint32_t id,
if (!name || !media_class) if (!name || !media_class)
return; return;
/* get allowed mode from the media class */ if (desc == NULL)
/* TODO extend to something else besides Audio/Source|Sink */ desc = name;
if (spa_streq(media_class, "Audio/Source"))
mode = mode_record;
else if (spa_streq(media_class, "Audio/Sink"))
mode = mode_playback;
/* modes must match */ /* get allowed mode from the media class */
if (mode != data->mode) if (spa_streq(media_class, "Audio/Source")) {
if (data->mode != mode_record)
return;
ttype = TARGET_TYPE_SOURCE;
}
else if (spa_streq(media_class, "Stream/Output/Audio")) {
if (data->mode != mode_record)
return;
ttype = TARGET_TYPE_STREAM;
}
else if (spa_streq(media_class, "Audio/Sink")) {
if (data->mode != mode_playback &&
data->mode != mode_record)
return;
ttype = TARGET_TYPE_SINK;
}
else
return; return;
prio = prio_session ? atoi(prio_session) : -1; prio = prio_session ? atoi(prio_session) : -1;
@ -795,7 +812,7 @@ static void registry_event_global(void *userdata, uint32_t id,
} }
} }
target = target_create(id, name, desc, prio); target = target_create(id, ttype, name, desc, prio);
if (target) if (target)
spa_list_append(&data->targets, &target->link); spa_list_append(&data->targets, &target->link);
} }
@ -1880,7 +1897,23 @@ int main(int argc, char *argv[])
} }
printf("Available targets (\"*\" denotes default): %s\n", default_name); printf("Available targets (\"*\" denotes default): %s\n", default_name);
spa_list_for_each(target, &data.targets, link) { spa_list_for_each(target, &data.targets, link) {
printf("%s\t%"PRIu32": description=\"%s\" prio=%d\n", if (target->type != TARGET_TYPE_SOURCE)
continue;
printf("%s\t%"PRIu32": source description=\"%s\" prio=%d\n",
target == target_default ? "*" : "",
target->id, target->desc, target->prio);
}
spa_list_for_each(target, &data.targets, link) {
if (target->type != TARGET_TYPE_SINK)
continue;
printf("%s\t%"PRIu32": sink description=\"%s\" prio=%d\n",
target == target_default ? "*" : "",
target->id, target->desc, target->prio);
}
spa_list_for_each(target, &data.targets, link) {
if (target->type != TARGET_TYPE_STREAM)
continue;
printf("%s\t%"PRIu32": stream description=\"%s\" prio=%d\n",
target == target_default ? "*" : "", target == target_default ? "*" : "",
target->id, target->desc, target->prio); target->id, target->desc, target->prio);
} }