有馬総一郎のブログ

(彼氏の事情)

2025年04月18日 07:10:27 JST - 10 minute read - Linux

PipeWireがインストールされているLinuxのサンプルレートを変更する

Tauon Music Boxのオーディオ設定で再サンプリングを避けるにチェックを入れると、以下のようなダイアログが表示される。

Tip: To get samplerate to DAC you may need to check some settings, see: https://github.com/Taiko2k/Tauon/wiki/Audio-Specs

Tauon Music Box

この記事の大部分は、ちょっと高音質で聴きたいな、と思ったニワカが適当にググって調べて実行したものなの。また、以下のブログからの引用、実行なので、以降はこちらを見ていただいても良い。

やり方、結果から導かれる考えの信憑性は生成AI以下なので注意。

過去(適当な記憶。今から2010年あたり?)

これまで、何度かLinux環境でのハイレゾ1再生と高音質のためには、 リアルタイムカーネルとか JACK Audio Connection Kitの設定とかやってみたことはある。

リアルタイムカーネルは、ただ適当に使っている私にはカーネルが変わったところでどうこうはないけど、やはりディストリビューションによってはリアルタイムカーネルが見つからなかたり、アップデートでコケたりすることがあったので無理に入れなくなった。

また、jackといったサウンドサーバーに変えると、bluetoothでは再生できなかったり、対応しているアプリがあったりなかったり、ラッパーとかあるんだけど、それまでの PulseAudioのシームレスさと比べると煩雑で止めてしまった。

現在(2025年のにわかな知識)

Linuxカーネルのリアルタイム化は

「リアルタイムLinux」がメインラインカーネルに完全統合–20年に及ぶ開発を振り返る - ZDNET Japanから引用すると

「リアルタイムLinux」(「PREEMPT_RT」)がついに、ようやくメインラインカーネルに統合された。

リアルタイムLinuxのコードは、次の「Linux 6.12」カーネル以降、すべてのLinuxディストリビューションに組み込まれる。

とあるので、もう気にする必要はない。

先程の リアルタイムカーネルのリンク先でも

Linuxカーネルをリアルタイム化するための最後の拡張機能が、カーネル v6.12にて取り込まれました。リアルタイム(RT)カーネルには応答性をあげるための仕組みがいくつかありますが、それらは通常のカーネルにおいてもデフォルトで有効化されている

とある。

サウンドサーバーも今やマルチメディア フレームワークである PipeWireが普及して、PulseAudio、JACK、ALSA、GStreamer アプリケーションをシームレスにサポートしてくれるようになっている。

環境確認

カーネルバージョン

カーネルバージョンはuname -rで確認できる。ちなみに自分が使っているの Pop!_OS、まとめて取得したいならneofetchの後継アプリfastfetchのほうが情報は多い。

$ uname -r
6.12.10-76061203-generic
$ fastfetch
             /////////////                 arimasou16@pop-os
         /////////////////////             -----------------
      ///////*767////////////////          OS: Pop!_OS 22.04 LTS x86_64
    //////7676767676*//////////////        Host: S5
   /////76767//7676767//////////////       Kernel: Linux 6.12.10-76061203-generic
  /////767676///*76767///////////////      Uptime: 11 hours, 55 mins
 ///////767676///76767.///7676*///////     Packages: 2380 (dpkg), 6 (flatpak-system), 89 (flatpak-user)
/////////767676//76767///767676////////    Shell: zsh 5.8.1
//////////76767676767////76767/////////    Display (DELL S2721QS): 3840x2160 @ 60 Hz in 27" [External] *
///////////76767676//////7676//////////    Display (GSM5AB8): 3840x2160 @ 60 Hz in 22" [External]
////////////,7676,///////767///////////    DE: GNOME 42.9
/////////////*7676///////76////////////    WM: Mutter (X11)
///////////////7676////////////////////    WM Theme: Pop
 ///////////////7676///767////////////     Theme: Pop [GTK2/3/4]
  //////////////////////'////////////      Icons: Pop [GTK2/3/4]
   //////.7676767676767676767,//////       Font: Noto Sans (10pt) [GTK2/3/4]
    /////767676767676767676767/////        Cursor: Pop (24px)
      ///////////////////////////          Terminal: tilix 1.9.4
         /////////////////////             Terminal Font: PlemolJP Console NF (16pt)
             /////////////                 CPU: AMD Ryzen 5 5500U (12) @ 4.06 GHz
                                           GPU: AMD Lucienne [Integrated]
                                           Memory: 13.39 GiB / 28.29 GiB (47%)
                                           Swap: 512.00 KiB / 20.00 GiB (0%)
                                           Disk (/): 236.30 GiB / 459.52 GiB (51%) - ext4
                                           Disk (/mnt/hdd1): 1.92 TiB / 5.46 TiB (35%) - ntfs3
                                           Disk (/mnt/hdd2): 6.30 TiB / 7.28 TiB (87%) - ntfs3
                                           Disk (/recovery): 2.87 GiB / 3.99 GiB (72%) - vfat
                                           Local IP (wlo1): 192.168.0.163/24
                                           Locale: ja_JP.UTF-8

