2012-06-03 4 views
8

La mia funzione di analisi audio risponde meglio su iPad (2) rispetto all'iPhone (4). Sembra sensibile a suoni più morbidi sull'iPad, mentre l'iPhone richiede un input molto più forte per rispondere correttamente. Che si tratti di posizionamento del microfono, componenti diversi, configurazioni software diverse o altri fattori, mi piacerebbe poterlo controllare nella mia app.Come controllare il guadagno/livello di ingresso del microfono hardware su iPhone?

Ovviamente potrei semplicemente moltiplicare tutti i miei campioni audio per applicare il guadagno a livello di codice. Ovviamente anche questo ha un costo del software:

È possibile controllare il guadagno del microfono dal software in iOS, analogamente a come è in MacOS? Non riesco a trovare alcuna documentazione su questo, ma spero che mi manchi solo in qualche modo.

risposta

17

Su iOS6 + è possibile utilizzare le proprietà AVAudioSession

 CGFloat gain = sender.value; 
     NSError* error; 
     self.audioSession = [AVAudioSession sharedInstance]; 
     if (self.audioSession.isInputGainSettable) { 
      BOOL success = [self.audioSession setInputGain:gain 
                error:&error]; 
       if (!success){} //error handling 
     } else { 
      NSLog(@"ios6 - cannot set input gain"); 
     }    

Su iOS5 è possibile ottenere/set audio proprietà di guadagno in ingresso utilizzando le funzioni AudioSession

UInt32 ui32propSize = sizeof(UInt32); 
    UInt32 f32propSize = sizeof(Float32); 
    UInt32 inputGainAvailable = 0; 
    Float32 inputGain = sender.value; 


    OSStatus err = 
     AudioSessionGetProperty(kAudioSessionProperty_InputGainAvailable 
          , &ui32propSize 
          , &inputGainAvailable); 

    if (inputGainAvailable) { 
    OSStatus err = 
     AudioSessionSetProperty(kAudioSessionProperty_InputGainScalar 
          , sizeof(inputGain) 
          , &inputGain); 
    } else { 
     NSLog(@"ios5 - cannot set input gain"); 
    } 
    OSStatus err = 
     AudioSessionGetProperty(kAudioSessionProperty_InputGainScalar 
           , &f32propSize 
           , &inputGain); 
    NSLog(@"inputGain: %0.2f",inputGain); 

(gestione degli errori omessa)

Come siete interessati a controllare guadagno in ingresso, si consiglia inoltre di disattivare il controllo automatico del guadagno impostando la modalità sessione audio di AVAudioSessionModeMeasurement (iOS5 + 6)

[self.audioSession setMode:AVAudioSessionModeMeasurement 
        error:nil]; 
NSLog(@"mode:%@",self.audioSession.mode); 

Queste impostazioni sono abbastanza specifiche hardware in modo disponibilità non può essere assunto. Ad esempio, posso modificare il guadagno su iPhone3GS/ios6 e iPhone4S/ios5.1, ma non su ipadMini/ios6.1. Posso disabilitare AGC su iPhone3G e iPad mini, ma non su iPhone4S.

+0

Grazie per la soluzione - sapete dove nel codice dovrei impostare questo? Controlla i livelli di guadagno del microfono globale o solo per un flusso di registrazione specifico? –

+2

@DavidDaudelin: imposta i livelli di guadagno del microfono per la tua app e le impostazioni rimangono attive per l'intero runtime della tua app fino a quando non le cambierai. Luoghi adatti per impostarli sono il delegato dell'app o il metodo 'init' di un controller. Solitamente realizzo un oggetto audioController e installo la sessione audio lì. Il comportamento quando la tua app è in background dipende dalle tue impostazioni e da quelle di altre app che potrebbero competere per il controllo hardware. – foundry

+0

Grazie mille! –

-2
+0

Bello articolo, ma descrive solo la manipolazione del software del flusso audio, che come ho già detto è ciò che sto già facendo. – buildsucceeded

+1

Le sole risposte di collegamento non sono particolarmente utili ei collegamenti hanno la tendenza a morire, rendendo la risposta completamente inutile. – nhgrif