[alsa-devel] [alsa-lib][PATCH 3/4] pcm: linear, route: handle linear formats with 20-bit sample on 4 bytes
Takashi Iwai
tiwai at suse.de
Tue Dec 5 15:57:15 CET 2017
On Tue, 05 Dec 2017 15:37:09 +0100,
Takashi Sakamoto wrote:
>
> Hi,
>
> On Dec 5 2017 22:22, Maciej S. Szmigiero wrote:
> >>>> @@ -121,6 +125,7 @@ int snd_pcm_linear_put_index(snd_pcm_format_t
> >> src_format, snd_pcm_format_t dst_f
> >>> endian = 0;
> >>> pwidth = snd_pcm_format_physical_width(dst_format);
> >>> width = snd_pcm_format_width(dst_format);
> >>> + assert(width >= 8 && width <= 32);
> >>> if (pwidth == 24) {
> >>> switch (width) {
> >>> case 24:
> >>
> >> I can understand your intention to insert these assert(), while it's better not to include them in this series of patch.
> >>
> >> A call of 'snd_pcm_format_physical_width()' and 'snd_pcm_format_width()'
> >> returns 4 for 'SNDRV_PCM_FORMAT_IMA_ADPCM'. Furthermore, both of them
> >> returns -EINVAL for 'SNDRV_PCM_FORMAT_MPEG', 'SNDRV_PCM_FORMAT_GSM' and
> >> 'SNDRV_PCM_FORMAT_SPECIAL'. They can bring wrong calculation to the
> >> resampling function, in the worse case result in any fault.
> >
> > snd_pcm_linear_get_index() and snd_pcm_linear_put_index() should
> > be called for linear formats only (like their names suggest).
> >
> > If they were called for 'SNDRV_PCM_FORMAT_IMA_ADPCM' this will result
> > in a negative conversion arrays index.
> > The same goes for formats that return '-EINVAL' as their width.
> >
> > This will mean that an application will try to access these arrays
> > outside of their bounds, which may produce a hard to find bugs.
> > I think it is really better to fail with an assertion failure in such
> > cases.
> >
> >> However, this is another issue, at least out of your aim for this
> >> patchset. It's a kind of bug for wider influence. I think to have
> >> another opportunity to discuss about the way to handle such special
> >> formats in the resampling layer. Would you please post this patchset
> >> again without these assertions?
> >
> > If these assertions are really controversial I will remove it, but please
> > think again about it in the light of the paragraph above.
> > Asserts can also be split out to a separate patch.
>
> Your have correct understanding of this issue. However, it's better for
> us to achieve your aim (addition of the new pcm formats) at first. Then
> we start discussion about better solution to handle the non-Linear
> formats.
>
> In my opinion, addition of constraint of PCM hardware parameters to
> these PCM plugins is preferable to insertion of the assertions,
> because abort inner library is bad idea itself. Proper errors should
> be returned
> to applications in protocol via alsa-lib PCM APIs. It's more friendly to
> usual developers and users.
Well, it's basically moot to discuss about it, as
snd_pcm_lib_linear_get_index() is an internal function, i.e. it's not
supposed to be called from applications.
In that sense, assert() wouldn't be too bad. However, the primary
question is -- would it really catch anything in practice? What drove
you to put that assert() at all?
If a check of the valid formats, then calling snd_pcm_format_linear()
is the safest.
thanks,
Takashi
More information about the Alsa-devel
mailing list