C++ と irrKlang を使って オーディオファイルを再生する

[C/C++ にて　オーディオファイルを再生する]
(https://qiita.com/ohwada/items/f1f171908f8af769c56b)　
の続きです。

前回は、OpenAL を使う方法に紹介した。
今回は、irrKlang を使う方法に紹介する。
セットアップに手間がかかったので記録しておく。

### irrKlang

オーディオファイルを再生するライブラリです。
https://www.ambiera.com/irrklang/

クロスプラットフォーム（Windows、MacOS、Linux )です。

wav、ogg、mp3、flac、mod、xm、s3m などのファイル形式に対応している。

ライセンス
非商用製品では無料でirrKlang を使用できる。
商用製品では、irrKlang proライセンスを購入する必要がある。

### irrKlang のセットアップ

irrKlang はプラットフォーム毎にビルドされたライブラリで配布されている。

パッケージ管理ツールでインストールできない。
かなり手間がかかる。

(1)下記からダウンロードする
https://www.ambiera.com/irrklang/downloads.html


(2) 解凍する
下記のようなディレクトリとファイルの構成に展開される。
bin ディレクトリにプラットフォーム毎にビルドされたライブラリがある。

> doc
> examples
> examples.net
> include
> lib
> media
> plugins
> readme.txt
> changes.txt
> bin
>     dotnet-4-64		
>     linux-gcc-64		
>     winx64-visualStudio
>         libirrklang.dylib
>         ikpMP3.dylib
>         ikpFLAC.dylib

(3) 必要なファイルをシステム領域にコピーする。
(3-1) システム領域にディレクトリを作成する

> mkdir /usr/local/opt/irrklang
> mkdir /usr/local/opt/irrklang/include
> mkdir /usr/local/opt/irrklang/lib

(3-2)ヘッダーファイルとライブラリイファイルをコピーする

> cp include/* /usr/local/opt/irrklang/includ/
> cp  bin/macosx-gcc/*.dylib /usr/local/opt/irrklang/lib

下記のように g++ のコマンドオプションを指定してビルドする。

> g++ sample.cpp -I/usr/local/opt/irrklang/include  -L/usr/local/opt/irrklang/lib -lirrklang

(5) 実行環境を整備する
以降は主に MAC の場合

(5-1)　シンボリックリンクを作成する。

実行すると、下記のエラーになる。

> dyld: Library not loaded: /usr/local/lib/libirrklang.dylib

シンボリックリンクを作成する。

> ln -s /usr/local/opt/irrklang/lib/libirrklang.dylib /usr/local/lib/libirrklang.dylib

(5-2) ライブラリの使用を許可する

実行すると、下記のワーニングが表示される。

>	/usr/local/lib/libirrklang.dylib: code signature in (/usr/local/lib/libirrklang.dylib) not valid for use in process using Library Validation: library load disallowed by system policy

「開発元を検証できないため開けません」
![screenshot_libirrlang_warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/f57005e7-f463-f63b-19d7-4307c2de0499.png)

参考 apple developer
[Notarizing macOS Software Before Distribution](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution)

対応策
署名のないライブラリは、
手動で使用を許可する

システム環境設定のセキュリティとプラバシーから
![screenshot_libirrlang_security_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/87631ba5-67fb-5f4e-73fb-7e35ac3509dc.png)

再度実行すると、確認ダイアログが表示される
![screenshot_libirrlang_confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/f18f0876-b0fd-42a5-ce18-f38e5c7c539c.png)

参考
[macOS 10.15 Catalinaにおける「開発元を検証できないため開けません」](https://github.com/ko-ichi-h/khcoder/issues/100)


(4)pkg-config を使えるようにする

(4-1) 設定ファイルをコピーする

> mkdir /usr/local/opt/irrklang/pkgconfig
> cp pkgconfig/irrklang.pc /usr/local/opt/irrklang/pkgconfig

(4-2) PKG_CONFIG_PATH を設定する

> export PKG_CONFIG_PATH=/usr/local/opt/irrklang/pkgconfig

(4-2) 動作確認する

> pkg-config --cflags --libs irrklang
> -I/usr/local/opt/irrklang/include -L/usr/local/opt/irrklang/lib -lirrklang

以上で、下記のようにビルドできる。
> g++ sample.cpp `pkg-config --cflags --libs irrklang`

参考
[pkg-configを使ってg++でコンパイルできるようになるまで](https://qiita.com/t13m082h/items/c0482b87712f1d78a0f9)

### irrKlang の使用方法

[ irrKlang Tutorials](https://www.ambiera.com/irrklang/tutorials.html)

zip ファイルの examples に下記のサンプルがある。

> 01.HelloWorld
> 04.OverrideFileAccess
> 02.3DSound
> 03.MemoryPlayback
> 04.OverrideFileAccess			
> 05.Effects
> 06.Recording

01.HelloWorld を 参考にMAC で動くように修正したコードはこちらに。
https://github.com/ohwada/MAC_cpp_Samples/blob/master/irrKlang/play_file.cpp

### mp3 を再生する

libirrklang.dylib は、
wav、ogg、mod、xm、s3m などの形式に対応している。

mp3 のときは、実行ファイルと同じディレクトリに  ikpMP3.dylib　を配置する。

参考
[Cannot play mp3 File](https://ambiera.com/forum.php?t=847)

実行すると、ワーニングが表示されるので、
手動で使用を許可する。

![screenshot_ikpmp3_warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/e02bbbcd-2b5b-6ce3-b5f1-a98faa8f354f.png)

![screenshot_ikpmp3_security_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/41907182-0064-7116-ad5a-f1ee167442ca.png)