オーディオサンプルフォーマットコンバータとリサンプラ

オーディオデータを扱う時、8bit / 16bit / 24bit / 32bit に int / unsigned int / float だの LSB / MSB だの色々なフォーマットがあり、色々な周波数があり、それらを相互に変換できると嬉しいことが多々ある。
フォーマットの違いを吸収するためにはわりと泥臭いコードを泥臭く書かないといけないし、リサンプラは下手に作ると計算量も少なくないので重くなりやすい。

もちろん変換を経由しないのが一番ではあるものの、ドライバが腐っていて特定のフォーマットは非対応だったり、入力したデータがぶっ壊れてたりすることもあったりするので、というかあったので、変換しなければいけないケースが出てくる。

探してみると BSD 系ライセンスでその辺をやってくれるコードが見つかる。
  • PortAudio のサンプルフォーマットコンバータ実装箇所 pa_converters.c
    クリッピングやディザリングに対応したコンバータも一部ある
  • Speex のリサンプラ実装箇所 resample.c / resample_sse.h
    ファイル名からわかるとおり SSE 最適化済みコードも含んでいる
どちらのソースもわりと切り出しやすくなっていて部分的に使う場合でもハードルが低くてありがたい。

自分のように技術力がうんこでも一見うんこじゃないプログラムが作れるよ! うんこの部分はクローズドソースなんだ! ごめんな! でも普通うんこはクローズドでするだろ!

まあ結局これら使って作ってたソフトは情熱が冷めてやめちゃったんですがね……。