[alsa-devel] [PATCH] ALSA: oxfw: add Mackie Onyx Satellite quirk to inform wrong value in 'dbs' field in tx CIP header
Takashi Iwai
tiwai at suse.de
Thu Sep 24 11:45:03 CEST 2015
On Sun, 20 Sep 2015 14:18:55 +0200,
Takashi Sakamoto wrote:
>
> Mackie Onyx Satellite has two usage; standalone and with base station.
>
> These two modes has different stream formats. In standalone mode, rx data
> block includes 2 Multi Bit Linear Audio (MBLA) data channels and tx data
> block includes 2. With base station, they're 6 and 2.
>
> Although, with base station, the actual tx packet include wrong value in
> 'dbs' field in its CIP header. This quirk causes packet streaming layer to
> detect packet discontinuity and to stop PCM substream.
>
> This is a response of 'single' subfunction 'extended stream format
> information' command in AV/C Stream Format Information Specification 1.1.
> It means that a data block in tx packets includes 2 MBLA data channels.
>
> $ ./firewire-request /dev/fw1 fcp 0x01ffbfc001000000ffffffff
> response: 000: 0c ff bf c0 01 00 00 00 ff 00 90 40 03 02 01 02
> response: 010: 06
>
> Current OXFW driver parses the response and detects stream formats
> correctly.
>
> $ cat /proc/asound/card1/firewire/formation
> ...
> Output Stream from device:
> Rate PCM MIDI
> * 48000 2 0
> 44100 2 0
> 88200 2 0
> 96000 2 0
>
> On the other hand, in actual tx CIP, the 'dbs' field has 6. But the number
> of quadlets in CIP payload is not multiple of 6. Seeing the subtraction of
> two successive payload quadlets, it should be multiple of 2.
>
> payload CIP CIP
> quadlets header0 header1
> 24 00060052 9002ffff
> 24 0006005e 9002ffff
> 26 0006006a 9002ffff
> 24 00060077 9002ffff
> 24 00060083 9002ffff
> 26 0006008f 9002ffff
> 24 0006009c 9002ffff
> 24 000600a8 9002ffff
> 26 000600b4 9002ffff
> 24 000600c1 9002ffff
>
> This commit adds support for this quirk to OXFW driver, by using
> CIP_WRONG_DBS flag. When this flag is set, packet streaming layer uses
> the value of its 'data_block_quadlets' member instead of the value in CIP
> header. This value is already set by OXFW driver and no discontinuity is
> detected.
>
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
Applied, thanks.
Takashi
> ---
> sound/firewire/oxfw/oxfw-stream.c | 5 ++++-
> sound/firewire/oxfw/oxfw.c | 29 +++++++++++++++++++++++++++++
> sound/firewire/oxfw/oxfw.h | 1 +
> 3 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/sound/firewire/oxfw/oxfw-stream.c b/sound/firewire/oxfw/oxfw-stream.c
> index 77ad5b9..863eb4a 100644
> --- a/sound/firewire/oxfw/oxfw-stream.c
> +++ b/sound/firewire/oxfw/oxfw-stream.c
> @@ -238,9 +238,12 @@ int snd_oxfw_stream_init_simplex(struct snd_oxfw *oxfw,
> * packets. As a result, next isochronous packet includes more data
> * blocks than IEC 61883-6 defines.
> */
> - if (stream == &oxfw->tx_stream)
> + if (stream == &oxfw->tx_stream) {
> oxfw->tx_stream.flags |= CIP_SKIP_INIT_DBC_CHECK |
> CIP_JUMBO_PAYLOAD;
> + if (oxfw->wrong_dbs)
> + oxfw->tx_stream.flags |= CIP_WRONG_DBS;
> + }
> end:
> return err;
> }
> diff --git a/sound/firewire/oxfw/oxfw.c b/sound/firewire/oxfw/oxfw.c
> index 8c6ce01..d606e3a 100644
> --- a/sound/firewire/oxfw/oxfw.c
> +++ b/sound/firewire/oxfw/oxfw.c
> @@ -19,6 +19,8 @@
> #define VENDOR_BEHRINGER 0x001564
> #define VENDOR_LACIE 0x00d04b
>
> +#define MODEL_SATELLITE 0x00200f
> +
> #define SPECIFIER_1394TA 0x00a02d
> #define VERSION_AVC 0x010001
>
> @@ -129,6 +131,31 @@ static void oxfw_card_free(struct snd_card *card)
> mutex_destroy(&oxfw->mutex);
> }
>
> +static void detect_quirks(struct snd_oxfw *oxfw)
> +{
> + struct fw_device *fw_dev = fw_parent_device(oxfw->unit);
> + struct fw_csr_iterator it;
> + int key, val;
> + int vendor, model;
> +
> + /* Seek from Root Directory of Config ROM. */
> + vendor = model = 0;
> + fw_csr_iterator_init(&it, fw_dev->config_rom + 5);
> + while (fw_csr_iterator_next(&it, &key, &val)) {
> + if (key == CSR_VENDOR)
> + vendor = val;
> + else if (key == CSR_MODEL)
> + model = val;
> + }
> +
> + /*
> + * Mackie Onyx Satellite with base station has a quirk to report a wrong
> + * value in 'dbs' field of CIP header against its format information.
> + */
> + if (vendor == VENDOR_LOUD && model == MODEL_SATELLITE)
> + oxfw->wrong_dbs = true;
> +}
> +
> static int oxfw_probe(struct fw_unit *unit,
> const struct ieee1394_device_id *id)
> {
> @@ -157,6 +184,8 @@ static int oxfw_probe(struct fw_unit *unit,
> if (err < 0)
> goto error;
>
> + detect_quirks(oxfw);
> +
> err = name_card(oxfw);
> if (err < 0)
> goto error;
> diff --git a/sound/firewire/oxfw/oxfw.h b/sound/firewire/oxfw/oxfw.h
> index cace5ad..7b5dad8 100644
> --- a/sound/firewire/oxfw/oxfw.h
> +++ b/sound/firewire/oxfw/oxfw.h
> @@ -49,6 +49,7 @@ struct snd_oxfw {
> struct mutex mutex;
> spinlock_t lock;
>
> + bool wrong_dbs;
> bool has_output;
> u8 *tx_stream_formats[SND_OXFW_STREAM_FORMAT_ENTRIES];
> u8 *rx_stream_formats[SND_OXFW_STREAM_FORMAT_ENTRIES];
> --
> 2.1.4
>
More information about the Alsa-devel
mailing list