2015-07-03 22 views
12

Possiedo un'istanza AVAudioPlayer che carica il suono in memoria con audioPlayer.prepareToPlay() e, dopo alcuni, inizia a riprodurlo. Ho un problema che in circa dieci minuti dopo aver inserito lo sfondo, si perde dalla memoria e non sono in preparazione. Dopo quelle ore alimentate, non ho ancora la possibilità di eseguire prepareToPlay(). Come lasciare quel suono precaricato in memoria per un lungo periodo? Sto preparando suono da riprodurre in applicationDidFinishLaunchingWithOptions metodo:AVAudioPlayer ha precaricato le perdite di suono dalla memoria

let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(dispatchQueue, {[weak self] in 
     var audioSessionError: NSError? 

     let audioSession = AVAudioSession.sharedInstance() 
     NSNotificationCenter.defaultCenter().addObserver(self!, selector: "handleInterruption:", name: AVAudioSessionInterruptionNotification, object: nil) 
     audioSession.setActive(true, error: nil) 

     if (audioSession.setCategory(AVAudioSessionCategoryPlayback, error: &audioSessionError)) { 
      println("Successfully set the audio session") 
     } else { 
      println("Could not set the audio session") 
     } 

     let filePath = NSBundle.mainBundle().pathForResource("sound", ofType:"mp3") 
     let fileData = NSData(contentsOfFile: filePath!, options: .DataReadingMappedIfSafe, error: nil) 
     var error:NSError? 

     self!.audioPlayer = AVAudioPlayer(data: fileData, error: &error) 

     self!.audioPlayer?.numberOfLoops = -1 

     self!.audioPlayer?.delegate = self 

     if (self?.audioPlayer?.prepareToPlay() != false) { 
      println("Successfully prepared for playing") 
     } else { 
      println("Failed to prepare for playing") 
     } 
    }) 

Poi nel didReceiveRemoteNotification Sto cercando di giocare in background: self.audioPlayer?.play(), IT rendimenti true. Probabilmente funziona, ma dopo circa 10 - 20 minuti non funziona. E nota che .play() ora restituisce false.

  1. C'è un senso di disabilitare ARC (Automatic Reference Counting) per sbloccare e dealloc audioPlayer manualmente?

  2. Forse ho bisogno di utilizzare API di livello inferiore come OpenAL? Tuttavia non lo userò poiché è deprecato in iOS 9 e in seguito dovrò riscriverlo senza OpenAL.

  3. Altre idee? Forse ho bisogno di usare Audio Units con RemoteIO? Se funzionerà, fornisci alcuni esempi per favore.

  4. Forse ci sono quadri di terze parti come ObjectAL - una facile implementazione di OpenAL. Come so che è disponibile in iOS 9.

Questi metodi sono solo mie supposizioni. Ma la loro domanda principale rimane la stessa: Questi metodi funzioneranno dallo sfondo?

+0

provato questo collegamento? http://stackoverflow.com/questions/12498015/leak-from-nsurl-and-avaudioplayer-using-arc –

+0

Non sembra una risposta –

+0

Disabilita ARC: http://stackoverflow.com/questions/6646052/how -can-i-disable-arc-for-a-single-file-in-a-project – d4Rk

risposta

2

È necessario disabilitare ARC. Quando inserisci backgroud, se non lo usi, viene rilasciato. In Swift crea AVAudioPlayer come oggetto Unmanaged<T>.