[pulseaudio-discuss] [PATCH 7/7] format: Add API to query a property's type
Arun Raghavan
arun.raghavan at collabora.co.uk
Tue Feb 7 11:04:05 PST 2012
On Tue, 2012-02-07 at 10:26 +0100, David Henningsson wrote:
> On 02/07/2012 09:20 AM, Arun Raghavan wrote:
> > Since a given property can be single-valued, an array or (in the case of
> > ints) a range, clients need an API to figure out what type of value a
> > property holds. This adds such an API. The actual property type
> > enumeration is kept in the PA_PROP_* namespace and not the
> > PA_FORMAT_INFO* namespace so that it can later be reused for properties
> > generically if required.
> > ---
> > src/map-file | 1 +
> > src/pulse/format.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++
> > src/pulse/format.h | 24 +++++++++++++++
> > src/tests/format-test.c | 5 +++
> > 4 files changed, 104 insertions(+), 0 deletions(-)
> >
> > diff --git a/src/map-file b/src/map-file
> > index ee3d31d..5730fdf 100644
> > --- a/src/map-file
> > +++ b/src/map-file
> > @@ -168,6 +168,7 @@ pa_format_info_free;
> > pa_format_info_free2;
> > pa_format_info_from_string;
> > pa_format_info_from_sample_spec;
> > +pa_format_info_get_prop_type;
> > pa_format_info_get_prop_int;
> > pa_format_info_get_prop_int_range;
> > pa_format_info_get_prop_int_array;
> > diff --git a/src/pulse/format.c b/src/pulse/format.c
> > index 6176846..aee3dfc 100644
> > --- a/src/pulse/format.c
> > +++ b/src/pulse/format.c
> > @@ -280,6 +280,80 @@ int pa_format_info_to_sample_spec_fake(pa_format_info *f, pa_sample_spec *ss) {
> > return 0;
> > }
> >
> > +pa_prop_type_t pa_format_info_get_prop_type(pa_format_info *f, const char *key) {
> > + const char *str;
> > + json_object *o, *o1;
> > + pa_prop_type_t type;
> > +
> > + pa_assert(f);
> > + pa_assert(key);
> > +
> > + str = pa_proplist_gets(f->plist, key);
> > + if (!str)
> > + return PA_PROP_TYPE_INVALID;
> > +
> > + o = json_tokener_parse(str);
> > + if (is_error(o))
> > + return PA_PROP_TYPE_INVALID;
> > +
> > + switch (json_object_get_type(o)) {
> > + case json_type_int:
> > + type = PA_PROP_TYPE_INT;
> > + break;
> > +
> > + case json_type_string:
> > + type = PA_PROP_TYPE_STRING;
> > + break;
> > +
> > + case json_type_array:
> > + if (json_object_array_length(o) == 0) {
> > + /* Unlikely, but let's account for this anyway. We need at
> > + * least one element to figure out the array type. */
> > + type = PA_PROP_TYPE_INVALID;
> > + break;
> > + }
> > +
> > + o1 = json_object_array_get_idx(o, 1);
> > +
> > + if (json_object_get_type(o1) == json_type_int)
> > + type = PA_PROP_TYPE_INT_ARRAY;
> > + else if (json_object_get_type(o1) == json_type_string)
> > + type = PA_PROP_TYPE_STRING_ARRAY;
> > + else
> > + type = PA_PROP_TYPE_INVALID;
> > +
> > + json_object_put(o1);
> > + break;
> > +
> > + case json_type_object:
> > + /* We actually know at this point that it's a int range, but let's
> > + * confirm. */
> > + o1 = json_object_object_get(o, PA_JSON_MIN_KEY);
> > + if (!o1) {
> > + type = PA_PROP_TYPE_INVALID;
> > + break;
> > + }
> > + json_object_put(o1);
> > +
> > + o1 = json_object_object_get(o, PA_JSON_MIN_KEY);
>
> Shouldn't this be PA_JSON_MAX_KEY - and if it should, how come that the
> test succeed anyway? (Assuming you have actually tested that it does
> before submitting?)
The test succeeds because we're testing the same thing twice in this
code, so it's true both times. Crafting a case that causes this test to
fail would be quite painful (the actual condition for the range case. as
I've documented, is more out of paranoia than actual necessity).
-- Arun
More information about the pulseaudio-discuss
mailing list