owntone-server/advanced/outputs-alsa/index.html

294 lines
86 KiB
HTML

<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Linux/FreeBSD DAAP (iTunes) and MPD media server with support for AirPlay devices (multiroom), Apple Remote (and compatibles), Chromecast, Spotify and internet radio. "><meta name=author content="OwnTone maintainers"><link href=https://owntone.github.io/owntone-server/advanced/outputs-alsa/ rel=canonical><link href=../../integrations/lastfm/ rel=prev><link href=../outputs-pulse/ rel=next><link rel=icon href=../../assets/favicon.ico><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.5.49"><title>ALSA - OwnTone</title><link rel=stylesheet href=../../assets/stylesheets/main.6f8fc17f.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.06af60db.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../assets/extra.css><script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=white data-md-color-accent=teal> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#alsa class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class=md-header data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../.. title=OwnTone class="md-header__button md-logo" aria-label=OwnTone data-md-component=logo> <img src=../../assets/logo.svg alt=logo> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> OwnTone </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> ALSA </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=white data-md-color-accent=teal aria-label="Switch to dark mode" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=blue-grey data-md-color-accent=teal aria-label="Switch to light mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg> </label> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> </button> </nav> </form> <div class=md-search__output> <div class=md-search__scrollwrap tabindex=0 data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/owntone/owntone-server title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> </div> <div class=md-source__repository> owntone/owntone-server </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <nav class=md-tabs aria-label=Tabs data-md-component=tabs> <div class=md-grid> <ul class=md-tabs__list> <li class=md-tabs__item> <a href=../.. class=md-tabs__link> Home </a> </li> <li class="md-tabs__item md-tabs__item--active"> <a href=../../getting-started/ class=md-tabs__link> Documentation </a> </li> <li class=md-tabs__item> <a href=../../json-api/ class=md-tabs__link> JSON API </a> </li> </ul> </div> </nav> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../.. title=OwnTone class="md-nav__button md-logo" aria-label=OwnTone data-md-component=logo> <img src=../../assets/logo.svg alt=logo> </a> OwnTone </label> <div class=md-nav__source> <a href=https://github.com/owntone/owntone-server title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> </div> <div class=md-source__repository> owntone/owntone-server </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../.. class=md-nav__link> <span class=md-ellipsis> Home </span> </a> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2 checked> <label class=md-nav__link for=__nav_2 id=__nav_2_label tabindex> <span class=md-ellipsis> Documentation </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_2_label aria-expanded=true> <label class=md-nav__title for=__nav_2> <span class="md-nav__icon md-icon"></span> Documentation </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../getting-started/ class=md-nav__link> <span class=md-ellipsis> Getting Started </span> </a> </li> <li class=md-nav__item> <a href=../../installation/ class=md-nav__link> <span class=md-ellipsis> Installation </span> </a> </li> <li class=md-nav__item> <a href=../../configuration/ class=md-nav__link> <span class=md-ellipsis> Configuration </span> </a> </li> <li class=md-nav__item> <a href=../../building/ class=md-nav__link> <span class=md-ellipsis> Building </span> </a> </li> <li class=md-nav__item> <a href=../../library/ class=md-nav__link> <span class=md-ellipsis> Library </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_6> <label class=md-nav__link for=__nav_2_6 id=__nav_2_6_label tabindex=0> <span class=md-ellipsis> Control </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_6_label aria-expanded=false> <label class=md-nav__title for=__nav_2_6> <span class="md-nav__icon md-icon"></span> Control </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../control-clients/mobile/ class=md-nav__link> <span class=md-ellipsis> Mobile Device </span> </a> </li> <li class=md-nav__item> <a href=../../control-clients/desktop/ class=md-nav__link> <span class=md-ellipsis> Desktop </span> </a> </li> <li class=md-nav__item> <a href=../../control-clients/web/ class=md-nav__link> <span class=md-ellipsis> Browser </span> </a> </li> <li class=md-nav__item> <a href=../../control-clients/cli-api/ class=md-nav__link> <span class=md-ellipsis> API and CLI </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_7> <label class=md-nav__link for=__nav_2_7 id=__nav_2_7_label tabindex=0> <span class=md-ellipsis> Audio Outputs </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_7_label aria-expanded=false> <label class=md-nav__title for=__nav_2_7> <span class="md-nav__icon md-icon"></span> Audio Outputs </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../audio-outputs/airplay/ class=md-nav__link> <span class=md-ellipsis> AirPlay </span> </a> </li> <li class=md-nav__item> <a href=../../audio-outputs/chromecast/ class=md-nav__link> <span class=md-ellipsis> Chromecast </span> </a> </li> <li class=md-nav__item> <a href=../../audio-outputs/local-audio/ class=md-nav__link> <span class=md-ellipsis> Local Audio </span> </a> </li> <li class=md-nav__item> <a href=../../audio-outputs/mobile/ class=md-nav__link> <span class=md-ellipsis> Mobile Device </span> </a> </li> <li class=md-nav__item> <a href=../../audio-outputs/web/ class=md-nav__link> <span class=md-ellipsis> Web </span> </a> </li> <li class=md-nav__item> <a href=../../audio-outputs/roku/ class=md-nav__link> <span class=md-ellipsis> Roku </span> </a> </li> <li class=md-nav__item> <a href=../../audio-outputs/streaming/ class=md-nav__link> <span class=md-ellipsis> Streaming </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../media-clients/ class=md-nav__link> <span class=md-ellipsis> Media Clients </span> </a> </li> <li class=md-nav__item> <a href=../../artwork/ class=md-nav__link> <span class=md-ellipsis> Artwork </span> </a> </li> <li class=md-nav__item> <a href=../../playlists/ class=md-nav__link> <span class=md-ellipsis> Playlists and Radio </span> </a> </li> <li class=md-nav__item> <a href=../../smart-playlists/ class=md-nav__link> <span class=md-ellipsis> Smart Playlists </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_12> <label class=md-nav__link for=__nav_2_12 id=__nav_2_12_label tabindex=0> <span class=md-ellipsis> Services Integration </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_12_label aria-expanded=false> <label class=md-nav__title for=__nav_2_12> <span class="md-nav__icon md-icon"></span> Services Integration </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../integrations/spotify/ class=md-nav__link> <span class=md-ellipsis> Spotify </span> </a> </li> <li class=md-nav__item> <a href=../../integrations/lastfm/ class=md-nav__link> <span class=md-ellipsis> LastFM </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_13 checked> <label class=md-nav__link for=__nav_2_13 id=__nav_2_13_label tabindex=0> <span class=md-ellipsis> Advanced Setup </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_13_label aria-expanded=true> <label class=md-nav__title for=__nav_2_13> <span class="md-nav__icon md-icon"></span> Advanced Setup </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> <span class=md-ellipsis> ALSA </span> <span class="md-nav__icon md-icon"></span> </label> <a href=./ class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> ALSA </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#quick-introduction-to-alsa-devices class=md-nav__link> <span class=md-ellipsis> Quick introduction to ALSA devices </span> </a> </li> <li class=md-nav__item> <a href=#configuring-the-server class=md-nav__link> <span class=md-ellipsis> Configuring the server </span> </a> </li> <li class=md-nav__item> <a href=#automatically-determine-all-relevant-the-sound-card-information class=md-nav__link> <span class=md-ellipsis> Automatically Determine ALL relevant the sound card information </span> </a> </li> <li class=md-nav__item> <a href=#manually-determining-the-sound-cards-you-have-alsa-can-see class=md-nav__link> <span class=md-ellipsis> Manually Determining the sound cards you have / ALSA can see </span> </a> </li> <li class=md-nav__item> <a href=#mixer-name class=md-nav__link> <span class=md-ellipsis> Mixer name </span> </a> </li> <li class=md-nav__item> <a href=#mixer-device class=md-nav__link> <span class=md-ellipsis> Mixer device </span> </a> </li> <li class=md-nav__item> <a href=#handling-devices-that-cannot-concurrently-play-multiple-audio-streams class=md-nav__link> <span class=md-ellipsis> Handling Devices that cannot concurrently play multiple audio streams </span> </a> </li> <li class=md-nav__item> <a href=#alsa-dmix-configurationsetup class=md-nav__link> <span class=md-ellipsis> ALSA dmix configuration/setup </span> </a> <nav class=md-nav aria-label="ALSA dmix configuration/setup"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#config-with-dmix class=md-nav__link> <span class=md-ellipsis> Config with dmix </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#setting-up-an-audio-equalizer class=md-nav__link> <span class=md-ellipsis> Setting up an Audio Equalizer </span> </a> </li> <li class=md-nav__item> <a href=#troubleshooting class=md-nav__link> <span class=md-ellipsis> Troubleshooting </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../outputs-pulse/ class=md-nav__link> <span class=md-ellipsis> PulseAudio </span> </a> </li> <li class=md-nav__item> <a href=../radio-streams/ class=md-nav__link> <span class=md-ellipsis> Radio Streams </span> </a> </li> <li class=md-nav__item> <a href=../remote-access/ class=md-nav__link> <span class=md-ellipsis> Remote Access </span> </a> </li> <li class=md-nav__item> <a href=../multiple-instances/ class=md-nav__link> <span class=md-ellipsis> Multiple Instances </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../json-api/ class=md-nav__link> <span class=md-ellipsis> JSON API </span> </a> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#quick-introduction-to-alsa-devices class=md-nav__link> <span class=md-ellipsis> Quick introduction to ALSA devices </span> </a> </li> <li class=md-nav__item> <a href=#configuring-the-server class=md-nav__link> <span class=md-ellipsis> Configuring the server </span> </a> </li> <li class=md-nav__item> <a href=#automatically-determine-all-relevant-the-sound-card-information class=md-nav__link> <span class=md-ellipsis> Automatically Determine ALL relevant the sound card information </span> </a> </li> <li class=md-nav__item> <a href=#manually-determining-the-sound-cards-you-have-alsa-can-see class=md-nav__link> <span class=md-ellipsis> Manually Determining the sound cards you have / ALSA can see </span> </a> </li> <li class=md-nav__item> <a href=#mixer-name class=md-nav__link> <span class=md-ellipsis> Mixer name </span> </a> </li> <li class=md-nav__item> <a href=#mixer-device class=md-nav__link> <span class=md-ellipsis> Mixer device </span> </a> </li> <li class=md-nav__item> <a href=#handling-devices-that-cannot-concurrently-play-multiple-audio-streams class=md-nav__link> <span class=md-ellipsis> Handling Devices that cannot concurrently play multiple audio streams </span> </a> </li> <li class=md-nav__item> <a href=#alsa-dmix-configurationsetup class=md-nav__link> <span class=md-ellipsis> ALSA dmix configuration/setup </span> </a> <nav class=md-nav aria-label="ALSA dmix configuration/setup"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#config-with-dmix class=md-nav__link> <span class=md-ellipsis> Config with dmix </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#setting-up-an-audio-equalizer class=md-nav__link> <span class=md-ellipsis> Setting up an Audio Equalizer </span> </a> </li> <li class=md-nav__item> <a href=#troubleshooting class=md-nav__link> <span class=md-ellipsis> Troubleshooting </span> </a> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <h1 id=alsa>ALSA<a class=headerlink href=#alsa title="Permanent link">&para;</a></h1> <p>ALSA is one of the main output configuration options for local audio; when using ALSA you will typically let the system select the sound card on your machine as the <code>default</code> device/sound card - a mixer associated with the ALSA device is used for volume control. However if your machine has multiple sound cards and your system chooses the wrong playback device, you will need to manually select the card and mixer to complete the OwnTone configuration.</p> <h2 id=quick-introduction-to-alsa-devices>Quick introduction to ALSA devices<a class=headerlink href=#quick-introduction-to-alsa-devices title="Permanent link">&para;</a></h2> <p>ALSA devices can be addressed in a number ways but traditionally we have referred to them using the hardware prefix, card number and optionally device number with something like <code>hw:0</code> or <code>hw:0,1</code>. In ALSA configuration terms <code>card X, device Y</code> is known as <code>hw:X,Y</code>.</p> <p>ALSA has other <em>prefixes</em> for each card and most importantly <code>plughw</code>. The <code>plughw</code> performs transparent sample format and sample rate conversions and maybe a better choice for many users rather than <code>hw:</code> which would fail when provided unsupported audio formats/sample rates.</p> <p>Alternative ALSA names can be used to refer to physical ALSA devices and can be useful in a number of ways:</p> <ul> <li>more descriptive rather than being a card number</li> <li>consistent for USB numeration - USB ALSA devices may not have the same card number across reboots/reconnects</li> </ul> <p>The ALSA device information required for configuration the server can be determined using <code>aplay</code>, as described in the rest of this document, but OwnTone can also assist; when configured to log at <code>INFO</code> level the following information is provided during startup:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a>laudio:<span class=w> </span>Available<span class=w> </span>ALSA<span class=w> </span>playback<span class=w> </span>mixer<span class=o>(</span>s<span class=o>)</span><span class=w> </span>on<span class=w> </span>hw:0<span class=w> </span><span class=nv>CARD</span><span class=o>=</span>Intel<span class=w> </span><span class=o>(</span>HDA<span class=w> </span>Intel<span class=o>)</span>:<span class=w> </span><span class=s1>&#39;Master&#39;</span><span class=w> </span><span class=s1>&#39;Headphone&#39;</span><span class=w> </span><span class=s1>&#39;Speaker&#39;</span><span class=w> </span><span class=s1>&#39;PCM&#39;</span><span class=w> </span><span class=s1>&#39;Mic&#39;</span><span class=w> </span><span class=s1>&#39;Beep&#39;</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a>laudio:<span class=w> </span>Available<span class=w> </span>ALSA<span class=w> </span>playback<span class=w> </span>mixer<span class=o>(</span>s<span class=o>)</span><span class=w> </span>on<span class=w> </span>hw:1<span class=w> </span><span class=nv>CARD</span><span class=o>=</span>E30<span class=w> </span><span class=o>(</span>E30<span class=o>)</span>:<span class=w> </span><span class=s1>&#39;E30 &#39;</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a>laudio:<span class=w> </span>Available<span class=w> </span>ALSA<span class=w> </span>playback<span class=w> </span>mixer<span class=o>(</span>s<span class=o>)</span><span class=w> </span>on<span class=w> </span>hw:2<span class=w> </span><span class=nv>CARD</span><span class=o>=</span>Seri<span class=w> </span><span class=o>(</span>Plantronics<span class=w> </span>Blackwire<span class=w> </span><span class=m>3210</span><span class=w> </span>Seri<span class=o>)</span>:<span class=w> </span><span class=s1>&#39;Sidetone&#39;</span><span class=w> </span><span class=s1>&#39;Headset&#39;</span>
</code></pre></div> <p>The <code>CARD=</code> string is the alternate ALSA name for the device and can be used in place of the traditional <code>hw:x</code> name.</p> <p>On this machine the server reports that it can see the onboard HDA Intel sound card and two additional sound cards: a Topping E30 DAC and a Plantronics Headset which are both USB devices. We can address the first ALSA device as <code>hw:0</code> or <code>hw:CARD=Intel</code> or <code>hw:Intel</code> or <code>plughw:Intel</code>, the second ALSA device as <code>hw:1</code> or <code>hw:E30</code> and so forth. The latter 2 devices being on USB will mean that <code>hw:1</code> may not always refer to <code>hw:E30</code> and thus in such a case using the alternate name is useful.</p> <h2 id=configuring-the-server>Configuring the server<a class=headerlink href=#configuring-the-server title="Permanent link">&para;</a></h2> <p>OwnTone can support a single ALSA device or multiple ALSA devices.</p> <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a># example audio section for server for a single sound card
<a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a>audio {
<a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a> nickname = &quot;Computer&quot;
<a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a> type = &quot;alsa&quot;
<a id=__codelineno-1-5 name=__codelineno-1-5 href=#__codelineno-1-5></a>
<a id=__codelineno-1-6 name=__codelineno-1-6 href=#__codelineno-1-6></a> card = &quot;hw:1&quot; # defaults to &#39;default&#39;
<a id=__codelineno-1-7 name=__codelineno-1-7 href=#__codelineno-1-7></a> mixer = &quot;Analogue&quot; # defaults to &#39;PCM&#39; or &#39;Master&#39;
<a id=__codelineno-1-8 name=__codelineno-1-8 href=#__codelineno-1-8></a> mixer_device = &quot;hw:1&quot; # defaults to same as &#39;card&#39; value
<a id=__codelineno-1-9 name=__codelineno-1-9 href=#__codelineno-1-9></a>}
</code></pre></div> <p>Multiple devices can be made available to OwnTone using separate <code>alsa { .. }</code> sections.</p> <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a>audio {
<a id=__codelineno-2-2 name=__codelineno-2-2 href=#__codelineno-2-2></a> type = &quot;alsa&quot;
<a id=__codelineno-2-3 name=__codelineno-2-3 href=#__codelineno-2-3></a>}
<a id=__codelineno-2-4 name=__codelineno-2-4 href=#__codelineno-2-4></a>
<a id=__codelineno-2-5 name=__codelineno-2-5 href=#__codelineno-2-5></a>alsa &quot;hw:1&quot; {
<a id=__codelineno-2-6 name=__codelineno-2-6 href=#__codelineno-2-6></a> nickname = &quot;Computer&quot;
<a id=__codelineno-2-7 name=__codelineno-2-7 href=#__codelineno-2-7></a> mixer = &quot;Analogue&quot;
<a id=__codelineno-2-8 name=__codelineno-2-8 href=#__codelineno-2-8></a> mixer_device = &quot;hw:1&quot;
<a id=__codelineno-2-9 name=__codelineno-2-9 href=#__codelineno-2-9></a>}
<a id=__codelineno-2-10 name=__codelineno-2-10 href=#__codelineno-2-10></a>
<a id=__codelineno-2-11 name=__codelineno-2-11 href=#__codelineno-2-11></a>alsa &quot;hw:2&quot; {
<a id=__codelineno-2-12 name=__codelineno-2-12 href=#__codelineno-2-12></a> nickname = &quot;Second ALSA device&quot;
<a id=__codelineno-2-13 name=__codelineno-2-13 href=#__codelineno-2-13></a>}
</code></pre></div> <p>NB: When introducing <code>alsa { .. }</code> section(s) the ALSA specific configuration in the <code>audio { .. }</code> section will be ignored.</p> <p>If there is only one sound card, verify if the <code>default</code> sound device is correct for playback, we will use the <code>aplay</code> utility.</p> <div class=highlight><pre><span></span><code><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__codelineno-3-1></a><span class=c1># generate some audio if you don&#39;t have a wav file to hand</span>
<a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a>sox<span class=w> </span>-n<span class=w> </span>-c<span class=w> </span><span class=m>2</span><span class=w> </span>-r<span class=w> </span><span class=m>44100</span><span class=w> </span>-b<span class=w> </span><span class=m>16</span><span class=w> </span>-C<span class=w> </span><span class=m>128</span><span class=w> </span>/tmp/sine441.wav<span class=w> </span>synth<span class=w> </span><span class=m>30</span><span class=w> </span>sin<span class=w> </span><span class=m>500</span>-100<span class=w> </span>fade<span class=w> </span>h<span class=w> </span><span class=m>0</span>.2<span class=w> </span><span class=m>30</span><span class=w> </span><span class=m>0</span>.2
<a id=__codelineno-3-3 name=__codelineno-3-3 href=#__codelineno-3-3></a>
<a id=__codelineno-3-4 name=__codelineno-3-4 href=#__codelineno-3-4></a>aplay<span class=w> </span>-Ddefault<span class=w> </span>/tmp/sine441.wav
</code></pre></div> <p>If you can hear music played then you are good to use <code>default</code> for the server configuration. If you can not hear anything from the <code>aplay</code> firstly verify (using <code>alsamixer</code>) that the sound card is not muted. If the card is not muted AND there is no sound you can try the options below to determine the card and mixer for configuring the server.</p> <h2 id=automatically-determine-all-relevant-the-sound-card-information>Automatically Determine ALL relevant the sound card information<a class=headerlink href=#automatically-determine-all-relevant-the-sound-card-information title="Permanent link">&para;</a></h2> <p>As shown above, OwnTone can help, consider the information that logged:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a>laudio: Available ALSA playback mixer(s) on hw:0 CARD=Intel (HDA Intel): &#39;Master&#39; &#39;Headphone&#39; &#39;Speaker&#39; &#39;PCM&#39; &#39;Mic&#39; &#39;Beep&#39;
<a id=__codelineno-4-2 name=__codelineno-4-2 href=#__codelineno-4-2></a>laudio: Available ALSA playback mixer(s) on hw:1 CARD=E30 (E30): &#39;E30 &#39;
<a id=__codelineno-4-3 name=__codelineno-4-3 href=#__codelineno-4-3></a>laudio: Available ALSA playback mixer(s) on hw:2 CARD=Seri (Plantronics Blackwire 3210 Seri): &#39;Sidetone&#39; &#39;Headset&#39;
</code></pre></div> <p>Using the information above, we can see 3 sound cards that we could use with OwnTone with the first sound card having a number of separate mixer devices (volume control) for headphone and the internal speakers - we'll configure the server to use both these and also the E30 device. The server configuration for these multiple outputs would be:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-5-1 name=__codelineno-5-1 href=#__codelineno-5-1></a># using ALSA device alias where possible
<a id=__codelineno-5-2 name=__codelineno-5-2 href=#__codelineno-5-2></a>
<a id=__codelineno-5-3 name=__codelineno-5-3 href=#__codelineno-5-3></a>alsa &quot;hw:Intel&quot; {
<a id=__codelineno-5-4 name=__codelineno-5-4 href=#__codelineno-5-4></a> nickname = &quot;Computer - Speaker&quot;
<a id=__codelineno-5-5 name=__codelineno-5-5 href=#__codelineno-5-5></a> mixer = &quot;Speaker&quot;
<a id=__codelineno-5-6 name=__codelineno-5-6 href=#__codelineno-5-6></a>}
<a id=__codelineno-5-7 name=__codelineno-5-7 href=#__codelineno-5-7></a>
<a id=__codelineno-5-8 name=__codelineno-5-8 href=#__codelineno-5-8></a>alsa &quot;hw:Intel&quot; {
<a id=__codelineno-5-9 name=__codelineno-5-9 href=#__codelineno-5-9></a> nickname = &quot;Computer - Headphones&quot;
<a id=__codelineno-5-10 name=__codelineno-5-10 href=#__codelineno-5-10></a> mixer = &quot;Headphone&quot;
<a id=__codelineno-5-11 name=__codelineno-5-11 href=#__codelineno-5-11></a>}
<a id=__codelineno-5-12 name=__codelineno-5-12 href=#__codelineno-5-12></a>
<a id=__codelineno-5-13 name=__codelineno-5-13 href=#__codelineno-5-13></a>alsa &quot;plughw:E30&quot; {
<a id=__codelineno-5-14 name=__codelineno-5-14 href=#__codelineno-5-14></a> # this E30 device only support S32_LE so we can use the &#39;plughw&#39; prefix to
<a id=__codelineno-5-15 name=__codelineno-5-15 href=#__codelineno-5-15></a> # add transparent conversion support of more common S16/S24_LE formats
<a id=__codelineno-5-16 name=__codelineno-5-16 href=#__codelineno-5-16></a>
<a id=__codelineno-5-17 name=__codelineno-5-17 href=#__codelineno-5-17></a> nickname = &quot;E30 DAC&quot;
<a id=__codelineno-5-18 name=__codelineno-5-18 href=#__codelineno-5-18></a> mixer = &quot;E30 &quot;
<a id=__codelineno-5-19 name=__codelineno-5-19 href=#__codelineno-5-19></a> mixer_device = &quot;hw:E30&quot;
<a id=__codelineno-5-20 name=__codelineno-5-20 href=#__codelineno-5-20></a>}
</code></pre></div> <p>NB: it is troublesome to use <code>hw</code> or <code>plughw</code> ALSA addressing when running OwnTone on a machine with <code>pulseaudio</code> and if you wish to use refer to ALSA devices directly that you stop <code>pulseaudio</code>.</p> <h2 id=manually-determining-the-sound-cards-you-have-alsa-can-see>Manually Determining the sound cards you have / ALSA can see<a class=headerlink href=#manually-determining-the-sound-cards-you-have-alsa-can-see title="Permanent link">&para;</a></h2> <p>The example below is how I determined the correct sound card and mixer values for a Raspberry Pi that has an additional DAC card (hat) mounted. Of course using the log output from the server would have given the same results.</p> <p>Use <code>aplay -l</code> to list all the sound cards and their order as known to the system - you can have multiple <code>card X, device Y</code> entries; some cards can also have multiple playback devices such as the RPI's onboard sound card which feeds both headphone (card 0, device 0) and HDMI (card 0, device 1).</p> <div class=highlight><pre><span></span><code><a id=__codelineno-6-1 name=__codelineno-6-1 href=#__codelineno-6-1></a>$<span class=w> </span>aplay<span class=w> </span>-l
<a id=__codelineno-6-2 name=__codelineno-6-2 href=#__codelineno-6-2></a>
<a id=__codelineno-6-3 name=__codelineno-6-3 href=#__codelineno-6-3></a>****<span class=w> </span>List<span class=w> </span>of<span class=w> </span>PLAYBACK<span class=w> </span>Hardware<span class=w> </span>Devices<span class=w> </span>****
<a id=__codelineno-6-4 name=__codelineno-6-4 href=#__codelineno-6-4></a>card<span class=w> </span><span class=m>0</span>:<span class=w> </span>ALSA<span class=w> </span><span class=o>[</span>bcm2835<span class=w> </span>ALSA<span class=o>]</span>,<span class=w> </span>device<span class=w> </span><span class=m>0</span>:<span class=w> </span>bcm2835<span class=w> </span>ALSA<span class=w> </span><span class=o>[</span>bcm2835<span class=w> </span>ALSA<span class=o>]</span>
<a id=__codelineno-6-5 name=__codelineno-6-5 href=#__codelineno-6-5></a><span class=w> </span>Subdevices:<span class=w> </span><span class=m>6</span>/7
<a id=__codelineno-6-6 name=__codelineno-6-6 href=#__codelineno-6-6></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#0: subdevice #0</span>
<a id=__codelineno-6-7 name=__codelineno-6-7 href=#__codelineno-6-7></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#1: subdevice #1</span>
<a id=__codelineno-6-8 name=__codelineno-6-8 href=#__codelineno-6-8></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#2: subdevice #2</span>
<a id=__codelineno-6-9 name=__codelineno-6-9 href=#__codelineno-6-9></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#3: subdevice #3</span>
<a id=__codelineno-6-10 name=__codelineno-6-10 href=#__codelineno-6-10></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#4: subdevice #4</span>
<a id=__codelineno-6-11 name=__codelineno-6-11 href=#__codelineno-6-11></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#5: subdevice #5</span>
<a id=__codelineno-6-12 name=__codelineno-6-12 href=#__codelineno-6-12></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#6: subdevice #6</span>
<a id=__codelineno-6-13 name=__codelineno-6-13 href=#__codelineno-6-13></a>card<span class=w> </span><span class=m>0</span>:<span class=w> </span>ALSA<span class=w> </span><span class=o>[</span>bcm2835<span class=w> </span>ALSA<span class=o>]</span>,<span class=w> </span>device<span class=w> </span><span class=m>1</span>:<span class=w> </span>bcm2835<span class=w> </span>ALSA<span class=w> </span><span class=o>[</span>bcm2835<span class=w> </span>IEC958/HDMI<span class=o>]</span>
<a id=__codelineno-6-14 name=__codelineno-6-14 href=#__codelineno-6-14></a><span class=w> </span>Subdevices:<span class=w> </span><span class=m>1</span>/1
<a id=__codelineno-6-15 name=__codelineno-6-15 href=#__codelineno-6-15></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#0: subdevice #0</span>
<a id=__codelineno-6-16 name=__codelineno-6-16 href=#__codelineno-6-16></a>card<span class=w> </span><span class=m>1</span>:<span class=w> </span>IQaudIODAC<span class=w> </span><span class=o>[</span>IQaudIODAC<span class=o>]</span>,<span class=w> </span>device<span class=w> </span><span class=m>0</span>:<span class=w> </span>IQaudIO<span class=w> </span>DAC<span class=w> </span>HiFi<span class=w> </span>pcm512x-hifi-0<span class=w> </span><span class=o>[]</span>
<a id=__codelineno-6-17 name=__codelineno-6-17 href=#__codelineno-6-17></a><span class=w> </span>Subdevices:<span class=w> </span><span class=m>1</span>/1
<a id=__codelineno-6-18 name=__codelineno-6-18 href=#__codelineno-6-18></a><span class=w> </span>Subdevice<span class=w> </span><span class=c1>#0: subdevice #0</span>
</code></pre></div> <p>On this machine we see the second sound card installed, an IQaudIODAC dac hat, and identified as <code>card 1 device 0</code>. This is the playback device we want to be used by the server.</p> <p><code>hw:1,0</code> is the IQaudIODAC that we want to use - we verify audible playback through that sound card using <code>aplay -Dhw:1 /tmp/sine441.wav</code>. If the card has only one device, we can simply refer to the sound card using <code>hw:X</code> so in this case where the IQaudIODAC only has one device, we can refer to this card as <code>hw:1</code> or <code>hw:1,0</code>.</p> <p>Use <code>aplay -L</code> to get more information about the PCM devices defined on the system.</p> <div class=highlight><pre><span></span><code><a id=__codelineno-7-1 name=__codelineno-7-1 href=#__codelineno-7-1></a>$<span class=w> </span>aplay<span class=w> </span>-L
<a id=__codelineno-7-2 name=__codelineno-7-2 href=#__codelineno-7-2></a>
<a id=__codelineno-7-3 name=__codelineno-7-3 href=#__codelineno-7-3></a>null
<a id=__codelineno-7-4 name=__codelineno-7-4 href=#__codelineno-7-4></a><span class=w> </span>Discard<span class=w> </span>all<span class=w> </span>samples<span class=w> </span><span class=o>(</span>playback<span class=o>)</span><span class=w> </span>or<span class=w> </span>generate<span class=w> </span>zero<span class=w> </span>samples<span class=w> </span><span class=o>(</span>capture<span class=o>)</span>
<a id=__codelineno-7-5 name=__codelineno-7-5 href=#__codelineno-7-5></a>default:CARD<span class=o>=</span>ALSA
<a id=__codelineno-7-6 name=__codelineno-7-6 href=#__codelineno-7-6></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>ALSA
<a id=__codelineno-7-7 name=__codelineno-7-7 href=#__codelineno-7-7></a><span class=w> </span>Default<span class=w> </span>Audio<span class=w> </span>Device
<a id=__codelineno-7-8 name=__codelineno-7-8 href=#__codelineno-7-8></a>sysdefault:CARD<span class=o>=</span>ALSA
<a id=__codelineno-7-9 name=__codelineno-7-9 href=#__codelineno-7-9></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>ALSA
<a id=__codelineno-7-10 name=__codelineno-7-10 href=#__codelineno-7-10></a><span class=w> </span>Default<span class=w> </span>Audio<span class=w> </span>Device
<a id=__codelineno-7-11 name=__codelineno-7-11 href=#__codelineno-7-11></a>dmix:CARD<span class=o>=</span>ALSA,DEV<span class=o>=</span><span class=m>0</span>
<a id=__codelineno-7-12 name=__codelineno-7-12 href=#__codelineno-7-12></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>ALSA
<a id=__codelineno-7-13 name=__codelineno-7-13 href=#__codelineno-7-13></a><span class=w> </span>Direct<span class=w> </span>sample<span class=w> </span>mixing<span class=w> </span>device
<a id=__codelineno-7-14 name=__codelineno-7-14 href=#__codelineno-7-14></a>dmix:CARD<span class=o>=</span>ALSA,DEV<span class=o>=</span><span class=m>1</span>
<a id=__codelineno-7-15 name=__codelineno-7-15 href=#__codelineno-7-15></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>IEC958/HDMI
<a id=__codelineno-7-16 name=__codelineno-7-16 href=#__codelineno-7-16></a><span class=w> </span>Direct<span class=w> </span>sample<span class=w> </span>mixing<span class=w> </span>device
<a id=__codelineno-7-17 name=__codelineno-7-17 href=#__codelineno-7-17></a>dsnoop:CARD<span class=o>=</span>ALSA,DEV<span class=o>=</span><span class=m>0</span>
<a id=__codelineno-7-18 name=__codelineno-7-18 href=#__codelineno-7-18></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>ALSA
<a id=__codelineno-7-19 name=__codelineno-7-19 href=#__codelineno-7-19></a><span class=w> </span>Direct<span class=w> </span>sample<span class=w> </span>snooping<span class=w> </span>device
<a id=__codelineno-7-20 name=__codelineno-7-20 href=#__codelineno-7-20></a>dsnoop:CARD<span class=o>=</span>ALSA,DEV<span class=o>=</span><span class=m>1</span>
<a id=__codelineno-7-21 name=__codelineno-7-21 href=#__codelineno-7-21></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>IEC958/HDMI
<a id=__codelineno-7-22 name=__codelineno-7-22 href=#__codelineno-7-22></a><span class=w> </span>Direct<span class=w> </span>sample<span class=w> </span>snooping<span class=w> </span>device
<a id=__codelineno-7-23 name=__codelineno-7-23 href=#__codelineno-7-23></a>hw:CARD<span class=o>=</span>ALSA,DEV<span class=o>=</span><span class=m>0</span>
<a id=__codelineno-7-24 name=__codelineno-7-24 href=#__codelineno-7-24></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>ALSA
<a id=__codelineno-7-25 name=__codelineno-7-25 href=#__codelineno-7-25></a><span class=w> </span>Direct<span class=w> </span>hardware<span class=w> </span>device<span class=w> </span>without<span class=w> </span>any<span class=w> </span>conversions
<a id=__codelineno-7-26 name=__codelineno-7-26 href=#__codelineno-7-26></a>hw:CARD<span class=o>=</span>ALSA,DEV<span class=o>=</span><span class=m>1</span>
<a id=__codelineno-7-27 name=__codelineno-7-27 href=#__codelineno-7-27></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>IEC958/HDMI
<a id=__codelineno-7-28 name=__codelineno-7-28 href=#__codelineno-7-28></a><span class=w> </span>Direct<span class=w> </span>hardware<span class=w> </span>device<span class=w> </span>without<span class=w> </span>any<span class=w> </span>conversions
<a id=__codelineno-7-29 name=__codelineno-7-29 href=#__codelineno-7-29></a>plughw:CARD<span class=o>=</span>ALSA,DEV<span class=o>=</span><span class=m>0</span>
<a id=__codelineno-7-30 name=__codelineno-7-30 href=#__codelineno-7-30></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>ALSA
<a id=__codelineno-7-31 name=__codelineno-7-31 href=#__codelineno-7-31></a><span class=w> </span>Hardware<span class=w> </span>device<span class=w> </span>with<span class=w> </span>all<span class=w> </span>software<span class=w> </span>conversions
<a id=__codelineno-7-32 name=__codelineno-7-32 href=#__codelineno-7-32></a>plughw:CARD<span class=o>=</span>ALSA,DEV<span class=o>=</span><span class=m>1</span>
<a id=__codelineno-7-33 name=__codelineno-7-33 href=#__codelineno-7-33></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>IEC958/HDMI
<a id=__codelineno-7-34 name=__codelineno-7-34 href=#__codelineno-7-34></a><span class=w> </span>Hardware<span class=w> </span>device<span class=w> </span>with<span class=w> </span>all<span class=w> </span>software<span class=w> </span>conversions
<a id=__codelineno-7-35 name=__codelineno-7-35 href=#__codelineno-7-35></a>default:CARD<span class=o>=</span>IQaudIODAC
<a id=__codelineno-7-36 name=__codelineno-7-36 href=#__codelineno-7-36></a><span class=w> </span>IQaudIODAC,<span class=w> </span>
<a id=__codelineno-7-37 name=__codelineno-7-37 href=#__codelineno-7-37></a><span class=w> </span>Default<span class=w> </span>Audio<span class=w> </span>Device
<a id=__codelineno-7-38 name=__codelineno-7-38 href=#__codelineno-7-38></a>sysdefault:CARD<span class=o>=</span>IQaudIODAC
<a id=__codelineno-7-39 name=__codelineno-7-39 href=#__codelineno-7-39></a><span class=w> </span>IQaudIODAC,<span class=w> </span>
<a id=__codelineno-7-40 name=__codelineno-7-40 href=#__codelineno-7-40></a><span class=w> </span>Default<span class=w> </span>Audio<span class=w> </span>Device
<a id=__codelineno-7-41 name=__codelineno-7-41 href=#__codelineno-7-41></a>dmix:CARD<span class=o>=</span>IQaudIODAC,DEV<span class=o>=</span><span class=m>0</span>
<a id=__codelineno-7-42 name=__codelineno-7-42 href=#__codelineno-7-42></a><span class=w> </span>IQaudIODAC,<span class=w> </span>
<a id=__codelineno-7-43 name=__codelineno-7-43 href=#__codelineno-7-43></a><span class=w> </span>Direct<span class=w> </span>sample<span class=w> </span>mixing<span class=w> </span>device
<a id=__codelineno-7-44 name=__codelineno-7-44 href=#__codelineno-7-44></a>dsnoop:CARD<span class=o>=</span>IQaudIODAC,DEV<span class=o>=</span><span class=m>0</span>
<a id=__codelineno-7-45 name=__codelineno-7-45 href=#__codelineno-7-45></a><span class=w> </span>IQaudIODAC,<span class=w> </span>
<a id=__codelineno-7-46 name=__codelineno-7-46 href=#__codelineno-7-46></a><span class=w> </span>Direct<span class=w> </span>sample<span class=w> </span>snooping<span class=w> </span>device
<a id=__codelineno-7-47 name=__codelineno-7-47 href=#__codelineno-7-47></a>hw:CARD<span class=o>=</span>IQaudIODAC,DEV<span class=o>=</span><span class=m>0</span>
<a id=__codelineno-7-48 name=__codelineno-7-48 href=#__codelineno-7-48></a><span class=w> </span>IQaudIODAC,<span class=w> </span>
<a id=__codelineno-7-49 name=__codelineno-7-49 href=#__codelineno-7-49></a><span class=w> </span>Direct<span class=w> </span>hardware<span class=w> </span>device<span class=w> </span>without<span class=w> </span>any<span class=w> </span>conversions
<a id=__codelineno-7-50 name=__codelineno-7-50 href=#__codelineno-7-50></a>plughw:CARD<span class=o>=</span>IQaudIODAC,DEV<span class=o>=</span><span class=m>0</span>
<a id=__codelineno-7-51 name=__codelineno-7-51 href=#__codelineno-7-51></a><span class=w> </span>IQaudIODAC,<span class=w> </span>
<a id=__codelineno-7-52 name=__codelineno-7-52 href=#__codelineno-7-52></a><span class=w> </span>Hardware<span class=w> </span>device<span class=w> </span>with<span class=w> </span>all<span class=w> </span>software<span class=w> </span>conversions
</code></pre></div> <p>For the server configuration, we will use:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-8-1 name=__codelineno-8-1 href=#__codelineno-8-1></a>audio {
<a id=__codelineno-8-2 name=__codelineno-8-2 href=#__codelineno-8-2></a> nickname = &quot;Computer&quot;
<a id=__codelineno-8-3 name=__codelineno-8-3 href=#__codelineno-8-3></a> type = &quot;alsa&quot;
<a id=__codelineno-8-4 name=__codelineno-8-4 href=#__codelineno-8-4></a> card=&quot;hw:1&quot;
<a id=__codelineno-8-5 name=__codelineno-8-5 href=#__codelineno-8-5></a> # mixer=TBD
<a id=__codelineno-8-6 name=__codelineno-8-6 href=#__codelineno-8-6></a> # mixer_device=TBD
<a id=__codelineno-8-7 name=__codelineno-8-7 href=#__codelineno-8-7></a>}
</code></pre></div> <h2 id=mixer-name>Mixer name<a class=headerlink href=#mixer-name title="Permanent link">&para;</a></h2> <p>Once you have the card number (determined from <code>aplay -l</code>) we can inspect/confirm the name of the mixer that can be used for playback (it may NOT be <code>PCM</code> as expected by the server). In this example, the card <code>1</code> is of interest and thus we use <code>-c 1</code> with the following command:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-9-1 name=__codelineno-9-1 href=#__codelineno-9-1></a>$<span class=w> </span>amixer<span class=w> </span>-c<span class=w> </span><span class=m>1</span><span class=w> </span>
<a id=__codelineno-9-2 name=__codelineno-9-2 href=#__codelineno-9-2></a>Simple<span class=w> </span>mixer<span class=w> </span>control<span class=w> </span><span class=s1>&#39;DSP Program&#39;</span>,0
<a id=__codelineno-9-3 name=__codelineno-9-3 href=#__codelineno-9-3></a><span class=w> </span>Capabilities:<span class=w> </span>enum
<a id=__codelineno-9-4 name=__codelineno-9-4 href=#__codelineno-9-4></a><span class=w> </span>Items:<span class=w> </span><span class=s1>&#39;FIR interpolation with de-emphasis&#39;</span><span class=w> </span><span class=s1>&#39;Low latency IIR with de-emphasis&#39;</span><span class=w> </span><span class=s1>&#39;High attenuation with de-emphasis&#39;</span><span class=w> </span><span class=s1>&#39;Fixed process flow&#39;</span><span class=w> </span><span class=s1>&#39;Ringing-less low latency FIR&#39;</span>
<a id=__codelineno-9-5 name=__codelineno-9-5 href=#__codelineno-9-5></a><span class=w> </span>Item0:<span class=w> </span><span class=s1>&#39;Ringing-less low latency FIR&#39;</span>
<a id=__codelineno-9-6 name=__codelineno-9-6 href=#__codelineno-9-6></a>Simple<span class=w> </span>mixer<span class=w> </span>control<span class=w> </span><span class=s1>&#39;Analogue&#39;</span>,0
<a id=__codelineno-9-7 name=__codelineno-9-7 href=#__codelineno-9-7></a><span class=w> </span>Capabilities:<span class=w> </span>pvolume
<a id=__codelineno-9-8 name=__codelineno-9-8 href=#__codelineno-9-8></a><span class=w> </span>Playback<span class=w> </span>channels:<span class=w> </span>Front<span class=w> </span>Left<span class=w> </span>-<span class=w> </span>Front<span class=w> </span>Right
<a id=__codelineno-9-9 name=__codelineno-9-9 href=#__codelineno-9-9></a><span class=w> </span>Limits:<span class=w> </span>Playback<span class=w> </span><span class=m>0</span><span class=w> </span>-<span class=w> </span><span class=m>1</span>
<a id=__codelineno-9-10 name=__codelineno-9-10 href=#__codelineno-9-10></a><span class=w> </span>Mono:
<a id=__codelineno-9-11 name=__codelineno-9-11 href=#__codelineno-9-11></a><span class=w> </span>Front<span class=w> </span>Left:<span class=w> </span>Playback<span class=w> </span><span class=m>1</span><span class=w> </span><span class=o>[</span><span class=m>100</span>%<span class=o>]</span><span class=w> </span><span class=o>[</span><span class=m>0</span>.00dB<span class=o>]</span>
<a id=__codelineno-9-12 name=__codelineno-9-12 href=#__codelineno-9-12></a><span class=w> </span>Front<span class=w> </span>Right:<span class=w> </span>Playback<span class=w> </span><span class=m>1</span><span class=w> </span><span class=o>[</span><span class=m>100</span>%<span class=o>]</span><span class=w> </span><span class=o>[</span><span class=m>0</span>.00dB<span class=o>]</span>
<a id=__codelineno-9-13 name=__codelineno-9-13 href=#__codelineno-9-13></a>Simple<span class=w> </span>mixer<span class=w> </span>control<span class=w> </span><span class=s1>&#39;Analogue Playback Boost&#39;</span>,0
<a id=__codelineno-9-14 name=__codelineno-9-14 href=#__codelineno-9-14></a><span class=w> </span>Capabilities:<span class=w> </span>volume
<a id=__codelineno-9-15 name=__codelineno-9-15 href=#__codelineno-9-15></a><span class=w> </span>Playback<span class=w> </span>channels:<span class=w> </span>Front<span class=w> </span>Left<span class=w> </span>-<span class=w> </span>Front<span class=w> </span>Right
<a id=__codelineno-9-16 name=__codelineno-9-16 href=#__codelineno-9-16></a><span class=w> </span>Capture<span class=w> </span>channels:<span class=w> </span>Front<span class=w> </span>Left<span class=w> </span>-<span class=w> </span>Front<span class=w> </span>Right
<a id=__codelineno-9-17 name=__codelineno-9-17 href=#__codelineno-9-17></a><span class=w> </span>Limits:<span class=w> </span><span class=m>0</span><span class=w> </span>-<span class=w> </span><span class=m>1</span>
<a id=__codelineno-9-18 name=__codelineno-9-18 href=#__codelineno-9-18></a><span class=w> </span>Front<span class=w> </span>Left:<span class=w> </span><span class=m>0</span><span class=w> </span><span class=o>[</span><span class=m>0</span>%<span class=o>]</span><span class=w> </span><span class=o>[</span><span class=m>0</span>.00dB<span class=o>]</span>
<a id=__codelineno-9-19 name=__codelineno-9-19 href=#__codelineno-9-19></a><span class=w> </span>Front<span class=w> </span>Right:<span class=w> </span><span class=m>0</span><span class=w> </span><span class=o>[</span><span class=m>0</span>%<span class=o>]</span><span class=w> </span><span class=o>[</span><span class=m>0</span>.00dB<span class=o>]</span>
<a id=__codelineno-9-20 name=__codelineno-9-20 href=#__codelineno-9-20></a>...
</code></pre></div> <p>This card has multiple controls but we want to find a mixer control listed with a <code>pvolume</code> (playback) capability - in this case that mixer value required for the server configuration is called <code>Analogue</code>.</p> <p>For the server configuration, we will use:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-10-1 name=__codelineno-10-1 href=#__codelineno-10-1></a>audio {
<a id=__codelineno-10-2 name=__codelineno-10-2 href=#__codelineno-10-2></a> nickname = &quot;Computer&quot;
<a id=__codelineno-10-3 name=__codelineno-10-3 href=#__codelineno-10-3></a> type = &quot;alsa&quot;
<a id=__codelineno-10-4 name=__codelineno-10-4 href=#__codelineno-10-4></a> card=&quot;hw:1&quot;
<a id=__codelineno-10-5 name=__codelineno-10-5 href=#__codelineno-10-5></a> mixer=&quot;Analogue&quot;
<a id=__codelineno-10-6 name=__codelineno-10-6 href=#__codelineno-10-6></a> # mixer_device=TBD
<a id=__codelineno-10-7 name=__codelineno-10-7 href=#__codelineno-10-7></a>}
</code></pre></div> <h2 id=mixer-device>Mixer device<a class=headerlink href=#mixer-device title="Permanent link">&para;</a></h2> <p>This is the name of the underlying physical device used for the mixer - it is typically the same value as the value of <code>card</code> in which case a value is not required by the server configuration. An example of when you want to change explicitly configure this is if you need to use a <code>dmix</code> device (see below).</p> <h2 id=handling-devices-that-cannot-concurrently-play-multiple-audio-streams>Handling Devices that cannot concurrently play multiple audio streams<a class=headerlink href=#handling-devices-that-cannot-concurrently-play-multiple-audio-streams title="Permanent link">&para;</a></h2> <p>Some devices such as various RPI DAC boards (IQaudio DAC, Allo Boss DAC...) cannot have multiple streams opened at the same time/cannot play multiple sound files at the same time. This results in <code>Device or resource busy</code> errors. You can confirm if your sound card has this problem by using the example below once have determined the names/cards information as above.</p> <p>Using our <code>hw:1</code> device we try:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-11-1 name=__codelineno-11-1 href=#__codelineno-11-1></a><span class=c1># generate some audio</span>
<a id=__codelineno-11-2 name=__codelineno-11-2 href=#__codelineno-11-2></a>$<span class=w> </span>sox<span class=w> </span>-n<span class=w> </span>-c<span class=w> </span><span class=m>2</span><span class=w> </span>-r<span class=w> </span><span class=m>44100</span><span class=w> </span>-b<span class=w> </span><span class=m>16</span><span class=w> </span>-C<span class=w> </span><span class=m>128</span><span class=w> </span>/tmp/sine441.wav<span class=w> </span>synth<span class=w> </span><span class=m>30</span><span class=w> </span>sin<span class=w> </span><span class=m>500</span>-100<span class=w> </span>fade<span class=w> </span>h<span class=w> </span><span class=m>0</span>.2<span class=w> </span><span class=m>30</span><span class=w> </span><span class=m>0</span>.2
<a id=__codelineno-11-3 name=__codelineno-11-3 href=#__codelineno-11-3></a>
<a id=__codelineno-11-4 name=__codelineno-11-4 href=#__codelineno-11-4></a><span class=c1># attempt to play 2 files at the same time</span>
<a id=__codelineno-11-5 name=__codelineno-11-5 href=#__codelineno-11-5></a>$<span class=w> </span>aplay<span class=w> </span>-v<span class=w> </span>-Dhw:1<span class=w> </span>/tmp/sine441.wav<span class=w> </span><span class=p>&amp;</span>
<a id=__codelineno-11-6 name=__codelineno-11-6 href=#__codelineno-11-6></a>Playing<span class=w> </span>WAVE<span class=w> </span><span class=s1>&#39;/tmp/sine441.wav&#39;</span><span class=w> </span>:<span class=w> </span>Signed<span class=w> </span><span class=m>16</span><span class=w> </span>bit<span class=w> </span>Little<span class=w> </span>Endian,<span class=w> </span>Rate<span class=w> </span><span class=m>44100</span><span class=w> </span>Hz,<span class=w> </span>Stereo
<a id=__codelineno-11-7 name=__codelineno-11-7 href=#__codelineno-11-7></a>Hardware<span class=w> </span>PCM<span class=w> </span>card<span class=w> </span><span class=m>1</span><span class=w> </span><span class=s1>&#39;IQaudIODAC&#39;</span><span class=w> </span>device<span class=w> </span><span class=m>0</span><span class=w> </span>subdevice<span class=w> </span><span class=m>0</span>
<a id=__codelineno-11-8 name=__codelineno-11-8 href=#__codelineno-11-8></a>Its<span class=w> </span>setup<span class=w> </span>is:
<a id=__codelineno-11-9 name=__codelineno-11-9 href=#__codelineno-11-9></a><span class=w> </span>stream<span class=w> </span>:<span class=w> </span>PLAYBACK
<a id=__codelineno-11-10 name=__codelineno-11-10 href=#__codelineno-11-10></a><span class=w> </span>access<span class=w> </span>:<span class=w> </span>RW_INTERLEAVED
<a id=__codelineno-11-11 name=__codelineno-11-11 href=#__codelineno-11-11></a><span class=w> </span>format<span class=w> </span>:<span class=w> </span>S16_LE
<a id=__codelineno-11-12 name=__codelineno-11-12 href=#__codelineno-11-12></a><span class=w> </span>subformat<span class=w> </span>:<span class=w> </span>STD
<a id=__codelineno-11-13 name=__codelineno-11-13 href=#__codelineno-11-13></a><span class=w> </span>channels<span class=w> </span>:<span class=w> </span><span class=m>2</span>
<a id=__codelineno-11-14 name=__codelineno-11-14 href=#__codelineno-11-14></a><span class=w> </span>rate<span class=w> </span>:<span class=w> </span><span class=m>44100</span>
<a id=__codelineno-11-15 name=__codelineno-11-15 href=#__codelineno-11-15></a><span class=w> </span>exact<span class=w> </span>rate<span class=w> </span>:<span class=w> </span><span class=m>44100</span><span class=w> </span><span class=o>(</span><span class=m>44100</span>/1<span class=o>)</span>
<a id=__codelineno-11-16 name=__codelineno-11-16 href=#__codelineno-11-16></a><span class=w> </span>msbits<span class=w> </span>:<span class=w> </span><span class=m>16</span>
<a id=__codelineno-11-17 name=__codelineno-11-17 href=#__codelineno-11-17></a><span class=w> </span>buffer_size<span class=w> </span>:<span class=w> </span><span class=m>22052</span>
<a id=__codelineno-11-18 name=__codelineno-11-18 href=#__codelineno-11-18></a><span class=w> </span>period_size<span class=w> </span>:<span class=w> </span><span class=m>5513</span>
<a id=__codelineno-11-19 name=__codelineno-11-19 href=#__codelineno-11-19></a><span class=w> </span>period_time<span class=w> </span>:<span class=w> </span><span class=m>125011</span>
<a id=__codelineno-11-20 name=__codelineno-11-20 href=#__codelineno-11-20></a><span class=w> </span>tstamp_mode<span class=w> </span>:<span class=w> </span>NONE
<a id=__codelineno-11-21 name=__codelineno-11-21 href=#__codelineno-11-21></a><span class=w> </span>tstamp_type<span class=w> </span>:<span class=w> </span>MONOTONIC
<a id=__codelineno-11-22 name=__codelineno-11-22 href=#__codelineno-11-22></a><span class=w> </span>period_step<span class=w> </span>:<span class=w> </span><span class=m>1</span>
<a id=__codelineno-11-23 name=__codelineno-11-23 href=#__codelineno-11-23></a><span class=w> </span>avail_min<span class=w> </span>:<span class=w> </span><span class=m>5513</span>
<a id=__codelineno-11-24 name=__codelineno-11-24 href=#__codelineno-11-24></a><span class=w> </span>period_event<span class=w> </span>:<span class=w> </span><span class=m>0</span>
<a id=__codelineno-11-25 name=__codelineno-11-25 href=#__codelineno-11-25></a><span class=w> </span>start_threshold<span class=w> </span>:<span class=w> </span><span class=m>22052</span>
<a id=__codelineno-11-26 name=__codelineno-11-26 href=#__codelineno-11-26></a><span class=w> </span>stop_threshold<span class=w> </span>:<span class=w> </span><span class=m>22052</span>
<a id=__codelineno-11-27 name=__codelineno-11-27 href=#__codelineno-11-27></a><span class=w> </span>silence_threshold:<span class=w> </span><span class=m>0</span>
<a id=__codelineno-11-28 name=__codelineno-11-28 href=#__codelineno-11-28></a><span class=w> </span>silence_size<span class=w> </span>:<span class=w> </span><span class=m>0</span>
<a id=__codelineno-11-29 name=__codelineno-11-29 href=#__codelineno-11-29></a><span class=w> </span>boundary<span class=w> </span>:<span class=w> </span><span class=m>1445199872</span>
<a id=__codelineno-11-30 name=__codelineno-11-30 href=#__codelineno-11-30></a><span class=w> </span>appl_ptr<span class=w> </span>:<span class=w> </span><span class=m>0</span>
<a id=__codelineno-11-31 name=__codelineno-11-31 href=#__codelineno-11-31></a><span class=w> </span>hw_ptr<span class=w> </span>:<span class=w> </span><span class=m>0</span>
<a id=__codelineno-11-32 name=__codelineno-11-32 href=#__codelineno-11-32></a>$<span class=w> </span>aplay<span class=w> </span>-v<span class=w> </span>-Dhw:1<span class=w> </span>/tmp/sine441.wav
<a id=__codelineno-11-33 name=__codelineno-11-33 href=#__codelineno-11-33></a>aplay:<span class=w> </span>main:788:<span class=w> </span>audio<span class=w> </span>open<span class=w> </span>error:<span class=w> </span>Device<span class=w> </span>or<span class=w> </span>resource<span class=w> </span>busy
</code></pre></div> <p>In this instance this device cannot open multiple streams - OwnTone can handle this situation transparently with some audio being truncated from the end of the current file as the server prepares to play the following track. If this handling is causing you problems you may wish to use <a href=https://www.alsa-project.org/main/index.php/Asoundrc#Software_mixing>ALSA's <code>dmix</code> functionally</a> which provides a software mixing module. We will need to define a <code>dmix</code> component and configure the server to use that as it's sound card.</p> <p>The downside to the <code>dmix</code> approach will be the need to fix a sample rate (48000 being the default) for this software mixing module meaning any files that have a mismatched sample rate will be resampled.</p> <h2 id=alsa-dmix-configurationsetup>ALSA dmix configuration/setup<a class=headerlink href=#alsa-dmix-configurationsetup title="Permanent link">&para;</a></h2> <p>A <code>dmix</code> device can be defined in <code>/etc/asound.conf</code> or <code>~/.asoundrc</code> for the same user running OwnTone. We will need to know the underlying physical sound card to be used: in our examples above, <code>hw:1,0</code> / <code>card 1, device 0</code> representing our IQaudIODAC as per output of <code>aplay -l</code>. We also take the <code>buffer_size</code> and <code>period_size</code> from the output of playing a sound file via <code>aplay -v</code>.</p> <div class=highlight><pre><span></span><code><a id=__codelineno-12-1 name=__codelineno-12-1 href=#__codelineno-12-1></a># use &#39;dac&#39; as the name of the device: &quot;aplay -Ddac ....&quot;
<a id=__codelineno-12-2 name=__codelineno-12-2 href=#__codelineno-12-2></a>pcm.!dac {
<a id=__codelineno-12-3 name=__codelineno-12-3 href=#__codelineno-12-3></a> type plug
<a id=__codelineno-12-4 name=__codelineno-12-4 href=#__codelineno-12-4></a> slave.pcm &quot;dmixer&quot;
<a id=__codelineno-12-5 name=__codelineno-12-5 href=#__codelineno-12-5></a> hint.description &quot;IQAudio DAC s/w dmix enabled device&quot;
<a id=__codelineno-12-6 name=__codelineno-12-6 href=#__codelineno-12-6></a>}
<a id=__codelineno-12-7 name=__codelineno-12-7 href=#__codelineno-12-7></a>
<a id=__codelineno-12-8 name=__codelineno-12-8 href=#__codelineno-12-8></a>pcm.dmixer {
<a id=__codelineno-12-9 name=__codelineno-12-9 href=#__codelineno-12-9></a> type dmix
<a id=__codelineno-12-10 name=__codelineno-12-10 href=#__codelineno-12-10></a> ipc_key 1024 # need to be uniq value
<a id=__codelineno-12-11 name=__codelineno-12-11 href=#__codelineno-12-11></a> ipc_key_add_uid false # multiple concurrent different users
<a id=__codelineno-12-12 name=__codelineno-12-12 href=#__codelineno-12-12></a> ipc_perm 0666 # multi-user sharing permissions
<a id=__codelineno-12-13 name=__codelineno-12-13 href=#__codelineno-12-13></a>
<a id=__codelineno-12-14 name=__codelineno-12-14 href=#__codelineno-12-14></a> slave {
<a id=__codelineno-12-15 name=__codelineno-12-15 href=#__codelineno-12-15></a> pcm &quot;hw:1,0&quot; # points at the underlying device - could also simply be hw:1
<a id=__codelineno-12-16 name=__codelineno-12-16 href=#__codelineno-12-16></a> period_time 0
<a id=__codelineno-12-17 name=__codelineno-12-17 href=#__codelineno-12-17></a> period_size 4096 # from the output of aplay -v
<a id=__codelineno-12-18 name=__codelineno-12-18 href=#__codelineno-12-18></a> buffer_size 22052 # from the output of aplay -v
<a id=__codelineno-12-19 name=__codelineno-12-19 href=#__codelineno-12-19></a> rate 44100 # locked in sample rate for resampling on dmix device
<a id=__codelineno-12-20 name=__codelineno-12-20 href=#__codelineno-12-20></a> }
<a id=__codelineno-12-21 name=__codelineno-12-21 href=#__codelineno-12-21></a> hint.description &quot;IQAudio DAC s/w dmix device&quot;
<a id=__codelineno-12-22 name=__codelineno-12-22 href=#__codelineno-12-22></a>}
<a id=__codelineno-12-23 name=__codelineno-12-23 href=#__codelineno-12-23></a>
<a id=__codelineno-12-24 name=__codelineno-12-24 href=#__codelineno-12-24></a>ctl.dmixer {
<a id=__codelineno-12-25 name=__codelineno-12-25 href=#__codelineno-12-25></a> type hw
<a id=__codelineno-12-26 name=__codelineno-12-26 href=#__codelineno-12-26></a> card 1 # underlying device
<a id=__codelineno-12-27 name=__codelineno-12-27 href=#__codelineno-12-27></a> device 0
<a id=__codelineno-12-28 name=__codelineno-12-28 href=#__codelineno-12-28></a>}
</code></pre></div> <p>Running <code>aplay -L</code> we will see our newly defined devices <code>dac</code> and <code>dmixer</code></p> <div class=highlight><pre><span></span><code><a id=__codelineno-13-1 name=__codelineno-13-1 href=#__codelineno-13-1></a>$<span class=w> </span>aplay<span class=w> </span>-L
<a id=__codelineno-13-2 name=__codelineno-13-2 href=#__codelineno-13-2></a>null
<a id=__codelineno-13-3 name=__codelineno-13-3 href=#__codelineno-13-3></a><span class=w> </span>Discard<span class=w> </span>all<span class=w> </span>samples<span class=w> </span><span class=o>(</span>playback<span class=o>)</span><span class=w> </span>or<span class=w> </span>generate<span class=w> </span>zero<span class=w> </span>samples<span class=w> </span><span class=o>(</span>capture<span class=o>)</span>
<a id=__codelineno-13-4 name=__codelineno-13-4 href=#__codelineno-13-4></a>dac
<a id=__codelineno-13-5 name=__codelineno-13-5 href=#__codelineno-13-5></a><span class=w> </span>IQAudio<span class=w> </span>DAC<span class=w> </span>s/w<span class=w> </span>dmix<span class=w> </span>enabled<span class=w> </span>device
<a id=__codelineno-13-6 name=__codelineno-13-6 href=#__codelineno-13-6></a>dmixer
<a id=__codelineno-13-7 name=__codelineno-13-7 href=#__codelineno-13-7></a><span class=w> </span>IQAudio<span class=w> </span>DAC<span class=w> </span>s/w<span class=w> </span>dmix<span class=w> </span>device
<a id=__codelineno-13-8 name=__codelineno-13-8 href=#__codelineno-13-8></a>default:CARD<span class=o>=</span>ALSA
<a id=__codelineno-13-9 name=__codelineno-13-9 href=#__codelineno-13-9></a><span class=w> </span>bcm2835<span class=w> </span>ALSA,<span class=w> </span>bcm2835<span class=w> </span>ALSA
<a id=__codelineno-13-10 name=__codelineno-13-10 href=#__codelineno-13-10></a><span class=w> </span>Default<span class=w> </span>Audio<span class=w> </span>Device
<a id=__codelineno-13-11 name=__codelineno-13-11 href=#__codelineno-13-11></a>...
</code></pre></div> <p>At this point we are able to rerun the concurrent <code>aplay</code> commands (adding <code>-Ddac</code> to specify the playback device to use) to verify ALSA configuration.</p> <p>If there is only one card on the machine you may use <code>pcm.!default</code> instead of <code>pcm.!dac</code> - there is less configuration to be done later since many ALSA applications will use the device called <code>default</code> by default. Furthermore on RPI you can explicitly disable the onboard sound card to leave us with only the IQaudIODAC board enabled (won't affect HDMI sound output) by commenting out <code>#dtparam=audio=on</code> in <code>/boot/config.txt</code> and rebooting.</p> <h3 id=config-with-dmix>Config with dmix<a class=headerlink href=#config-with-dmix title="Permanent link">&para;</a></h3> <p>We will use the newly defined card named <code>dac</code> which uses the underlying <code>hw:1</code> device as per <code>/etc/asound.conf</code> or <code>~/.asoundrc</code> configuration. Note that the <code>mixer_device</code> is now required and must refer to the real device (see the <code>slave.pcm</code> value) and not the named device (ie <code>dac</code>) that we created and are using for the <code>card</code> configuration value.</p> <p>For the final server configuration, we will use:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-14-1 name=__codelineno-14-1 href=#__codelineno-14-1></a>audio {
<a id=__codelineno-14-2 name=__codelineno-14-2 href=#__codelineno-14-2></a> nickname = &quot;Computer&quot;
<a id=__codelineno-14-3 name=__codelineno-14-3 href=#__codelineno-14-3></a> type = &quot;alsa&quot;
<a id=__codelineno-14-4 name=__codelineno-14-4 href=#__codelineno-14-4></a> card=&quot;dac&quot;
<a id=__codelineno-14-5 name=__codelineno-14-5 href=#__codelineno-14-5></a> mixer=&quot;Analogue&quot;
<a id=__codelineno-14-6 name=__codelineno-14-6 href=#__codelineno-14-6></a> mixer_device=&quot;hw:1&quot;
<a id=__codelineno-14-7 name=__codelineno-14-7 href=#__codelineno-14-7></a>}
</code></pre></div> <h2 id=setting-up-an-audio-equalizer>Setting up an Audio Equalizer<a class=headerlink href=#setting-up-an-audio-equalizer title="Permanent link">&para;</a></h2> <p>There exists an ALSA equalizer plugin. On <code>debian</code> (incl Raspberry Pi) systems you can install this plugin by <code>apt install libasound2-plugin-equal</code>; this is not currently available on Fedora (FC31) but can be easily built from <a href=https://github.com/raedwulf/alsaequal>source</a> after installing the dependant <code>ladspa</code> package.</p> <p>Once installed the user must setup a virtual device and use this device in the server configuration.</p> <p>If you wish to use your <code>hw:0</code> device for output:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-15-1 name=__codelineno-15-1 href=#__codelineno-15-1></a># /etc/asound.conf
<a id=__codelineno-15-2 name=__codelineno-15-2 href=#__codelineno-15-2></a>ctl.equal {
<a id=__codelineno-15-3 name=__codelineno-15-3 href=#__codelineno-15-3></a> type equal;
<a id=__codelineno-15-4 name=__codelineno-15-4 href=#__codelineno-15-4></a>
<a id=__codelineno-15-5 name=__codelineno-15-5 href=#__codelineno-15-5></a> # library /usr/lib64/ladspa/caps.so
<a id=__codelineno-15-6 name=__codelineno-15-6 href=#__codelineno-15-6></a>}
<a id=__codelineno-15-7 name=__codelineno-15-7 href=#__codelineno-15-7></a>
<a id=__codelineno-15-8 name=__codelineno-15-8 href=#__codelineno-15-8></a>pcm.equal {
<a id=__codelineno-15-9 name=__codelineno-15-9 href=#__codelineno-15-9></a> type plug;
<a id=__codelineno-15-10 name=__codelineno-15-10 href=#__codelineno-15-10></a> slave.pcm {
<a id=__codelineno-15-11 name=__codelineno-15-11 href=#__codelineno-15-11></a> type equal;
<a id=__codelineno-15-12 name=__codelineno-15-12 href=#__codelineno-15-12></a>
<a id=__codelineno-15-13 name=__codelineno-15-13 href=#__codelineno-15-13></a> ## must be plughw:x,y and not hw:x,y
<a id=__codelineno-15-14 name=__codelineno-15-14 href=#__codelineno-15-14></a> slave.pcm &quot;plughw:0,0&quot;;
<a id=__codelineno-15-15 name=__codelineno-15-15 href=#__codelineno-15-15></a>
<a id=__codelineno-15-16 name=__codelineno-15-16 href=#__codelineno-15-16></a> # library /usr/lib64/ladspa/caps.so
<a id=__codelineno-15-17 name=__codelineno-15-17 href=#__codelineno-15-17></a> }
<a id=__codelineno-15-18 name=__codelineno-15-18 href=#__codelineno-15-18></a> hint.description &quot;equalised device&quot;
<a id=__codelineno-15-19 name=__codelineno-15-19 href=#__codelineno-15-19></a>}
</code></pre></div> <p>and in <code>owntone.conf</code></p> <div class=highlight><pre><span></span><code><a id=__codelineno-16-1 name=__codelineno-16-1 href=#__codelineno-16-1></a>alsa &quot;equal&quot; {
<a id=__codelineno-16-2 name=__codelineno-16-2 href=#__codelineno-16-2></a> nickname = &quot;Equalised Output&quot;
<a id=__codelineno-16-3 name=__codelineno-16-3 href=#__codelineno-16-3></a> # adjust accordingly for mixer with pvolume capability
<a id=__codelineno-16-4 name=__codelineno-16-4 href=#__codelineno-16-4></a> mixer = &quot;PCM&quot;
<a id=__codelineno-16-5 name=__codelineno-16-5 href=#__codelineno-16-5></a> mixer_device = &quot;hw:0&quot;
<a id=__codelineno-16-6 name=__codelineno-16-6 href=#__codelineno-16-6></a>}
</code></pre></div> <p>Using the web UI and on the outputs selection you should see an output called <code>Equalised Output</code> which you should select and set the volume.</p> <p>When starting playback for any audio tracks you should hopefully hear the output. In a terminal, run <code>alsamixer -Dequal</code> and you'll see the eqaliser - to test that this is all working, go and drop the upper frequencies and boosting the bass frequencies and give it a second - if this changes the sound profile from your speakers, well done, its done and you can adjust the equalizer as you desire.</p> <p>Note however, the equalizer appears to require a <code>plughw</code> device which means you cannnot use this equalizer with a <code>dmix</code> output chain.</p> <h2 id=troubleshooting>Troubleshooting<a class=headerlink href=#troubleshooting title="Permanent link">&para;</a></h2> <ul> <li>Errors in log <code>Failed to open configured mixer element</code> when selecting output device</li> <li> <p>Errors in log <code>Invalid CTL</code> or <code>Failed to attach mixer</code> when playing/adjusting volume</p> <p><code>mixer</code> value is wrong. Verify name of <code>mixer</code> value in server config against the names from all devices capable of playback using <code>amixer -c &lt;card number&gt;</code>. Assume the device is card 1:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-17-1 name=__codelineno-17-1 href=#__codelineno-17-1></a><span class=o>(</span><span class=nv>IFS</span><span class=o>=</span><span class=s1>$&#39;\n&#39;</span>
<a id=__codelineno-17-2 name=__codelineno-17-2 href=#__codelineno-17-2></a><span class=w> </span><span class=nv>CARD</span><span class=o>=</span><span class=m>1</span>
<a id=__codelineno-17-3 name=__codelineno-17-3 href=#__codelineno-17-3></a><span class=w> </span><span class=k>for</span><span class=w> </span>i<span class=w> </span><span class=k>in</span><span class=w> </span><span class=k>$(</span>amixer<span class=w> </span>-c<span class=w> </span><span class=si>${</span><span class=nv>CARD</span><span class=si>}</span><span class=w> </span>scontrols<span class=w> </span><span class=p>|</span><span class=w> </span>awk<span class=w> </span>-F<span class=se>\&#39;</span><span class=w> </span><span class=s1>&#39;{ print $2 }&#39;</span><span class=k>)</span><span class=p>;</span><span class=w> </span><span class=k>do</span><span class=w> </span>
<a id=__codelineno-17-4 name=__codelineno-17-4 href=#__codelineno-17-4></a><span class=w> </span>amixer<span class=w> </span>-c<span class=w> </span><span class=si>${</span><span class=nv>CARD</span><span class=si>}</span><span class=w> </span>sget<span class=w> </span><span class=s2>&quot;</span><span class=nv>$i</span><span class=s2>&quot;</span><span class=w> </span><span class=p>|</span><span class=w> </span>grep<span class=w> </span>Capabilities<span class=w> </span><span class=p>|</span><span class=w> </span>grep<span class=w> </span>-q<span class=w> </span>pvolume<span class=w> </span><span class=o>&amp;&amp;</span><span class=w> </span><span class=nb>echo</span><span class=w> </span><span class=nv>$i</span>
<a id=__codelineno-17-5 name=__codelineno-17-5 href=#__codelineno-17-5></a><span class=w> </span><span class=k>done</span>
<a id=__codelineno-17-6 name=__codelineno-17-6 href=#__codelineno-17-6></a><span class=o>)</span>
</code></pre></div> <p>Look at the names output and choose the one that fits. The outputs can be something like:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-18-1 name=__codelineno-18-1 href=#__codelineno-18-1></a><span class=c1># laptop</span>
<a id=__codelineno-18-2 name=__codelineno-18-2 href=#__codelineno-18-2></a>Master
<a id=__codelineno-18-3 name=__codelineno-18-3 href=#__codelineno-18-3></a>Headphone
<a id=__codelineno-18-4 name=__codelineno-18-4 href=#__codelineno-18-4></a>Speaker
<a id=__codelineno-18-5 name=__codelineno-18-5 href=#__codelineno-18-5></a>PCM
<a id=__codelineno-18-6 name=__codelineno-18-6 href=#__codelineno-18-6></a>Mic
<a id=__codelineno-18-7 name=__codelineno-18-7 href=#__codelineno-18-7></a>Beep
<a id=__codelineno-18-8 name=__codelineno-18-8 href=#__codelineno-18-8></a>
<a id=__codelineno-18-9 name=__codelineno-18-9 href=#__codelineno-18-9></a><span class=c1># RPI with no additional DAC, card = 0</span>
<a id=__codelineno-18-10 name=__codelineno-18-10 href=#__codelineno-18-10></a>PCM
<a id=__codelineno-18-11 name=__codelineno-18-11 href=#__codelineno-18-11></a>
<a id=__codelineno-18-12 name=__codelineno-18-12 href=#__codelineno-18-12></a><span class=c1># RPI with additional DAC hat (IQAudioDAC, using a pcm512x chip)</span>
<a id=__codelineno-18-13 name=__codelineno-18-13 href=#__codelineno-18-13></a>Analogue
<a id=__codelineno-18-14 name=__codelineno-18-14 href=#__codelineno-18-14></a>Digital
</code></pre></div> </li> <li> <p>No sound during playback - valid mixer/verified by aplay</p> <p>Check that the mixer is not muted or volume set to 0. Using the value of <code>mixer</code> as per server config and unmute or set volume to max. Assume the device is card 1 and <code>mixer = Analogue</code>:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-19-1 name=__codelineno-19-1 href=#__codelineno-19-1></a>amixer<span class=w> </span>-c<span class=w> </span><span class=m>1</span><span class=w> </span><span class=nb>set</span><span class=w> </span>Analogue<span class=w> </span>unmute<span class=w> </span><span class=c1>## some mixers can not be muted resulting in &quot;invalid command&quot;</span>
<a id=__codelineno-19-2 name=__codelineno-19-2 href=#__codelineno-19-2></a>amixer<span class=w> </span>-c<span class=w> </span><span class=m>1</span><span class=w> </span><span class=nb>set</span><span class=w> </span>Analogue<span class=w> </span><span class=m>100</span>%
</code></pre></div> <p>An example of a device with volume turned all the way down - notice the <code>Playback</code> values are <code>0</code>[0%]`:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-20-1 name=__codelineno-20-1 href=#__codelineno-20-1></a>Simple<span class=w> </span>mixer<span class=w> </span>control<span class=w> </span><span class=s1>&#39;Analogue&#39;</span>,0
<a id=__codelineno-20-2 name=__codelineno-20-2 href=#__codelineno-20-2></a>Capabilities:<span class=w> </span>pvolume
<a id=__codelineno-20-3 name=__codelineno-20-3 href=#__codelineno-20-3></a>Playback<span class=w> </span>channels:<span class=w> </span>Front<span class=w> </span>Left<span class=w> </span>-<span class=w> </span>Front<span class=w> </span>Right
<a id=__codelineno-20-4 name=__codelineno-20-4 href=#__codelineno-20-4></a>Limits:<span class=w> </span>Playback<span class=w> </span><span class=m>0</span><span class=w> </span>-<span class=w> </span><span class=m>1</span>
<a id=__codelineno-20-5 name=__codelineno-20-5 href=#__codelineno-20-5></a>Mono:
<a id=__codelineno-20-6 name=__codelineno-20-6 href=#__codelineno-20-6></a>Front<span class=w> </span>Left:<span class=w> </span>Playback<span class=w> </span><span class=m>0</span><span class=w> </span><span class=o>[</span><span class=m>0</span>%<span class=o>]</span><span class=w> </span><span class=o>[</span>-6.00dB<span class=o>]</span>
<a id=__codelineno-20-7 name=__codelineno-20-7 href=#__codelineno-20-7></a>Front<span class=w> </span>Right:<span class=w> </span>Playback<span class=w> </span><span class=m>0</span><span class=w> </span><span class=o>[</span><span class=m>0</span>%<span class=o>]</span><span class=w> </span><span class=o>[</span>-6.00dB<span class=o>]</span>
</code></pre></div> </li> <li> <p>Server stops playing after moving to new track in paly queue, Error in log <code>Could not open playback device</code> The log contains these log lines:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-21-1 name=__codelineno-21-1 href=#__codelineno-21-1></a>[2019-06-19 20:52:51] [ LOG] laudio: open &#39;/dev/snd/pcmC0D0p&#39; failed (-16)[2019-06-19 20:52:51] [ LOG] laudio: Could not open playback device: Device or resource busy
<a id=__codelineno-21-2 name=__codelineno-21-2 href=#__codelineno-21-2></a>[2019-06-19 20:52:51] [ LOG] laudio: Device &#39;hw&#39; does not support quality (48000/16/2), falling back to default
<a id=__codelineno-21-3 name=__codelineno-21-3 href=#__codelineno-21-3></a>[2019-06-19 20:52:51] [ LOG] laudio: open &#39;/dev/snd/pcmC0D0p&#39; failed (-16)[2019-06-19 20:52:51] [ LOG] laudio: Could not open playback device: Device or resource busy
<a id=__codelineno-21-4 name=__codelineno-21-4 href=#__codelineno-21-4></a>[2019-06-19 20:52:51] [ LOG] laudio: ALSA device failed setting fallback quality[2019-06-19 20:52:51] [ LOG] player: The ALSA device &#39;Computer&#39; FAILED
</code></pre></div> <p>If you have a RPI with a DAC hat with a <code>pcm512x</code> chip will affect you. This is because the server wants to open the audio device for the next audio track whilst current track is still playing but the hardware does not allow this - see the comments above regarding determining concurrrent playback.</p> <p>This error will occur for output hardware that do not support concurrent device open and the server plays 2 files of different bitrate (44.1khz and 48khz) back to back.</p> <p>If you observe the error, you will need to use the <code>dmix</code> configuration as mentioned above.</p> </li> </ul> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class=md-footer> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> <div class=md-social> <a href=https://github.com/owntone/owntone-server target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": "../..", "features": ["navigation.tabs", "navigation.top"], "search": "../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src=../../assets/javascripts/bundle.88dd0f4e.min.js></script> <script src=../../assets/extra.js></script> </body> </html>