D言語でPortAudioとかlibsndfileを叩いてたらコマンドラインで動く音楽プレーヤーが出来てた。

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

初めに

ふとしたきっかけで、D言語で音を扱いたいなぁって思って調べていると
PortAudioを使ってD言語で波形を鳴らす
という記事を発見しました。

そこで、ビビビッときた僕はこれで上手いことやれば、コマンドラインで動く音楽プレーヤーが開発できるのでは...?と考えて手を動かしたところ、
出来ました。

こちらです: Github alphaKAI/yacmp
yacmpという命名に関しては、Yet Anotoher Console Music Playerの各単語の頭文字をくっつけただけという安直なネーミングです。

技術的な話。

まずはじめに使っているライブラリとかについて。
PortAudioを ウォルター先生がポーティングしてくださった、バインディングを用いて使っています。
バインディング : PortAudio D bindings
また、libsndfileに関しては適当にdubで検索していた所、以下のバインディングを見つけたのでそれを使いました。
derelict_extras-sndfile

次に、コードについて。
最初に断っておくと、あまり綺麗な実装では無いです。_
操作のためにマルチスレッドで色々としているのですが、とりあえず動けばいいや、といった考えで手を動かしていたらいつの間にかできていた、ということもあってフラグ管理とかが普通に甘いです。
多分適当に触ってると普通にバグを踏みそうです。(幾つかケースは想定できていますが、面倒なのでいつか時間があれば...)。

簡単に何が汚いかを書いておくと、
shared staticな変数を用いて関数間を横断して色々と情報を共有しています。
これ用のクラスを作って隠蔽して〜とかもやればよかったなぁとは思いますが、先ほど行ったとおりいつの間にかできていたので、はい。

実際の所、このプログラムはほとんどPortAudiolibsndfileに関するサンプルをネットで検索している中で見つけたサンプルをD言語にコンバートしてチョットだけミュージックプレイヤーっぽくしただけ、というようなものです。
それ故に、コードに関する解説はあまり必要ないと思いますのでここでは言及しないことにします。

とりあえず、動くようになってはいるので
適当にforkするなどして、Dlang UI等のGUIツールキットと組み合わせれば簡単にD言語でミュージックプレイヤーアプリケーションが開発できます。

また、最後に注意としては
音楽ファイルの読み込みにlibsndfileを用いているのですが、READMEに

Supported formats

Supported formats are based on that of libsndfile.

と書いたとおり、読み込める音楽ファイルのフォーマットはlibsndfileがサポートしているフォーマットに基づきます。
したがって、libsndfileMP3に対応していないのでyacmpMP3には対応していません。
何故、libsndfileMP3をサポートしていないのかということはlibsndfileの公式ページのFAQに書いてあります。
libsndfile : Frequently Asked Questions. / Q20 : Why doesn't libsndfile support MP3? Lots of other Open Source projects support it!

とりあえず、D言語でPortAudiolibsndfileを叩いていたらいつの間にかコマンドラインで動く音楽プレーヤーができていたのでそれの紹介をしました。
(手を動かしていたらいつのまにか音楽プレーヤーができているとか、D言語ってやっぱり強力だなぁと思いました。)