2012-12-10 8 views
8

내 앱에서이 두 가지 AudioUnits 사이를 전환해야합니다. VPIO에서 RemoteIO로 전환 할 때마다 내 녹음 음량이 떨어집니다. 꽤 큰 하락. 재생 볼륨에 변화가 없습니다.이 경험이있는 사람이 있습니까?RemoteIO와 VPIO 간의 녹음 볼륨 드롭 전환

다음은 라우팅 변경에 의해 트리거되는 스위치를 수행하는 코드입니다. (나는 정확하게 변경했는지 여부를 확신 할 수 없으므로 여기에서도 묻습니다.)

녹음 볼륨 감소 문제를 어떻게 해결할 수 있습니까?

감사합니다. 얻을 수있는 도움에 감사드립니다.

부두.

- (void)switchInputBoxTo : (OSType) inputBoxSubType 
{ 
OSStatus result; 

if (!remoteIONode) return; // NULL check 

// Get info about current output node 
AudioComponentDescription outputACD; 
AudioUnit currentOutputUnit; 

AUGraphNodeInfo(theGraph, remoteIONode, &outputACD, &currentOutputUnit); 

if (outputACD.componentSubType != inputBoxSubType) 
{ 
    AUGraphStop(theGraph); 
    AUGraphUninitialize(theGraph); 
    result = AUGraphDisconnectNodeInput(theGraph, remoteIONode, 0); 
    NSCAssert (result == noErr, @"Unable to disconnect the nodes in the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result); 
    AUGraphRemoveNode(theGraph, remoteIONode); 
    // Re-init as other type 

    outputACD.componentSubType = inputBoxSubType; 
    // Add the RemoteIO unit node to the graph 
    result = AUGraphAddNode (theGraph, &outputACD, &remoteIONode); 
    NSCAssert (result == noErr, @"Unable to add the replacement IO unit to the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result); 

    result = AUGraphConnectNodeInput(theGraph, mixerNode, 0, remoteIONode, 0); 
    // Obtain a reference to the I/O unit from its node 
    result = AUGraphNodeInfo (theGraph, remoteIONode, 0, &_remoteIOUnit); 
    NSCAssert (result == noErr, @"Unable to obtain a reference to the I/O unit. Error code: %d '%.4s'", (int) result, (const char *)&result); 

    //result = AudioUnitUninitialize(_remoteIOUnit); 

    [self setupRemoteIOTest]; // reinit all that remoteIO/voiceProcessing stuff 
    [self configureAndStartAudioProcessingGraph:theGraph]; 
} 
} 

답변

5

나는 이것을 위해 내 사과 개발자 지원을 사용했습니다. 지원 내용은 다음과 같습니다.

음성 I/O가 있으면 입력/출력이 매우 다르게 처리됩니다. 우리는이 유닛들이 전혀 같은 게인 레벨을 가지지 않는다고 기대하지만 레벨이 당신이 나타내는 것처럼 크게 벗어나서는 안됩니다.

그렇다면 Core Audio 엔지니어링 팀은 결과가 음성 블록이 만들어 졌을 때와 관련되어있어 RIO 인스턴스에도 영향을 미쳤다 고 밝혔습니다. 추가 논의를 통해 Core Audio 엔지니어링은 레벨 차이가 매우 격렬하므로 일부 레코딩의 버그를 파일에 기록하여 음성 I/O와 사운드 레벨 사이의 레벨 차이를 강조 할 수 있다면 좋을 것이라고 생각했습니다. 원격 I/O를 테스트 코드와 함께 사용하면 집에서 재생산을 시도하고 이것이 실제로 버그인지 확인할 수 있습니다. 위에 설명 된 단일 IO 장치 테스트의 결과와 추가 비교 결과를 포함시키는 것이 좋습니다.

이 게인 레벨을 제어하는 ​​API는 없습니다. 오디오 세션 범주 (예 : VPA는 항상 PlayAndRecord와 함께 사용되어야합니다) 및 어떤 IO 장치가 설정되었는지에 따라 모든 것이 OS에 의해 내부적으로 설정됩니다. 일반적으로 두 인스턴스가 동시에 인스턴스화되지는 않습니다.

결론? 나는 그것이 버그라고 생각한다. :/

2

오디오 장치를 올바르게 처리하지 않으면 볼륨이 낮다고하는 문제가 있습니다. 기본적으로 첫 번째 오디오 구성 요소는 메모리에 남아 있으며 연속 재생은 사용자 또는 다른 응용 프로그램 아래에서 멈추어 볼륨이 떨어집니다.

솔루션 : 오디오 단위는 AudioComponentInstance이며 AudioComponentInstanceDispose()를 사용하여 해제해야합니다.

+1

안녕하세요, 나는 그것을 시도했습니다. AUGraphNodeInfo (theGraph, remoteIONode, 0, & _remoteIOUnit)를 사용하기 때문에; remoteIO 인스턴스를 얻으려면 AudioComponentInstanceDispose (충돌)를 사용할 수없는 것 같습니다. 나는 당신이 말하는 것처럼 보이는 글을 읽었습니다. 나를 위해 작동하지 않는 것 같아요/ – lppier

2

음성 처리 io (PlayAndRecord)에서 원격 IO (SoloAmbient)로 갈 때 오디오 세션 카테고리를 변경하면 성공했습니다. 오디오 세션을 변경하기 전에 오디오 세션을 일시 중지하십시오. 또한 오디오 그래프를 초기화하지 않아야합니다.

+0

이것은 나를 위해 작동합니다, 고마워요! – scharli