[pulseaudio-discuss] [PATCH RFCv3 43/51] core: Add volume-util.h

Peter Meerwald pmeerw at pmeerw.net
Mon Nov 10 01:45:02 PST 2014


Hallo,

> >>>> implement inlineable functions PA_CVOLUME_VALID(),
> >>>> PA_CVOLUME_CHANNELS_EQUALS_TO(), PA_CVOLUME_IS_MUTED(),
> >>>> PA_CVOLUME_IS_NORM() that assume data is valid
> >>>
> >>> Why are these uppercase? AFAIK, we don't usually uppercase inline
> functions.
> >>
> >> I've modelled after e.g. PA_ALIGN_PTR() in pulsecore/macro.h or
> >> PA_SOURCE_IS_LINKED() in source.h
> >>
> >> I think there is no clear rule; I'd prefer PA_CVOLUME_IS_NORM() to
> >> pa_cvolume_is_norm_internal() or pa_cvolume_is_norm_unchecked()
> >>
> >> thanks, p.
> >
> > My preference is lower case for functions (I suspect the exceptions
> > began as macros).
> 
> My preference is to avoid uppercase too. I think it's okay to move the 
> pa_assert to pa_assert_fp in general if the asserts end up being CPU 
> intensive - rather than making one pa_cvolume_is_norm() and one 
> pa_cvolume_is_norm_unchecked() function.

there is the issue of 
* inlineability (function under pulse/ are API/ABI)
* avoiding checks with NDEBUG
* naming (I'm fine with lowercase)

I suggest to add new functions under pulsecore/ that mirror those under 
pulse/ but are inlineable and do less checking

let's take pa_cvolume_channels_equal_to() in pulse/volume.c as an example:

int pa_cvolume_channels_equal_to(const pa_cvolume *a, pa_volume_t v) {
    unsigned c;
    pa_assert(a);

    pa_return_val_if_fail(pa_cvolume_valid(a), 0);
    pa_return_val_if_fail(PA_VOLUME_IS_VALID(v), 0);

    for (c = 0; c < a->channels; c++)
        if (a->values[c] != v)
            return 0;

    return 1;
}

the function is called often in critial paths, non-inlineable and the 
checks don't go away with NDEBUG since they use pa_return_val_if_fail() 
and are mandated by the API

so I'd suggest to add a function pa_cvolume_channels_equal_to_internal() 
in pulsecore/volume-util.h:

static inline int pa_cvolume_channels_equal_to_internal(const pa_cvolume 
*a, pa_volume_t v) {
    unsigned c;
    pa_assert_fp(a);

    pa_assert_fp(pa_cvolume_valid(a), 0);
    pa_assert_fp(PA_VOLUME_IS_VALID(v), 0);

    for (c = 0; c < a->channels; c++)
        if (a->values[c] != v)
            return 0;

    return 1;
}

this results in
(1) the name is rather long and ugly, yet lowercase
(2) the function is inlineable and not part of the API/ABI
(3) checks will be go away with OPTIMIZE or NDEBUG, the behaviour is 
DIFFERENT compared to pa_cvolume_channels_equal_to() -- the 
assumption is that cvolumes and volumes are always valid internally

regards, p.

-- 

Peter Meerwald
+43-664-2444418 (mobile)


More information about the pulseaudio-discuss mailing list