ALSA: firewire-lib: handle the case that empty isochronous packet payload for CIP
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 18 May 2021 13:00:41 +0000 (22:00 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 18 May 2021 16:10:47 +0000 (18:10 +0200)
Two quadlets are at least included in isochronous packet payload for
Common Isochronous Packet (CIP) format in IEC 61883-1. However, it's
better to equip ALSA IEC 61883-1/6 packet streaming engine for contrary
packet.

This commit handles isochronous cycle to process such packet so that the
cycle is skipped.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20210518130048.146596-3-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/amdtp-stream.c

index ac37cd4..fcb70f3 100644 (file)
@@ -656,11 +656,18 @@ static int parse_ir_ctx_header(struct amdtp_stream *s, unsigned int cycle,
        }
 
        if (cip_header_size > 0) {
-               cip_header = ctx_header + 2;
-               err = check_cip_header(s, cip_header, *payload_length,
-                                      data_blocks, data_block_counter, syt);
-               if (err < 0)
-                       return err;
+               if (*payload_length >= cip_header_size) {
+                       cip_header = ctx_header + 2;
+                       err = check_cip_header(s, cip_header, *payload_length, data_blocks,
+                                              data_block_counter, syt);
+                       if (err < 0)
+                               return err;
+               } else {
+                       // Handle the cycle so that empty packet arrives.
+                       cip_header = NULL;
+                       *data_blocks = 0;
+                       *syt = 0;
+               }
        } else {
                cip_header = NULL;
                err = 0;