summaryrefslogtreecommitdiffstats
path: root/src/pulse
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
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')
-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;