Skip to content
  • Takashi Sakamoto's avatar
    ALSA: firewire-motu: add MOTU specific protocol layer · 4641c939
    Takashi Sakamoto authored
    
    
    MOTU FireWire series uses blocking transmission for AMDTP packet streaming.
    They transmit/receive 8,000 packets per second, to handle the same number
    of data blocks as current sampling transmission frequency. Thus,
    IEC 61883-1/6 packet streaming engine of ALSA firewire stack is available
    for them.
    
    However, the sequence of packet and data blocks includes some quirks.
    Below sample is a sequence of CIP headers of packets received by 828mk2,
    at 44.1kHz of sampling transmission frequency.
    
    quads CIP1        CIP2
    488   0x020F04E8  0x8222FFFF
      8   0x020F04F8  0x8222FFFF
    488   0x020F0400  0x8222FFFF
    488   0x020F0408  0x8222FFFF
      8   0x020F04E8  0x8222FFFF
    488   0x020F04F0  0x8222FFFF
    488   0x020F04F8  0x8222FFFF
    
    The SID (source node ID), DBS (data block size), SPH (source packet header),
    FMT (format ID), FDF (format dependent field) and SYT (time stamp) fields
    are in IEC 61883-1. Especially, FMT is 0x02, FDF is 0x22 and SYT is 0xffff
    to define MOTU specific protocol. In an aspect of dbc field, the value
    represents accumulated number of data blocks included the packet. This
    is against IEC 61883-1, because according to the specification this value
    should be the number of data blocks already transferred.
    
    In ALSA IEC 61883-1/6 engine, this quirk is already supported by
    CIP_DBC_IS_END_EVENT flag, because Echo Audio Fireworks has.
    
    Each data block includes SPH as its first quadlet field, to represent its
    presentation time stamp. Actual value of SPH is compliant to IEC 61883-1;
    lower 25 bits of 32 bits width consists of 13 bits cycle count and 12 bits
    cycle offset.
    
    The rest of each data block consists of 24 bit chunks. All of PCM samples,
    MIDI messages, status and control messages are transferred by the chunks.
    This is similar to '24-bit * 4 Audio Pack' in IEC 61883-6. The position of
    each kind of data depends on generations of each model. The number of
    whole chunks in a data block is a multiple of 4, to consists of
    quadlet-aligned packets.
    
    This commit adds data block processing layer specific for the MOTU
    protocol. The remarkable point is the way to generate SPH header. Time
    stamps for each data blocks are generated by below calculation:
    
     * Using pre-computed table for the number of ticks per event
      *  44,1kHz: (557 + 123/441)
      *  48.0kHz: (512 +   0/441)
      *  88.2kHz: (278 + 282/441)
      *  96.0kHz: (256 +   0/441)
      * 176.4kHz: (139 + 141/441)
      * 192.0kHz: (128 +   0/441)
     * Accumulate the ticks and set the value to SPH for every events.
     * This way makes sense only for blocking transmission because this mode
       transfers fixed number or none of events.
    
    This calculation assumes that each data block has a PCM frame which is
    sampled according to event timing clock. Current packet streaming layer
    has the same assumption.
    
    Although this sequence works fine for MOTU FireWire series at sampling
    transmission frequency based on 48.0kHz, it is not enough at the frequency
    based on 44.1kHz. The units generate choppy noise every few seconds.
    
    Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    4641c939