2015-04-08 24 views
7

Ho un'app che registra e quindi riproduce un file audio. Attualmente la riproduzione audio viene riprodotta attraverso l'altoparlante dell'auricolare. Qualcuno potrebbe dirmi come Swift gestirà la codifica per forzare l'uscita dell'altoparlante invece?Forza la riproduzione del file audio tramite altoparlante per iPhone utilizzando Swift

Qui di seguito è un'una delle istanze che sto usando per riprodurre il file audio:

@IBAction func playAudioVader(sender: UIButton) { 
    playAudioWithVariablePitch(-1000) 
    } 

    func playAudioWithVariablePitch(pitch: Float){ 
    audioPlayer.stop() 
    audioEngine.stop() 
    audioEngine.reset() 

     var audioPlayerNode = AVAudioPlayerNode() 
     audioEngine.attachNode(audioPlayerNode) 

     var changePitchEffect = AVAudioUnitTimePitch() 
     changePitchEffect.pitch = pitch 
     audioEngine.attachNode(changePitchEffect) 

     audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil) 
     audioEngine.connect(changePitchEffect, to: audioEngine.outputNode, format: nil) 

     audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil) 
     audioEngine.startAndReturnError(nil) 

     audioPlayerNode.play() 

} 

    override func viewDidLoad() { 

    super.viewDidLoad() 

    audioPlayer = AVAudioPlayer(contentsOfURL:receivedAudio.filePathURL, error: nil) 
    audioPlayer.enableRate = true 
    audioEngine = AVAudioEngine() 
    audioFile = AVAudioFile(forReading:receivedAudio.filePathURL, error: nil) 


} 
+0

In StackOverflow si dovrebbe condividere un codice di ciò che si è tentato, per ottenere aiuto ... –

+0

C'è, mi dispiace! Spero che ti dia un'idea migliore di ciò che sto cercando di realizzare. – Unconquered82

risposta

11

EDIT luglio 2017: fare riferimento alla risposta di Husam per la soluzione Swift 2.0.

A partire da Swift 1.2, si utilizza overrideOutputAudioPort e AVAudioSessionPortOverride. Esso può essere attuata facendo qualcosa di simile a questo:

if !session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, error:&error) { 
    println("could not set output to speaker") 
    if let e = error { 
     println(e.localizedDescription) 
    } 
} 

Sto lavorando su un'applicazione che utilizza questa ora, e ho una funzione chiamata setSessionPlayandRecord, che assomiglia a:

func setSessionPlayAndRecord() { 
    let session:AVAudioSession = AVAudioSession.sharedInstance() 
    var error: NSError? 
    if !session.setCategory(AVAudioSessionCategoryPlayAndRecord, error:&error) { 
     println("could not set session category") 
     if let e = error { 
      println(e.localizedDescription) 
     } 
    } 
    if !session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, error:&error) { 
     println("could not set output to speaker") 
     if let e = error { 
      println(e.localizedDescription) 
     } 
    } 
    if !session.setActive(true, error: &error) { 
     println("could not make session active") 
     if let e = error { 
      println(e.localizedDescription) 
     } 
    } 
} 
+0

Nevermind .. Capisco cosa stai dicendo ora e ho funzionato. Grazie mille per la risposta! Vorrei avere più rappresentanti in modo da poter sviare il diavolo! Tu ragazzo/ragazze rock! – Unconquered82

11

Swift 2.0 codice

func setSessionPlayerOn() 
{ 
    do { 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) 
    } catch _ { 
    } 
    do { 
     try AVAudioSession.sharedInstance().setActive(true) 
    } catch _ { 
    } 
    do { 
     try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker) 
    } catch _ { 
    } 
} 
func setSessionPlayerOff() 
{ 
    do { 
     try AVAudioSession.sharedInstance().setActive(false) 
    } catch _ { 
    } 
}