Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

ラズパイでAirPlay2を実現するためには、Shairport SyncとNQPTPをインストールします。古い環境(AirPlay1)ではNQPTPは必要ありませんでした。ここではAirPlay2の導入方法です。

ビルドインストールしないとならないため少し分かりにくいですよね。(make make install)

手順に従って実行して、エラーメッセージが出たらよく読んで進めていきます。ラズパイやOS、出力先によっても異なりますので注意してください。

iPhoneのミュージックアプリからAirPlay2を経由して、Pi 5に繋いだモニターのスピーカーから出力する例です。

PipWireとPulseAudio

ちょっと複雑でなかなか理解が進みません。

Raspberry Pi OSも他のLinuxシステム同様に、PulseAudioまたはPipeWireがサウンドサーバーとしてインストールされています。PipWireに移行する途中?という感じです。

これが厄介で、GUIの環境だとShairport Syncに問題を引き起こします。

逆にRaspberry Pi OS LiteなどはGUIもPulseAudioもシステムにありません。PulseAudioがない環境が望ましいとのこと。詳しくは次のサイトに書いてあります。

GitHub

shairport-sync/ADVANCED TOPICS/PulseAudioAndPipeWire.md at master · mikebrady/shairport-sync AirPlay and AirPlay 2 audio player. Contribute to mikebrady/shairport-sync development by creating an account on GitHub.

AirPlay2(shairport-sync)のサポート

AirPlay2は主にAppleの製品と接続できます。

  • iOS搭載デバイス(iPhone、iPad)

  • macOS 10.15 (Catalina) 以降

  • HomePod mini

  • Apple TV

  • メタデータ

  • ミュージックソース

  • WindowsのiTunes

  • リモートコントロール用

  • 10.15(Catalina)より前のmacOS

  • 複数のインスタンスを同じシステムでホストできない

  • メタデータとミュージック以外は受信できない

shairport-sync/AIRPLAY2.md at master · mikebrady/shairport-sync

やり直すには

既にshairport-syncをビルドインストールしてしまった場合は、実行ファイルとサービスファイルを削除してから再度ビルドインストールしましょう。間に一旦再起動を挟みます。

Raspberry Pi OSの例:

  • /usr/local/bin/shairport-sync
  • /lib/systemd/system/shairport-sync.service

古いサービスファイルの削除

古いAirPlay1をインストールしたことが無ければ、恐らく無いと思います。もしインストールしたことがある場合は既にあるshairport-syncを削除します。

which shairport-sync

複数表示されたらすべて削除しておきます。

仮に/usr/local/bin/shairport-syncを削除するコマンド。

sudo rm /usr/local/bin/shairport-sync
  • /etc/systemd/system/shairport-sync.service
  • /etc/systemd/user/shairport-sync.service
  • /lib/systemd/system/shairport-sync.service
  • /lib/systemd/user/shairport-sync.service
  • /etc/init.d/shairport-sync

記事執筆時点のRaspberry Pi OS bookwormだと、/lib/systemd/system/shairport-sync.serviceにあると思います。これも削除しておきます。無ければ構いません。

削除した場合は一旦再起動します。

必要なライブラリ類のインストール

ここからがインストールです。

shairport-syncとNQPTPをビルドインストールするのに必要なライブラリやツールソフトをインストールしておきます。

いわゆる依存関係に必要なファイルです。

sudo apt update
sudo apt upgrade
sudo apt install --no-install-recommends build-essential git autoconf automake libtool \
    libpopt-dev libconfig-dev libasound2-dev avahi-daemon libavahi-client-dev libssl-dev libsoxr-dev \
    libplist-dev libsodium-dev libavutil-dev libavcodec-dev libavformat-dev uuid-dev libgcrypt-dev xxd

■Pi 5は8GBモデルがオススメ

Shairport Syncのビルドインストール

configureで使うフラグオプションの-with-alsa(alsaへの出力)と、--with-pa(PulseAudioオーディオバックエンド)で、--sysconfdir=/etcは設定ファイルはetcの中がデフォルトというフラグオプションです。

他のフラグや詳しくは以下のURLで確認してください。

shairport-sync/CONFIGURATION FLAGS.md at master · mikebrady/shairport-sync

パターンとして2つ。

1つは通常通り、ビルドインストールしたサービスを有効にして使用するパターン。もう1つは、サービスは動作させず、GUIで直接起動するパターンです。

パターン1

一般的なLinuxでは以下のようにサービスとしてシステムのデーモンとして実行させます。

エラーが出たり、Raspberry Pi OS GUI版の場合などはパターン2を試してみてください。

cd ~
git clone https://github.com/mikebrady/shairport-sync.git
cd shairport-sync
autoreconf -fi
./configure --sysconfdir=/etc --with-alsa \
    --with-soxr --with-avahi --with-ssl=openssl --with-systemd --with-airplay-2 --with-pa
make
sudo make install

サービスの有効化。

sudo systemctl enable shairport-sync

これは通常通りのビルドインストールです。

shairport-sync/BUILD.md at master · mikebrady/shairport-sync

パターン2

Raspberry Pi 5で試しているビルドインストールと設定をもう1つのパターンとして載せておきます。これで上手く行きました。

ケースバイケースですが、エラーで困ったら、こちらのパターンも試してみてください。

エラーの例

sudo systemctl status shairport-sync
Failed to create secure directory (/home/shairport-sync/.config/pulse): No such file or directory
fatal error: could not establish a service on port 7000 -- program terminating. Is another instance of Shairport Sync running on this device?

または、音が出ない。

