私が今していること:
iPod Lib からオーディオを再生するためのコールバックを使用してオーディオ ユニットを実行しています。コールバックで、playxback バッファーに必要なサンプル数を取得します。inNumberFrames
static OSStatus playbackMP3Callback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
BeepTrackController *remoteIOplayer = (__bridge BeepTrackController *)inRefCon;
for (int i = 0 ; i < ioData->mNumberBuffers; i++){
AudioBuffer buffer = ioData->mBuffers[i];
if (remoteIOplayer->_isMP3Running == YES) {
SInt16 peak = [remoteIOplayer getMP3Samples:buffer.mData nrOfAudioFrames:inNumberFrames];
}else
memset(buffer.mData,0,ioData->mBuffers[i].mDataByteSize);
}
return noErr;
}
iPod Lib の読み取りには、CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer で AssetReader を使用します。これは、オーディオ コールバック バッファから必要なサンプル数とは異なるサンプル数を提供します。彼女の重要なコード行は次のとおりです。
-(SInt16) getMP3Samples:(SInt16*)address nrOfAudioFrames:(NSInteger)nrOfFrames
... Loop ....
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
_mp3Control.nextbuffer,
NULL,
&audioBufferList,
sizeof(audioBufferList),
NULL,
NULL,
kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
&_mp3Control.blockBuffer
);
... SNIP ....
for (int bufferCount=currentBuffer; bufferCount < audioBufferList.mNumberBuffers; bufferCount++) {
SInt16* samples = (SInt16 *)audioBufferList.mBuffers[bufferCount].mData;
for (int i=currentSampleCount; i < audioBufferList.mBuffers[bufferCount].mDataByteSize/2 ; i++) {
currentSample = samples[i];
address [_mp3Control.currentSampleBufferCount++] = currentSample;
// End of Buffer reached?
if (_mp3Control.currentSampleBufferCount >nrOfFrames*2) {
_mp3Control.currentSampleBufferCount = 0;
currentBuffer = bufferCount;
currentSampleCount = i;
return currentSample;
}
}
}
したがって、CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer が、AUnit コールバックのコールバック バッファに必要なサンプル量を正確に返すようにしたいと考えています。構造が等しいので、ここでこれを同期する方法に違いないと思います。私はオーディオの再生を達成しましたが、さまざまなサイズのバッファーへの醜い静的ポインターを使用しているため、よりエレガントで堅牢なものが必要です。
今、私は CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer 関数のドコを読んでいましたが、ヘッダー ファイルを除いて、ここに多くのドキュメントがないことは誰もが知っています。
ヒントはありますか?私の試みはすべてノイズやクラッシュで失敗しました...私はそれが可能でなければならないことを知っています;-)
ありがとう、アンドレアス