Need help to recover from AlsaMixer mistake/malfunction (urgent!)

It could be caused by my stupid mistake or something else. As fiddling with the GUI of AlsaMixer (v1.1.0) I changed the number of “ADMAIF2 Channels”. But ended up the number stays at 6 or higher, won’t go back down to 0. As a result, the video+audio recording always appears in fast forward mode!

The “stuck on 6” problem would happen to other channels as well.

For reference, I started the AlsaMixer GUI by a terminal command:

alsamixer -c tegrasndt186ref

or

alsamixer -c 1

Man, this sounds crazy. How do I reset the value for the devices?
Please help.

nvidia@tegra-ubuntu:~$ alsactl restore
alsactl: state_lock:125: file /var/lib/alsa/asound.state lock error: File exists
alsactl: load_state:1683: Cannot open /var/lib/alsa/asound.state for reading: File exists

Then if I do

nvidia@tegra-ubuntu:~$ ll /var/lib/alsa/asound.state
ls: cannot access '/var/lib/alsa/asound.state': No such file or directory

Smashing my head against the wall…

This is a bug in the ADMAIF driver and will be fixed in a future release. If you are able to rebuild and flash the kernel, then please try making the following change …

diff --git a/sound/soc/tegra-alt/tegra210_admaif_alt.c b/sound/soc/tegra-alt/tegra210_admaif_alt.c
index 0c73af735bdd..7b6ff5d6a4e4 100644
--- a/sound/soc/tegra-alt/tegra210_admaif_alt.c
+++ b/sound/soc/tegra-alt/tegra210_admaif_alt.c
@@ -557,7 +557,7 @@ static int tegra210_admaif_put_format(struct snd_kcontrol *kcontrol,
        char buf[50];
 
        if (strstr(kcontrol->id.name, "Channels")) {
-               if (value > 0 && value <= 16)
+               if (value >= 0 && value <= 16)
                        admaif->override_channels[mc->reg] = value;
                else
                        return -EINVAL;

Otherwise, what worked for me was …

  1. Edit the /lib/systemd/system/alsa-restore.service file and comment out the ExecStart and ExecStop.
#
# Note that two different ALSA card state management schemes exist and they
# can be switched using a file exist check - /etc/alsa/state-daemon.conf .
#

[Unit]
Description=Save/Restore Sound Card State
ConditionPathExists=!/etc/alsa/state-daemon.conf
ConditionPathExistsGlob=/dev/snd/control*
After=alsa-state.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/bin/mkdir -p /run/alsa
#ExecStart=-/usr/sbin/alsactl -E HOME=/run/alsa restore
#ExecStop=-/usr/sbin/alsactl -E HOME=/run/alsa store
  1. If the file /var/lib/alsa/asound.state exists remove it (I see it did not exist for you but double check again before rebooting)

  2. Reboot board

  3. Edit the /lib/systemd/system/alsa-restore.service file and uncomment out the ExecStart and ExecStop.

Re-flashing the board again will also work but obviously that is a last resort!

Sorry we did not catch this sooner.

Regards
Jon

Currently there is a udev rule that is removing the asound.state file on boot and so you will not find this file. This is something else that I am fixing for future releases.

Regards
Jon

Thanks Jon. You saved me a lot of time from hunting solutions in the dark. Really appreciated.