2012-12-10 8 views
8

In meiner App muss ich zwischen diesen 2 verschiedenen AudioUnits wechseln. Immer wenn ich von VPIO auf RemoteIO umschalte, sinkt mein Aufnahmevolumen. Ziemlich großer Rückgang. Keine Änderung der Wiedergabelautstärke. Jemand hat das erlebt?Aufnahme Volumenwechsel zwischen RemoteIO und VPIO

Hier ist der Code, wo ich den Schalter, der durch eine Routing-Änderung ausgelöst wird. (Ich bin mir nicht sicher, ob ich die Änderung richtig gemacht habe, also frage ich auch hier.)

Wie löse ich das Problem des Aufzeichnungsvolumens?

Danke, schätze jede Hilfe, die ich bekommen kann.

Pier.

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

Antwort

5

Ich habe meinen Apple-Entwickler-Support dafür verwendet. Hier ist, was der Support sagte:

Das Vorhandensein der Voice I/O wird dazu führen, dass die Eingabe/Ausgabe sehr unterschiedlich verarbeitet wird. Wir erwarten nicht, dass diese Einheiten die gleichen Verstärkungspegel haben, aber die Werte sollten nicht drastisch abfallen, wie es scheint.

Das heißt, Core Audio Engineering gab an, dass Ihre Ergebnisse möglicherweise damit zusammenhängen, wenn der Sprachblock erstellt wird und sich auch auf die RIO-Instanz auswirkt. Bei weiteren Diskussionen, Core Audio Engineering, wurde der Eindruck erweckt, dass der Pegelunterschied sehr drastisch ist. Daher wäre es gut, wenn Sie bei einigen Aufnahmen einen Fehler machen könnten, um den Pegelunterschied zwischen Voice I/O und Remote I/O zusammen mit Ihrem Testcode, damit wir versuchen können, im Haus zu reproduzieren und zu sehen, ob das tatsächlich ein Fehler ist. Es wäre eine gute Idee, die Ergebnisse der oben skizzierten Singe-IO-Unit-Tests sowie weitere Vergleichsergebnisse einzubeziehen.

Es gibt keine API, die diese Verstärkungsstufe steuert, alles wird intern vom Betriebssystem abhängig von der Audio Session-Kategorie eingerichtet (z. B. wird VPIO immer mit PlayAndRecord verwendet) und welche IO-Einheit wurde eingerichtet. Im Allgemeinen wird nicht erwartet, dass beide gleichzeitig instanziiert werden.

Fazit? Ich denke, es ist ein Fehler. :/

2

Es wird über Probleme mit geringen Lautstärken gesprochen, wenn Sie Ihr Audiogerät nicht ordnungsgemäß entsorgen. Im Grunde bleibt die erste Audiokomponente im Speicher und jede nachfolgende Wiedergabe wird unter Ihrer oder anderen Apps geduckt, was den Lautstärkepegel verursacht.

Lösung: Audiogeräte sind AudioComponentInstance der und müssen mit AudioComponentInstanceDispose befreit werden().

+1

Hallo Rocky, das habe ich ausprobiert. Weil ich AUGraphNodeInfo (theGraph, remoteIONode, 0, & _remoteIOUnit) verwende; Um die RemoteIO-Instanz zu erhalten, scheint es, dass ich AudioComponentInstanceDispose nicht verwenden kann (es stürzt ab). Ich habe den Beitrag gelesen, über den du zu sprechen scheinst. Scheint nicht für mich zu arbeiten:/ – lppier

2

Ich hatte Erfolg, wenn ich die Audio-Session-Kategorie ändere, wenn ich von der Sprachverarbeitung io (PlayAndRecord) zu Remote IO (SoloAmbient) gehe. Stellen Sie sicher, dass Sie die Audio-Session pausieren, bevor Sie dies ändern. Sie müssen Ihre Audiodatei auch nicht initialisieren.

+0

Das funktioniert für mich, danke! – scharli