[Solved] Asterisks locks alsa device if chan_alsa is loaded

I am implementing an extension 900 which routes the audio to alsa device. I am also using mpd which plays music through alsa.

Asterisk 15, Openwrt 18.06

mpd.conf

 cat /etc/mpd.conf 
log_file "syslog"

bind_to_address "127.0.0.1"
bind_to_address "192.168.1.18"

input {
    plugin          "curl"
}

audio_output {
    type            "alsa"
    name		    "sun4icodec"
    device          "hw:0,0"
    mixer_control   "Power Amplifier"
}

Here is the section of extensions.conf related to the extension


;SIP 900
exten => 900,1,NoOp(Testing calls to speakers. Dialing ${EXTEN} from ${CALLERID})
same => n,System(kill -9 `pgrep mpg123`)
same => n,System(amixer set 'Power Amplifier' 80%)
same => n,System(/usr/bin/aplay /var/lib/myapp/sounds/tone3.wav &)
same => n,System(sleep(4))
same => n,NoOp(Testing calls to speakers. Dialing ${EXTEN} from ${CALLERID})
same => n,Dial(CONSOLE/ALSA)
same => n,Hangup()
same => n,System(sleep(1))
same => n,System(amixer set 'Power Amplifier' 80%;)
same => n,System(sleep(4))

When chan_alsa is loaded it locks the alsa device and when something is played on mpd I get the following error

aplay: main:722: audio open error: Resource busy

I came across this on a website but I am not sure how to implement this. Can please guide me how to solve this… twiddle software and/or hardware mixing

  • output_device = <ALSA device name>
    Indicates the name of the ALSA device to use for playing sound, i.e. for listening. A device name specified here is passed, unchanged, to the ALSA sound layer, so any ALSA device name should work. Warning : Asterisk may lock the ALSA device specified here for the entire duration the Asterisk process is running. You may have to twiddle software and/or hardware mixing settings to keep Asterisk from hogging your output device.

Solved the issue by using alsa dmix plugin and forcing all applications to access the soundcard via the dmix plugin instead of directly accessing the hw:0,0

1 Like