ALSA: firewire-motu: add a flag for chunks for main 1/2 out
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 18 Jun 2018 12:07:52 +0000 (21:07 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 19 Jun 2018 18:44:47 +0000 (20:44 +0200)
This driver explicitly assumes that all of supported models have main data
chunk separated from chunk for analog ports. However, MOTU Traveler doesn't
support the separated main data chunk.

This commit adds a flag for the separated main data chunk.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/motu/motu-protocol-v2.c
sound/firewire/motu/motu-protocol-v3.c
sound/firewire/motu/motu.c
sound/firewire/motu/motu.h

index a51fd196d884b03ae8baa3c8253bb56d1bbba885..614f9b11e010fccf8a2ddee193617ed0dcc336ab 100644 (file)
@@ -149,11 +149,15 @@ static void calculate_fixed_part(struct snd_motu_packet_format *formats,
                        pcm_chunks[1] += 2;
                }
        } else {
-               /*
-                * Packets to v2 units transfer main-out-1/2 and phone-out-1/2.
-                */
-               pcm_chunks[0] += 4;
-               pcm_chunks[1] += 4;
+               if (flags & SND_MOTU_SPEC_RX_SEPARETED_MAIN) {
+                       pcm_chunks[0] += 2;
+                       pcm_chunks[1] += 2;
+               }
+
+               // Packets to v2 units include 2 chunks for phone 1/2, except
+               // for 176.4/192.0 kHz.
+               pcm_chunks[0] += 2;
+               pcm_chunks[1] += 2;
        }
 
        /*
index c7cd9864dc4d23b686c2e55059da6d1b8551c7c2..293353991591fe251b01a80db9dec468a8ebdd2a 100644 (file)
@@ -188,11 +188,15 @@ static void calculate_fixed_part(struct snd_motu_packet_format *formats,
                        pcm_chunks[1] += 2;
                }
        } else {
-               /*
-                * Packets to v2 units transfer main-out-1/2 and phone-out-1/2.
-                */
-               pcm_chunks[0] += 4;
-               pcm_chunks[1] += 4;
+               if (flags & SND_MOTU_SPEC_RX_SEPARETED_MAIN) {
+                       pcm_chunks[0] += 2;
+                       pcm_chunks[1] += 2;
+               }
+
+               // Packets to v3 units include 2 chunks for phone 1/2, except
+               // for 176.4/192.0 kHz.
+               pcm_chunks[0] += 2;
+               pcm_chunks[1] += 2;
        }
 
        /*
index 0d6b526105ab08b8e905f2988548d3662ff37302..445aa589582d4625c4a66be2fe031f9be36e0069 100644 (file)
@@ -200,6 +200,7 @@ static const struct snd_motu_spec motu_828mk2 = {
        .flags = SND_MOTU_SPEC_SUPPORT_CLOCK_X2 |
                 SND_MOTU_SPEC_TX_MICINST_CHUNK |
                 SND_MOTU_SPEC_TX_RETURN_CHUNK |
+                SND_MOTU_SPEC_RX_SEPARETED_MAIN |
                 SND_MOTU_SPEC_HAS_OPT_IFACE_A |
                 SND_MOTU_SPEC_RX_MIDI_2ND_Q |
                 SND_MOTU_SPEC_TX_MIDI_2ND_Q,
@@ -216,6 +217,7 @@ static const struct snd_motu_spec motu_828mk3 = {
                 SND_MOTU_SPEC_TX_MICINST_CHUNK |
                 SND_MOTU_SPEC_TX_RETURN_CHUNK |
                 SND_MOTU_SPEC_TX_REVERB_CHUNK |
+                SND_MOTU_SPEC_RX_SEPARETED_MAIN |
                 SND_MOTU_SPEC_HAS_OPT_IFACE_A |
                 SND_MOTU_SPEC_HAS_OPT_IFACE_B |
                 SND_MOTU_SPEC_RX_MIDI_3RD_Q |
@@ -231,6 +233,7 @@ static const struct snd_motu_spec motu_audio_express = {
        .flags = SND_MOTU_SPEC_SUPPORT_CLOCK_X2 |
                 SND_MOTU_SPEC_TX_MICINST_CHUNK |
                 SND_MOTU_SPEC_TX_RETURN_CHUNK |
+                SND_MOTU_SPEC_RX_SEPARETED_MAIN |
                 SND_MOTU_SPEC_RX_MIDI_2ND_Q |
                 SND_MOTU_SPEC_TX_MIDI_3RD_Q,
        .analog_in_ports = 2,
index 4b23cf337c4bec535172f289186fefb295919697..bced0407179e16bbf8b8549555d3da86b799b711 100644 (file)
@@ -86,6 +86,7 @@ enum snd_motu_spec_flags {
        SND_MOTU_SPEC_RX_MIDI_3RD_Q     = 0x0200,
        SND_MOTU_SPEC_TX_MIDI_2ND_Q     = 0x0400,
        SND_MOTU_SPEC_TX_MIDI_3RD_Q     = 0x0800,
+       SND_MOTU_SPEC_RX_SEPARETED_MAIN = 0x1000,
 };
 
 #define SND_MOTU_CLOCK_RATE_COUNT      6