RemoteIO 自体のセットアップ プロセス(かなり骨が折れますが、 Apple のサンプル コードでカバーされています) を除けば、洞察の重要なポイントは次のとおりです。
- 最初にストリームをセットアップするために使用したのと同じ
AudioStreamBasicDescription
( ) を使用します。*audioFormat
他の質問や投稿に基づいて、パラメーターがわずかに異なる新しいパラメーターを設定するのにどれだけの時間を費やしたかわかりません。ivar からストリーム属性を参照するだけで十分でした。
- 「isRecording」ブール値を設定して、RemoteIO セッションを破棄して再セットアップしなくても、ファイルへの書き込みをオンまたはオフにできるようにします。
recordingCallback
ええと、コールバックでファイルに書き込むことは問題ありませんが、非同期で行います。PlaybackCallback でそれを行うか、3 番目の audioFileWriteCallback を設定することについて多くの情報が語られています。これにより、サイレント ファイルまたは 4KB (つまり空の) ファイルが生成されました。やらないでください。
- また、コールバックに渡された ioDataのコピーを必ず使用してください。
recordingCallback
後AudioUnitRender
にbufferList
: _
AudioDeviceManager* THIS = (__bridge AudioDeviceManager *)inRefCon;
if (THIS->isRecording) {
ExtAudioFileWriteAsync(THIS->extAudioFileRef, inNumberFrames, bufferList);
}
- 参考までに、記録機能の開始と停止:
-(void)startRecording {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *destinationFilePath = [documentsDirectory stringByAppendingPathComponent:kAudioFileName];
CFURLRef destinationURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)destinationFilePath, kCFURLPOSIXPathStyle, false);
OSStatus status;
// create the capture file
status = ExtAudioFileCreateWithURL(destinationURL, kAudioFileWAVEType, &audioFormat, NULL, kAudioFileFlags_EraseFile, &extAudioFileRef);
if (status) NSLog(@"Error creating file with URL: %ld", status);
// use the same "audioFormat" AudioStreamBasicDescription we used to set up RemoteIO in the first place
status = ExtAudioFileSetProperty(extAudioFileRef, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &audioFormat);
ExtAudioFileSeek(extAudioFileRef, 0);
ExtAudioFileWrite(extAudioFileRef, 0, NULL);
isRecording = YES;
}
- (void)stopRecording {
isRecording = NO;
OSStatus status = ExtAudioFileDispose(extAudioFileRef);
if (status) printf("ExtAudioFileDispose %ld \n", status);
}
それでおしまい!