[PATCH v5] sound: rawmidi: Add framing mode

Jaroslav Kysela perex at perex.cz
Mon Apr 19 10:14:57 CEST 2021


Dne 19. 04. 21 v 9:34 Takashi Iwai napsal(a):
> On Mon, 19 Apr 2021 08:22:50 +0200,
> David Henningsson wrote:
>>
>>
>> On 2021-04-18 20:24, Jaroslav Kysela wrote:
>>> Dne 18. 04. 21 v 17:12 David Henningsson napsal(a):
>>>
>>>> +#define SND_RAWMIDI_FRAMING_DATA_LENGTH 16
>>> SNDRV_ prefix should be here.
>>
>> Ack
>>
>>>
>>>> +
>>>> +struct snd_rawmidi_framing_tstamp {
>>>> +	/* For now, frame_type is always 0. Midi 2.0 is expected to add new
>>>> +	 * types here. Applications are expected to skip unknown frame types.
>>>> +	 */
>>>> +	u8 frame_type;
>>>> +	u8 length; /* number of valid bytes in data field */
>>>> +	u8 reserved[2];
>>>> +	u32 tv_nsec;		/* nanoseconds */
>>>> +	u64 tv_sec;		/* seconds */
>>>> +	u8 data[SND_RAWMIDI_FRAMING_DATA_LENGTH];
>>> What about to move the fields to union (except for frame_type) like we do for
>>> 'struct snd_ctl_event' in case when we need to reorganize the contents for
>>> future types?
>>
>> So the two degrees of freedom would be
>>
>> 1) the SNDRV_RAWMIDI_MODE_FRAMING_32BYTES indicates that the frame
>> size is 32 bytes and the first byte of that frame is frame_type
>>
>> 2) the frame_type of every frame indicates the format of the other 31
>> bytes, and an application is expected to ignore unknown frame_types,
>> so we can add new frame_types in a backwards compatible way.
>>
>> We'll end up with:
>>
>> struct snd_rawmidi_framing_32bytes {
>>     u8 frame_type;
>>     union {
>>         struct {
>>             u8 length; /* number of valid bytes in data field */
>>             u8 reserved[2];
>>             u32 tv_nsec;        /* nanoseconds */
>>             u64 tv_sec;        /* seconds */
>>             u8 data[SNDRV_RAWMIDI_FRAMING_32BYTES_FOO_LENGTH];
>>         } foo;
>>         u8 reserved[31];
>>     } data;
>> };
>>
>> ...except I don't know what we should replace foo with. We can't call
>> it "midi1" or "type0" or such because many different frame_types might
>> share the same interior format.
> 
> I thought of the use of union, but concluded that it doesn't give any
> good benefit.  Practically seen, defining two structs would be far
> easier, and if you want to code something in user-space for another
> new frame format, you would just use the new struct as is, as long as
> the size fits correctly.

Ok.

>>> As I noted, I would prefer to add 'unsigned int mode;' and define
>>> SNDRV_RAWMID_MODE_XXX bit flags and groups with framing and clock_type groups.
>>> There's no reason to stick with 'clockid_t' (which is integer anyway). We're
>>> using just a subset.
>>>
>>> #define SNDRV_RAWMIDI_MODE_FRAMING_MASK        (7<<0)
>>> #define SNDRV_RAWMIDI_MODE_FRAMING_SHIFT       0
>>> #define SNDRV_RAWMIDI_MODE_FRAMING_NONE	       (0<<0)
>>> #define SNDRV_RAWMIDI_MODE_FRAMING_32BYTES     (1<<0)
>>> #define SNDRV_RAWMIDI_MODE_CLOCK_MASK          (7<<3)
>>> #define SNDRV_RAWMIDI_MODE_CLOCK_SHIFT         3
>>> #define SNDRV_RAWMIDI_MODE_CLOCK_NONE	       (0<<3)
>>> #define SNDRV_RAWMIDI_MODE_CLOCK_REALTIME      (1<<3)
>>> #define SNDRV_RAWMIDI_MODE_CLOCK_MONOTONIC     (2<<3)
>>> #define SNDRV_RAWMIDI_MODE_CLOCK_MONOTONIC_RAW (3<<3)
>>>
>>> In this case, we can use 26-bits in future for extensions.
>>
>> Well, for me this is mostly bikeshedding. But as long as you and
>> Takashi can't agree on whether bitfields/bimasks/etc are good or bad,
>> I'm just stuck between the two of you and can't actually improve
>> Linux's capability to be a great pro audio OS, and that is utterly
>> frustrating. I don't care if the two of you decides who's going to win
>> this through this list, a conference call, a game of SuperTuxKart or
>> thumb wrestling, just reach consensus somehow. Okay?
> 
> Oh, don't get me wrong, I have no objection to the bit flags at all.
> My objection was against the use of C language bit-fields
> (e.g. unsigned int foo:5) as Jaroslav suggested in his earlier reply.
> That's not portable, hence unsuitable for ioctl structs.  OTOH, the
> explicit bit flags are very common in ABI definitions.
> 
> And I have no strong opinion on the flag definitions.  I find it OK to
> keep two uchar fields (that are mostly enough for near future
> extensions), but having a 32bit full bit flag would be of course OK
> from ABI design POV (and one less code in the compat function).
> 
> That said, there is no disagreement about the flag definition at all.
> You can pick up what you believe the best.

I have two reasons to pick the flags rather uchar fields (a bit non-standard
in the ALSA ioctl API):

1) save bits for future use
2) align to 4 bytes - with 2 uchar, we have 2 bytes pad

So, instead to split the 4 bytes from the reserved area, allocate the whole
32-bit word and allocate bits from it.

					Jaroslav

-- 
Jaroslav Kysela <perex at perex.cz>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.


More information about the Alsa-devel mailing list