なぜこのオーディオユニットのremoteioの初期化はiPhoneで動作しますが、シミュレータでは機能しませんか?
-
25-09-2019 - |
質問
オーディオユニットサービスを使用して、合成されたオーディオを一緒にミックスできるように、出力レンダリングコールバックをセットアップしています。私が持っているコードは、私が持っているデバイス(iPod Touch、iPhone 3G、およびiPad)で完全に動作しているようですが、シミュレーターでは動作しません。
シミュレータでは、AudiounitInitialise関数が失敗し、-10851(kaudiouniterr_invalidpropertyvalue)の値を返します。
これが私の初期化コードです。このAPIの経験がある人は、ここで間違っていることを見るよりも多くの人がいますか?
#define kOutputBus 0
#define kInputBus 1
...
static OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList* ioData)
{
// Mix audio here - but it never gets here on the simulator
return noErr;
}
...
{
OSStatus status;
// Describe audio component
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
// Get component
AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
// Get audio units
status = AudioComponentInstanceNew(inputComponent, &m_audio_unit);
if(status != noErr) {
NSLog(@"Failed to get audio component instance: %d", status);
}
// Enable IO for playback
UInt32 flag = 1;
status = AudioUnitSetProperty(m_audio_unit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
kOutputBus,
&flag,
sizeof(flag));
if(status != noErr) {
NSLog(@"Failed to enable audio i/o for playback: %d", status);
}
// Describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 4;
audioFormat.mBytesPerFrame = 4;
// Apply format
status = AudioUnitSetProperty(m_audio_unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
if(status != noErr) {
NSLog(@"Failed to set format descriptor: %d", status);
}
// Set output callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = playbackCallback;
callbackStruct.inputProcRefCon = self;
status = AudioUnitSetProperty(m_audio_unit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
kOutputBus,
&callbackStruct,
sizeof(callbackStruct));
if(status != noErr) {
NSLog(@"Failed to set output callback: %d", status);
}
// Initialize (This is where it fails on the simulator)
status = AudioUnitInitialize(m_audio_unit);
if(status != noErr) {
NSLog(@"Failed to initialise audio unit: %d", status);
}
}
私のXcodeバージョンは3.2.2(64ビット)です私のシミュレーターバージョンは3.2です(ただし、同じ問題は3.1.3デバッグまたはリリースで発生します)
ありがとう、私はそれを感謝します!
解決
デバイスとシミュレータ用のコンパイルはまったく異なります。最も一般的なものには、同じ予想される結果があります。たとえば、ビュースイッチを再生するなどを読み込むなど。ただし、10個のバッファーをオープンロードしてサウンドを再生してからそれらを切り替えるなど、シミュレータはそれを処理できませんが、デバイスはそれを処理できません。
私が見る方法は、私が気にかけているすべてのデバイスで動作する限りです。デバイスで正常に動作するときに、シミュレーターでアプリケーションを動作させるためだけに髪を引き抜かないでください。
それが役立つことを願っています
PK
他のヒント
remoteio初期化コードを呼び出す前に、オーディオセッションを構成して有効にしましたか?
入力バスにストリームプロパティを設定している場合、使用しています kOutputBus
入力スコープ用。それはおそらく良くないでしょう。また、出力のためだけに必要なので、おそらくグローバルスコープにレンダリングコールバックを適用する必要はありません。さらに、私はあなたの定義があると思います kOutputBus
と kInputBus
間違っています...ワーキングiPhoneオーディオコードを見ると、入力バスに0、出力バスに1が使用されます。
また、AudioStreamBasicdescriptionに関していくつかの小さなことを考えることもできますが、これらが大きな違いを生むとは思わない:
- 追加します
kAudioFormatFlagsNativeEndian
フォーマットフラグのプロパティ - 明示的に設定します
mReserved
フィールド0。