2012-06-26 5 views
4

그래서 AudioUnit에서 iOS의 마이크/라인 입력에서 데이터를 가져 오는 데 문제가 있습니다. 내가 생각하는 것까지 모든 것을 설정할 수 있으며 내 recordingCallback을 호출하고 있지만 버퍼에서 빠져 나가는 데이터가 올바르지 않습니다. 항상 똑같은 것을 반환합니다. 이것은 거의 0과 임의의 큰 숫자입니다. 누구든지이 원인을 알 수 있습니까? 내 코드는 다음과 같습니다. AudioUnit 입력 샘플

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); 
status = AudioComponentInstanceNew(inputComponent, &audioUnit); 

// Enable IO for recording 
UInt32 flag = 1; 
status = AudioUnitSetProperty(audioUnit, 
           kAudioOutputUnitProperty_EnableIO, 
           kAudioUnitScope_Input, 
           kInputBusNumber, 
           &flag, 
           sizeof(flag)); 
// Disable playback IO 
flag = 0; 
status = AudioUnitSetProperty(audioUnit, 
           kAudioOutputUnitProperty_EnableIO, 
           kAudioUnitScope_Output, 
           kOutputBusNumber, 
           &flag, 
           sizeof(flag)); 

// Describe format 
AudioStreamBasicDescription audioFormat; 
audioFormat.mSampleRate   = 44100.00; 
audioFormat.mFormatID   = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags  = kAudioFormatFlagsNativeFloatPacked |kAudioFormatFlagIsNonInterleaved; 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mChannelsPerFrame = 1; 
audioFormat.mBitsPerChannel  = 32; 
audioFormat.mBytesPerPacket  = 4; 
audioFormat.mBytesPerFrame  = 4; 

// Apply format 
status = AudioUnitSetProperty(audioUnit, 
           kAudioUnitProperty_StreamFormat, 
           kAudioUnitScope_Output, 
           kInputBusNumber, 
           &audioFormat, 
           sizeof(audioFormat)); 

// Set input callback 
AURenderCallbackStruct callbackStruct; 
callbackStruct.inputProc = recordingCallback; 
callbackStruct.inputProcRefCon = (__bridge void*)self; 
status = AudioUnitSetProperty(audioUnit, 
           kAudioOutputUnitProperty_SetInputCallback, 
           kAudioUnitScope_Global, 
           kInputBusNumber, 
           &callbackStruct, 
           sizeof(callbackStruct)); 
status = AudioUnitInitialize(audioUnit); 

입력 콜백

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

    AudioBufferList bufferList; 
    bufferList.mNumberBuffers = 1; 
    bufferList.mBuffers[0].mDataByteSize = 4; 
    bufferList.mBuffers[0].mNumberChannels = 1; 
    bufferList.mBuffers[0].mData = malloc(sizeof(float)*inNumberFrames); // 
    InputAudio *input = (__bridge InputAudio*)inRefCon; 

    OSStatus status; 

    status = AudioUnitRender([input audioUnit], 
          ioActionFlags, 
          inTimeStamp, 
          inBusNumber, 
          inNumberFrames, 
          &bufferList); 

    float* result = (float*)&bufferList.mBuffers[0].mData; 

    if (input->counter == 5) { 
     for (int i = 0;i<inNumberFrames;i++) { 
      printf("%f ",result[i]); 
     } 
    } 
    input->counter++; 
    return noErr; 
} 

누구도 비슷한 문제가 발생하거나 내 코드에서 분명히 뭔가 잘못 참조 오디오 장치 설정. 어떤 도움을 주셔서 미리 감사드립니다! 만약 내가 올바르게 기억

내가 Michael Tysons Core Audio RemoteIO code

+0

이것은 얼마 전의 일이지만 누군가가 이것을보고 복사 할 경우를 대비하여 시간에 민감한 코드에서 malloc을 사용하지 않아야합니다. 버퍼를 다른 곳에 할당하십시오. (또는 lazily alloc 한 번.) –

답변

2

떨어져 그것 모두를 근거로하고, 당신은 콜백에서 오디오 버퍼에서 얻을 샘플은 SInt16있어, 수레 없습니다.

SInt16 *sn16AudioData= (SInt16 *)(bufferList.mBuffers[0].mData); 

을 그리고 이것들은 최대 및 최소 값과 같아야합니다 : 같은 샘플을 캐스팅하려고 나는 기본적으로 매우 유사 코드와 같은 일을하려고하지만, AudioGraph()을 사용했다

#define sn16_MAX_SAMPLE_VALUE 32767 
#define sn16_MIN_SAMPLE_VALUE -32768 
+0

나는이 예제에서도 SInt16로 다시 바꾸는 것을 잊었다. 그것은 내가 전혀 사용할 수없는 쓰레기 데이터를 계속 돌려 보내는 것 같습니다. – MZimmerman6

0

. 나는 마이크에서 내 출력 데이터에서 동일한 문제, 0을했고, 당신은 kAudioUnitProperty_MakeConnectio n 및 패스 AudioUnitSetProperty()를 호출해야합니다 그래프를 사용하지 않는 것처럼 내가 선

Status = AUGraphConnectNodeInput(graph, ioNode, 1, ioNode, 0); 

를 추가 할 때까지 작동되지 수 완전한 AudioUnitConnection 구조체를 전달하십시오.

+0

사용중인 코드의 복사본을 얻을 수 있습니까? 그렇다면 알려주세요. 이메일 주소를 알려 드리겠습니다. – MZimmerman6

+0

예, 내 웹 사이트는 [link] (http://www.zippysystems.com)입니다. 문의하기 페이지로 이동하십시오. 나는 당신에게 창조 함수를 보낼 것이다. – Dan