2012-11-28 2 views
2

iOS 장치의 마이크에서 오디오를 캡처하여 .caf 파일에 기록하려고합니다.원격 IO의 출력 요소에 콜백 연결

원격 I/O 오디오 장치를 MCMU (Multichannel Mixer Unit)에 연결하고 콜백을 MCMU의 입력에 연결할 수 있습니다. 콜백 내부에서 ExtAudioFileAsyncWrite()를 사용하여 마이크에서 오디오 데이터를 파일에 성공적으로 쓸 수 있습니다.

나는 단순화하고 그림에서 MCMU를 제거하고 싶다. 내 생각은 원격 IO의 입력 범위의 출력 버스와 그 콜백 호출 인 ExtAudioFileAsyncWrite() 내에서 콜백을 간단히 첨부 할 수있다.

그러나이 ExtAudioFileAsyncWrite()는 -50 (paramError)을 반환합니다.

원격 IO의 입력 요소의 출력 버스에 콜백을 연결할 수 있습니까?

답변

3

가능합니다. 속성을 설정하려면 AudioUnitSetProperty을 사용하는 것이 좋습니다. 이 콜백은 렌더링 콜백과 비슷하게 작동하지만 RemoteIO/마이크에 (프로그램의 데이터 요청 대신) 새로운 데이터가있을 때마다 호출됩니다.

예 :

AURenderCallbackStruct callbackInfo = {YourInputCallback, NULL}; 
AudioUnitSetProperty(remoteIO, 
        kAudioOutputUnitProperty_SetInputCallback, 
        kAudioUnitScope_Global, 
        0, 
        &callbackInfo, 
        sizeof(callbackInfo)); 

이 샘플의 새로운 배치를 가지고 때마다이 RemoteIO/마이크 전화 YourInputCallback를 만들 것입니다. 이전과 마찬가지로이 콜백을 사용하여 ExtAudioFileWriteAsync에 전화 할 수 있습니다. 새 샘플을 가져 오려면 RemoteIO에서도 AudioUnitRender으로 전화해야합니다.

-50 오류에 대해서는 매우 유용한 오류 진단이 아닙니다. 기본적으로 "귀하의 매개 변수 중 하나에 오류가있었습니다"라고되어 있습니다. 대부분 ExtAudioFile이 NULL이거나 올바르게 설정되지 않았을 가능성이 있습니다 (이 경우 이전에 사용했던 ExtAudioFile* 함수 중 하나가 더 유용한 오류 코드를 반환했을 수 있습니다).

+0

감사합니다. 위의 잘못 입력 한 : 콜백 함수 내에서 AudioUnitRender() 호출 할 때 -50 오류가 반환됩니다. AudioUnitSetProperty()의 AudioUnitElement 인수가 0이 아닌 1이어야합니까? – Nick

+0

전역 매개 변수의 경우 전역 범위에 "요소"가 없기 때문에 항상 0입니다. 이상하게 들리지만 실제로는 RemoteIO의 입력에 영향을 미치므로 Core Audio가 고려되는 한'kAudioOutputUnitProperty_SetInputCallback'은 입/출력 범위 매개 변수가 아닌 전역 범위 매개 변수입니다. – admsyn

+0

또한'AudioUnitRender'의'paramErr'은 RemoteIO가 NULL/초기화되지 않았거나 부적절하게 설정되었거나'ioData' AudioBufferList가 잘못된 형식임을 의미합니다. "제대로 설정되지 않은"경우 이전 Core Audio 기능 중 하나가 아마도 OSStatus를 반환했을 것입니다. 그것이 NULL이라면, NULL이고, 그렇게해서는 안된다. (그러나 당신은 그것을 안다. :)). – admsyn