summaryrefslogtreecommitdiff
path: root/pipewire-pulseaudio
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2020-07-31 15:47:14 +0200
committerWim Taymans <wtaymans@redhat.com>2020-07-31 15:47:14 +0200
commit0b12cc96ccd8a687c0bd853cc9372a55f4bcb3a9 (patch)
tree106016356e87184e539b7dabd9a6886d020367cf /pipewire-pulseaudio
parentf2cc0e67231c1cc00cba5846dc18f5824215fa57 (diff)
pulse: remove metadata store
We don't actually need to store all the metadata, we just need to track the default sink and source property and store the value.
Diffstat (limited to 'pipewire-pulseaudio')
-rw-r--r--pipewire-pulseaudio/src/context.c28
-rw-r--r--pipewire-pulseaudio/src/internal.h2
-rw-r--r--pipewire-pulseaudio/src/introspect.c12
-rw-r--r--pipewire-pulseaudio/src/meson.build1
-rw-r--r--pipewire-pulseaudio/src/metadata.c129
5 files changed, 24 insertions, 148 deletions
diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c
index 4e646455..1c9f95a5 100644
--- a/pipewire-pulseaudio/src/context.c
+++ b/pipewire-pulseaudio/src/context.c
@@ -984,18 +984,22 @@ static int metadata_property(void *object,
const char *value)
{
struct global *global = object;
- int res;
-
- if ((res = pa_metadata_update(global, subject, key, type, value)) < 0)
- return res;
-
- if (key) {
- if (strcmp(key, METADATA_DEFAULT_SINK) == 0 ||
- strcmp(key, METADATA_DEFAULT_SOURCE) == 0) {
- emit_event(global->context, global, PA_SUBSCRIPTION_EVENT_CHANGE);
- }
+ pa_context *c = global->context;
+ uint32_t val;
+ bool changed = false;
+
+ if (key && strcmp(key, METADATA_DEFAULT_SINK) == 0) {
+ val = value ? (uint32_t)atoi(value) : SPA_ID_INVALID;
+ changed = c->default_sink != val;
+ c->default_sink = val;
+ } else if (key && strcmp(key, METADATA_DEFAULT_SOURCE) == 0) {
+ val = value ? (uint32_t)atoi(value) : SPA_ID_INVALID;
+ changed = c->default_source != val;
}
- return res;
+ if (changed)
+ emit_event(global->context, global, PA_SUBSCRIPTION_EVENT_CHANGE);
+
+ return 0;
}
static const struct pw_metadata_events metadata_events = {
@@ -1413,6 +1417,8 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
c->proplist = p ? pa_proplist_copy(p) : pa_proplist_new();
c->refcount = 1;
c->client_index = PA_INVALID_INDEX;
+ c->default_sink = SPA_ID_INVALID;
+ c->default_source = SPA_ID_INVALID;
if (name)
pa_proplist_sets(c->proplist, PA_PROP_APPLICATION_NAME, name);
diff --git a/pipewire-pulseaudio/src/internal.h b/pipewire-pulseaudio/src/internal.h
index 4cbb42ff..21847ce7 100644
--- a/pipewire-pulseaudio/src/internal.h
+++ b/pipewire-pulseaudio/src/internal.h
@@ -356,6 +356,8 @@ struct pa_context {
int disconnect:1;
struct global *metadata;
+ uint32_t default_sink;
+ uint32_t default_source;
};
struct global *pa_context_find_global(pa_context *c, uint32_t id);
diff --git a/pipewire-pulseaudio/src/introspect.c b/pipewire-pulseaudio/src/introspect.c
index 5d2dafdc..c9c1e6d0 100644
--- a/pipewire-pulseaudio/src/introspect.c
+++ b/pipewire-pulseaudio/src/introspect.c
@@ -1248,25 +1248,23 @@ struct server_data {
static const char *get_default_name(pa_context *c, uint32_t mask)
{
struct global *g;
- const char *str, *id = NULL, *type, *key;
+ const char *str;
+ uint32_t id = SPA_ID_INVALID;
if (c->metadata) {
if (mask & PA_SUBSCRIPTION_MASK_SINK)
- key = METADATA_DEFAULT_SINK;
+ id = c->default_sink;
else if (mask & PA_SUBSCRIPTION_MASK_SOURCE)
- key = METADATA_DEFAULT_SOURCE;
+ id = c->default_source;
else
return NULL;
-
- if (pa_metadata_get(c->metadata, PW_ID_CORE, key, &type, &id) <= 0)
- id = NULL;
}
spa_list_for_each(g, &c->globals, link) {
if ((g->mask & mask) != mask)
continue;
if (g->props != NULL &&
(str = pw_properties_get(g->props, PW_KEY_NODE_NAME)) != NULL &&
- (id == NULL || (uint32_t)atoi(id) == g->id))
+ (id == SPA_ID_INVALID || id == g->id))
return str;
}
return "unknown";
diff --git a/pipewire-pulseaudio/src/meson.build b/pipewire-pulseaudio/src/meson.build
index ebc2f04c..332824f6 100644
--- a/pipewire-pulseaudio/src/meson.build
+++ b/pipewire-pulseaudio/src/meson.build
@@ -13,7 +13,6 @@ pipewire_pulseaudio_sources = [
'json.c',
'mainloop.c',
'mainloop-signal.c',
- 'metadata.c',
'operation.c',
'proplist.c',
'rtclock.c',
diff --git a/pipewire-pulseaudio/src/metadata.c b/pipewire-pulseaudio/src/metadata.c
deleted file mode 100644
index 5fd858f3..00000000
--- a/pipewire-pulseaudio/src/metadata.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* PipeWire
- * Copyright (C) 2020 Wim Taymans <wim.taymans@gmail.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include <errno.h>
-
-#include <spa/utils/result.h>
-
-#include "internal.h"
-
-struct metadata_item {
- uint32_t subject;
- char *key;
- char *type;
- char *value;
-};
-
-static void clear_item(struct metadata_item *it)
-{
- free(it->key);
- free(it->type);
- free(it->value);
-}
-
-void remove_all(struct global *global, uint32_t subject, const char *key)
-{
- struct metadata_item *it;
- for (it = pw_array_first(&global->metadata_info.metadata);
- pw_array_check(&global->metadata_info.metadata, it);) {
- if (it->subject == subject &&
- (key == NULL || it->key == NULL || strcmp(key, it->key) == 0)) {
- clear_item(it);
- pw_array_remove(&global->metadata_info.metadata, it);
- } else {
- it++;
- }
- }
-}
-
-static struct metadata_item *find_item(struct global *global, uint32_t subject,
- const char *key)
-{
- struct metadata_item *it;
- pw_array_for_each(it, &global->metadata_info.metadata) {
- if (it->subject == subject &&
- (key == NULL || strcmp(key, it->key) == 0))
- return it;
- }
- return NULL;
-}
-
-static int replace_item(struct metadata_item *it, const char *type, const char *value)
-{
- if (it->type == NULL || strcmp(it->type, type) != 0) {
- free(it->type);
- it->type = strdup(type);
- }
- if (it->value == NULL || strcmp(it->value, value) != 0) {
- free(it->value);
- it->value = strdup(value);
- }
- return 0;
-}
-
-static int add_item(struct global *global, uint32_t subject, const char *key,
- const char *type, const char *value)
-{
- struct metadata_item *it;
- it = pw_array_add(&global->metadata_info.metadata, sizeof(*it));
- if (it == NULL)
- return -errno;
- it->subject = subject;
- it->key = strdup(key);
- it->type = strdup(type);
- it->value = strdup(value);
- return 0;
-}
-
-int pa_metadata_update(struct global *global, uint32_t subject, const char *key,
- const char *type, const char *value)
-{
- struct metadata_item *it;
- int res = 0;
- pw_log_info("metadata %p: id:%u key:%s value:%s type:%s",
- global, subject, key, value, type);
-
- if (key == NULL || value == NULL) {
- remove_all(global, subject, key);
- } else {
- if (type == NULL)
- type = "";
- it = find_item(global, subject, key);
- if (it == NULL) {
- res = add_item(global, subject, key, type, value);
- } else {
- res = replace_item(it, type, value);
- }
- }
- return res;
-}
-
-int pa_metadata_get(struct global *global, uint32_t subject, const char *key,
- const char **type, const char **value)
-{
- struct metadata_item *it;
- it = find_item(global, subject, key);
- if (it == NULL)
- return 0;
- if (type)
- *type = it->type;
- if (value)
- *value = it->value;
- return 1;
-}