لماذا تعمل تهيئة Remoteio وحدة الصوت هذه على iPhone ولكن ليس في Simulator؟

StackOverflow https://stackoverflow.com/questions/3809377

سؤال

أنا أستخدم خدمات وحدة الصوت لإعداد رد اتصال لتقديم الإخراج حتى أتمكن من مزج الصوت المركب. يبدو أن الكود الذي لدي يعمل بشكل مثالي على الأجهزة التي لدي (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 ، على الرغم من أنني لا أعتقد أن هذه ستحدث فرقًا كبيرًا:

  1. أضف ال kAudioFormatFlagsNativeEndian خاصية لأعلام التنسيق الخاص بك
  2. ضبط صراحة mReserved حقل إلى 0.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top