[alsa-devel] [PATCH 05/17] firewire-lib: Add support for AMDTP transmit stream and PCM capture

Takashi Sakamoto o-takashi at sakamocchi.jp
Tue Nov 26 11:50:25 CET 2013


(Nov 26 2013 00:27), Clemens Ladisch wrote:
>> -		if (s->dual_wire)
>> +		if (s->direction == AMDTP_TRANSMIT_STREAM) {
>> +			if (s->dual_wire)
>> +				s->transfer_samples = amdtp_read_s16_dualwire;
>> +			else
>> +				s->transfer_samples = amdtp_read_s16;
>> +		} else if (s->dual_wire)
>>   			s->transfer_samples = amdtp_write_s16_dualwire;
>>   		else
>>   			s->transfer_samples = amdtp_write_s16;
>
> It's inconsistent to have braces around the if branch but not around the
> else branch.

OK. I'm sorry but I forget to run checkpatch.pl for this series.

>> +static void amdtp_read_s16(struct amdtp_stream *s,
>> +			   struct snd_pcm_substream *pcm,
>> +			   __be32 *buffer, unsigned int frames)
>> +{
>
>> +			*dst = be32_to_cpu(buffer[c]) << 8;
>
>                                                        >> 8
> (also in _dualwire)

I also took mistakes of this bit-shift in this patch and patch 11.
I should have tested it with S16LE.

 > It might be a good idea to completely drop S16 support.

Please give me a bit time to consider about this.

>> +static void amdtp_read_s32_dualwire(struct amdtp_stream *s,
>> +				     struct snd_pcm_substream *pcm,
>> +				     __be32 *buffer, unsigned int frames)
>> +{
>
>> +	for (i = 0; i < frames; ++i) {
>> +		for (c = 0; c < channels; ++c) {
>> +			*dst =
>> +			     be32_to_cpu(buffer[c]) << 8;
>> +			dst++;
>> +		}
>> +		buffer += 1;
>> +		for (c = 0; c < channels; ++c) {
>> +			*dst =
>> +			     be32_to_cpu(buffer[c]) << 8;
>> +			dst++;
>> +		}
>> +		buffer += s->data_block_quadlets - 1;
>
> This is not correct.
>
> If we assume SYT_INTERVAL = 4, two channels at 192 kHz, and MIDI, the
> samples L1 R1 L2 R2 L3 R3 ... L8 R8 would be arranged in the data
> block's quadlets like four channels at 96 kHz, like this:
>
>    L1 L4 R1 R4 L2 L5 R2 R5 L3 L6 R3 R6 L4 L7 R4 R8 MIDI

This is my fault to create patches. These codes will be correctly 
modified in later patch 11. But I should have notice in this patch...

>> +static void handle_in_packet(struct amdtp_stream *s,
>> +			     unsigned int payload_quadlets,
>> +			     __be32 *buffer)
>
>> +	if (((cip_header[0] & CIP_EOH_MASK) == CIP_EOH) ||
>> +	    ((cip_header[1] & CIP_EOH_MASK) != CIP_EOH) ||
>> +	    ((cip_header[1] & CIP_FMT_MASK) != CIP_FMT_AM)) {
>> +		dev_info(&s->unit->device,
>> +			 "Invalid CIP header for AMDTP: %08X:%08X\n",
>> +			 cip_header[0], cip_header[1]);
>
> If some device sends 'wrong' values for all packets, the log will
> overflow with these messages.  Please use printk_ratelimit().

OK.

>> +	if ((payload_quadlets < 3) ||
>> +	     ((s->flags & CIP_BLOCKING) &&
>> +	      ((cip_header[1] & CIP_SYT_MASK) == CIP_SYT_NO_INFO)))
>
> In the general case, we do not know if the stream is blocking or non-
> blocking, so the driver should always be able to handle (=ignore) no-
> data packets.

OK. And we should consider about AMDTP special non-empty packet for 
no-data, I should have written like this:

#define AMDTP_FDF_NO_DATA 0xff

/* ignore CIP empty packet or AMDTP NO-DATA packet */
if ((payload_quadlets < 3) ||
     ((cip_header[1] & CIP_FDF_MASK) >> CIP_FDF_SFC_SHIFT)  == 
AMDTP_FDF_NO_DATA)))

>> +	data_block_counter = (cip_header[1] & AMDTP_DBC_MASK);
>
> These parentheses are not needed.

OK.

>> +	s->data_block_counter = (s->data_block_counter + data_blocks) & 0xff;
>> +	if (s->data_block_counter != data_block_counter) {
>> +		dev_err(&s->unit->device,
>> +			"Detect uncontinuity of CIP packets\n");
>> +		s->data_block_counter = data_block_counter;
>> +		return;
>> +	}
>
> The correct thing to do would be to insert the missing samples, or to
> stop the stream.

OK. But I remember there are some devices which transmits packets with 
0x0000 in its SYT field (Digidesign 003 Rack, I don't touch its 
development.). So I want to remove these codes if possible.


Thank you.

Takashi Sakamoto



More information about the Alsa-devel mailing list