CAAudioFileについて [マックな開発]
前回のAUHALを使ってファイルを再生する方法でファイルが終りに達しているかをチェックするところでCAAudioFileのTell()をいうメソッドを使っていました。
しかし、Tell()という再生位置を返すメソッドの動きが期待したようになっていない場合があるようなので、前記事の追記とします。
まず、GetNumberFrames()は、ファイルにあるFrame数(PCMならサンプル数)を返します。Seek()は、ファイルの位置をFrameで指定するものです。これらのメソッドは、ファイルのフォーマットにあるサンプルレートがベースとなっているようです。
Tell()で位置を取得するとき、ファイル読み込み直後または、Seek()で位置を指定した直後は、ファイルのサンプルレートで値を返すようですが、再生すると再生したサンプルレートをベースにサンプル数を足しているようです。
すなわち、ファイルのサンプルレートと再生サンプルレートが異なると、正しい値が得られません。
32kHzのMP3を44.1kHzで最初から最後まで再生するとTell()の返す値は、GetNumberFrames()の返す値に44.1÷32をかけた数にほぼ近い値になります。適当な位置にSeek()してから最後まで再生するとGetNumberFrames()よりも大きい値になります。これはおそらく、Seek()で設定した値(ファイルのサンプルレート)に再生したサンプル数(再生サンプルレート)を足したいるためだと思われます。
あと、MP3などのパケットを使ったのフォーマット(non-PCM)の場合、ファイルを読み込み直後もしくは、Seek(0)で位置を最初にしたときにTell()は0を返さず、マイナスのパケットサイズを返すようです。Tell()の戻り値はUInt64なのでマイナスではなく巨大な数値になります。これについての説明は、CAAudioFile.cppのソースのコメントに書いてあります。なぜ、仕様としてそういう値を返そうとするのかは理解できませんが。
というわけで、現状バグっぽいので、CAAudilFile::Tell()はある限定された条件以外はうまく動かないのではないかということになります。
コメント 0