ALSA: fireworks/firewire-lib: Add a quirk of data blocks for MIDI in out-stream
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Fri, 25 Apr 2014 13:45:10 +0000 (22:45 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 26 May 2014 12:28:14 +0000 (14:28 +0200)
Fireworks has a quirk to ignore MIDI messages in data blocks more than 8.
This commit adds a flag for this quirk and codes to skip 8 or more data
blocks to transfer MIDI messages.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/amdtp.c
sound/firewire/amdtp.h
sound/firewire/fireworks/fireworks_stream.c

index 5e13b3f..28ee3d8 100644 (file)
@@ -78,6 +78,8 @@ int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
        s->callbacked = false;
        s->sync_slave = NULL;
 
+       s->rx_blocks_for_midi = UINT_MAX;
+
        return 0;
 }
 EXPORT_SYMBOL(amdtp_stream_init);
@@ -472,7 +474,8 @@ static void amdtp_fill_midi(struct amdtp_stream *s,
                b = (u8 *)&buffer[s->midi_position];
 
                port = (s->data_block_counter + f) % 8;
-               if ((s->midi[port] == NULL) ||
+               if ((f >= s->rx_blocks_for_midi) ||
+                   (s->midi[port] == NULL) ||
                    (snd_rawmidi_transmit(s->midi[port], b + 1, 1) <= 0))
                        b[0] = 0x80;
                else
index 42c75c9..fb5934c 100644 (file)
@@ -125,6 +125,9 @@ struct amdtp_stream {
        /* quirk: fixed interval of dbc between previos/current packets. */
        unsigned int tx_dbc_interval;
 
+       /* quirk: the first count of data blocks in an rx packet for MIDI */
+       unsigned int rx_blocks_for_midi;
+
        bool callbacked;
        wait_queue_head_t callback_wait;
        struct amdtp_stream *sync_slave;
index 3a3f203..f9d836f 100644 (file)
@@ -212,6 +212,11 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
                destroy_stream(efw, &efw->tx_stream);
                goto end;
        }
+       /*
+        * Fireworks ignores MIDI messages in more than first 8 data
+        * blocks of an received AMDTP packet.
+        */
+       efw->rx_stream.rx_blocks_for_midi = 8;
 
        /* set IEC61883 compliant mode (actually not fully compliant...) */
        err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883);