mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 08:44:21 +08:00
1b6604896e
Alesis iO 26 FireWire has two pairs of digital optical interface. It
delivers PCM frames from the interfaces by second isochronous packet
streaming. Although both of the interfaces are available at 44.1/48.0
kHz, first one of them is only available at 88.2/96.0 kHz. It reduces
the number of PCM samples to 4 in Multi Bit Linear Audio data channel
of data blocks on the second isochronous packet streaming.
This commit fixes hardcoded stream formats.
Cc: <stable@vger.kernel.org>
Fixes: 28b208f600
("ALSA: dice: add parameters of stream formats for models produced by Alesis")
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20210513125652.110249-2-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Iwai <tiwai@suse.de>
77 lines
1.8 KiB
C
77 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* dice-alesis.c - a part of driver for DICE based devices
|
|
*
|
|
* Copyright (c) 2018 Takashi Sakamoto
|
|
*/
|
|
|
|
#include "dice.h"
|
|
|
|
static const unsigned int
|
|
alesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
|
|
{6, 6, 4}, /* Tx0 = Analog + S/PDIF. */
|
|
{8, 4, 0}, /* Tx1 = ADAT1. */
|
|
};
|
|
|
|
static const unsigned int
|
|
alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
|
|
{10, 10, 4}, /* Tx0 = Analog + S/PDIF. */
|
|
{16, 4, 0}, /* Tx1 = ADAT1 + ADAT2 (available at low rate). */
|
|
};
|
|
|
|
int snd_dice_detect_alesis_formats(struct snd_dice *dice)
|
|
{
|
|
__be32 reg;
|
|
u32 data;
|
|
int i;
|
|
int err;
|
|
|
|
err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO, ®,
|
|
sizeof(reg));
|
|
if (err < 0)
|
|
return err;
|
|
data = be32_to_cpu(reg);
|
|
|
|
if (data == 4 || data == 6) {
|
|
memcpy(dice->tx_pcm_chs, alesis_io14_tx_pcm_chs,
|
|
MAX_STREAMS * SND_DICE_RATE_MODE_COUNT *
|
|
sizeof(unsigned int));
|
|
} else {
|
|
memcpy(dice->tx_pcm_chs, alesis_io26_tx_pcm_chs,
|
|
MAX_STREAMS * SND_DICE_RATE_MODE_COUNT *
|
|
sizeof(unsigned int));
|
|
}
|
|
|
|
for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i)
|
|
dice->rx_pcm_chs[0][i] = 8;
|
|
|
|
dice->tx_midi_ports[0] = 1;
|
|
dice->rx_midi_ports[0] = 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int snd_dice_detect_alesis_mastercontrol_formats(struct snd_dice *dice)
|
|
{
|
|
int i;
|
|
|
|
dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_LOW] = 16;
|
|
dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_LOW] = 12;
|
|
dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_MIDDLE] = 12;
|
|
dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_MIDDLE] = 4;
|
|
dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_HIGH] = 8;
|
|
dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_HIGH] = 0;
|
|
|
|
for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i) {
|
|
dice->rx_pcm_chs[0][i] = 6;
|
|
dice->rx_pcm_chs[1][i] = 0;
|
|
}
|
|
|
|
for (i = 0; i < MAX_STREAMS; ++i) {
|
|
dice->tx_midi_ports[i] = 2;
|
|
dice->rx_midi_ports[i] = 2;
|
|
}
|
|
|
|
return 0;
|
|
}
|