diff -pruN tmp.000/src/modules/module-stream-restore.c tmp/src/modules/module-stream-restore.c --- tmp.000/src/modules/module-stream-restore.c 2015-02-12 15:10:35.000000000 +0100 +++ tmp/src/modules/module-stream-restore.c 2016-01-25 16:56:11.716990564 +0100 @@ -1274,7 +1274,7 @@ static void subscribe_callback(pa_core * if (!(sink_input = pa_idxset_get_by_index(c->sink_inputs, idx))) return; - if (!(name = pa_proplist_get_stream_group(sink_input->proplist, "sink-input", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(sink_input->proplist, "sink-input", IDENTIFICATION_PROPERTY))) return; if ((old = entry_read(u, name))) { @@ -1324,7 +1324,7 @@ static void subscribe_callback(pa_core * if (!(source_output = pa_idxset_get_by_index(c->source_outputs, idx))) return; - if (!(name = pa_proplist_get_stream_group(source_output->proplist, "source-output", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(source_output->proplist, "source-output", IDENTIFICATION_PROPERTY))) return; if ((old = entry_read(u, name))) { @@ -1417,7 +1417,7 @@ static pa_hook_result_t sink_input_new_h pa_assert(u); pa_assert(u->restore_device); - if (!(name = pa_proplist_get_stream_group(new_data->proplist, "sink-input", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(new_data->proplist, "sink-input", IDENTIFICATION_PROPERTY))) return PA_HOOK_OK; if (new_data->sink) @@ -1459,7 +1459,7 @@ static pa_hook_result_t sink_input_fixat pa_assert(u); pa_assert(u->restore_volume || u->restore_muted); - if (!(name = pa_proplist_get_stream_group(new_data->proplist, "sink-input", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(new_data->proplist, "sink-input", IDENTIFICATION_PROPERTY))) return PA_HOOK_OK; if ((e = entry_read(u, name))) { @@ -1513,7 +1513,7 @@ static pa_hook_result_t source_output_ne if (new_data->direct_on_input) return PA_HOOK_OK; - if (!(name = pa_proplist_get_stream_group(new_data->proplist, "source-output", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(new_data->proplist, "source-output", IDENTIFICATION_PROPERTY))) return PA_HOOK_OK; if (new_data->source) @@ -1556,7 +1556,7 @@ static pa_hook_result_t source_output_fi pa_assert(u); pa_assert(u->restore_volume || u->restore_muted); - if (!(name = pa_proplist_get_stream_group(new_data->proplist, "source-output", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(new_data->proplist, "source-output", IDENTIFICATION_PROPERTY))) return PA_HOOK_OK; if ((e = entry_read(u, name))) { @@ -1628,7 +1628,7 @@ static pa_hook_result_t sink_put_hook_ca if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si))) continue; - if (!(name = pa_proplist_get_stream_group(si->proplist, "sink-input", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(si->proplist, "sink-input", IDENTIFICATION_PROPERTY))) continue; if ((e = entry_read(u, name))) { @@ -1676,7 +1676,7 @@ static pa_hook_result_t source_put_hook_ if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(so))) continue; - if (!(name = pa_proplist_get_stream_group(so->proplist, "source-output", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(so->proplist, "source-output", IDENTIFICATION_PROPERTY))) continue; if ((e = entry_read(u, name))) { @@ -1712,7 +1712,7 @@ static pa_hook_result_t sink_unlink_hook if (!si->sink) continue; - if (!(name = pa_proplist_get_stream_group(si->proplist, "sink-input", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(si->proplist, "sink-input", IDENTIFICATION_PROPERTY))) continue; if ((e = entry_read(u, name))) { @@ -1758,7 +1758,7 @@ static pa_hook_result_t source_unlink_ho if (!so->source) continue; - if (!(name = pa_proplist_get_stream_group(so->proplist, "source-output", IDENTIFICATION_PROPERTY))) + if (!(name = pa_proplist_get_stream_id(so->proplist, "source-output", IDENTIFICATION_PROPERTY))) continue; if ((e = entry_read(u, name))) { @@ -1870,7 +1870,7 @@ static void entry_apply(struct userdata char *n; pa_sink *s; - if (!(n = pa_proplist_get_stream_group(si->proplist, "sink-input", IDENTIFICATION_PROPERTY))) + if (!(n = pa_proplist_get_stream_id(si->proplist, "sink-input", IDENTIFICATION_PROPERTY))) continue; if (!pa_streq(name, n)) { @@ -1918,7 +1918,7 @@ static void entry_apply(struct userdata char *n; pa_source *s; - if (!(n = pa_proplist_get_stream_group(so->proplist, "source-output", IDENTIFICATION_PROPERTY))) + if (!(n = pa_proplist_get_stream_id(so->proplist, "source-output", IDENTIFICATION_PROPERTY))) continue; if (!pa_streq(name, n)) { diff -pruN tmp.000/src/pulsecore/proplist-util.c tmp/src/pulsecore/proplist-util.c --- tmp.000/src/pulsecore/proplist-util.c 2015-02-12 15:10:35.000000000 +0100 +++ tmp/src/pulsecore/proplist-util.c 2016-01-25 16:58:03.091957280 +0100 @@ -272,3 +272,42 @@ char *pa_proplist_get_stream_group(pa_pr return t; } + +char *pa_proplist_get_stream_id(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_APPLICATION_PROCESS_ID)) + t = pa_sprintf_malloc("%s-by-application-pid:%s", prefix, r); + else { + char randomstring[17]; + int i; + long int l; + + srandom(time(NULL)); + for (i = 0; i < 16; i++) { + l = (random() & 31) + 97; + if (l > (25 + 97)) { + i--; + continue; + } + randomstring[i] = (char)l; + } + randomstring[16] = '\0'; + t = pa_sprintf_malloc("%s-fallback:%s", prefix, randomstring); + } + + if (cache) + pa_proplist_sets(p, cache, t); + + return t; +}