2017-12-12 8 views
-1

配列のサウンドを時間差を持って再生しようとしています。遅延のある配列でサウンドを再生する

私はwhileループから以下の遅延関数を使用するまですべてを試しましたが、何も動作していないようです。

コードは配列上の最初の2つの文字列だけを再生し、停止します。

私を助けてください):あなたのwhen値の両方が同じであるため

var audioPlayer : AVAudioPlayer! 
var selectedSoundFileName : String = "" 
var n : Int = 0 

// array containing the sound files 
let playArray = ["base","snare","base","base","snare"] 

// Button Press to start play sequence 

@IBAction func playSequence(_ sender: Any) { 

    selectedSoundFileName =playArray[0] 
    playSound() 

    let when = DispatchTime.now() + 1 
    DispatchQueue.main.asyncAfter(deadline: when) { 
     selectedSoundFileName =playArray[1] 
     playSound() 
    } 
    let when = DispatchTime.now() + 1 
    DispatchQueue.main.asyncAfter(deadline: when) { 
     selectedSoundFileName =playArray[2] 
     playSound() 
    } 
} 

func playSound() { 
    let soundURL = Bundle.main.url(forResource: selectedSoundFileName, withExtension: "mp3") 
    do { 
     audioPlayer = try AVAudioPlayer(contentsOf: soundURL!) 
    } catch { 
     print(error) 
    } 
    audioPlayer.play() 
} 

答えて

0

ファイルplayArray[1]playArray[2]を同時に再生することが予定されています。 DispatchQueue.main.asyncAfterのブロックだけが、後続のコードではなく、遅れて実行されます。次のことを試してみてください。

@IBAction func playSequence(_ sender: Any) { 

selectedSoundFileName =playArray[0] 
playSound() 

let when = DispatchTime.now() + 1 
DispatchQueue.main.asyncAfter(deadline: when) { 
    selectedSoundFileName =playArray[1] 
    playSound() 
    let nextWhen = DispatchTime.now() + 1 
    DispatchQueue.main.asyncAfter(deadline: nextWhen) { 
     selectedSoundFileName =playArray[2] 
     playSound() 
    } 
} 
} 

EDIT:
次のコードは、よりスケーラブルになります。

@IBAction func playSequence(_ sender: Any) { 
    for index in 0..<playArray.count{ 
     let when = DispatchTime.now() + Double(index)//The sounds won't overlap as long as each sound's duration is 1 sec. If not you may have to add the duration of each sound to the delay instead of just a second. 
     DispatchQueue.main.asyncAfter(deadline: when) { 
      selectedSoundFileName = playArray[index] 
      playSound() 
     } 
    } 
} 
+0

それが魅力(のように働いたそんなにSanthoshありがとう: – Alex

+0

確かにアレックス:)また、外部のディスパッチ・ブロックを維持していないあなたが行ったようにネストされたが、遅延を増やすことができます。私の編集された答えを見てください。 –

関連する問題