لماذا تعمل تهيئة Remoteio وحدة الصوت هذه على iPhone ولكن ليس في Simulator؟
-
25-09-2019 - |
سؤال
أنا أستخدم خدمات وحدة الصوت لإعداد رد اتصال لتقديم الإخراج حتى أتمكن من مزج الصوت المركب. يبدو أن الكود الذي لدي يعمل بشكل مثالي على الأجهزة التي لدي (iPod Touch و iPhone 3G و iPad) ولكنها تفشل في العمل على جهاز المحاكاة.
على جهاز المحاكاة ، تفشل وظيفة AudiounitInitialise وإرجاع قيمة -10851 (KaudiouniterR_InvalIdPropertyValue وفقًا لوثائق Apple).
إليك رمز التهيئة الخاص بي .. أي شخص لديه خبرة أكثر مع واجهة برمجة التطبيقات هذه أكثر مما أرى أي شيء أفعله غير صحيح هنا؟
#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 مخازن المؤقتة Openal Loading ثم التبديل بينهما ، لا يمكن للمحاكاة التعامل مع ذلك ولكن يمكن للأجهزة.
الطريقة التي أراها طالما أنها تعمل على الجهاز الذي يهتم به. حاول ألا تسحب شعرك فقط لجعل التطبيق يعمل على جهاز محاكاة عندما يعمل بشكل جيد على الجهاز.
امل ان يساعد
PK
نصائح أخرى
هل قمت بتكوين وتمكين جلسة صوتية قبل استدعاء رمز تهيئة Remoteio؟
عندما تقوم بتعيين خصائص الدفق على ناقل الإدخال ، فأنت تستخدم kOutputBus
لنطاق الإدخال الخاص بك. ربما هذا ليس جيدًا. أيضًا ، ربما لا تحتاج إلى تطبيق رد الاتصال على النطاق العالمي ، حيث تحتاج فقط إلى الإخراج. علاوة على ذلك ، أعتقد أن تعريفاتك kOutputBus
و kInputBus
مخطئون ... عندما أنظر إلى عمل رمز صوت iPhone ، فإنه يستخدم 0 لحافلة الإدخال و 1 لحافلة الإخراج.
أستطيع أيضًا أن أفكر في بعض الأشياء البسيطة فيما يتعلق بـ AudioStreamBasicDescription ، على الرغم من أنني لا أعتقد أن هذه ستحدث فرقًا كبيرًا:
- أضف ال
kAudioFormatFlagsNativeEndian
خاصية لأعلام التنسيق الخاص بك - ضبط صراحة
mReserved
حقل إلى 0.