iosswiftavaudioplayer

AVAudioPlayer keeps restarting


I want to make a warning sound according to the speed of the user using the map. When the user is above a certain speed, the sound works. But since the speed changes every second, it starts again. It's not working properly. Can you help with this? I'm new to software.

class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {
    
    
    @IBOutlet weak var imageLabel: UIImageView!
    @IBOutlet weak var mapView: MKMapView!
    var player : AVAudioPlayer!
    var locationManager = CLLocationManager()
    
    var lastSpeed = Int()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        mapView.delegate = self
        
        imageLabel.isHidden = true
        
        
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
        
        
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        
        
        let sonKonum : CLLocation = locations[locations.count - 1]
        
        let konum = CLLocationCoordinate2D(latitude: sonKonum.coordinate.latitude, longitude: sonKonum.coordinate.longitude)
        
        let span = MKCoordinateSpan(latitudeDelta: 0.03, longitudeDelta: 0.03)
        
        let bolge = MKCoordinateRegion(center: konum, span: span)
        
        mapView.setRegion(bolge, animated: true)
        
        mapView.showsUserLocation = true
        
        lastSpeed = Int(sonKonum.speed)
        
        if lastSpeed >= 7 {
            imageLabel.isHidden = false
            player?.play()
            
        } else {
            imageLabel.isHidden = true
            player?.stop()
        }
        
        print(sonKonum.speed)
        
    }
    
    func sesFonk() {
        
        let url = Bundle.main.url(forResource: "yavas", withExtension: "mp3")
        
        do {
            player = try AVAudioPlayer(contentsOf: url!)
            
        } catch {
            print("hata")
        }
    }
}

Solution

  • Every time the location gets updated you execute this code:

    if lastSpeed >= 7 {
        imageLabel.isHidden = false
        player?.play()
    } else {
        imageLabel.isHidden = true
        player?.stop()
    }
    

    and if the user is fast enough you execute this line:

    player?.play()
    

    that is causing your issue of the sound being restarted.

    To solve this you should execute player?.play() only when it doesn´t play allready. You can ask the player if it is in "playing" state:

    if lastSpeed >= 7 {
        if !(player?.isPlaying ?? true) {
            imageLabel.isHidden = false
            player?.play()
        }
    } else {
        imageLabel.isHidden = true
        player?.stop()
    }