[alsa-devel] [PATCH 06/39] firewire-lib: Add support for MIDI capture/playback

Clemens Ladisch clemens at ladisch.de
Sun Mar 9 21:48:26 CET 2014


Takashi Sakamoto wrote:
> For capturing/playbacking MIDI messages, this commit adds one MIDI conformant
> data channel. This channel supports 8 MPX-MIDI data streams then maximum number
> of supported MIDI ports is limited by 8.
>
> And this commit allows to set PCM format even if AMDTP stream already starts.
> I suppose the case that PCM stream is going to be joined into AMDTP streams after
> AMDTP stream is already started by MIDI. Each driver must count how many MIDI
> substreams use AMDTP stream to stop AMDTP stream.
>
> IEC 61883-6 refers to AMEI/MMA RP-027 for implementation of MIDI conformant
> data. In the specification, 'MIDI1.0-2x/3x-SPEED' mode are described with
> 'negotiation procedure' and 'encapsulation details'. But there is no
> specifications to define them. This module implement 'MIDI1.0-1x-SPEED' mode.

> +++ b/sound/firewire/amdtp.c
> @@ -505,11 +509,46 @@ static void amdtp_fill_pcm_silence(struct amdtp_stream *s,
>  static void amdtp_fill_midi(struct amdtp_stream *s,

> +	unsigned int f, port;
> +	u8 *b;
> +
> +	for (f = 0; f < frames; f++) {
> +		buffer[s->pcm_channels + 1] = 0x00;

This is a 32-bit value.

> +		b = (u8 *)&buffer[s->pcm_channels + 1];
> +
> +		port = (s->data_block_counter + f) % 8;
> +		if ((s->midi[port] == NULL) ||
> +		    (snd_rawmidi_transmit(s->midi[port], b + 1, 1) <= 0)) {
> +			b[0] = 0x80;
> +			b[1] = 0x00;	/* confirm to be zero */

snd_rawmidi_transmit() will not write an unsused byte, and in any
case, zero can be a valid MIDI data byte.

> +static void amdtp_pull_midi(struct amdtp_stream *s,
> +			    __be32 *buffer, unsigned int frames)
> +{
> +	for (f = 0; f < frames; f++) {
> ...
> +		if (s->midi[port] == NULL)
> +			continue;
> +
> +		snd_rawmidi_receive(s->midi[port], b + 1, len);
> +		buffer += s->data_block_quadlets;
> +	}

The buffer pointer must be increased even when there is no active port.

> +++ b/sound/firewire/amdtp.h
>  /**
> + * amdtp_stream_pcm_running - check PCM stream is running or not
> + * @s: the AMDTP stream
> + *
> + * If this function returns true, PCM stream in the stream is running.
> + */
> +static inline bool amdtp_stream_pcm_running(struct amdtp_stream *s)
> +{
> +	return !IS_ERR_OR_NULL(s->pcm);
> +}

fw_iso_context_create() can return an error code, but for s->pcm,
all the IS_ERR stuff is not necessary.  This should be a plain NULL
check.


Regards,
Clemens


More information about the Alsa-devel mailing list