https://adventar.org/calendars/3353 の16日目エントリーです。
tremolo
tremoloはOgg Vorbisのデコードを行うライブラリです。
tremoloはtremorをARM NEON命令を活用して最適化したものです。tremorは浮動小数点ではなく整数型のみを使用して実装されているOgg Vorbisの展開ライブラリです。浮動小数点ほど微細な音声にはなりませんが、モバイル環境など軽量な処理が求められる環境により相応しいものになっています。
GoogleがAndroid向けに最適化されたものとしてAOSP(Android Open Source Project)の一部として配布しているもので、実装としてはほぼ完成しているはずです。
libvorbisencとlibvorbisidec
浮動小数点を使用した実装は(おそらくLinux系ディストリビューションの大半では)libvorbis、libvorbisencおよびlibvorbisfileとしてパッケージされているでしょう。筆者が使用しているUbuntu 18.04ではlibvorbis0a、libvorbisenc2、libvorbisfile3となっています。(dpkg -L libvorbisenc2
などで内容を確認できます。)
一方tremorはlibvorbisidecという名前でパッケージされています。tremorとlibvorbisの間にはいくつかの部分でAPI互換性がありません(もともとのAPIが概ね同じところからスタートしているので、大部分は互換であるといえます)。APIが似ているからといって、これらを混同して使うと期待通りに動作しないでしょう。他言語バインディングなどを作成するときには注意しましょう。
Androidで使う場合
なお、tremoloはAndroidで使われているので、Android M以前の端末ではアプリケーションにlibvorbisidec.soをパッケージしなくても大抵の場合は呼び出すことが出来ましたが、tremoloはAndroid NDKの標準APIには含まれていないので、tremoloをアプリケーションで使おうと思ったら、自分で明示的にビルドして含める必要があります。
筆者はtremoloのC#バインディングtremolo-sharpを作って公開しているのですが、実はまだ全然使っておらず、作業内容も、昔作ったアプリケーションからのtremolo interop部分の抜き出しと、tremoloのNDKビルドスクリプトの作成がほとんどでした(使っていたコードなので動くには動くとは思います)。後者は他の言語バインディングを作成したい場合にも有用だと思うので、適宜再利用してもらえればと思います。