summaryrefslogtreecommitdiffstats
path: root/src/pulse/format.c
diff options
context:
space:
mode:
authorArun Raghavan <arun.raghavan@collabora.co.uk>2011-02-28 10:53:41 +0530
committerArun Raghavan <arun.raghavan@collabora.co.uk>2011-05-02 10:17:20 +0530
commit3767c9c4e8107a3e78f387466b45384d64644d94 (patch)
tree8e448f8fd687a3dbd25beb83b296b8828f2088f7 /src/pulse/format.c
parentc3839c76377ea7662f29364ae66718e8ac6233af (diff)
format: Add some properties and internal API
The properties will be used by clients to set the sample format, sampling rate, etc. The functions will be used internally.
Diffstat (limited to 'src/pulse/format.c')
-rw-r--r--src/pulse/format.c87
1 files changed, 87 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);
+}