OS X 10.8 でアプリのサンドボックスを有効にして AudioFilePlayer オーディオ ユニットを使用すると問題が発生しました。DefaultOutput ユニットに接続された AudioFilePlayer ユニットで構成される 2 つのノードのみを持つ AUGraph があります。(現時点での) 目標は、1 つのオーディオ ファイルを単純に再生することです。サンドボックスが有効になっていない場合、すべて正常に機能します。サンドボックスを有効にすると、AUGraphOpen()
エラー -3000 (無効なコンポーネント ID) が返されます。AUGraph からファイル プレーヤー ノードを削除すると、エラーは解消されます。これは、少なくともオーディオ ファイル プレーヤーが問題を引き起こしていることを意味します。
ファイル プレーヤー ノードを設定するために使用するコードは次のとおりです。
OSStatus AddFileToGraph(AUGraph graph, NSURL *fileURL, AudioFileInfo *outFileInfo, AUNode *outFilePlayerNode)
{
OSStatus error = noErr;
if ((error = AudioFileOpenURL((__bridge CFURLRef)fileURL, kAudioFileReadPermission, 0, &outFileInfo->inputFile))) {
NSLog(@"Could not open audio file at %@ (%ld)", fileURL, (long)error);
return error;
}
// Get the audio data format from the file
UInt32 propSize = sizeof(outFileInfo->inputFormat);
if ((error = AudioFileGetProperty(outFileInfo->inputFile, kAudioFilePropertyDataFormat, &propSize, &outFileInfo->inputFormat))) {
NSLog(@"Couldn't get format of input file %@", fileURL);
return error;
}
// Add AUAudioFilePlayer node
AudioComponentDescription fileplayercd = {0};
fileplayercd.componentType = kAudioUnitType_Generator;
fileplayercd.componentSubType = kAudioUnitSubType_AudioFilePlayer;
fileplayercd.componentManufacturer = kAudioUnitManufacturer_Apple;
fileplayercd.componentFlags = kAudioComponentFlag_SandboxSafe;
if ((error = AUGraphAddNode(graph, &fileplayercd, outFilePlayerNode))) {
NSLog(@"AUAudioFilePlayer node not found (%ld)", (long)error);
return error;
}
return error;
}
AudioFileOpenURL() 呼び出しの fileURL は、セキュリティ スコープのブックマーク データから取得された URL であり、ユーザーによってアプリケーションにドラッグされたファイルへの URL であることに注意してください。
com.apple.security.temporary-exception.audio-unit-host サンドボックス資格を設定した場合、AUGraphOpen() が呼び出されると、ユーザーはセキュリティ設定を下げるように求められ、ユーザーが同意すると、再生は再び正常に機能します (サンドボックス無効になっています)。
したがって、これは AudioFilePlayer ユニットがサンドボックスセーフ/互換性がないことを示しています。これは本当ですか?Apple が、CoreAudio API の重要な部分をサンドボックスと互換性を持つように修正しなかったとは信じがたいです。またkAudioComponentFlag_SandboxSafe
、AUGraphAddNode に渡す説明でフラグを指定しており、その呼び出しは失敗しないことに注意してください。また、AudioFilePlayer がサンドボックス セーフではないことについて、CoreAudio メーリング リストへのこの投稿の形式で、オンラインで 1 つだけ参照を見つけることができますが、返信はありませんでした。おそらく、サンドボックスが有効になっているときに問題を引き起こす他の微妙な間違いを犯しているのかもしれませんが、それがオフの場合はそうではありません(Core Audioは初めてです)?