パターン1と違うのは、直接-with-alsa(alsaへの出力)と--with-pa(PulseAudioオーディオバックエンド)を使わず、PipWireのバックエンドとして使う方法です。

更に、デーモンとして実行せず、GUIで自動起動からshairport-syncを起動させます。

PipeWireの実験的なサポートがあります。必要なライブリを先にインストールします。

sudo apt install libpipewire-0.3-dev

configureのフラグを変更したビルドインストールコマンド。

cd ~
git clone https://github.com/mikebrady/shairport-sync.git
cd shairport-sync
autoreconf -fi
 ./configure --sysconfdir=/etc --with-pw \
    --with-soxr --with-avahi --with-ssl=openssl --with-systemd --with-airplay-2
make
sudo make install

--with-paを外し、-with-alsa-with-pwへ変更したものです。

この場合、ビルドインストールした後、shairport-sync.confにターゲットデバイス名を直接指定します。

ターゲットデバイス名は、次のコマンドで見つけられるでしょう。(pactl list sources sinks shortまたはpactl list sourcesから探す)

pactl list sources sinks short
217	alsa_output.platform-107c701400.hdmi.hdmi-stereo	PipeWire	s32le 2ch 48000Hz	RUNNING

この例では、HDMIで繋がっているモニターのスピーカーなので"alsa_output.platform-107c701400.hdmi.hdmi-stereo"ですね。

conf内のsink_targetに入力します。

sudo nano /etc/shairport-sync.conf

confファイルの真ん中辺りにあるpw =にあるsink_targetです。

// Parameters for the "pw" PipeWire backend.
// For this section to be operative, Shairport Sync must be built with the following configuration fla>
// --with-pw
pw =
{
        application_name = "Shairport Sync"; // Set this to the name that should appear in the Sounds >
        node_name = "Shairport Sync"; // This appears in some PipeWire CLI tool outputs.
        sink_target = "ターゲットデバイス名"; // Leave this commented out >
};

行頭のコメントアウト(//)を外し、sink_targetに出力先のデバイス名に置き換えます。

pwはPipWireのバックエンドなので、そこから直接alsa_から始まる出力先へ渡すためです。

サービスは無効のまま

この場合は、サービスは無効のままで使います。その代わり、起動時にshairport-syncを起動させることになります。

Raspberry Pi OS bookwormの~/.config/wayfire.iniへ自動起動を記述する。

sudo nano ~/.config/wayfire.ini
[autostart]
shairport = /usr/local/bin/shairport-sync

サービスはdisableのままということになります。(enableやstartはしない)

sudo systemctl status shairport-sync.service
○ shairport-sync.service - Shairport Sync - AirPlay Audio Receiver
     Loaded: loaded (/lib/systemd/system/shairport-sync.service; disabled; preset: enabled)
     Active: inactive (dead)

この方法はdockerなどでも有効なようです。

今後、PipWireの開発が進めば1つにまとまるかも知れません。記事執筆時点での対処法です。

参考:

[Problem]: No audio after update to Raspberry Pi OS Bookworm · Issue #1749 · mikebrady/shairport-syn…

理由など:

shairport-sync/ADVANCED TOPICS/PulseAudioAndPipeWire.md at development · mikebrady/shairport-sync

他のコマンド

インストールが完了したらバージョンを確認してみます。

shairport-sync -V
4.3.3-AirPlay2-smi10-OpenSSL-Avahi-ALSA-pa-soxr-sysconfdir:/etc

受信中は次のコマンドでオーディオ情報が返ってきます。

shairport-sync --statistics

NQPTPのビルドインストール

今のAirPlay2はNQPTPというクロック同期管理に使われるツールが必要です。ビルドインストールはgithubに公開されている手順に従います。

GitHub - mikebrady/nqptp: Not Quite PTP

cd ~
git clone https://github.com/mikebrady/nqptp.git
cd nqptp
autoreconf -fi
./configure --with-systemd-startup
make
sudo make install

そしてサービスを有効化して再起動しておきます。

sudo systemctl enable nqptp
sudo systemctl start nqptp

サービスでエラーがないか確認する。

sudo systemctl status nqptp
sudo systemctl status shairport-sync.service

NQPTPアプリは、ポート319/UDPと320/UDPへアクセスが必要です。PTPサービスデーモンをはじめ、同じポートを使用する他のユーザーと共存できない排他利用です。

もしもファイアーウォールで閉じているなら該当のポートを開けてください。

PTP ( Precision Time Protocol )はクロック同期に使用されるプロトコルです。NTPと連携した時刻設定が有名です。GPSレシーバーを使った記事で用語として知りました。

PTPプロトコル

Wi-Fiの省電力をオフ

Wi-Fiの省電力状態へ移行すると、AirPlayのリストに出なくなることが予想されるのでパワーセーブをオフにしておきます。

Raspberry Pi OS bookwormの場合は以下。

sudo iw dev wlan0 set power_save off

iPhoneなどから確認

iPhoneでミュージックアプリの出力先をPi5にインストールしたshairport-syncへ変更して確認する。画像の場合はホスト名がPi5nvmeになっています。

Pi 5のHDMIのスピーカーから聞こえたら成功です。

HDMIのスピーカーなので接続しているモニターが点いていないと鳴りません。

ラズパイでAirPlay

AirPlay2(shairport-sync)は、Raspberry Pi 2またはPi Zero 2以上のパワーを持つシステムに対応しているため、現行で手に入るモデルなら問題ありません。

AirPlayには1と2があるので、ちょっと混乱しますね。