OSDN Git Service

ALSA: firewire-motu: detect SPH source of sampling clock
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 30 Oct 2019 08:06:41 +0000 (17:06 +0900)
committerTakashi Iwai <tiwai@suse.de>
Wed, 30 Oct 2019 09:57:54 +0000 (10:57 +0100)
In MOTU FireWire series, devices have a mode to generate sampling clock
from a sequence of source packet header (SPH) included in each data block
of received packet. This mode is used for several purposes such as mode
for SMPTE time code, sync to the other sound cards and so on.

This commit adds support for the SPH mode.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20191030080644.1704-4-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/motu/motu-pcm.c
sound/firewire/motu/motu-proc.c
sound/firewire/motu/motu-protocol-v2.c
sound/firewire/motu/motu-protocol-v3.c
sound/firewire/motu/motu.h

index 55d3d66..490408b 100644 (file)
@@ -159,7 +159,8 @@ static int pcm_open(struct snd_pcm_substream *substream)
        // When source of clock is not internal or any stream is reserved for
        // transmission of PCM frames, the available sampling rate is limited
        // at current one.
-       if (src != SND_MOTU_CLOCK_SOURCE_INTERNAL ||
+       if ((src != SND_MOTU_CLOCK_SOURCE_INTERNAL &&
+            src != SND_MOTU_CLOCK_SOURCE_SPH) ||
            (motu->substreams_counter > 0 && d->events_per_period > 0)) {
                unsigned int frames_per_period = d->events_per_period;
                unsigned int frames_per_buffer = d->events_per_buffer;
index 4e5767c..b47ba81 100644 (file)
@@ -19,6 +19,7 @@ static const char *const clock_names[] = {
        [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX] = "S/PCIF on coaxial interface",
        [SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR] = "AESEBU on XLR interface",
        [SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC] = "Word clock on BNC interface",
+       [SND_MOTU_CLOCK_SOURCE_SPH] = "Source packet header",
        [SND_MOTU_CLOCK_SOURCE_UNKNOWN] = "Unknown",
 };
 
index a42f77f..2757e5b 100644 (file)
@@ -114,6 +114,9 @@ static int v2_get_clock_source(struct snd_motu *motu,
        case 2:
                *src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX;
                break;
+       case 3:
+               *src = SND_MOTU_CLOCK_SOURCE_SPH;
+               break;
        case 4:
                *src = SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC;
                break;
index ba5794c..d1545e2 100644 (file)
@@ -104,6 +104,8 @@ static int v3_get_clock_source(struct snd_motu *motu,
                *src = SND_MOTU_CLOCK_SOURCE_INTERNAL;
        } else if (val == 0x01) {
                *src = SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC;
+       } else if (val == 0x02) {
+               *src = SND_MOTU_CLOCK_SOURCE_SPH;
        } else if (val == 0x10) {
                *src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX;
        } else if (val == 0x18 || val == 0x19) {
index 08e3d56..bd782ee 100644 (file)
@@ -104,6 +104,7 @@ enum snd_motu_clock_source {
        SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX,
        SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR,
        SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC,
+       SND_MOTU_CLOCK_SOURCE_SPH,
        SND_MOTU_CLOCK_SOURCE_UNKNOWN,
 };