2015-09-21 3 views
0

Я написал приложение Iphone Swift, которое воспроизводит ряд звуков в произвольном порядке с использованием AVAudioPlayer - на данный момент поп-звук, звуковой сигнал и гонг. Он работает, когда вы нажимаете кнопку воспроизведения, за исключением ...Управление потоком в Swift - AVAudioPlayer

Однако, когда я нажимаю кнопку остановки, ничего не происходит - он не отвечает (остановка работает, если у меня есть только один звук). Я считаю, что это связано с моим контролем потока. Если бы я не включил «while soundPlayer.playing == true {}», код «пролетел» через звук и не дождался его завершения.

Как изменить код, чтобы звук воспроизводился до завершения перед тем, как перейти к следующему звуку? А также позволяет кнопке остановки функционировать? Смотрите код и снимок экрана ниже. (На самом деле переполнение стека не позволит мне разместить изображение, так как я так новый)


// 
// ViewController.swift 
// InsultSchool2 Swift 
// 
// Created by JR on 12/3/14. 
// Copyright (c) 2014 JR. All rights reserved. 
// 

import UIKit 
import AVFoundation 

//--------------------------------------------------- 

var soundPlayer:AVAudioPlayer = AVAudioPlayer() 

// used to try to do some kind of flow control. May not be needed if better way is found. 
var stopFlag:Bool = false 

//----------------------------------------------------- 

class ViewController: UIViewController { 

    @IBOutlet weak var valueSliderTime: UISlider! 
    @IBOutlet weak var valueLabelTime: UILabel! 
    @IBOutlet weak var valueStepperVolume: UIStepper! 
    @IBOutlet weak var valueLabelVolume: UILabel! 

//------------------------------------------------------ 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     //Displays an initial Volume value in volume label on load 
     //Convert to an int. Otherwise you get a weird value when getting close to zero 
     //Multiply by 10 so the int works. Otherwise you would int'ing a number between 0.0 and 1.0. 
     // "\()" is a shorthand to convert whatever to a string 
     valueLabelVolume.text = "\(Int(valueStepperVolume.value * 10))" 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


//------------------------------------------------------ 


    @IBAction func buttonStop(sender: UIBarButtonItem) { 
     NSLog("Enter Button Stop") 
     //?1 If a sound is not playing and stop is hit, then it crashes 
     //?2 the stop button does not work with the whlle loop below 
     soundPlayer.stop() 
    } 

    @IBAction func sliderTime(sender: UISlider) { 
     valueLabelTime.text = "\(Int(valueSliderTime.value))" 
    } 

    @IBAction func stepperVolume(sender: UIStepper) { 
     //Converted to an int. Otherwise you get a weird value when getting close to zero 
     valueLabelVolume.text = "\(Int(valueStepperVolume.value * 10))" 
    } 

    @IBAction func buttonPlay(sender: UIBarButtonItem) { 
     NSLog("Enter Button Start") 

     var soundArray:[String] = ["Sound0", "Sound1", "Sound2"] 

     // Randomizes a number to indicate which random sound to play in the array 
     /* Number is from 0 to number in the(). Don't add one or 0 will never play. Go one more than the numbers in the array. For example if you have 3 items in the array go to 3. THis will go from 0 to 2 (ie., 3 items)*/ 
     // Reference----- var soundRandomNumber:Int = Int(arc4random_uniform(3)) 
     var soundRandomNumber:Int 
     soundRandomNumber = Int(arc4random_uniform(3)) 


     //Creates a random number to wait between sounds based on the slider value. 
     //arc4random requires a UInt32 (Unsigned is a positive number). 
     //_uniform is slightly more random than without the Uniform 
     //The documentation says to use Int otherwise. 
     println(Int(valueSliderTime.value)) 
     NSLog("valueSliderTime.value") 
     var waitTimeRandomNumber = Int(arc4random_uniform(UInt32(valueSliderTime.value))) 
     println(waitTimeRandomNumber) 
     NSLog("waitTimeRandomNumber") 

     // Constructs a string with the random number for the URL 
     //var soundFile:String = soundArray[soundRandomNumber] 
     var soundFile:String 
     soundFile = soundArray[soundRandomNumber] 

     //Reference---- var soundURL = NSBundle.mainBundle().URLForResource(soundFile, withExtension:"mp3") 

     var soundURL:NSURL! 
     soundURL = NSBundle.mainBundle().URLForResource(soundFile, withExtension:"mp3") 
     soundPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: nil) 


     //?3 How do I set up a loop or control that works until the stop button is pressed? 
      while stopFlag == false{ 
       NSLog("inside while") 
       println(stopFlag) 


       //?4 Is the below correct? The actual volume does not seem to change though the .volume does 
       soundPlayer.volume = Float(valueStepperVolume.value) 
       println(Float(valueStepperVolume.value)) 
       NSLog("Float(valueStepperVolume.value)") 
       println(soundPlayer.volume) 
       NSLog("soundPlayer.volume") 

       soundRandomNumber = Int(arc4random_uniform(3)) 
       soundFile = soundArray[soundRandomNumber] 
       soundURL = NSBundle.mainBundle().URLForResource(soundFile, withExtension:"mp3") 
       soundPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: nil) 
       soundPlayer.prepareToPlay() 
       soundPlayer.play() 


       //?5 How do I make the player not blow through the sound and wait until is finished 
       while soundPlayer.playing == true { 
       } 


       //?6 How can i make a random timer that waits for a random time before relooping? 
       waitTimeRandomNumber = Int(arc4random_uniform(UInt32(valueSliderTime.value))) 

      }// End of while loop 


     } //ends playButton IBAction 

//?7 How to allow this app to play over other music in another player 
} 

ответ

0

использовать повтор в то время как оператор вместо того, чтобы контролировать поток:

здесь ссылку на разработчиков яблока ссылка:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ControlFlow.html

repeat { 
// move up or down for a snake or ladder 
square += board[square] 
// roll the dice 
if ++diceRoll == 7 { diceRoll = 1 } 
// move by the rolled amount 
square += diceRoll 
      } while square < finalSquare 
print("Game over!") 
Смежные вопросы