From 3767c9c4e8107a3e78f387466b45384d64644d94 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Mon, 28 Feb 2011 10:53:41 +0530 Subject: [PATCH] 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. --- src/pulse/format.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pulse/internal.h | 5 +++ src/pulse/proplist.h | 12 ++++++++ 3 files changed, 104 insertions(+) diff --git a/src/pulse/format.c b/src/pulse/format.c index 372ae1c..c3962de 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 ab702b9..53fcca6 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 7d02699..a641f24 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; -- 2.7.4