[pulseaudio-commits] [SCM] PulseAudio Sound Server branch, master, updated. v0.9.15-127-g8f23a2e
Lennart Poettering
gitmailer-noreply at 0pointer.de
Mon May 25 14:52:20 PDT 2009
This is an automated email from the git hooks/post-receive script. It was
generated because of a push to the "PulseAudio Sound Server" repository.
The master branch has been updated
from f80928495aa41ce54e9ca2c64ab31fb71ce21c23 (commit)
- Log -----------------------------------------------------------------
8f23a2e proplist: add two new generic properties, media.copyright and media.software
01fa34b channelmap: introduce pa_channel_map_mask() and pa_channel_position_mask_t
261a483 sample: introduce pa_proplist_setp()
346a708 sample: introduce pa_sample_format_is_{le,be,ne,re}()
3533599 upnp: s/org.Rygel./org.gnome.UPnP/ following the newest version of the spec
-----------------------------------------------------------------------
Summary of changes:
src/map-file | 4 ++
src/modules/module-rygel-media-server.c | 64 +++++++++++++++---------------
src/pulse/channelmap.c | 12 ++++++
src/pulse/channelmap.h | 9 ++++
src/pulse/proplist.c | 15 +++++++
src/pulse/proplist.h | 14 +++++++
src/pulse/sample.c | 33 ++++++++++++++++
src/pulse/sample.h | 20 ++++++++++
8 files changed, 139 insertions(+), 32 deletions(-)
-----------------------------------------------------------------------
commit 3533599579b64d7124451bd60ea57c6f70dd9f35
Author: Lennart Poettering <lennart at poettering.net>
Date: Mon May 25 23:47:09 2009 +0200
upnp: s/org.Rygel./org.gnome.UPnP/ following the newest version of the spec
diff --git a/src/modules/module-rygel-media-server.c b/src/modules/module-rygel-media-server.c
index cb9ec92..4c02e95 100644
--- a/src/modules/module-rygel-media-server.c
+++ b/src/modules/module-rygel-media-server.c
@@ -57,18 +57,18 @@ PA_MODULE_USAGE(
/* This implements http://live.gnome.org/Rygel/MediaServerSpec */
-#define SERVICE_NAME "org.Rygel.MediaServer1.PulseAudio"
+#define SERVICE_NAME "org.gnome.UPnP.MediaServer1.PulseAudio"
-#define OBJECT_ROOT "/org/Rygel/MediaServer1/PulseAudio"
-#define OBJECT_SINKS "/org/Rygel/MediaServer1/PulseAudio/Sinks"
-#define OBJECT_SOURCES "/org/Rygel/MediaServer1/PulseAudio/Sources"
+#define OBJECT_ROOT "/org/gnome/UPnP/MediaServer1/PulseAudio"
+#define OBJECT_SINKS "/org/gnome/UPnP/MediaServer1/PulseAudio/Sinks"
+#define OBJECT_SOURCES "/org/gnome/UPnP/MediaServer1/PulseAudio/Sources"
#define CONTAINER_INTROSPECT_XML_PREFIX \
DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \
"<node>" \
" <!-- If you are looking for documentation make sure to check out" \
" http://live.gnome.org/Rygel/MediaServerSpec -->" \
- " <interface name=\"org.Rygel.MediaContainer1\">" \
+ " <interface name=\"org.gnome.UPnP.MediaContainer1\">" \
" <signal name=\"Updated\">" \
" <arg name=\"path\" type=\"o\"/>" \
" </signal>" \
@@ -77,7 +77,7 @@ PA_MODULE_USAGE(
" <property name=\"Containers\" type=\"ao\" access=\"read\"/>" \
" <property name=\"ContainerCount\" type=\"u\" access=\"read\"/>" \
" </interface>" \
- " <interface name=\"org.Rygel.MediaObject1\">" \
+ " <interface name=\"org.gnome.UPnP.MediaObject1\">" \
" <property name=\"Parent\" type=\"s\" access=\"read\"/>" \
" <property name=\"DisplayName\" type=\"s\" access=\"read\"/>" \
" </interface>" \
@@ -112,12 +112,12 @@ PA_MODULE_USAGE(
"<node>" \
" <!-- If you are looking for documentation make sure to check out" \
" http://live.gnome.org/Rygel/MediaProviderSpec -->" \
- " <interface name=\"org.Rygel.MediaItem1\">" \
+ " <interface name=\"org.gnome.UPnP.MediaItem1\">" \
" <property name=\"URLs\" type=\"as\" access=\"read\"/>" \
" <property name=\"MIMEType\" type=\"s\" access=\"read\"/>" \
" <property name=\"Type\" type=\"s\" access=\"read\"/>" \
" </interface>" \
- " <interface name=\"org.Rygel.MediaObject1\">" \
+ " <interface name=\"org.gnome.UPnP.MediaObject1\">" \
" <property name=\"Parent\" type=\"s\" access=\"read\"/>" \
" <property name=\"DisplayName\" type=\"s\" access=\"read\"/>" \
" </interface>" \
@@ -174,7 +174,7 @@ static void send_signal(struct userdata *u, pa_source *s) {
else
parent = OBJECT_SOURCES;
- pa_assert_se(m = dbus_message_new_signal(parent, "org.Rygel.MediaContainer1", "Updated"));
+ pa_assert_se(m = dbus_message_new_signal(parent, "org.gnome.UPnP.MediaContainer1", "Updated"));
pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->bus), m, NULL));
dbus_message_unref(m);
@@ -349,23 +349,23 @@ static DBusHandlerResult root_handler(DBusConnection *c, DBusMessage *m, void *u
pa_assert(u);
- if (message_is_property_get(m, "org.Rygel.MediaContainer1", "Containers")) {
+ if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "Containers")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_object_array(r, NULL, (const char**) array_root_containers, PA_ELEMENTSOF(array_root_containers));
- } else if (message_is_property_get(m, "org.Rygel.MediaContainer1", "ContainerCount")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ContainerCount")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_unsigned(r, NULL, PA_ELEMENTSOF(array_root_containers));
- } else if (message_is_property_get(m, "org.Rygel.MediaContainer1", "Items")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "Items")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_object_array(r, NULL, array_no_children, PA_ELEMENTSOF(array_no_children));
- } else if (message_is_property_get(m, "org.Rygel.MediaContainer1", "ItemCount")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ItemCount")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_unsigned(r, NULL, PA_ELEMENTSOF(array_no_children));
- } else if (message_is_property_get_all(m, "org.Rygel.MediaContainer1")) {
+ } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaContainer1")) {
DBusMessageIter iter, sub;
pa_assert_se(r = dbus_message_new_method_return(m));
@@ -378,15 +378,15 @@ static DBusHandlerResult root_handler(DBusConnection *c, DBusMessage *m, void *u
append_property_dict_entry_unsigned(r, &sub, "ItemCount", PA_ELEMENTSOF(array_no_children));
pa_assert_se(dbus_message_iter_close_container(&iter, &sub));
- } else if (message_is_property_get(m, "org.Rygel.MediaObject1", "Parent")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "Parent")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_object(r, NULL, OBJECT_ROOT);
- } else if (message_is_property_get(m, "org.Rygel.MediaObject1", "DisplayName")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "DisplayName")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_string(r, NULL, u->display_name);
- } else if (message_is_property_get_all(m, "org.Rygel.MediaObject1")) {
+ } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaObject1")) {
DBusMessageIter iter, sub;
pa_assert_se(r = dbus_message_new_method_return(m));
@@ -509,15 +509,15 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
/* Container nodes */
- if (message_is_property_get(m, "org.Rygel.MediaContainer1", "Containers")) {
+ if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "Containers")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_object_array(r, NULL, array_no_children, PA_ELEMENTSOF(array_no_children));
- } else if (message_is_property_get(m, "org.Rygel.MediaContainer1", "ContainerCount")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ContainerCount")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_unsigned(r, NULL, PA_ELEMENTSOF(array_no_children));
- } else if (message_is_property_get(m, "org.Rygel.MediaContainer1", "Items")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "Items")) {
char ** array;
unsigned n;
@@ -528,14 +528,14 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
free_child_array(array, n);
- } else if (message_is_property_get(m, "org.Rygel.MediaContainer1", "ItemCount")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ItemCount")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_unsigned(r, NULL,
pa_streq(path, OBJECT_SINKS) ?
pa_idxset_size(u->core->sinks) :
pa_idxset_size(u->core->sources));
- } else if (message_is_property_get_all(m, "org.Rygel.MediaContainer1")) {
+ } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaContainer1")) {
DBusMessageIter iter, sub;
char **array;
unsigned n;
@@ -557,11 +557,11 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
pa_assert_se(dbus_message_iter_close_container(&iter, &sub));
- } else if (message_is_property_get(m, "org.Rygel.MediaObject1", "Parent")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "Parent")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_object(r, NULL, OBJECT_ROOT);
- } else if (message_is_property_get(m, "org.Rygel.MediaObject1", "DisplayName")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "DisplayName")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_string(r,
NULL,
@@ -569,7 +569,7 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
_("Output Devices") :
_("Input Devices"));
- } else if (message_is_property_get_all(m, "org.Rygel.MediaObject1")) {
+ } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaObject1")) {
DBusMessageIter iter, sub;
pa_assert_se(r = dbus_message_new_method_return(m));
@@ -632,15 +632,15 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
if (!sink && !source)
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- if (message_is_property_get(m, "org.Rygel.MediaObject1", "Parent")) {
+ if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "Parent")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_object(r, NULL, sink ? OBJECT_SINKS : OBJECT_SOURCES);
- } else if (message_is_property_get(m, "org.Rygel.MediaObject1", "DisplayName")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "DisplayName")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_string(r, NULL, pa_strna(pa_proplist_gets(sink ? sink->proplist : source->proplist, PA_PROP_DEVICE_DESCRIPTION)));
- } else if (message_is_property_get_all(m, "org.Rygel.MediaObject1")) {
+ } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaObject1")) {
DBusMessageIter iter, sub;
pa_assert_se(r = dbus_message_new_method_return(m));
@@ -651,11 +651,11 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
append_property_dict_entry_string(r, &sub, "DisplayName", pa_strna(pa_proplist_gets(sink ? sink->proplist : source->proplist, PA_PROP_DEVICE_DESCRIPTION)));
pa_assert_se(dbus_message_iter_close_container(&iter, &sub));
- } else if (message_is_property_get(m, "org.Rygel.MediaItem1", "Type")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaItem1", "Type")) {
pa_assert_se(r = dbus_message_new_method_return(m));
append_variant_string(r, NULL, "audio");
- } else if (message_is_property_get(m, "org.Rygel.MediaItem1", "MIMEType")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaItem1", "MIMEType")) {
char *t;
if (sink)
@@ -667,7 +667,7 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
append_variant_string(r, NULL, t);
pa_xfree(t);
- } else if (message_is_property_get(m, "org.Rygel.MediaItem1", "URLs")) {
+ } else if (message_is_property_get(m, "org.gnome.UPnP.MediaItem1", "URLs")) {
DBusMessageIter iter, sub, array;
char *url;
@@ -685,7 +685,7 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
pa_xfree(url);
- } else if (message_is_property_get_all(m, "org.Rygel.MediaItem1")) {
+ } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaItem1")) {
DBusMessageIter iter, sub, dict, variant, array;
char *url, *t;
const char *un = "URLs";
commit 346a708c2c079e646ced407ea15b1475ae9129ad
Author: Lennart Poettering <lennart at poettering.net>
Date: Mon May 25 23:49:47 2009 +0200
sample: introduce pa_sample_format_is_{le,be,ne,re}()
diff --git a/src/map-file b/src/map-file
index d0102ae..c6a576e 100644
--- a/src/map-file
+++ b/src/map-file
@@ -182,6 +182,8 @@ pa_proplist_to_string_sep;
pa_proplist_unset;
pa_proplist_unset_many;
pa_proplist_update;
+pa_sample_format_is_be;
+pa_sample_format_is_le;
pa_sample_format_to_string;
pa_sample_size;
pa_sample_size_of_format;
diff --git a/src/pulse/sample.c b/src/pulse/sample.c
index ed7b1b0..0f19f8e 100644
--- a/src/pulse/sample.c
+++ b/src/pulse/sample.c
@@ -241,3 +241,36 @@ pa_sample_format_t pa_parse_sample_format(const char *format) {
return -1;
}
+
+int pa_sample_format_is_le(pa_sample_format_t f) {
+ pa_assert(f >= PA_SAMPLE_U8);
+ pa_assert(f < PA_SAMPLE_MAX);
+
+ switch (f) {
+ case PA_SAMPLE_S16LE:
+ case PA_SAMPLE_S24LE:
+ case PA_SAMPLE_S32LE:
+ case PA_SAMPLE_S24_32LE:
+ case PA_SAMPLE_FLOAT32LE:
+ return 1;
+
+ case PA_SAMPLE_S16BE:
+ case PA_SAMPLE_S24BE:
+ case PA_SAMPLE_S32BE:
+ case PA_SAMPLE_S24_32BE:
+ case PA_SAMPLE_FLOAT32BE:
+ return 0;
+
+ default:
+ return -1;
+ }
+}
+
+int pa_sample_format_is_be(pa_sample_format_t f) {
+ int r;
+
+ if ((r = pa_sample_format_is_le(f)) < 0)
+ return r;
+
+ return !r;
+}
diff --git a/src/pulse/sample.h b/src/pulse/sample.h
index 138f13c..53d7dea 100644
--- a/src/pulse/sample.h
+++ b/src/pulse/sample.h
@@ -305,6 +305,26 @@ char* pa_sample_spec_snprint(char *s, size_t l, const pa_sample_spec *spec);
/** Pretty print a byte size value. (i.e. "2.5 MiB") */
char* pa_bytes_snprint(char *s, size_t l, unsigned v);
+/** Return 1 when the specified format is little endian, return -1
+ * when endianess does not apply to this format. \since 0.9.16 */
+int pa_sample_format_is_le(pa_sample_format_t f) PA_GCC_PURE;
+
+/** Return 1 when the specified format is big endian, return -1 when
+ * endianess does not apply to this format. \since 0.9.16 */
+int pa_sample_format_is_be(pa_sample_format_t f) PA_GCC_PURE;
+
+#ifdef WORDS_BIGENDIAN
+#define pa_sample_format_is_ne(f) pa_sample_format_is_be(f)
+#define pa_sample_format_is_re(f) pa_sample_format_is_le(f)
+#else
+/** Return 1 when the specified format is native endian, return -1
+ * when endianess does not apply to this format. \since 0.9.16 */
+#define pa_sample_format_is_ne(f) pa_sample_format_is_le(f)
+/** Return 1 when the specified format is reverse endian, return -1
+ * when endianess does not apply to this format. \since 0.9.16 */
+#define pa_sample_format_is_re(f) pa_sample_format_is_be(f)
+#endif
+
PA_C_DECL_END
#endif
commit 261a4830fb28f7ae690176cdfbe21607d27d9bcb
Author: Lennart Poettering <lennart at poettering.net>
Date: Mon May 25 23:50:18 2009 +0200
sample: introduce pa_proplist_setp()
diff --git a/src/map-file b/src/map-file
index c6a576e..201e837 100644
--- a/src/map-file
+++ b/src/map-file
@@ -175,6 +175,7 @@ pa_proplist_iterate;
pa_proplist_new;
pa_proplist_set;
pa_proplist_setf;
+pa_proplist_setp;
pa_proplist_sets;
pa_proplist_size;
pa_proplist_to_string;
diff --git a/src/pulse/proplist.c b/src/pulse/proplist.c
index db4c934..c904f53 100644
--- a/src/pulse/proplist.c
+++ b/src/pulse/proplist.c
@@ -140,6 +140,21 @@ static int proplist_setn(pa_proplist *p, const char *key, size_t key_length, con
return 0;
}
+/** Will accept only valid UTF-8 */
+int pa_proplist_setp(pa_proplist *p, const char *pair) {
+ const char *t;
+
+ pa_assert(p);
+ pa_assert(pair);
+
+ if (!(t = strchr(pair, '=')))
+ return -1;
+
+ return proplist_setn(p,
+ pair, t - pair,
+ t + 1, strchr(pair, 0) - t - 1);
+}
+
static int proplist_sethex(pa_proplist *p, const char *key, size_t key_length, const char *value, size_t value_length) {
struct property *prop;
pa_bool_t add = FALSE;
diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index 2e7e5ad..7d680d0 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -234,6 +234,14 @@ int pa_proplist_sets(pa_proplist *p, const char *key, const char *value);
/** Append a new string entry to the property list, possibly
* overwriting an already existing entry with the same key. An
* internal copy of the data passed is made. Will accept only valid
+ * UTF-8. The string passed in must contain a '='. Left hand side of
+ * the '=' is used as key name, the right hand side as string
+ * data. \since 0.9.16 */
+int pa_proplist_setp(pa_proplist *p, const char *pair);
+
+/** Append a new string entry to the property list, possibly
+ * overwriting an already existing entry with the same key. An
+ * internal copy of the data passed is made. Will accept only valid
* UTF-8. The data can be passed as printf()-style format string with
* arguments. \since 0.9.11 */
int pa_proplist_setf(pa_proplist *p, const char *key, const char *format, ...) PA_GCC_PRINTF_ATTR(3,4);
commit 01fa34ba8a2be006964b87e5e19a2c955bf7131e
Author: Lennart Poettering <lennart at poettering.net>
Date: Mon May 25 23:51:34 2009 +0200
channelmap: introduce pa_channel_map_mask() and pa_channel_position_mask_t
diff --git a/src/map-file b/src/map-file
index 201e837..98a568e 100644
--- a/src/map-file
+++ b/src/map-file
@@ -20,6 +20,7 @@ pa_channel_map_init_auto;
pa_channel_map_init_extend;
pa_channel_map_init_mono;
pa_channel_map_init_stereo;
+pa_channel_map_mask;
pa_channel_map_parse;
pa_channel_map_snprint;
pa_channel_map_superset;
diff --git a/src/pulse/channelmap.c b/src/pulse/channelmap.c
index fe14df2..4654a9a 100644
--- a/src/pulse/channelmap.c
+++ b/src/pulse/channelmap.c
@@ -852,3 +852,15 @@ int pa_channel_map_has_position(const pa_channel_map *map, pa_channel_position_t
return 0;
}
+
+pa_channel_position_mask_t pa_channel_map_mask(const pa_channel_map *map) {
+ unsigned c;
+ pa_channel_position_mask_t r = 0;
+
+ pa_return_val_if_fail(pa_channel_map_valid(map), 0);
+
+ for (c = 0; c < map->channels; c++)
+ r |= PA_CHANNEL_POSITION_MASK(map->map[c]);
+
+ return r;
+}
diff --git a/src/pulse/channelmap.h b/src/pulse/channelmap.h
index 4f39d8a..2aaead0 100644
--- a/src/pulse/channelmap.h
+++ b/src/pulse/channelmap.h
@@ -205,6 +205,12 @@ typedef enum pa_channel_position {
#define PA_CHANNEL_POSITION_MAX PA_CHANNEL_POSITION_MAX
/** \endcond */
+/** A mask of channel positions. \since 0.9.16 */
+typedef uint64_t pa_channel_position_mask_t;
+
+/** Makes a bit mask from a channel position. \since 0.9.16 */
+#define PA_CHANNEL_POSITION_MASK(f) ((pa_channel_position_mask_t) (1 << (f)))
+
/** A list of channel mapping definitions for pa_channel_map_init_auto() */
typedef enum pa_channel_map_def {
PA_CHANNEL_MAP_AIFF,
@@ -333,6 +339,9 @@ const char* pa_channel_map_to_pretty_name(const pa_channel_map *map) PA_GCC_PURE
* least once in the channel map. \since 0.9.16 */
int pa_channel_map_has_position(const pa_channel_map *map, pa_channel_position_t p) PA_GCC_PURE;
+/** Generates a bit mask from a channel map. \since 0.9.16 */
+pa_channel_position_mask_t pa_channel_map_mask(const pa_channel_map *map) PA_GCC_PURE;
+
PA_C_DECL_END
#endif
commit 8f23a2edb5c602064b24648088572e61e9aeb395
Author: Lennart Poettering <lennart at poettering.net>
Date: Mon May 25 23:52:31 2009 +0200
proplist: add two new generic properties, media.copyright and media.software
diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index 7d680d0..4c791dc 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -39,6 +39,12 @@ PA_C_DECL_BEGIN
/** For streams: localized media artist if applicable, formatted as UTF-8. e.g. "Guns'N'Roses" */
#define PA_PROP_MEDIA_ARTIST "media.artist"
+/** For streams: localized media copyright string if applicable, formatted as UTF-8. e.g. "Evil Record Corp." */
+#define PA_PROP_MEDIA_COPYRIGHT "media.copyright"
+
+/** For streams: localized media generator software string if applicable, formatted as UTF-8. e.g. "Foocrop AudioFrobnicator" */
+#define PA_PROP_MEDIA_SOFTWARE "media.software"
+
/** For streams: media language if applicable, in standard POSIX format. e.g. "de_DE" */
#define PA_PROP_MEDIA_LANGUAGE "media.language"
--
hooks/post-receive
PulseAudio Sound Server
More information about the pulseaudio-commits
mailing list