コンテンツへ移動

再生エンジン

再生エンジンの契約はソースへの忠実さです。ユーザーの元のバイト列を、ソース自身のレートで、リリースの構造を保ったままデコードします。このページはその仕様です。

すべてのデコードは、全プラットフォームでプロセス内の FFmpeg が行います。FLAC、MP3、APE、ALAC、AAC、PCM(WAV/AIFF)、Ogg Vorbis、Opus、WavPack、DSD がインポートで受け入れられます。記録上のコーデックは、ファイル拡張子ではなく、FFmpeg がバイト列から報告したものです。サンプルは出力段階へ 32 ビット float として出ます。実行される変換はサンプル形式変換だけです。

出力はプラットフォームのネイティブ音声 API です(デスクトップと iOS では cpal 経由の Core Audio、Android では AAudio)。出力ストリームはソースのサンプルレートとチャンネル数に設定されます。96 kHz のファイルは 96 kHz で再生されます。リサンプリング段はありません。既定の出力デバイスはストリーム構築ごとに解決されるため、再生はシステムのデバイス切り替えに従います。Android では、ハードウェア対応コーデックが FFmpeg を完全に迂回してオフロードデコードできる場合があります。

ストリーミング読み取り

このセクションへのリンク

再生にはファイル全体は不要です。音声はスパースバッファーを通じて読み取られます。ローカルファイル、キャッシュ、クラウドから、必要に応じてバイト範囲を取得します。シークでは、対象サンプルをバイト位置へ対応付けるため、未取得領域へのシークはそこから取得します。取得の調停は、再生中トラックの読み取りを先読みより優先するため、次のトラックが現在のトラックを遅らせることはありません。

窓としてのトラック

このセクションへのリンク

トラックはファイルではありません。1 つ以上のファイル上にあるサンプル窓の順序付きリストで、インポート時に CUE シートまたはファイル自身の範囲から作られます。この 1 つの表現が、あらゆるディスク形状を持ちます。トラックごとに 1 ファイル、ディスク全体が 1 つのイメージ、あるファイルの末尾と別ファイルの先頭にまたがるプリギャップ、非可逆リッピングでトラックごとに切られたファイルです。

プリギャップ窓はそのようにマークされます。トラックにプリギャップがある場合(index 00、隠しトラック音声を含む)、再生はそこから入りますが、時計はトラック時間を表示します。位置はトラック本体が始まるまでゼロに固定され、表示される長さはプリギャップを除外します。CD プレーヤーの挙動に合わせています。

次のトラックは、現在のトラックの再生中に開かれ、バッファーされます。2 つがサンプルレートとチャンネル数を共有している場合、エンジンはライブ音声コールバック内でそれらを連結します。ストリームは止まらず、境界はサンプル単位で正確です。形式が異なる場合はストリームを作り直します。これは形式の変化により境界が聞こえる場合です。

インポートは、デコード検証の処理中に integrated loudness(EBU R128)と true peak をトラックごと、アルバムごとに測定します。Replay gain は再生時にそれらの測定から導かれ、ファイルには焼き込まれません。目標は −18 LUFS で、true peak がクリップしないよう上限がかかり、トラック単位またはアルバム単位で適用され、ギャップレス境界でも切り替わります。このモードは現在、設定 UI なしで出荷され、既定ではオフです。ライブラリの設定ファイルで設定できます。

トラックリストは面とディスクの構造を持ちます。ユーザーが pause-between-sides を有効にした場合、エンジンは面の境界で保持し、続行プロンプトを表示できます。この保持は再生サービスの状態であり、デコード済みの無音ではありません。そのため再開は即時です。