2017-12-07 11 views
10

나는 일련의 음색이 연주되고 사용자가 음색을 반복하려고하는 Simon-like 메모리 게임을 가지고 있습니다. 문제는 때때로 나는 끔찍한 균열을 일으켜 소리를 터뜨리는 것입니다. 단지 몇 개의 노트 나 20 개가 넘는 수 있습니다. 사운드는 길이가 2 초인 모든 wav 파일입니다. 나는 10 명의 플레이어를 거쳐서 어떤 소리도 잘리지 않도록 반복한다. (나는 50까지 시도했지만 아무것도 도움이되지 않았다.) 나는 또한 audioPlayerDidFinishPlaying을 구현하려고 시도했기 때문에 사운드가 완성되면 플레이어를 멈출 수 있었지만 그 역시 도움이되지 못했다. 그리고 마지막으로 나는 prepareToPlay()을 추가했습니다. 슬프게도 차이는 없습니다.AVAudioPlayer crackles and pops

약 15 개의 음표 시퀀스 후에 오디오가 모두 작동하지 않는 것이 흥미로운 문제 일 수 있습니다. 앱은 정상적으로 계속되지만 소리는 들리지 않습니다.

func playSound(_ soundID: Int) { 
     var soundName = "" 

     switch soundID { 
     case 0: 
      soundName = "beep1" 
     case 1: 
      soundName = "beep2" 
     case 2: 
      soundName = "beep3" 
     case 3: 
      soundName = "beep4" 
     case 4: 
      soundName = "swish3" 
     default: 
      soundName = "clank" 
     } 

     guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav") else { return } 

     do { 
      buttonSound.insert(try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue), at: playerIndex) 
      buttonSound[playerIndex].prepareToPlay() 
      buttonSound[playerIndex].delegate = self 

      if playerIndex < 10 { 
       buttonSound[playerIndex].play() 
       playerIndex += 1 
      } else { 
       buttonSound[playerIndex].play() 
       playerIndex = 0 
      } 

     } catch { 
      // error 
     } 
    } 

    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
     if flag { 
      player.stop() 
     } 
    } 

/******** UPDATE

/

난에 AVAudioPlayer 생성 이동 ********* : 여기

코드의 오디오 부분이고 나는 예전의 예를 기반으로하는 자신의 수업을 어딘가에 가로 질렀다. 15 음색 문제가 완전히 제거 된 오디오를 해결했지만 균열과 팝이 여전히 남아 있습니다! 나는 운이없는 소리를 다시 녹음 해 보았습니다. 여기

필요에 따라 AVAudioPlayers를 만들기위한 클래스입니다 :

import UIKit 
import AVFoundation 

private var players: [AVAudioPlayer] = [] 

class AVAudioPlayerPool: NSObject { 

    class func playerWithURL(url: URL) -> AVAudioPlayer? { 

     let availablePlayers = players.filter { (player) -> Bool in 
      return player.isPlaying == false && player.url == url 
     } 

     if let playerToUse = availablePlayers.first { 
      playerToUse.prepareToPlay() 
      return playerToUse 
     } 

     do { 
      let newPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue) 
      players.append(newPlayer) 
      newPlayer.prepareToPlay() 
      return newPlayer 

     } catch { 
      return nil 
     } 
    } 
} 

소리를 재생하는 것은 간단하다

func playSound(_ soundID: Int) { 
    var soundName = "" 

    switch soundID { 
    case 0: 
     soundName = "tt1" 
    case 1: 
     soundName = "tt2" 
    case 2: 
     soundName = "tt3" 
    case 3: 
     soundName = "tt4" 
    case 4: 
     soundName = "swish3" 
    default: 
     soundName = "clank" 
    } 

    guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav") else { return } 
    let player = AVAudioPlayerPool.playerWithURL(url: url) 
    player?.play() 

} 

사람이 어떤 생각을 가지고 있다면 - 그것은 단지 다음 단계는 경우에도 당신이 시도 할 수 있습니다 ...

+0

백그라운드 대기열에서 파일을 재생하는 방법은 무엇입니까? 메인 스레드가 당신의 딱딱한 소리를 일으킬 수있는 당신의 게임을 처리하는 것으로 바쁠 수도 있습니다. – hhanesand

+0

메인 스레드에서 움직여 보았습니다. 그러나 제안에 감사드립니다. – squarehippo10

+0

OALSimpleAudio를 사용 하시나요? https://github.com/kstenerud/ObjectAL-for-iPhone 저는 현재 게임 프로젝트에서 사용하고 있습니다. 다른 사운드가 많이 있습니다. Objective-C 코드이지만 브리지 헤더를 사용하여 신속한 프로젝트에 추가하는 것이 간단합니다. 도움이 필요하면 알려주세요. – Woof

답변

1

많은 시간 동안 실험을 해본 결과 문제는 내가 선택한 사운드에서 비롯된 것이라고 말하고 싶습니다. 리버브가있는 거대한 구형파 신디사이저 사운드입니다. 나는 처음으로 레벨 생각을 줄이려고 노력했다. 다음으로 나는 온갖 종류의 소리를 내 보았지만 모든 것이 딱딱 해졌다. 나는 그것이 내가 선수를 배정하는 방식과 더 관련이 있다고 생각한다. 플레이어의 문제를 해결하고 나면 다시 돌아가 다른 사운드를 시도해 보지 않았습니다. 그랬을 때까지 ... 그게 효과가있어!

2

내 생각에, 당신의 주된 문제는 사운드 로딩 자체가 사운드 자체를 재생할 동일한 기능 안에서 수행된다는 것입니다. 개념적으로 잘못된 것입니다. 가능한 한 빨리 사운드를 재생하려면 "재생"기능을 제외한 모든 사운드를 한 번로드해야합니다. 그 기능은 단지 재생되어야하며, 그게 전부입니다.

+1

그건 의미가 있습니다. 나는 여전히 다이내믹 플레이어 생성을 플레이 기능에서 분리하는 방법을 찾으려하고있다. 그러나 나는 그것에 대해 연구 중입니다 ... – squarehippo10

0

우리 팀에서 문제가 발생했습니다. 이 경우 디버거가 연결된 장치에서 앱을 실행하는 경우 왜곡 된 사운드 버그는 으로 재현 될 수 있습니다. 일단 우리가 디버거에서 응용 프로그램을 분리하면 크래클이 사라집니다. 새로운 Xcode 9.2 (9C40b)에 처음 나온 문제인 것 같습니다.

+0

내 문제를 해결하면 흥미롭고 훌륭했을 것입니다. 플레이어 생성 프로세스를 개선했을 때 시뮬레이터에서 왜곡이 사라졌습니다. 안타깝게도, 장치에 연결되어 있거나 연결되어 있지 않습니다. – squarehippo10