Core Audio를 처음 사용하기 때문에 무언가가 분명하지 않을 수도 있습니다. 제 목표는 이전에 녹음 된 오디오 신호를 처리하는 것입니다. 그러나 이러한 신호는 먼저 필터링해야합니다. 나는 오디오를 재생할 필요가 없습니다. 나는 그것을 기록하고 처리해야합니다.코어 오디오 : non-remoteIO 장치의 kAudioOutputUnitProperty_SetInputCallback
내 그래프는 다음과 같습니다 -> HighPassFilter - RemoteIO> 콜백 (프로세스 오디오)
그리고 아래와 같이 설정
LBAudioDetectiveGetDefaultFormat(&detective->streamFormat);
// Create new AUGraph
OSStatus error = NewAUGraph(&detective->graph);
LBErrorCheck(error);
// Initialize AUNodes
AudioComponentDescription rioCD = {0};
rioCD.componentType = kAudioUnitType_Output;
rioCD.componentSubType = kAudioUnitSubType_RemoteIO;
rioCD.componentManufacturer = kAudioUnitManufacturer_Apple;
AUNode rioNode;
error = AUGraphAddNode(detective->graph, &rioCD, &rioNode);
LBErrorCheck(error);
AudioComponentDescription filterCD = {0};
filterCD.componentType = kAudioUnitType_Effect;
filterCD.componentSubType = kAudioUnitSubType_HighPassFilter;
filterCD.componentManufacturer = kAudioUnitManufacturer_Apple;
AUNode filterNode;
error = AUGraphAddNode(detective->graph, &filterCD, &filterNode);
LBErrorCheck(error);
// Open the graph so I can modify the AudioUnits
error = AUGraphOpen(detective->graph);
// Adapt rioUnit
error = AUGraphNodeInfo(detective->graph, rioNode, NULL, &detective->rioUnit);
LBErrorCheck(error);
UInt32 onFlag = 1;
AudioUnitElement bus1 = 1;
UInt32 propertySize = sizeof(UInt32);
error = AudioUnitSetProperty(detective->rioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, bus1, &onFlag, propertySize);
LBErrorCheck(error);
propertySize = sizeof(AudioStreamBasicDescription);
error = AudioUnitSetProperty(detective->rioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, bus1, &detective->streamFormat, propertySize);
LBErrorCheck(error);
// Adapt filterUnit
error = AUGraphNodeInfo(detective->graph, filterNode, NULL, &detective->filterUnit);
LBErrorCheck(error);
AURenderCallbackStruct callback = {0};
callback.inputProc = _LBAudioDetectiveFilterOutput;
callback.inputProcRefCon = detective;
propertySize = sizeof(AURenderCallbackStruct);
error = AudioUnitSetProperty(detective->filterUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &callback, propertySize);
LBErrorCheck(error);
// Connect the two units
AudioUnitElement bus0 = 0;
error = AUGraphConnectNodeInput(detective->graph, rioNode, bus1, filterNode, bus0);
LBErrorCheck(error);
AUGraphInitialize(detective->graph);
내 코드가 오류와 함께 실패합니다 - 10879 콜백을 설정할 때. 필터 오디오 장치가이 속성을 지원하지 않는다고 가정합니다. 어떻게하면 녹음 된 사운드를 얻을 수 있습니까? 두 번째 일반 출력 단위는 내가 아는 한 허용되지 않습니다. RemoteIO 오디오 장치,하지만 RemoteIO 콜백에서 (대신 필터 유닛 또는 입력 버스의), 당기의 사전에 당신의 도움이
흠, 이것은 현명한 접근 방법이지만 입력 콜백을 더 이상 호출하지 않습니다. 정확히 어떤 버스를 연결해야합니까? rioUnit의 버스 1을 filterUnit의 버스 0에 연결했습니다. 콜백 구조체는 출력 범위의 rioUnit 버스 1에 구성되었습니다. 콜백이 호출되었지만 'ioData-> mBuffers [0] .mData'에 데이터가 없습니다. – lbrndnr