[alsa-devel] alsa-lib rate plugins - float samples - patches

Pavel Hofman pavel.hofman at ivitera.com
Fri Jul 1 11:27:03 CEST 2011


Dne 30.6.2011 14:48, Takashi Iwai napsal(a):
> At Tue, 28 Jun 2011 09:11:02 +0200,
> 
> Thanks for the patches.
> The basic strategy looks good to me, but a few things to be considered:
> 
> - The extension of API should be done in binary-compatible way; i.e.
>   append new stuff to the existing structure, not inserting in the
>   middle.  In that way, you can use still old plugins.

Hi Takashi, thanks a lot for your reply. Would moving the new method to
the end of snd_pcm_rate_ops struct suffice? Or do I have to create a new
API number with corresponding checks? I am afraid the latter is the case :)

> 
> - From the performance POV, we may need to have the built-in
>   float conversion in rate plugin indeed.  Anyway, if rate plugin
>   supports float, it should add FLOAT as the supported format.
>   This needs changes in the parameter setup in rate plugin.
>   Then it should accept the float format as is without conversions.

If I understand correctly, the rate plugin accepts only linear formats
now. What was the original reason to exclude float? The "convert" API
method is generic enough, perhaps I should add float support to all the
rate converters using the API "convert" method. Again there is the
question of new API version - the new one would offer convert_float and
allow float samples in the generic convert method.

The specific convert_s16/float methods in pcm_rate.c can be modified to
accept float too.

> 
> - The float-support has to be disabled when the float is suppressed
>   via configure option.  Also this needs to be exposed somehow to the
>   plugin.

Is softfloat/HAVE_SOFT_FLOAT the corresponding configure option? BTW, is
the ifndef check in pcm_softvol.c correct?

#ifndef HAVE_SOFT_FLOAT
                svol->dB_value = calloc(resolution, sizeof(unsigned int));
                if (! svol->dB_value) {
                        SNDERR("cannot allocate dB table");
                        return -ENOMEM;
                }
                svol->min_dB = min_dB;
                svol->max_dB = max_dB;
                for (i = 0; i <= svol->max_val; i++) {
                        double db = svol->min_dB + (i * (svol->max_dB -
svol->min_dB)) / svol->max_val;
                        double v = (pow(10.0, db / 20.0) * (double)(1 <<
VOL_SCALE_SHIFT));
                        svol->dB_value[i] = (unsigned int)v;
                }
                if (svol->zero_dB_val)
                        svol->dB_value[svol->zero_dB_val] = 65535;
#else
                SNDERR("Cannot handle the given dB range and resolution");
                return -EINVAL;
#endif

It occurs to me the check should be ifdef, but perhaps I just get it
wrong :)

> 
> - At best, the rate converters (plugin of plugin) should support both
>   cases with and without float.

Well, the libsamplerate is using float internally, I am afraid the
float-less case would require disabling this rate converter alltogether.

Thanks a lot for your help and guidance.

Pavel.


More information about the Alsa-devel mailing list