2013 Macbook Air Audio stopped working

Hoping this is the right place to post this.

I installed Ubuntu (24.04 LTS) on my 2013 Macbook Air several months ago it seemed to be working fine. I took it off the shelf a few days ago and was playing around with it, when the audio abruptly stopped working (during a youtube playback). I check the audio settings and there’s no audio card listed, only “Dummy Audio”. I checked for updates, and there were several, which I chose the Update all option. The updates churned away for a while, then finished, and I rebooted. Would not reboot, I got the old ‘Sad Mac’ face. I tried troubleshooting the no start condition for a while with no luck, so gave up and reinstalled Ubuntu (24.04 LTS). So now, everything is back up and running - except, still no audio card detected. Done a lot of googling and tired a lot of ‘fixes’ but still no audio. At this point, I’m wondering if the audio sub board died. Hoping someone can offer some advice.

Wasn’t exactly the right place, but I moved it into the right category and gave it some reasonable tags.

Please post the output of lspci in the terminal here.

00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:01.0 PCI bridge: Intel Corporation Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
00:16.0 Communication controller: Intel Corporation 6 Series/C200 Series Chipset Family MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Universal Host Controller #5 (rev 05)
00:1a.7 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 05)
00:1b.0 Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller (rev 05)
00:1c.0 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 1 (rev b5)
00:1c.1 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 2 (rev b5)
00:1d.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Universal Host Controller #1 (rev 05)
00:1d.7 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 05)
00:1f.0 ISA bridge: Intel Corporation QS67 Express Chipset LPC Controller (rev 05)
00:1f.2 SATA controller: Intel Corporation 6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller (rev 05)
00:1f.3 SMBus: Intel Corporation 6 Series/C200 Series Chipset Family SMBus Controller (rev 05)
02:00.0 Network controller: Broadcom Inc. and subsidiaries BCM43224 802.11a/b/g/n (rev 01)
03:00.0 PCI bridge: Intel Corporation DSL2310 Thunderbolt Controller [Eagle Ridge 2C 2011] (rev 01)
04:00.0 PCI bridge: Intel Corporation DSL2310 Thunderbolt Controller [Eagle Ridge 2C 2011] (rev 01)
04:03.0 PCI bridge: Intel Corporation DSL2310 Thunderbolt Controller [Eagle Ridge 2C 2011] (rev 01)
04:04.0 PCI bridge: Intel Corporation DSL2310 Thunderbolt Controller [Eagle Ridge 2C 2011] (rev 01)
05:00.0 System peripheral: Intel Corporation DSL2310 Thunderbolt Controller [Eagle Ridge 2C 2011] (rev 01)

Ran:
sudo apt install linux-modules-extra-uname -r
sudo modprobe snd-dummy,

(after googling: Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller)

And now I see an audio card (Analog Output - Built-in Audio) but still no sound. Running the test shows the level bar bouncing, but no audio (out of either the speakers or a wired headset).

Edit: After reboot, the only audio card option in the settings is back to ‘Dummy Audio’.

Let me get a little more information there. Try:

lspci -nnk | grep -A 3 Audio

