[PATCH v4] sound: rawmidi: Add framing mode

Takashi Iwai tiwai at suse.de
Mon Apr 12 13:17:39 CEST 2021


On Mon, 12 Apr 2021 12:26:49 +0200,
Jaroslav Kysela wrote:
> 
> Dne 12. 04. 21 v 12:04 Takashi Iwai napsal(a):
> > On Mon, 12 Apr 2021 11:43:02 +0200,
> > Jaroslav Kysela wrote:
> >>
> >> Dne 12. 04. 21 v 11:31 Takashi Iwai napsal(a):
> >>> On Sun, 11 Apr 2021 19:52:21 +0200,
> >>> Jaroslav Kysela wrote:
> >>>>>>>   struct snd_rawmidi_params {
> >>>>>>>   	int stream;
> >>>>>>>   	size_t buffer_size;		/* queue size in bytes */
> >>>>>>>   	size_t avail_min;		/* minimum avail bytes for wakeup */
> >>>>>>>   	unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */
> >>>>>>> -	unsigned char reserved[16];	/* reserved for future use */
> >>>>>>> +	unsigned char framing;		/* For input data only, frame incoming data */
> >>>>>> We can move this flag to above 32-bit word (no_active_sensing). I'm not sure,
> >>>>>> if we need 8 bits for this. It's first change after 20 years. Another flag may
> >>>>>> obsolete this one.
> >>>>>
> >>>>> Not sure what you mean by this, could you show the code? Framing is an 
> >>>>> enum rather than a flag, in case we find other framing formats with 
> >>>>> other sizes that would obsolete this one.
> >>>>
> >>>> unsigned int no_active_sensing: 1;
> >>>> unsigned int framing32: 1;
> >>>> unsigned int framing64: 1; /* future extension, framing32 == 0 in this case */
> >>>>
> >>>> or:
> >>>>
> >>>> unsigned int framing_mode: 3;	/* three bits for future types */
> >>>>
> >>>> perhaps also:
> >>>>
> >>>> unsigned int clock_type: 3;	/* three bits for the clock type selection */
> >>>
> >>> The usage of bit fields in an ioctl struct is a bad idea from the
> >>> compat layer POV.  Let's avoid it.
> >>
> >> What exactly do you mean?
> > 
> > The compat layer has the hard time to deal with the conversion of bit
> > fields to a different struct.  And, it's a nightmare for the emulator
> > like QEMU.  If it has to convert the ioctl struct, it has to consider
> > about the byte order as well (and there is no strict definition how to
> > put the bit fields in C language).
> 
> The endianness of the 32-bit word can be changed quite easily - and the
> situation is similar to bit flags stored in the 32-bit word. Nobody prevents
> QEMU to work with the whole 32-bit word instead bit fields in this case.

And how you assure that the bit field is set to which bit position?
There is no guarantee defined in C language about that.

> The linux compat layer may copy the whole 32-bit word, too.
> 
> I think that your argument is not so strong here.

Oh please, this is my experience years ago while discussing with the
QEMU developers in the past.  Using a bit field for an ioctl struct is
a horrible idea, after all.

> > That said, a bit field can be useful for the internal object
> > definition (if there is no racy access), but not for an object for the
> > communication that may be interpreted among different architectures.
> 
> In this case, we have 31 free bits and this information can be stored there. I
> would prefer to keep the reserved bytes for some large fields.

Again, C language doesn't define the position of the bit fields.
That's the primary problem.

If we really have to save the space, it's a nice workaround.  But for
other purposes, there is really little merit and more flip side by
that.


Takashi


More information about the Alsa-devel mailing list