2012-12-10 10 views
8

W mojej aplikacji muszę przełączać się między tymi 2 różnymi urządzeniami AudioUnits. Ilekroć przełączam się z VPIO na RemoteIO, następuje spadek głośności nagrywania. Dość znaczny spadek. Brak zmiany głośności odtwarzania. Czy ktoś to zauważył?Rejestrowanie spadku głośności nagrywania między urządzeniami RemoteIO i VPIO

Oto kod, w którym robię przełącznik, który jest wyzwalany przez zmianę trasy. (Nie jestem pewien, czy poprawnie wprowadziłem zmianę, więc proszę o to również tutaj.)

Jak mogę rozwiązać problem spadku głośności nagrywania?

Dzięki, doceniam każdą pomoc, jaką mogę uzyskać.

Molo.

- (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]; 
} 
} 

Odpowiedz

5

Użyłem do tego mojego wsparcia dla programistów Apple. Oto, co wsparcie powiedziało:

Obecność Voice I/O spowoduje, że wejście/wyjście będzie przetwarzane w bardzo różny sposób. Nie oczekujemy, że te jednostki będą miały takie same poziomy wzmocnienia, ale poziomy nie powinny być drastycznie wyłączone, jak się wydaje.

To powiedziawszy, inżynieria Core Audio wskazała, że ​​twoje wyniki mogą być związane z tworzeniem bloku głosu, ma również wpływ na instancję RIO. Po dalszej dyskusji, inżynieria Core Audio poczuła, że ​​skoro mówisz, że różnica poziomów jest bardzo drastyczna, dobrze byłoby, gdybyś mógł zgłosić błąd z niektórymi nagraniami, aby podkreślić różnicę poziomów, którą słyszysz pomiędzy głosowymi we/wy i zdalne wejścia/wyjścia wraz z kodem testowym, abyśmy mogli spróbować odtworzyć w domu i sprawdzić, czy to rzeczywiście błąd. Dobrym pomysłem byłoby uwzględnienie wyników pojedynczych testów jednostkowych IO opisanych powyżej, a także dalszych wyników porównawczych.

Nie ma interfejsu API sterującego tym poziomem wzmocnienia, wszystko jest konfigurowane wewnętrznie przez system operacyjny w zależności od kategorii sesji audio (na przykład VPIO ma być zawsze używany z PlayAndRecord) i która jednostka IO została skonfigurowana. Ogólnie nie oczekuje się, że oba będą tworzone jednocześnie.

Wniosek? Myślę, że to błąd. :/

2

Niektóre dyskusje dotyczą problemów o niskiej głośności, jeśli nie należy prawidłowo pozbywać się urządzenia audio. Zasadniczo pierwszy komponent audio pozostaje w pamięci, a każde kolejne odtwarzanie zostanie ukryte pod twoją lub innymi aplikacjami, powodując spadek głośności.

Rozwiązanie: urządzenia audio są AudioComponentInstance i muszą być zwolnione przez AudioComponentInstanceDispose().

+1

Cześć skalista, próbowałem tego. Ponieważ używam AUGraphNodeInfo (theGraph, remoteIONode, 0 i _remoteIOUnit); aby uzyskać instancję remoteIO, wydaje się, że nie mogę używać AudioComponentInstanceDispose (ulega awarii). Przeczytałem post, o którym wydajesz się mówić. Wydaje się nie działać dla mnie:/ – lppier

2

Odniosłem sukces, gdy zmieniłem kategorię sesji audio, przechodząc z przetwarzania głosu io (PlayAndRecord) na Remote IO (SoloAmbient). Przed zmianą należy wstrzymać sesję audio. Musisz też zrezygnować z inicjowania wykresu audio.

+0

To działa dla mnie, dziękuję! – scharli

Powiązane problemy