]> code.delx.au - pulseaudio/commitdiff
format: Add some properties and internal API
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Mon, 28 Feb 2011 05:23:41 +0000 (10:53 +0530)
committerArun Raghavan <arun.raghavan@collabora.co.uk>
Mon, 2 May 2011 04:47:20 +0000 (10:17 +0530)
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
src/pulse/internal.h
src/pulse/proplist.h

index 372ae1c5d1b7222fd4900b8c0a4b1e135b0e9058..c3962de9303e52bbdc06fac7e3fae97e0d4695eb 100644 (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);
+}
index ab702b99b5e2af4b55f465b6d6831620537a1d78..53fcca60c76b412b307a667b211baf9e9688ceab 100644 (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
index 7d0269978f0747df7f13e575784dc117c5d8b17d..a641f248d5644788b518850ed1a560a323ff923a 100644 (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;