Linuxでサスペンド(スリープ)からの復帰後にS/PDIF出力にプチプチとノイズが出るときの対応

この記事は公開から3年以上経過しています。

Debian 10(PulseAudio+ALSA)に接続したUSBサウンドカードを光デジタル出力(S/PDIF)で利用しているとスリープから復帰したときにプチプチ音のノイズが発生してしまう現象に遭遇したため、その解決方法の備忘録。

PulseAudio/Alsa/カーネルパラメータによるチューニングなどで解決できない場合に解決できるかもしれません。

サスペンドからのレジューム後以外でも常にノイズが発生する場合は「PulseAudioでS/PDIF出力にプチプチノイズが出るときの対応」が参考になるかもしれません。

対応手順

  1. 以下のコマンドでコマンドからUSBをリセットできるか確認する。

    which usbreset

    結果

    /usr/bin/usbreset

    usbresetコマンドが存在すると上記のようにコマンドのフルパスが表示されるので手順3へ。

  2. usbresetコマンドが存在しないときは以下のGitHubサイトのusbutilsソースをビルドしてusbresetコマンドをインストールする。

    gregkh/usbutils

  3. 以下のコマンドでリセットしたいUSBサウンドカードを特定する。

    /usr/bin/usbreset

    結果

    Usage:
      usbreset PPPP:VVVV - reset by product and vendor id
      usbreset BBB/DDD   - reset by bus and device number
      usbreset "Product" - reset by product name
    
    Devices:
      Number BBB/DDD  ID PPPP:VVVV  USB Keyboard
      Number BBB/DDD  ID PPPP:VVVV  USB2.0 Hub
      Number BBB/DDD  ID PPPP:VVVV  USB Receiver
      Number BBB/DDD  ID PPPP:VVVV  USB Sound Device

    本例ではDevicesに表示される製品名USB Sound Deviceが問題のサウンドカード。

  4. 以下のコマンドでUSBサウンドカードのリセットで現象を解決できるか確認する(同一の製品名が複数存在する場合は製品ID:供給元IDのPPPP:VVVVを指定)。

    /usr/bin/usbreset "USB Sound Device"

    現象が解決できた場合は手順5へ。解決できない場合は残念ながらこの方法では解決できません

  5. 任意のテキストエディタで以下のサービスを作成する。

    /etc/systemd/system/reset-usbsound.service

    [Unit]
    Description=Action to Reset USB sound device after resuming from suspend
    After=suspend.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/usbreset "USB Sound Device"
    
    [Install]
    WantedBy=suspend.target

    ExecStartで製品名USB Sound Deviceのリセットを行う(同一の製品名が複数存在する場合は製品ID:供給元IDのPPPP:VVVVを指定)。

  6. 以下のコマンドでサービスを登録する。

    sudo systemctl enable /etc/systemd/system/reset-usbsound.service

上記設定がうまくできていれば、サスペンドからの復帰後に以下のようなカーネルログ(dmesg)が記録され、デバイスがリセットできていることが確認できます。

usb x-x: reset full-speed USB device number x using xhci_hcd

参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする