2012-04-23 23 views
6

Otrzymuję błąd -50 (nieprawidłowe parametry) z AudioUnitRender w następującym kontekście. Korzystam z tej przykładowej aplikacji Pitch Detector i działa dobrze. Jedyną istotną różnicą w moim projekcie jest to, że używam również urządzenia zdalnego I/O do wyjścia audio. Wyjście audio działa dobrze. Oto moje wywołanie zwrotne wejściowe i mój kod inicjujący (z usunięciem sprawdzenia błędów dla zwięzłości). Wiem, że to dużo, ale błąd - 50 daje mi bardzo mało informacji na temat tego, gdzie może być problem.Błąd -50 z AudioUnitRender

zwrotna Wejście:

OSStatus inputCallback(void* inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp  *inTimeStamp, 
          UInt32      inBusNumber, 
          UInt32      inNumberFrames, 
          AudioBufferList    *ioData) { 

    WBAudio* audioObject= (WBAudio*)inRefCon; 

    AudioUnit rioUnit = audioObject->m_audioUnit; 
    OSStatus renderErr; 
    UInt32 bus1 = 1; 

    renderErr = AudioUnitRender(rioUnit, ioActionFlags, 
           inTimeStamp, bus1, inNumberFrames, audioObject->m_inBufferList); 
    if (renderErr < 0) { 
     return renderErr; // breaks here 
    } 

    return noErr; 
} // end inputCallback() 

Inicjalizacja:

- (id) init { 

    self= [super init]; 
    if(!self) return nil; 

    OSStatus result; 

    //! Initialize a buffer list for rendering input 
    size_t bytesPerSample; 
    bytesPerSample = sizeof(SInt16); 
    m_inBufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer)); 
    m_inBufferList->mNumberBuffers = 1; 
    m_inBufferList->mBuffers[0].mNumberChannels = 1; 
    m_inBufferList->mBuffers[0].mDataByteSize = 512*bytesPerSample; 
    m_inBufferList->mBuffers[0].mData = calloc(512, bytesPerSample); 

    //! Initialize an audio session to get buffer size 
    result = AudioSessionInitialize(NULL, NULL, NULL, NULL); 

    UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 
    result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); 

    // Set preferred buffer size 
    Float32 preferredBufferSize = static_cast<float>(m_pBoard->m_uBufferSize)/m_pBoard->m_fSampleRate; 
    result = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize); 

    // Get actual buffer size 
    Float32 audioBufferSize; 
    UInt32 size = sizeof (audioBufferSize); 
    result = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &audioBufferSize); 

    result = AudioSessionSetActive(true); 

    //! Create our Remote I/O component description 
    AudioComponentDescription desc; 
    desc.componentType= kAudioUnitType_Output; 
    desc.componentSubType= kAudioUnitSubType_RemoteIO; 
    desc.componentFlags= 0; 
    desc.componentFlagsMask= 0; 
    desc.componentManufacturer= kAudioUnitManufacturer_Apple; 

    //! Find the corresponding component 
    AudioComponent outputComponent = AudioComponentFindNext(NULL, &desc); 

    //! Create the component instance 
    result = AudioComponentInstanceNew(outputComponent, &m_audioUnit); 

    //! Enable audio output 
    UInt32 flag = 1; 
    result = AudioUnitSetProperty(m_audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, kOutputBus, &flag, sizeof(flag)); 

    //! Enable audio input 
    result= AudioUnitSetProperty(m_audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, kInputBus, &flag, sizeof(flag)); 

    //! Create our audio stream description 
    m_audioFormat.mSampleRate= m_pBoard->m_fSampleRate; 
    m_audioFormat.mFormatID= kAudioFormatLinearPCM; 
    m_audioFormat.mFormatFlags= kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    m_audioFormat.mFramesPerPacket= 1; 
    m_audioFormat.mChannelsPerFrame= 1; 
    m_audioFormat.mBitsPerChannel= 16; 
    m_audioFormat.mBytesPerPacket= 2; 
    m_audioFormat.mBytesPerFrame= 2; 

    //! Set the stream format 
    result = AudioUnitSetProperty(m_audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &m_audioFormat, sizeof(m_audioFormat)); 

    result = AudioUnitSetProperty(m_audioUnit, kAudioUnitProperty_StreamFormat, 
           kAudioUnitScope_Output, 
           kInputBus, &m_audioFormat, sizeof(m_audioFormat)); 

    //! Set the render callback 
    AURenderCallbackStruct renderCallbackStruct= {0}; 
    renderCallbackStruct.inputProc= renderCallback; 
    renderCallbackStruct.inputProcRefCon= m_pBoard; 
    result = AudioUnitSetProperty(m_audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, kOutputBus, &renderCallbackStruct, sizeof(renderCallbackStruct)); 

    //! Set the input callback 
    AURenderCallbackStruct inputCallbackStruct = {0}; 
    inputCallbackStruct.inputProc= inputCallback; 
    inputCallbackStruct.inputProcRefCon= self; 
    result= AudioUnitSetProperty(m_audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Input, kOutputBus, &inputCallbackStruct, sizeof(inputCallbackStruct)); 

    //! Initialize the unit 
    result = AudioUnitInitialize(m_audioUnit); 

    return self; 
} 
+1

upewnij się swoją bus1 i inBusNumber są takie same. Również wspomniana strona internetowa nie zawiera kodu detektora wysokości dźwięku, a jedynie błędnie oznaczonego detektora częstotliwości szczytowej, który często zawodzi przy ocenie wysokości tonu. – hotpaw2

+0

Są takie same. I zdecydowanie wezmę wykrywacz tonu z przymrużeniem oka. – Luke

+0

Czy byłeś w stanie to rozwiązać? Mam problem, że normalnie połączenie z AudioUnitRender się powiedzie, ale kiedy moja aplikacja wraca z tła, to się nie powiedzie, ponieważ wejściowe wywołanie zwrotne żąda więcej bajtów. Pierwszą myślą było to, że ma to coś wspólnego z moimi rozmiarami bufora, ale zwiększenie ich nie pomogło – tomk

Odpowiedz

0

Jesteś alokacji m_inBufferList jak:

m_inBufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer)); 

Powinno być:

m_inBufferList = (AudioBufferList *)malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer) * numberOfBuffers); //numberOfBuffers in your case is 1 

Może to rozwiąże Twój problem.

+0

Gdzieś brakuje nawiasu. –

+0

Dobry połów, ale błąd nadal istnieje. – Luke

+2

Ponieważ chce tylko jeden bufor, możesz pominąć drugi sizeof, ponieważ deklaracja AudioBufferList już przydziela jeden mbuffer – tomk

1

Błąd -50 w doc rozwijać oznacza błąd params, upewnij się, że przechodzą odpowiednie params w AudioUnitRender. sprawdzić format strumienia i swoją jednostkę

Powiązane problemy