#include <pulsecore/pstream-util.h>
#include <pulsecore/database.h>
#include <pulsecore/tagstruct.h>
+#include <pulsecore/proplist-util.h>
#ifdef HAVE_DBUS
#include <pulsecore/dbus-util.h>
pa_log_info("Synced.");
}
-static char *get_name(pa_proplist *p, const char *prefix) {
- const char *r;
- char *t;
-
- if (!p)
- return NULL;
-
- if ((r = pa_proplist_gets(p, IDENTIFICATION_PROPERTY)))
- return pa_xstrdup(r);
-
- if ((r = pa_proplist_gets(p, PA_PROP_MEDIA_ROLE)))
- t = pa_sprintf_malloc("%s-by-media-role:%s", prefix, r);
- else if ((r = pa_proplist_gets(p, PA_PROP_APPLICATION_ID)))
- t = pa_sprintf_malloc("%s-by-application-id:%s", prefix, r);
- else if ((r = pa_proplist_gets(p, PA_PROP_APPLICATION_NAME)))
- t = pa_sprintf_malloc("%s-by-application-name:%s", prefix, r);
- else if ((r = pa_proplist_gets(p, PA_PROP_MEDIA_NAME)))
- t = pa_sprintf_malloc("%s-by-media-name:%s", prefix, r);
- else
- t = pa_sprintf_malloc("%s-fallback:%s", prefix, r);
-
- pa_proplist_sets(p, IDENTIFICATION_PROPERTY, t);
- return t;
-}
-
static struct entry* entry_new(void) {
struct entry *r = pa_xnew0(struct entry, 1);
r->version = ENTRY_VERSION;
if (!(sink_input = pa_idxset_get_by_index(c->sink_inputs, idx)))
return;
- if (!(name = get_name(sink_input->proplist, "sink-input")))
+ if (!(name = pa_proplist_get_stream_group(sink_input->proplist, "sink-input", IDENTIFICATION_PROPERTY)))
return;
if ((old = entry_read(u, name))) {
if (!(source_output = pa_idxset_get_by_index(c->source_outputs, idx)))
return;
- if (!(name = get_name(source_output->proplist, "source-output")))
+ if (!(name = pa_proplist_get_stream_group(source_output->proplist, "source-output", IDENTIFICATION_PROPERTY)))
return;
if ((old = entry_read(u, name))) {
pa_assert(u);
pa_assert(u->restore_device);
- if (!(name = get_name(new_data->proplist, "sink-input")))
+ if (!(name = pa_proplist_get_stream_group(new_data->proplist, "sink-input", IDENTIFICATION_PROPERTY)))
return PA_HOOK_OK;
if (new_data->sink)
pa_assert(u);
pa_assert(u->restore_volume || u->restore_muted);
- if (!(name = get_name(new_data->proplist, "sink-input")))
+ if (!(name = pa_proplist_get_stream_group(new_data->proplist, "sink-input", IDENTIFICATION_PROPERTY)))
return PA_HOOK_OK;
if ((e = entry_read(u, name))) {
if (new_data->direct_on_input)
return PA_HOOK_OK;
- if (!(name = get_name(new_data->proplist, "source-output")))
+ if (!(name = pa_proplist_get_stream_group(new_data->proplist, "source-output", IDENTIFICATION_PROPERTY)))
return PA_HOOK_OK;
if (new_data->source)
pa_assert(u);
pa_assert(u->restore_volume || u->restore_muted);
- if (!(name = get_name(new_data->proplist, "source-output")))
+ if (!(name = pa_proplist_get_stream_group(new_data->proplist, "source-output", IDENTIFICATION_PROPERTY)))
return PA_HOOK_OK;
if ((e = entry_read(u, name))) {
if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si)))
continue;
- if (!(name = get_name(si->proplist, "sink-input")))
+ if (!(name = pa_proplist_get_stream_group(si->proplist, "sink-input", IDENTIFICATION_PROPERTY)))
continue;
if ((e = entry_read(u, name))) {
if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(so)))
continue;
- if (!(name = get_name(so->proplist, "source-output")))
+ if (!(name = pa_proplist_get_stream_group(so->proplist, "source-output", IDENTIFICATION_PROPERTY)))
continue;
if ((e = entry_read(u, name))) {
if (!si->sink)
continue;
- if (!(name = get_name(si->proplist, "sink-input")))
+ if (!(name = pa_proplist_get_stream_group(si->proplist, "sink-input", IDENTIFICATION_PROPERTY)))
continue;
if ((e = entry_read(u, name))) {
if (!so->source)
continue;
- if (!(name = get_name(so->proplist, "source-output")))
+ if (!(name = pa_proplist_get_stream_group(so->proplist, "source-output", IDENTIFICATION_PROPERTY)))
continue;
if ((e = entry_read(u, name))) {
char *n;
pa_sink *s;
- if (!(n = get_name(si->proplist, "sink-input")))
+ if (!(n = pa_proplist_get_stream_group(si->proplist, "sink-input", IDENTIFICATION_PROPERTY)))
continue;
if (!pa_streq(name, n)) {
char *n;
pa_source *s;
- if (!(n = get_name(so->proplist, "source-output")))
+ if (!(n = pa_proplist_get_stream_group(so->proplist, "source-output", IDENTIFICATION_PROPERTY)))
continue;
if (!pa_streq(name, n)) {
}
}
}
+
+char *pa_proplist_get_stream_group(pa_proplist *p, const char *prefix, const char *cache) {
+ const char *r;
+ char *t;
+
+ if (!p)
+ return NULL;
+
+ if (cache && (r = pa_proplist_gets(p, cache)))
+ return pa_xstrdup(r);
+
+ if (!prefix)
+ prefix = "stream";
+
+ if ((r = pa_proplist_gets(p, PA_PROP_MEDIA_ROLE)))
+ t = pa_sprintf_malloc("%s-by-media-role:%s", prefix, r);
+ else if ((r = pa_proplist_gets(p, PA_PROP_APPLICATION_ID)))
+ t = pa_sprintf_malloc("%s-by-application-id:%s", prefix, r);
+ else if ((r = pa_proplist_gets(p, PA_PROP_APPLICATION_NAME)))
+ t = pa_sprintf_malloc("%s-by-application-name:%s", prefix, r);
+ else if ((r = pa_proplist_gets(p, PA_PROP_MEDIA_NAME)))
+ t = pa_sprintf_malloc("%s-by-media-name:%s", prefix, r);
+ else
+ t = pa_sprintf_malloc("%s-fallback:%s", prefix, r);
+
+ if (cache)
+ pa_proplist_sets(p, cache, t);
+
+ return t;
+}