0

오디오 그래프에서 원격 I/O 장치에서 오디오를 캡처하려고하는 콜백이 있습니다. 내 콜백의 내부에서 AudioBufferListAudioUnitRender 함수에있어 두 채널의 비 인터리브 데이터를 저장해야합니다.이비 인터리브 오디오 데이터를 저장할 버퍼 목록을 구성 하시겠습니까?

//audiounit render function inside of a callback  
OSStatus status; 
     status = AudioUnitRender(THIS.ioUnit,  
           ioActionFlags, 
           inTimeStamp, 
           0, 
           inNumberFrames, 
           &bufferList); 

//want to initialize and configure bufferList to store non-interleaved data from both channels 
... 

//write audio data to disk 
    OSStatus result; 
     if (*ioActionFlags == kAudioUnitRenderAction_PostRender) { 
      result = ExtAudioFileWriteAsync(THIS.extAudioFileRef, inNumberFrames, &bufferList); 
      if(result) printf("ExtAudioFileWriteAsync %ld \n", result);} 
     return noErr; 

사람이이 작업을 수행하는 방법을 알고 있나요 :

다음 컨텍스트에 대한 코드이다?

감사합니다.

답변

2

float** 배열을 만들고 렌더 콜백에서 느리게 초기화하여 통과 한 것과 동일한 버퍼 크기를 유지해야합니다 (필요에 따라 다시 할당). 거기에서 필요한 채널로 복사하고 다른 채널에서 해당 데이터를 사용할 수 있습니다 (채널간에 상호 작용이 필요한 일부 유형의 효과를 내고있는 것 같습니다).

불행히도, 이것은 반드시 전역 변수에 의한 것이지만, iOS의 AudioUnits에 대한 제한 사항으로 인해 그걸로 살아야 할 것입니다.

+0

감사합니다. +1. 나는 방금 내가 틀린 나무를 짖고있는 것을 알아 차렸다. 내 연구에 따르면 ExtAudioFileWriteAsync는 스테레오를 전달하는 경우 인터리브 된 데이터의 버퍼를 1 개 예상합니다. 어쩌면 당신은 관련된 질문으로 도울 수있을 것입니다 : http://stackoverflow.com/questions/10511272/turn-non-interleaved-audio-data-into-interleaved –

+0

그래, 그렇지. 이 경우 많은 인터레이스와 디인터레이싱이 필요할 것입니다. :) –

+0

Audio Unit 콜백에 매개 변수 구조체를 전달할 수 있습니다. 스타일 가이드가 그런 것을 선호하지 않는다면 전역을 사용할 필요가 없습니다. – hotpaw2

0

귀하의 버퍼 목록은 애플 MixerHost 예를 확인, 작업 예를 들어

myBufferList.mNumberBuffers = 2; 

로 초기화되어야한다.