summaryrefslogtreecommitdiff
path: root/sound/firewire
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2021-10-15 17:08:23 +0900
committerTakashi Iwai <tiwai@suse.de>2021-10-15 17:52:14 +0200
commit7d843c494a9b69d07bc0588124599e3f665a1496 (patch)
tree203e64bac95f08e749bd5561e173885da3d7f758 /sound/firewire
parent41cc23389f5fc64bdac78b73935a44bd5abc990d (diff)
ALSA: firewire-motu: parse messages for input parameters in register DSP model
This commit parses message and cache current parameters of input function, available for MOTU Ultralite, 4 pre, and Audio Express. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Link: https://lore.kernel.org/r/20211015080826.34847-9-o-takashi@sakamocchi.jp Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/firewire')
-rw-r--r--sound/firewire/motu/motu-register-dsp-message-parser.c43
1 files changed, 41 insertions, 2 deletions
diff --git a/sound/firewire/motu/motu-register-dsp-message-parser.c b/sound/firewire/motu/motu-register-dsp-message-parser.c
index 85faf7a4e8a3..d94ca4875714 100644
--- a/sound/firewire/motu/motu-register-dsp-message-parser.c
+++ b/sound/firewire/motu/motu-register-dsp-message-parser.c
@@ -87,6 +87,9 @@ struct msg_parser {
u8 prev_mixer_src_type;
u8 mixer_ch;
u8 mixer_src_ch;
+
+ u8 input_ch;
+ u8 prev_msg_type;
};
int snd_motu_register_dsp_message_parser_new(struct snd_motu *motu)
@@ -109,6 +112,7 @@ int snd_motu_register_dsp_message_parser_init(struct snd_motu *motu)
parser->prev_mixer_src_type = INVALID;
parser->mixer_ch = 0xff;
parser->mixer_src_ch = 0xff;
+ parser->prev_msg_type = INVALID;
return 0;
}
@@ -225,6 +229,35 @@ void snd_motu_register_dsp_message_parser_parse(struct snd_motu *motu, const str
case LINE_INPUT_NOMINAL_LEVEL:
parser->param.line_input.nominal_level_flag = val;
break;
+ case INPUT_GAIN_AND_INVERT:
+ case INPUT_FLAG:
+ {
+ struct snd_firewire_motu_register_dsp_parameter *param = &parser->param;
+ u8 input_ch = parser->input_ch;
+
+ if (parser->prev_msg_type != msg_type)
+ input_ch = 0;
+ else
+ ++input_ch;
+
+ if (input_ch < SNDRV_FIREWIRE_MOTU_REGISTER_DSP_INPUT_COUNT) {
+ switch (msg_type) {
+ case INPUT_GAIN_AND_INVERT:
+ param->input.gain_and_invert[input_ch] = val;
+ break;
+ case INPUT_FLAG:
+ param->input.flag[input_ch] = val;
+ break;
+ default:
+ break;
+ }
+ parser->input_ch = input_ch;
+ }
+ break;
+ }
+ case UNKNOWN_0:
+ case UNKNOWN_2:
+ break;
case METER:
{
u8 pos;
@@ -239,11 +272,17 @@ void snd_motu_register_dsp_message_parser_parse(struct snd_motu *motu, const str
else
pos = (pos & 0x1f) + 20;
parser->meter.data[pos] = val;
- break;
+ // The message for meter is interruptible to the series of other
+ // types of messages. Don't cache it.
+ fallthrough;
}
+ case INVALID:
default:
- break;
+ // Don't cache it.
+ continue;
}
+
+ parser->prev_msg_type = msg_type;
}
}