diff options
author | Arun Raghavan <arun.raghavan@collabora.co.uk> | 2011-02-28 10:53:41 +0530 |
---|---|---|
committer | Arun Raghavan <arun.raghavan@collabora.co.uk> | 2011-05-02 10:17:20 +0530 |
commit | 3767c9c4e8107a3e78f387466b45384d64644d94 (patch) | |
tree | 8e448f8fd687a3dbd25beb83b296b8828f2088f7 /src/pulse/format.c | |
parent | c3839c76377ea7662f29364ae66718e8ac6233af (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.c | 87 |
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); +} |