排他的にサウンドデバイスを使う::カンタンな設定の準備

WindowsでいうところのWASAPIみたいなDAC利用方法/ALSA・排他的(ubuntuだけ)


ともだちに説明するのがめんどくさいので、こういうスクリプトを書けばいいのかなと思って用意してみました。

WindowsでいうところのWASAPIっぽい(夕立(艦隊これくしょん))Linuxでのサウンド・ソースの使い方といってもいいのがこの設定ではないかと思います。

誤解全開で換言すればサウンド資源独り占めモードですね。WASAPI/ASIOと違いアプリケーションの音量コントロールなどに制限がありません。おおざっぱにですよ。完全排他的じゃないので言葉のアヤです。あくまで、おおざっぱにっぽい。

わりと簡便設定なのでオトクだと決めました。困っている場合は、騙されたとおもって一度どうぞ。


まとめるとUSB-DACなどでノイズ、プチ等が気になる場合は

  1. まず、この排他利用 をしてみる。
  2. それでもだめなら低遅延カーネルを導入する。
  3. それでもだめなら、jackを導入する。

という3段階で考えるといいと思います。その次はドライバが悪いか、デバイスが悪いということであきらめましょう。ノーマルレゾリューション(CD-DA 44.1khz DVD48k)レベルではトラブルことはないと思いますが、問題はですね!! ハイレゾフォーマットです。48k/24bitまではノートラブルでも96k/24bit以上になるとおかしいなんてことがおきます。深入りしても意味はない気がするので、だめな場合は機材を変えたほうがいいかも。


カーネルそのものを変えてみたり、ディストロ自体を最新にしてみるなどはお約束。というのは、ALSAやPulseの設定は散々やりましたが上で述べた1-2-3を試すのがもっとも楽であるというのが私の結論だからです。2年ぐらい無駄にした。笑) CPUが速ければ問題なくなるのかもしれませんね。セレロン並だから。

ついでにいうと効果がまったくなかったのは、アプリの優先度を最優先にしてみるです。これはうまくなかった。CPUパフォーマンス最大固定でも意味はなかった。
このマシンでW10を起動して鳴らしてみると問題ないのでLinuxの中の問題なのでしょうね。私の守備範囲を超えています。

余談です。それではあなたのUSB-DACはほんとうに192k/24bitをサンプリングしていますか?? 実は48k以上をカットして再生しているのではないですか?? どうせ聴こえない音ですが。DACによってはLEDランプで確実に処理レベルがわかるものがありますが、そうでないなら「確信」を持つことはできないのでは?? sinkをそのまま内部録音して、スペクトラムはみることができますね。あるいはS/PDIFで別の機械にを通して別のマシンで録音してスペクトラムをみると確実ですね。

そもそも一般人が192kに対応したマイク録音環境はもってないですよね?? 民放はないけれどNHKにはありますが。いい方法があれば教えてください。ぺこり。特にラズパイで。

余談おわり。

新規にターミナル(端末)を開きます。ubuntu系は以下を同時押し。CTRL+ALT+T

#/etc/modprobe.conf USB-Audioを低遅延にする呪文。わりと重要かも。自分には必須!!

$ cat /etc/modprobe.conf ↲
options snd-usb-audio nrpacks=1
デフォルトではない?!と思うのでこの1行だけのファイルを作る。太字大文字にしたのは私の気分です。

sudo gedit /etc/modprobe.conf ↲ でペタ、保存。

http://alsa.opensrc.org/Usb-audio#Tuning_USB_devices_for_minimal_latencies
効果的だと思うので必要に応じて試してみてください。だめなら戻せばいいのです。DACに限らずUSBのDTM機器の場合に有効みたいですよ。

どれを選んだらいいのかわからないとかアプリ毎の選択インターフェイスが違ってめんどくさいという人のために。以下のPerlスクリプトでどうぞ。これでいいかと思います。かたっぱしから試すのも手ですが。笑)


#次のコマンドを発行してhwではじまる行のいずれかを適宜選びます。(黄色をそのままコピーしてターミナルで実行します。)
aplay -L | perl -nle 's|^(.*)$|\n$1|g if m/DEV=\d/ ; print' | perl -nle '$/=""; print if /without any/ ' ↲

以下のような出力が得られます。眺めても楽しくないので、さくっと青いところに注目しましょう。

hw:CARD=Generic,DEV=0
    HD-Audio Generic, ALC892 Analog
    Direct hardware device without any conversions
hw:CARD=Generic,DEV=1
    HD-Audio Generic, ALC892 Digital
    Direct hardware device without any conversions
hw:CARD=series,DEV=0
    EHP-AHR192 series, USB Audio
    Direct hardware device without any conversions
hw:CARD=HA90USB,DEV=0
    HA90USB, USB Audio
    Direct hardware device without any conversions
hw:CARD=HA90USB,DEV=1
    HA90USB, USB Audio #1
    Direct hardware device without any conversions

コマンド時点、上から順に。
  • 背面ミニジャック・オンボード
  • S/PDIF 光出力角・オンボード
  • エレコム EHP-AHR192のandroid用USB-DAC
  • オーディオテクニカHA90USBのUSB-DAC analog
  • オーディオテクニカHA90USBのUSB-DAC#1 S/PDIF 
ハードウェア的にはどれも (192k/24bit)です。HDMI/Display Portのサウンドのみ無効にしてあります。モニター音声を無毛にしてある。

作業とデバイスが「USB-DACの設定である」と決まっている場合は次で絞り込めます。
aplay -L | perl -nle 's|^(.*)$|\n$1|g if m/DEV=\d/ ; print' | perl -nle '$/=""; print if /without any/ and /USB Audio/' ↲

これ(端末)を開いたまま、アプリの設定をしてみましょう。

#現在小生が排他的に設定しているアプリ
mpv ちょっとややこしい。以下参照
audacious
deadbeef
#アプリ別設定方法 MPVのみ 
mpvもデフォルトはPulseです。
マニュアルで調べながら設定して以下で動かしています。 1行目だけでいいとは思いますが、学習成果として3行。全体適用ではなく個別ディレクトリ単位のコンテナのみに適用するようにしています。デフォルトにすると使いにくいためです。


audio-device=alsa/hw:CARD=HA90USB,DEV=0 # HA90USB
audio-fallback-to-null=yes #フォールバック、繋ぎ忘れていても再生する。
audio-exclusive=yes #わがままモード,有能かも?!

16.04LTSですが、mpv/ffmpeg 共にgitです。アグレッシブにオプションが消えたりします。バージョンが違うと無効だったりしますのでご注意ください。
mpv 0.27.0-amended (C) 2000-2017 mpv/MPlayer/mplayer2 projects
 built on Thu Sep 14 07:49:49 UTC 2017
ffmpeg library versions:
   libavutil       55.74.100
   libavcodec      57.105.100
   libavformat     57.82.100
   libswscale      4.7.103
   libavfilter     6.105.100
   libswresample   2.8.100
ffmpeg version: git-2017-09-12-6ce4a63

具体例::DeadBeef 音楽プレイヤー おすすめ

#aplay -Lの基礎問題

検証がGUIでかったるいというのであれば次のようにもできます。
https://www.alsa-project.org/main/index.php/Asoundrc
aplay -Dplughw:CARD=HA90USB,DEV=0 test.wav ↲
再生中 WAVE 'test.wav' : Signed 24 bit Little Endian in 3bytes, レート 96000 Hz, ステレオ

aplay -Dhw:CARD=HA90USB,DEV=0 test.wav ↲

※ところで、私は提督ではない。