MDX Player for iOS ver 2を更に高音質化するHiDef版のガイド

MDX Player ver2で再生周波数を変更できるようになりました(22,44,48,62.5KHz)
62.5KHzでは音質が良いのですが、他の周波数では内部で62.5KHzでエミュレートした上でダウンサンプリングをしていて、そのせいで音質が悪化します。

変更点

エミュレートエンジンであるGAMDXを改造して、
1) 指定周波数でのエミュレートを行いそのまま出力する(GAMDXの内部処理を変更)
2)ダウンサンプリングが必要なときは、高音質のリサンプラーを通すようにする
3) ADPCMは15.6KHzからアップサンプリングしているので、そこもリサンプラーを通す
リサンプラーはBSDライセンスのspeexライブラリを使用しました。2),3)はコンパイル時に使用・不使用を設定できるようにしました(後述)。iOS版では2)はメリットが殆ど無いのでデフォルトではオフにしてあります

4)また、究極の高音質化として、62.5KHz のMDX出力をダウンサンプルすること無くアップサンプルして出力できるよう、192KHzまでのHiDef DAC(外付け)に対応しました(実際に鳴っているところをまだ確認できていませんが

5)内部処理と、出力の周波数が違うので、周波数ボタンを2段にして上が内部処理、下が外部出力周波数とします

6)MDXを聞きながらポケモンGOをしていて気づいたのですが、一部のMDXファイルではボリュームが小さめのものがあります。ボリュームスイッチで音量を上げると、ポケモンGOの効果音が非常に大きくなってしまいます。せっかく内部のボリュームバーが付いたので、ボリュームを0〜1ではなく2まであげられるようにしてみました。

7)ボリュームを内部処理で上げると、16bitPCMの範囲からオーバーフローすることがあります(実はこれまでも一部の曲ではオーバーフローしていることはあった)。オーバーフローした時は自動的にボリュームを下げる機能をつけました(Automatic Gain Control)。ただ、次の曲に移ったときもそのボリュームが維持されるのが難点ですが。

8)周波数を変更したときにハングすることが一度だけ確認できました(何処かでMutexが開放されていないため?)。曲選択でエラーになったときにMutexが開放されていませんでしたので直しました。またしばらくMutex確保できないときにはタイム・アウトするようにしてみました。

使用法

https://github.com/sinn246/MDXPlayer/tree/HiDef においてあります。

フォルダ GAMDX > jni > speex というのが新たに導入したリサンプラーのファイル群です。
そのなかで speex_MDX.h というヘッダファイルにコンパイル時設定をまとめました。

#define USE_SPEEX
これを設定するとspeexルーチンが導入されます。設定しなければもとのままですが、リサンプラーはどうなるかというと、AppleがCoreAudioの中で勝手にリサンプルしてくれます

#define USE_SPEEX_FOR_ADPCM_UPSAMPLING
これを設定すると、ADPCMのアップサンプリングにspeexを使います。アップサンプリングにはわずかにディレイが生じるので、微妙にADPCMだけ音が遅れることにつながりますが、私にはほとんどわかりません・・・

// #define USE_SPEEX_FOR_DOWNSAMPLING
62.5KHzからダウンサンプルする必要があるとき、CoreAudioに任せずspeexライブラリを使用します。iPhoneで使う分には特に音質が上がるわけではなく(CoreAudioも音質は悪くなくさらに最適化されていると考えられるので)、研究的なもの(Androidなどに移植するときに使えるかも)として一応ソース上は残してあります(が、オフにしてあります

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中