summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/pulse/format.c87
-rw-r--r--src/pulse/internal.h5
-rw-r--r--src/pulse/proplist.h12
3 files changed, 104 insertions, 0 deletions
diff --git a/src/pulse/format.c b/src/pulse/format.c
index 372ae1c5..c3962de9 100644
--- a/src/pulse/format.c
+++ b/src/pulse/format.c
@@ -69,3 +69,90 @@ void pa_format_info_free(pa_format_info *f) {
int pa_format_info_valid(pa_format_info *f) {
return (f->encoding >= 0 && f->encoding < PA_ENCODING_MAX && f->plist != NULL);
}
+
+pa_bool_t pa_format_info_is_compatible(pa_format_info *first, pa_format_info *second) {
+ const char *key;
+ void *state = NULL;
+
+ pa_assert(first);
+ pa_assert(second);
+
+ if (first->encoding != second->encoding)
+ return FALSE;
+
+ while ((key = pa_proplist_iterate(first->plist, &state))) {
+ const char *value_one, *value_two;
+
+ value_one = pa_proplist_gets(first->plist, key);
+ value_two = pa_proplist_gets(second->plist, key);
+
+ if (!value_two || !pa_streq(value_one, value_two))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+pa_format_info* pa_format_info_from_sample_spec(pa_sample_spec *ss, pa_channel_map *map) {
+ char cm[PA_CHANNEL_MAP_SNPRINT_MAX];
+ pa_format_info *f;
+
+ pa_assert(ss && pa_sample_spec_valid(ss));
+ pa_assert(!map || pa_channel_map_valid(map));
+
+ f = pa_format_info_new();
+ f->encoding = PA_ENCODING_PCM;
+
+ pa_proplist_sets(f->plist, PA_PROP_FORMAT_SAMPLE_FORMAT, pa_sample_format_to_string(ss->format));
+ pa_proplist_setf(f->plist, PA_PROP_FORMAT_RATE, "%u", (unsigned int) ss->rate);
+ pa_proplist_setf(f->plist, PA_PROP_FORMAT_CHANNELS, "%u", (unsigned int) ss->channels);
+
+ if (map) {
+ pa_channel_map_snprint(cm, sizeof(cm), map);
+ pa_proplist_setf(f->plist, PA_PROP_FORMAT_CHANNEL_MAP, "%s", cm);
+ }
+
+ return f;
+}
+
+/* For PCM streams */
+void pa_format_info_to_sample_spec(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map) {
+ const char *sf, *r, *ch;
+ uint32_t channels;
+
+ pa_assert(f);
+ pa_assert(ss);
+ pa_assert(f->encoding == PA_ENCODING_PCM);
+
+ pa_assert(sf = pa_proplist_gets(f->plist, PA_PROP_FORMAT_SAMPLE_FORMAT));
+ pa_assert(r = pa_proplist_gets(f->plist, PA_PROP_FORMAT_RATE));
+ pa_assert(ch = pa_proplist_gets(f->plist, PA_PROP_FORMAT_CHANNELS));
+
+ pa_assert((ss->format = pa_parse_sample_format(sf)) != PA_SAMPLE_INVALID);
+ pa_assert(pa_atou(r, &ss->rate) == 0);
+ pa_assert(pa_atou(ch, &channels) == 0);
+ ss->channels = (uint8_t) channels;
+
+ if (map) {
+ const char *m = pa_proplist_gets(f->plist, PA_PROP_FORMAT_CHANNEL_MAP);
+ pa_channel_map_init(map);
+
+ if (m)
+ pa_assert(pa_channel_map_parse(map, m) != NULL);
+ }
+}
+
+/* For compressed streams */
+void pa_format_info_to_sample_spec_fake(pa_format_info *f, pa_sample_spec *ss) {
+ const char *r;
+
+ pa_assert(f);
+ pa_assert(ss);
+ pa_assert(f->encoding != PA_ENCODING_PCM);
+
+ ss->format = PA_SAMPLE_S16LE;
+ ss->channels = 2;
+
+ pa_assert(r = pa_proplist_gets(f->plist, PA_PROP_FORMAT_RATE));
+ pa_assert(pa_atou(r, &ss->rate) == 0);
+}
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index ab702b99..53fcca60 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -291,6 +291,11 @@ pa_tagstruct *pa_tagstruct_command(pa_context *c, uint32_t command, uint32_t *ta
void pa_ext_device_manager_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
void pa_ext_stream_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
+pa_bool_t pa_format_info_is_compatible(pa_format_info *first, pa_format_info *second);
+pa_format_info* pa_format_info_from_sample_spec(pa_sample_spec *ss, pa_channel_map *map);
+void pa_format_info_to_sample_spec(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map);
+void pa_format_info_to_sample_spec_fake(pa_format_info *f, pa_sample_spec *ss);
+
pa_bool_t pa_mainloop_is_our_api(pa_mainloop_api*m);
#endif
diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index 7d026997..a641f248 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -254,6 +254,18 @@ PA_C_DECL_BEGIN
/** For modules: a version string for the module. e.g. "0.9.15" */
#define PA_PROP_MODULE_VERSION "module.version"
+/** For PCM formats: the sample format used as returned by pa_sample_format_to_string() \since 1.0 */
+#define PA_PROP_FORMAT_SAMPLE_FORMAT "format.sample_format"
+
+/** For all formats: the sample rate (unsigned integer) \since 1.0 */
+#define PA_PROP_FORMAT_RATE "format.rate"
+
+/** For all formats: the number of channels (unsigned integer) \since 1.0 */
+#define PA_PROP_FORMAT_CHANNELS "format.channels"
+
+/** For PCM formats: the channel map of the stream as returned by pa_channel_map_snprint() \since 1.0 */
+#define PA_PROP_FORMAT_CHANNEL_MAP "format.channel_map"
+
/** A property list object. Basically a dictionary with ASCII strings
* as keys and arbitrary data as values. \since 0.9.11 */
typedef struct pa_proplist pa_proplist;