00:1b.0 Audio device [0403]: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller [8086:1c20] (rev 05)
Subsystem: Intel Corporation Apple MacBookPro8,2 [Core i7, 15", 2011] [8086:7270]
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel

First, please tell me you just did sudo modprobe snd-dummy and didn’t do anything else with that, like trying to make it permanent. You probably don’t want that.

Your issue is probably related to a kernel module parameter of some kind. You can see them all with something like this:

# set a variable for the location of the module's parameters
myparams="/sys/module/snd_hda_intel/parameters"

# go through all the parameters for the module
for param in $(ls $myparams); do

   # set a variable for each parameter's description
   paramdesc="$(modinfo -p snd_hda_intel | grep ^$param)"

   # set a variable for each parameter's value
   paramvalue="$(cat $myparams/$param)"

   # print out the description and on the next line, the value
   # divide each parameter with a little line
   echo -e "$paramdesc\n$paramvalue\n--------------------------"
done

It’s a little rough and dirty but it does the trick.

I’m not sure this will work for your specific situation but I would try this:

sudo modprobe -r snd_hda_intel
sudo modprobe snd_hda_intel model=generic

If that doesn’t work, you can try systemctl --user restart pipewire.

If that does work, we can discuss how to make it permanent (it won’t survive a reboot). If it doesn’t work, you can go through all those parameters and search to see if any of them might somehow be helpful. I would use it with your PCI ID (“8086:1c20”) when you search.

I haven’t made anything permanent (that I’m aware of).

When I run that bit of code, I get:

$ # set a variable for the location of the module’s parameters
myparams=“/sys/module/snd_hda_intel/parameters”

go through all the parameters for the module

for param in $(ls $myparams); do

set a variable for each parameter’s description

paramdesc=“$(modinfo -p | grep ^$param)”

set a variable for each parameter’s value

paramvalue=“$(cat $myparams/$param)”

print out the description and on the next line, the value

divide each parameter with a little line

echo -e “$paramdesc\n$paramvalue\n--------------------------”
done
modinfo: ERROR: missing module or filename.

-1

modinfo: ERROR: missing module or filename.

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

modinfo: ERROR: missing module or filename.

N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N

modinfo: ERROR: missing module or filename.

N

modinfo: ERROR: missing module or filename.

Y

modinfo: ERROR: missing module or filename.

Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y

modinfo: ERROR: missing module or filename.

-1

modinfo: ERROR: missing module or filename.

(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null)

modinfo: ERROR: missing module or filename.

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

modinfo: ERROR: missing module or filename.

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

modinfo: ERROR: missing module or filename.

(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null)

modinfo: ERROR: missing module or filename.

(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null)

modinfo: ERROR: missing module or filename.

Y

modinfo: ERROR: missing module or filename.

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

modinfo: ERROR: missing module or filename.

1

modinfo: ERROR: missing module or filename.

Y

modinfo: ERROR: missing module or filename.

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

modinfo: ERROR: missing module or filename.

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

modinfo: ERROR: missing module or filename.

-1

modinfo: ERROR: missing module or filename.

-1

Ooops, made a mistake so edited above. That listing isn’t important to this discussion at this point. Just saying that’s a way you could go through all the parameters and get their values.

Try the lower part.

This is what I get when I run the other bits:

$ modprobe -r snd_hda_intel
modprobe: FATAL: Module snd_hda_intel is in use.

$ modprobe snd_hda_intel model=generic (seemed to execute but nothing changed)
$ pulseaudio -k
E: [pulseaudio] main.c: Failed to kill daemon: No such process

Oops, another mistake up there.

Try closing all applications that you have running before you do the modprobe -r snd_hda_intel. If that doesn’t work, then we’ll have to edit a file and reboot. Otherwise, move forward with the revised instructions above.

$ # set a variable for the location of the module’s parameters
myparams=“/sys/module/snd_hda_intel/parameters”

go through all the parameters for the module

for param in $(ls $myparams); do

set a variable for each parameter’s description

paramdesc=“$(modinfo -p snd_hda_intel | grep ^$param)”

set a variable for each parameter’s value

paramvalue=“$(cat $myparams/$param)”

print out the description and on the next line, the value

divide each parameter with a little line

echo -e “$paramdesc\n$paramvalue\n--------------------------”
done
align_buffer_size:Force buffer and period sizes to be multiple of 128 bytes. (bint)
-1

bdl_pos_adj:BDL position adjustment offset. (array of int)
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

beep_mode:Select HDA Beep registration mode (0=off, 1=on) (default=1). (array of bool)
N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N

ctl_dev_id:Use control device identifier (based on codec address). (bool)
N

dmic_detect:Allow DSP driver selection (bypass this driver) (0=off, 1=on) (default=1); deprecated, use snd-intel-dspcfg.dsp_driver option instead (bool)
Y

enable:Enable Intel HD audio interface. (array of bool)
enable_msi:Enable Message Signaled Interrupt (MSI) (bint)
Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y

enable_msi:Enable Message Signaled Interrupt (MSI) (bint)
-1

id:ID string for Intel HD audio interface. (array of charp)
(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null)

index:Index value for Intel HD audio interface. (array of int)
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

jackpoll_ms:Ms between polling for jack events (default = 0, using unsol events only) (array of int)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

model:Use the given board model. (array of charp)
(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null)

patch:Patch file for Intel HD audio interface. (array of charp)
(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null)

pm_blacklist:Enable power-management denylist (bool)
Y

position_fix:DMA pointer read method.(-1 = system default, 0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO, 5 = SKL+, 6 = FIFO). (array of int)
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

power_save:Automatic power-saving timeout (in second, 0 = disable). (xint)
power_save_controller:Reset controller in power save mode. (bool)
1

power_save_controller:Reset controller in power save mode. (bool)
Y

probe_mask:Bitmask to probe codecs (default = -1). (array of int)
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

probe_only:Only probing and no codec initialization. (array of int)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

single_cmd:Use single command to communicate with codecs (for debugging only). (bint)
-1

snoop:Enable/disable snooping (bint)
-1

$ modprobe -r snd_hda_intel
modprobe: FATAL: Module snd_hda_intel is in use.

Only thing running (that I’m aware of) is the terminal window.

$ modprobe snd_hda_intel model=generic (seems to run OK but no obvious changes

Did you close all applications before doing this?

everything except the terminal window

Create a file named /etc/modprobe.d/snd_hda_intel.conf with the following content:

options snd_hda_intel model=generic

Reboot.

If that doesn’t work, I don’t know. Like I said above, one would need to scour the Internet to figure out what all those parameters that the script spit out do and how they would relate to your specific PCI device. I did some basic searching and couldn’t find anything very quickly, so it’s going to be a lot of work.

I took a look at system monitor and see that wire plumber was running in the background. I killed it and ran:

modprobe -r snd_hda_intel
modprobe: ERROR: …/libkmod/libkmod-module.c:856 kmod_module_remove_module() could not remove ‘snd_hda_intel’: Operation not permitted

Jeez, I’m off my game today. sudo it.

1 Like

Created the file and rebooted, but sadly no change.