AnonymousPi Posted September 5, 2016 Posted September 5, 2016 (edited) Hi All, After I accomplished my IR Red Key Rick Rolling experiment the other day with much success, and from general end-luser use with Armbian, there were two things which irritated me, which are namely due to the default ALSA configuration that comes with stock Debian and that Armbian inherits. These were: Update: 11 September 2017. This guide will not work for newer Armbiam (Debian) installations which comes with Pulseaudio by default. If you really want what this tutorial provides, you will need to uninstall pulseaudio first: sudo apt-get remove pulseaudio 1) You can't have simultaneous applications using an Audio device. So, how about if I want to stream Internet Radio with 'Radio Tray' but also get system alert sounds, or anything else? Out of luck, you'll get (for example): [ao/alsa] Playback open error: Device or resource busy 2) I want to actually have audio going out of the 3.5mm jack (don't really care about video out), better still if it's the same/simultaneous to what is going out via. HDMI. That means if I have a HDMI TV connected then I can get the sound from the TV, if I don't, then I can just use the 3.5mm jack (i.e. If I'm using my Pi to play Rick Astley headless/without a TV). No need to keep editing /etc/asound.conf every time. Solution? Step 1) Fix the mute on the analog Line-Out in alsamixer (for a start) There's a lot of noise out there about people not being able to get any sound our of the analog Line-Out jack even when having changed /etc/asound.conf. The reason for this is likely due to a mute by default on the analog audio line-out (i.e. the 3.5mm headphone jack) in alsa that you would unlikely to be aware of. I only found this out thanks to a comment here, otherwise I would have thrown by Pi PC out the window today. So to fix, you need to type in the console: sudo alsamixer Then F6 select the 'audiocodec', then tap the right arrow key to select the 'Audio lineout [Off]' item. Press 'm' and you'll get the green 'OO', which means it's now active. Exit alsamixer, and when you're back at the console type: sudo alsactl store 0 ... to store you mixer settings. For your information, the mixer settings are stored to the file: /var/lib/alsa/asound.state ... and if you do a diff of this file after having made the changes in alsamixer, this is what is changed in the alsa asound.state file: control.9 { control.9 { iface MIXER iface MIXER name 'Audio lineout' name 'Audio lineout' value false | value true comment { comment { access 'read write' access 'read write' type BOOLEAN type BOOLEAN count 1 count 1 } } } } Step 2) Change the /etc/asound.conf file As you might or might not be aware, the default /etc/asound.conf file looks something like this: pcm.!default { type hw card 1 } ctl.!default { type hw card 1 } All it is configured to do is give applications direct access to the hardware audio device, and pump the sound either out to the analogue line-out ('card 0') or via HDMI ('card 1'). Pretty basic, but does the job. However, what I wanted was two things: Software mixing before the resulting PCM/Sound is sent to the hardware audio device - This enables me to listen to Internet Radio and Youtube at the same time... Simultaneous Output to both HDMI and analog line-out. If you want only (1) above, and only via HDMI, then the /etc/asound.conf file is this: pcm.!default { type plug slave.pcm "dmixer" } pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:1,0" # "hw:1,0" means HDMI change to "hw:0,0" for analog lineout jack output period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 } } ctl.dmixer { type hw card 0 } ctl.!default { type hw card 0 } If you want (1) and (2) (which of course you do), then the /etc/asound.conf file is this: # Thanks to: http://alsa.opensrc.org/Asoundrc#Dupe_output_to_multiple_cards # https://sourceforge.net/p/alsa/mailman/message/33476395/ # Check that a MUTE doesn't exist on the Audio Line Out for Orange PI PC # or you'll get no sound other than via HDMI pcm.!default { type plug slave.pcm "duplicate" } ctl.!default { type hw card 0 } # Create the Software Mixer for HDMI and then link to hardware pcm.hdmi-dmixer { type dmix ipc_key 1024 slave { #pcm "hw:0,0" # pcm "duplicate" pcm "hdmi-hw" # pcm "analog-hw" period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 } } ctl.hdmi-dmixer { type hw card 0 } # Create the Software Mixer for Analogue Out and then link to hardware pcm.analog-dmixer { type dmix ipc_key 2048 slave { #pcm "hw:0,0" # pcm "duplicate" # pcm "hdmi-hw" pcm "analog-hw" period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 } } ctl.analog-dmixer { type hw card 0 } # Route the audio requests to both hardware devices via the mixer. # For some reason we can't have one mixer and then route to two hardware # devices (would be more efficient). pcm.duplicate { type route slave.pcm { type multi slaves { a { pcm "analog-dmixer" channels 2 } h { pcm "hdmi-dmixer" channels 2 } } bindings [ { slave a channel 0 } { slave a channel 1 } { slave h channel 0 } { slave h channel 1 } ] } ttable [ [ 1 0 1 0 ] [ 0 1 0 1 ] ] } ctl.duplicate { type hw; card 0; } # Physical Output Device Mappings - Analogue and HDMI for Orange PI PC pcm.analog-hw { type hw card 0 } pcm.hdmi-hw { type hw card 1 } There you have it. The only downside is that CPU usage for playing music will increase a bit as ALSA will essentially route inputs from applications to two Software Mixers, which are connected to the HDMI and Analog Line-Out hardware devices separately. For some reason you can't have a single Software Mixer route to two hardware devices (or I couldn't get it to work), but whatever. We're talking 20% CPU usage vs. 10% on one core, to play music. Edited September 11, 2017 by AnonymousPi Updated to include notice that it won't work with pulseaudio installed. 6
msev Posted September 6, 2016 Posted September 6, 2016 What about if I want just analog-line out and no hdmi. How do I configure it then?
AnonymousPi Posted September 6, 2016 Author Posted September 6, 2016 Perform 'Step 1' per my guide above, then copy-paste the /etc/asound.conf file to be: pcm.!default { type plug slave.pcm "dmixer" } pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:0,0" # "hw:1,0" means HDMI change to "hw:0,0" for analog lineout jack output period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 } } ctl.dmixer { type hw card 0 } ctl.!default { type hw card 0 } The hint on what to do was in my comment within the suggested asound.conf in my original post: # "hw:1,0" means HDMI change to "hw:0,0" for analog lineout jack output 2
msev Posted September 6, 2016 Posted September 6, 2016 Thanks, what about if I connected a PS3-eye external usb microphone (its also a camera). It has multiple mics (array), found this: https://me.m01.eu/blog/2014/07/an-asoundrc-alsa-config-for-the-ps3-eye/#comment-37806 Do you think it would work with that config file, in your opinion?
AnonymousPi Posted September 7, 2016 Author Posted September 7, 2016 Wouldn't have the slightest clue. Your first battle will be seeing if such a piece of hardware is even supported by Linux. If not, no amount of ALSA configuration is going to help. In any case, the configuration above is for audio output only.
msev Posted September 8, 2016 Posted September 8, 2016 How if there are mentioned microphone arrays in the config file? Are you sure, because this ps3 eye camera doesn't have speakers, just microphones. Aha nevermind you meant regarding your tutorial that its meant just for audio output.
araczkowski Posted December 1, 2016 Posted December 1, 2016 works like a charm on OPI PC+ I needed this description for mopidy, thanks!
mss Posted December 9, 2016 Posted December 9, 2016 Thanks @AnonymousPi but I try both config and I get cutting whit noise on hdmi while analogue outline working well.what did i do wrong?can it be a bad configuration on alsamixer ? lqqqqqqqqqqqqqqqqqqqqqqqqqqqqq AlsaMixer v1.0.28 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x Card: audiocodec F1: Help x x Chip: F2: System information x x View: F3:[Playback] F4: Capture F5: All F6: Select sound card x x Item: Lineout volume control Esc: Exit x x x x lqqk lqqk lqqk lqqk x x xaax xaax xaax xaax x x xaax xaax xaax xaax x x xaax xaax xaax xaax → x xaax xaax xaax xaax → x xaax xaax xaax xaax → x xaax xaax xaax xaax → x xaax xaax xaax xaax → x xaax xaax xaax xaax → x xaax xaax xaax xaax → x xaax xaax xaax xaax x x xaax xaax xaax xaax x x mqqj mqqj lqqk lqqk lqqk lqqk mqqj mqqj x x xOOx xOOx xOOx xOOx x x mqqj mqqj mqqj mqqj x x 100 100 100 100 x x <Lineout >ADC inpu Audio ad Audio ad Audio li Audio li LINEIN_G MIC1 boo x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj 1
mss Posted December 9, 2016 Posted December 9, 2016 Problem Solved alsamixer `hdmi audio function` may set to `pcm` [open alsamixer / press F6 / select hdmi ... / up-down to find pcm] lqqqqqqqqqqqqqqqqqqqqqqqqqqqqq AlsaMixer v1.0.28 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x Card: sndhdmi F1: Help x x Chip: F2: System information x x View: F3:[Playback] F4: Capture F5: All F6: Select sound card x x Item: hdmi audio format Function [pcm] Esc: Exit x x x x x x x x x x x x x x x x x x pcm x x <hdmi audio format Function> x x x x x x x x x x x x x x x x x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
lakyljuk Posted January 26, 2017 Posted January 26, 2017 Perform 'Step 1' per my guide above, then copy-paste the /etc/asound.conf file to be: pcm.!default { type plug slave.pcm "dmixer" } pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:0,0" # "hw:1,0" means HDMI change to "hw:0,0" for analog lineout jack output period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 } } ctl.dmixer { type hw card 0 } ctl.!default { type hw card 0 } The hint on what to do was in my comment within the suggested asound.conf in my original post: # "hw:1,0" means HDMI change to "hw:0,0" for analog lineout jack output Hi, i did configure it, like you mentioned, it works great, i am using Orange Pi PC with Retro Orange and now I can have HDMI video only and analog audio only working simultaneously in games and menu. But when I select Kodi, it only allows to select one audio output and this is HDMI audio. I would like to have option to select HDMI or analog. Do you think that this is because config change or that Kodi is bugged? Thanks 1
Armnlegs Posted April 30, 2017 Posted April 30, 2017 On 1/26/2017 at 3:36 AM, lakyljuk said: i am using Orange Pi PC with Retro Orange and now I can have HDMI video only and analog audio only working simultaneously in games and menu. Can you help/tell me how you get games sound? Followed them step above and got my sound thru avjack but when play games there's no sound. I figured it is in the retro configuration but couldn't find any info except for raapberry.
GoNzOBiRdY Posted May 20, 2017 Posted May 20, 2017 On 2017-4-30 at 0:31 AM, Armnlegs said: Can you help/tell me how you get games sound? Followed them step above and got my sound thru avjack but when play games there's no sound. I figured it is in the retro configuration but couldn't find any info except for raapberry. Had the same issue... underneath ipc_key 1024 for both hdmi and analog put ipc_perm 0666 this will give all users permission. reboot and enter command speaker-test to verify 1
Armnlegs Posted October 5, 2017 Posted October 5, 2017 On 05/20/2017 at 12:27 PM, GoNzOBiRdY said: Had the same issue... underneath ipc_key 1024 for both hdmi and analog put ipc_perm 0666 this will give all users permission. reboot and enter command speaker-test to verify Had my project on hold and now just getting back to the game. Just so that we are on the same page. The modification is for IF: Retro-Orangepi sound = Yes Game sound = No This will give games sound?
Recommended Posts