Bug#789250: bs1770gain: Fail to build on archs with strict alignment requirements

Peter Belkner pbelkner at snafu.de
Wed Jun 24 11:29:26 UTC 2015



On 24.06.2015 12:41, Petter Reinholdtsen wrote:
> [Peter Belkner]
>> BS1770GAIN doesn't make any assumption on buffer alignment itself
>> (i.e.  it relies on FFmpeg), and so myself. Are there any hints that
>> FFmpeg is broken on the systems in question?
> I do not know.  But I am more worried about other alignment problems
> being hidden if the warning is disabled.
>
>> You may use SoX to generate test files.
> Thank you.  I'll try to figure out how to use sox for this.  In the mean
> time, I tested on mips if I could find a way to tell the compiler that
> the pointer is expected to have the correct alignment, and this patch
> solve the build problem related to AVFrame.data:
>
> --- bs1770gain-0.4.3.orig/libffsox-2/ffsox_frame_convert.c
> +++ bs1770gain-0.4.3/libffsox-2/ffsox_frame_convert.c
> @@ -140,10 +140,10 @@ static int convert_##r##i##_##w##i(conve
>     R *rp; \
>     W *wp,*mp; \
>    \
> -  rp=(R *)p->fr->frame->data[0]; \
> +  rp=(R *)(void*)p->fr->frame->data[0]; \
>     rp+=channels*p->fr->nb_samples.frame; \
>    \
> -  wp=(W *)p->fw->frame->data[0]; \
> +  wp=(W *)(void*)p->fw->frame->data[0]; \
>     wp+=channels*p->fw->nb_samples.frame; \
>     mp=wp+channels*p->nb_samples; \
>    \
> @@ -281,11 +281,11 @@ static int convert_##r##p##_##w##i(conve
>     W *wp,*mp; \
>    \
>     for (ch=0;ch<channels;++ch) { \
> -    rp[ch]=(R *)p->fr->frame->data[ch]; \
> +    rp[ch]=(R *)(void*)p->fr->frame->data[ch]; \
>       rp[ch]+=p->fr->nb_samples.frame; \
>     } \
>    \
> -  wp=(W *)p->fw->frame->data[0]; \
> +  wp=(W *)(void*)p->fw->frame->data[0]; \
>     wp+=channels*p->fw->nb_samples.frame; \
>     mp=wp+channels*p->nb_samples; \
>    \
> --- bs1770gain-0.4.3.orig/libffsox-2/ffsox_frame_convert_sox.c
> +++ bs1770gain-0.4.3/libffsox-2/ffsox_frame_convert_sox.c
> @@ -98,10 +98,10 @@ static void convert_##sfx##i(convert_t *
>    \
>     (void)ch; \
>    \
> -  rp=(T *)p->fr->frame->data[0]; \
> +  rp=(T *)(void*)p->fr->frame->data[0]; \
>     rp+=channels*p->fr->nb_samples.frame; \
>    \
> -  wp=(sox_sample_t *)p->fw->frame->data[0]; \
> +  wp=(sox_sample_t *)(void*)p->fw->frame->data[0]; \
>     wp+=channels*p->fw->nb_samples.frame; \
>     mp=wp+channels*p->nb_samples; \
>    \
> @@ -184,11 +184,11 @@ static void convert_##sfx##p(convert_t *
>     SOX_SAMPLE_LOCALS; \
>    \
>     for (ch=0;ch<channels;++ch) { \
> -    rp[ch]=(T *)p->fr->frame->data[ch]; \
> +    rp[ch]=(T *)(void*)p->fr->frame->data[ch]; \
>       rp[ch]+=p->fr->nb_samples.frame; \
>     } \
>    \
> -  wp=(sox_sample_t *)p->fw->frame->data[0]; \
> +  wp=(sox_sample_t *)(void*)p->fw->frame->data[0]; \
>     wp+=channels*p->fw->nb_samples.frame; \
>     mp=wp+channels*p->nb_samples; \
>    \
>
> I like this approach better, as it do not disable strict alignment
> checking for the entire code, but only for the selected parts where it
> is believed to be OK to disable it.  So I plan to keep the
> -Wstrict-align warning in place for the Debian package for now.

OK.

>
> Changing the code like that exposes another build error, the cast to
> (pull_cb_t) from char * done in this function:
>
>    static int getopts(sox_effect_t *e, int argc, char *argv[])
>    {
>      priv_t *priv=e->priv;
>
>      priv->cb=1<argc?(pull_cb_t)argv[1]:NULL;
>      priv->data=2<argc?(void *)argv[2]:NULL;
>
>      return SOX_SUCCESS;
>    }
>
> I do not quite understand why a char * is used to store a function
> pointer, and am thus reluctant to add (void*) until it is analyzed a bit
> better.

It's a similar problem with the SoX API. The SoX API requires one to 
pass arguments to an effect via the function "int 
sox_effect_options(sox_effect_t *effp, int argc, char * const argv[])" 
(http://sox.sourceforge.net/libsox.html), i.e. as "char * const argv[]". 
In the effect's "getopts()" method, the effect has to cast back the real 
type of the argument.

It's C after all.

If you like you can avoid the warning also by an additional "(void *)" cast.



More information about the pkg-multimedia-maintainers mailing list