PipeWire動作確認

  • インストール確認pactl info

    サーバー名PulseAudio (on PipeWireとなっているか見る。なっていればインストール済み。

  • 起動確認wpctl status

    デバイスやクライアントが認識されているか

  • 上記で十分だと思うが、サービススタースの確認systemctl --user status pipewire.service pipewire-pulse.socket wireplumber.service

    それぞれactive (running)になっているか

pactl info実行結果

$ pactl info
サーバー文字列: /run/user/1000/pulse/native
ライブラリプロトコルバージョン: 35
サーバープロトコルバージョン: 35
Is ローカル: はい
クライアントインデックス: 484
タイルサイズ: 65472
ユーザー名: arimasou16
ホスト名: pop-os
サーバー名: PulseAudio (on PipeWire 1.0.3)
サーバーバージョン: 15.0.0
デフォルトサンプル仕様: float32le 2ch 48000Hz
デフォルトチャンネルマップ: front-left,front-right
デフォルトシンク: alsa_output.usb-Feixiang_USB_HIFI_Audio-01.iec958-stereo
デフォルトソース: alsa_input.usb-Ruision_UVC_Camera_20200416-02.mono-fallback
クッキー: aa7a:4152

サンプルレート設定変更後はデフォルトサンプル仕様: float32le 2ch 96000Hzとなる。

wpctl status実行結果

$ wpctl status
PipeWire 'pipewire-0' [1.0.3, arimasou16@pop-os, cookie:2860138834]
 └─ Clients:
        31. WirePlumber                         [1.0.3, arimasou16@pop-os, pid:3061]
        32. WirePlumber [export]                [1.0.3, arimasou16@pop-os, pid:3061]
        35. pipewire                            [1.0.3, arimasou16@pop-os, pid:3062]
        85. xdg-desktop-portal                  [1.0.3, arimasou16@pop-os, pid:3587]
        86. GNOME Volume Control Media Keys     [1.0.3, arimasou16@pop-os, pid:3886]
        87. GSConnect                           [1.0.3, arimasou16@pop-os, pid:4075]
        88. GNOME Shell Volume Control          [1.0.3, arimasou16@pop-os, pid:3687]
        89. Chromium input                      [1.0.3, arimasou16@pop-os, pid:5229]
        90. system76-scheduler                  [1.0.3, root@pop-os, pid:1437]
        91. Mutter                              [1.0.3, arimasou16@pop-os, pid:3687]
        92. Firefox                             [1.0.3, arimasou16@pop-os, pid:6898]
        93. speech-dispatcher-dummy             [1.0.3, arimasou16@pop-os, pid:8681]
        94. Thunderbird                         [1.0.3, arimasou16@pop-os, pid:17809]
        95. Firefox                             [1.0.3, arimasou16@pop-os, pid:6898]
       112. wpctl                               [1.0.3, arimasou16@pop-os, pid:64806]

Audio
 ├─ Devices:
 │      45. USB HIFI Audio                      [alsa]
 │      46. UVC Camera                          [alsa]
 │      47. Renoir Radeon High Definition Audio Controller [alsa]
 │      48. Family 17h (Models 10h-1fh) HD Audio Controller [alsa]
 ├─ Sinks:
 │      36. Family 17h (Models 10h-1fh) HD Audio Controller Line Output + Second Line Output + Headphones [vol: 0.59]
 │  *   49. USB HIFI Audio デジタルステレオ (IEC958) [vol: 0.53]
 │      52. Renoir Radeon High Definition Audio Controller HDMI / DisplayPort 4 Output [vol: 1.00]
 │      53. Renoir Radeon High Definition Audio Controller HDMI / DisplayPort 3 Output [vol: 1.00]
 │      54. Renoir Radeon High Definition Audio Controller HDMI / DisplayPort 2 Output [vol: 0.31]
 │      55. Renoir Radeon High Definition Audio Controller HDMI / DisplayPort 1 Output [vol: 0.98]
 ├─ Sink endpoints:
 ├─ Sources:
 │      39. Family 17h (Models 10h-1fh) HD Audio Controller Digital Microphone [vol: 1.00]
 │      41. Family 17h (Models 10h-1fh) HD Audio Controller Front Stereo Microphone + Headphones Stereo Microphone [vol: 1.00]
 │      50. USB HIFI Audio アナログステレオ [vol: 1.00]
 │  *   51. UVC Camera モノ                   [vol: 1.00]
 ├─ Source endpoints:
 └─ Streams:
        98. speech-dispatcher-dummy                                     
             99. output_FL       > USB HIFI Audio:playback_FL	[active]
            100. output_FR       > USB HIFI Audio:playback_FR	[active]

Video
 ├─ Devices:
 ├─ Sinks:
 ├─ Sink endpoints:
 ├─ Sources:
 ├─ Source endpoints:
 └─ Streams:

Settings
 └─ Default Configured Node Names:
         0. Audio/Sink    bluez_output.00_23_13_02_1F_28.1
         1. Audio/Source  alsa_input.usb-Ruision_UVC_Camera_20200416-02.mono-fallback

systemctl --user status pipewire.service pipewire-pulse.socket wireplumber.service実行結果

$ systemctl --user status pipewire.service pipewire-pulse.socket wireplumber.service
● pipewire.service - PipeWire Multimedia Service
     Loaded: loaded (/usr/lib/systemd/user/pipewire.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-04-16 20:58:05 JST; 12h ago
TriggeredBy: ● pipewire.socket
   Main PID: 2862 (pipewire)
      Tasks: 3 (limit: 34560)
     Memory: 12.2M
        CPU: 58.580s
     CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire.service
             └─2862 /usr/bin/pipewire

 4月 16 20:58:05 pop-os systemd[2847]: Started PipeWire Multimedia Service.

● pipewire-pulse.socket - PipeWire PulseAudio
     Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.socket; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-04-16 20:58:05 JST; 12h ago
   Triggers: ● pipewire-pulse.service
     Listen: /run/user/1000/pulse/native (Stream)
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/pipewire-pulse.socket

 4月 16 20:58:05 pop-os systemd[2847]: Listening on PipeWire PulseAudio.

● wireplumber.service - Multimedia Service Session Manager
     Loaded: loaded (/usr/lib/systemd/user/wireplumber.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-04-16 20:58:05 JST; 12h ago
   Main PID: 2866 (wireplumber)
      Tasks: 5 (limit: 34560)
     Memory: 6.5M
        CPU: 888ms
     CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/wireplumber.service
             └─2866 /usr/bin/wireplumber


### サンプルレート確認

DACでサポートされているサンプルレートを取得するgrep -E 'Codec|Audio Output|rates' /proc/asound/card*/codec#*

$  grep -E 'Codec|Audio Output|rates' /proc/asound/card*/codec#*
/proc/asound/card0/codec#0:Codec: ATI R6xx HDMI
・・・省略・・・
/proc/asound/card2/codec#0:Node 0x25 [Audio Output] wcaps 0x41d: Stereo Amp-Out
/proc/asound/card2/codec#0:    rates [0x560]: 44100 48000 96000 192000

現在、使用されているサンプルレートを確認するgrep rate: /proc/asound/card?/pcm??/sub?/hw_params

$ grep rate: /proc/asound/card?/pcm??/sub?/hw_params
/proc/asound/card1/pcm0p/sub0/hw_params:rate: 44100 (44100/1)

PipeWireサーバー上で動作しているノードとデバイスの統計情報をリアルタイムに表示するpw-top

pw-top
S   ID  QUANT   RATE    WAIT    BUSY   W/Q   B/Q  ERR FORMAT           NAME                                                                                                   
S   28      0      0    ---     ---   ---   ---     0                  Dummy-Driver
S   29      0      0    ---     ---   ---   ---     0                  Freewheel-Driver
S   42      0      0    ---     ---   ---   ---     0                  Midi-Bridge
R   49    512  44100  83.5us  12.5us  0.01  0.00    0    S24LE 2 44100 alsa_output.usb-Feixiang_USB_HIFI_Audio-01.iec958-stereo
R   98    941  44100  50.1us  21.4us  0.00  0.00    4    S16LE 1 44100  + speech-dispatcher-dummy
S   50      0      0    ---     ---   ---   ---     0                  alsa_input.usb-Feixiang_USB_HIFI_Audio-01.analog-stereo
S   51      0      0    ---     ---   ---   ---     0                  alsa_input.usb-Ruision_UVC_Camera_20200416-02.mono-fallback
S   52      0      0    ---     ---   ---   ---     0                  alsa_output.pci-0000_04_00.1.HiFi__hw_Generic_9__sink
S   53      0      0    ---     ---   ---   ---     0                  alsa_output.pci-0000_04_00.1.HiFi__hw_Generic_8__sink
S   54      0      0    ---     ---   ---   ---     0                  alsa_output.pci-0000_04_00.1.HiFi__hw_Generic_7__sink
S   55      0      0    ---     ---   ---   ---     0                  alsa_output.pci-0000_04_00.1.HiFi__hw_Generic_3__sink
S   36      0      0    ---     ---   ---   ---     0                  alsa_output.pci-0000_04_00.6.HiFi__hw_Generic_1__sink
S   41      0      0    ---     ---   ---   ---     0                  alsa_input.pci-0000_04_00.6.HiFi__hw_Generic_1__source
S   39      0      0    ---     ---   ---   ---     0                  alsa_input.pci-0000_04_00.6.HiFi__hw_acp__source

サンプルレートを高音質化する(ArchWiki)

PipeWire - ArchWikiだと1ファイルだけ変えれば変更されるとあるが、実際その通りとなった。

~/.config/pipewire/pipewire.conf

-    #default.clock.rate          = 48000
-    #default.clock.allowed-rates = [ 48000 ]
+    default.clock.rate          = 96000
+    default.clock.allowed-rates = [ 96000, 48000 ]

変更したら、systemctl --user restart pipewire.service pipewire-pulse.socket wireplumber.service

Sound quality (resampling quality) の項目で、違いが良く分からない音質(リサンプリング品質)の変更があるが、そもそもサンプルレートの変更でも違いが分からない上に変にCPUの負荷を上げるようなことはしたくなかったので、以下の設定は止めた。

~/.config/pipewire/client.conf.d ディレクトリとファイルは存在しなかったので新規作成。

~/.config/pipewire/client.conf.d/resample.conf

stream.properties = {
    resample.quality = 14
}

LinuxにDolbyクラスの高音質を。

このサイトでの B.1.Pipewire + Pipewire-pulseの場合の設定。 を参考に以下の設定も行なったが、結局違いや、grep rate: /proc/asound/card?/pcm??/sub?/hw_paramsでの結果から違いはなかったので、この変更も止めた。

設定の意味や違いが分かる人はトライしてほしい。

~/.config/pipewire/pipewire.conf

    ## Properties for the DSP configuration.
-    #default.clock.rate          = 48000
-    #default.clock.allowed-rates = [ 48000 ]
-    #default.clock.quantum       = 1024
-    default.clock.min-quantum   = 16
-    #default.clock.max-quantum   = 2048
-    #default.clock.quantum-limit = 8192
+    default.clock.rate          = 96000
+    default.clock.allowed-rates = [ 192000, 96000, 48000 ]
+    default.clock.quantum       = 1024
+    default.clock.min-quantum   = 32
+    default.clock.max-quantum   = 8192
+    default.clock.quantum-limit = 8192
・・・中略・・・
context.exec = [
    #{ path = <program-name> [ args = "<arguments>" ] }
    #
    # Execute the given program with arguments.
    #
    # You can optionally start the session manager here,
    # but it is better to start it as a systemd service.
    # Run the session manager with -h for options.
    #
    #{ path = "/usr/bin/pipewire-media-session" args = "" }
    #
    # You can optionally start the pulseaudio-server here as well
    # but it is better to start it as a systemd service.
    # It can be interesting to start another daemon here that listens
    # on another address with the -a option (eg. -a tcp:4713).
    #
    #{ path = "/usr/bin/pipewire" args = "-c pipewire-pulse.conf" }
+    { path = "pactl" args = "load-module module-always-sink" }
]

~/.config/pipewire/pipewire-pulse.conf

-    #pulse.default.frag     = 96000/48000   # 2 seconds
-    #pulse.default.tlength  = 96000/48000   # 2 seconds
-    #pulse.min.quantum      = 256/48000     # 5ms
-    #pulse.default.format   = F32
-    #pulse.default.position = [ FL FR ]
+    pulse.default.frag     = 192000/48000   # 2 seconds
+    pulse.default.tlength  = 192000/48000   # 2 seconds
+    #pulse.min.quantum      = 256/48000     # 5ms
+    pulse.default.format   = F32
+    pulse.default.position = [ FL FR ]

~/.config/pipewire/pipewire.conf.d/20-virtual-pipe-source.conf ファイルは存在しなかったので新規作成。

~/.config/pipewire/pipewire.conf.d/20-virtual-pipe-source.conf

context.modules = [
  {   name = libpipewire-module-pipe-tunnel
      args = {
          tunnel.mode = source
          pipe.filename = "/tmp/virtualdevice"
          audio.format = F32LE
          audio.rate = 192000
          audio.channels = 2
          audio.position = [ FL FR ]
          stream.props = {
              node.name = VirtualMic
          }
      }
  }
]

結果

~/.config/pipewire/pipewire.confdefault.clock.ratedefault.clock.allowed-ratesを変更した結果の話。

grep rate: /proc/asound/card?/pcm??/sub?/hw_paramsで確認していくと、Tauon Music Boxや Feishinで再生していると96kHzになる。FirefoxのYoutubeだと48kHzで表示される。

default.clock.rateはデフォルトだから48kHz(もしくはコメントアウトしたまま)にして、default.clock.allowed-ratesにCDより上の数値があれば良いのかと思いきや、96kHzハイレゾの曲を再生しても48kHzのままなのでdefault.clock.rateは96kHzとした。

Feishinの再生設定には、以下のような項目がある。

サンプルレート 設定とメディアのサンプル周波数が異なる場合に使用する出力サンプルレートを選択します

Feishin

そこが48kHzのままでも、曲のサンプレートに関係なく96kHzで表示される。

mpvだけが、44.1kHz48kHz96kHzと曲のサンプルレートごとに表示された。

オーディオサーバーやアプリでの制御とか絡み合うので複雑なんだろう。またgrep rate: /proc/asound/card?/pcm??/sub?/hw_paramsの確認・表示の意味もよく判ってない。

で、肝心の高音質したのかどうか…いや全く違いが分からない…そもそも 自分の耳がハイレゾ対応かどうかABX Comparatorで判定するで違いが分からなかったのだから当たり前だ。

それに、以下の動画を見て、もうflacもハイレゾではなくロスレスを購入しているので、正直、サンプルレートだビットがどうとか、実はどうでもいい。

サブウーファーでのスピーカー増設が一番聴覚上違いがあった(当たり前だが)。恐らくサンプルレートの変更よりもオーディオサーバーの変更jackとかの方が聴覚上の違いはありそうだ。


追記 2025-04-18
とか思ったら、互換ライブラリはインストール済みだった。純正?のものとどれだけの違いがあるのか分からないが、もうやるべきことはやった、という感じだ。

$ sudo apt search pipewire-jack 
Identified face as arimasou16
Identified face as arimasou16
ソート中... 完了
全文検索... 完了  
pipewire-audio-client-libraries/jammy,jammy,now 1.0.2~1707732619~22.04~b8b871b all [インストール済み]
  transitional package for pipewire-alsa and pipewire-jack

pipewire-jack/jammy,now 1.0.2~1707732619~22.04~b8b871b amd64 [インストール済み、自動]
  PipeWire JACK plugin

追記ここまで



  1. ここでのハイレゾとは、44.1kHz/24bit量子化ビット数がCDスペックより高いか96kHz /16bitサンプリング周波数がCDスペックより高いを定義している。 一般社団法人 日本オーディオ協会 | ハイレゾ | ハイレゾロゴ | 定義と運用 ↩︎