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.
This commit is contained in:
Arun Raghavan 2011-02-28 10:53:41 +05:30
parent c3839c7637
commit 3767c9c4e8
3 changed files with 104 additions and 0 deletions

View file

@ -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);
}

View file

@ -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

View file

@ -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;