Gautham Elango
Gautham Elango

Reputation: 363

Integrating audio and accelerometer for Swift 2.0? (Using coremotion)

import CoreMotion    
var ButtonAudio4URL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Swing", ofType: "wav")!)
var ButtonAudioPlayer4 = AVAudioPlayer()
 do {
        try ButtonAudioPlayer4 = AVAudioPlayer(contentsOfURL: ButtonAudio4URL)
        ButtonAudioPlayer4.prepareToPlay()
    } catch {
        print("audioPlayer failure")
    }   
func play() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.play()
}
func play2() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.play()
}
func play3() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.play()
}
func stop() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.stop()
}
func stop2() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.stop()
}
func stop3() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.stop()
}
lastDirection = 0 //Idle accel
    threshold = 1.0 //Minimum positive(right) accel
    nthreshold = -1.0 //Minimum negative(left) accel

    if motionManager.accelerometerAvailable {
        let queue = NSOperationQueue()
        motionManager.startAccelerometerUpdatesToQueue(queue, withHandler: {
            data, error in
            guard let data = data else{
                return
            }

    // Get the acceleration
    let xAccel = data.acceleration.x    //X accel
    let yAccel = data.acceleration.y    //Y accel
    let zAccel = data.acceleration.z    //Z accel
    let xPositive = xAccel > 0  //Positive(right) x accel
    let xNegative = xAccel < 0  //Negative(left) x accel
    let yPositive = yAccel > 0  //Positive(up) y accel
    let yNegative = yAccel < 0  //Negative(down) y accel
    let zPositive = zAccel > 0  //Positive(front) z accel
    let zNegative = zAccel < 0  //Negative(back) z accel

    // Run if the acceleration is higher than theshold
    if abs(xAccel) > self.threshold {

        //If moved right
        dispatch_async(dispatch_get_main_queue()) {
            if self.lastDirection != 1 && xPositive {
                self.lastDirection = 1
                print("Up")
                self.play()
        } else if self.lastDirection !=     -1 && !xPositive {
            self.lastDirection = -1
            print("Down")
            self.play()
        }
        }
    }

    // Run if the acceleration is higher than ntheshold
    if abs(xAccel) < self.nthreshold {

        //If moved left
        dispatch_async(dispatch_get_main_queue()) {
            if self.lastDirection != 1 && xNegative {
                self.lastDirection = 1
                print("Up")
                self.play2()
        } else if self.lastDirection !=     -1 && !xNegative {
            self.lastDirection = -1
            print("Down")
            self.play2()
        }
        }
    }

    // Run if the acceleration is higher than theshold
    if abs(yAccel) > self.threshold {

        //If moved up
        dispatch_async(dispatch_get_main_queue()) {
            if self.lastDirection != 1 && yPositive {
                self.lastDirection = 1
                print("Up")
                self.play()
        } else if self.lastDirection !=     -1 && !yPositive {
            self.lastDirection = -1
            print("Down")
            self.play()
        }
        }
    }

    // Run if the acceleration is higher than ntheshold
    if abs(yAccel) < self.nthreshold {

        //If moved left
        dispatch_async(dispatch_get_main_queue()) {
            if self.lastDirection != 1 && yNegative {
                self.lastDirection = 1
                print("Up")
                self.play2()
        } else if self.lastDirection !=     -1 && !yNegative {
            self.lastDirection = -1
            print("Down")
            self.play2()
    }
    }
    }

    // Run if the acceleration is higher than theshold
    if abs(zAccel) > self.threshold {

    //If moved front
    dispatch_async(dispatch_get_main_queue()) {
    if self.lastDirection != 1 && zPositive {
    self.lastDirection = 1
    print("Up")
    self.play()
    } else if self.lastDirection !=     -1 && !zPositive {
    self.lastDirection = -1
    print("Down")
    self.play()
    }
    }
    }

    // Run if the acceleration is higher than theshold
    if abs(zAccel) < self.nthreshold {

    //If moved back
    dispatch_async(dispatch_get_main_queue()) {
    if self.lastDirection != 1 && zNegative {
    self.lastDirection = 1
    print("Up")
    self.play2()
    } else if self.lastDirection !=     -1 && !zNegative {
    self.lastDirection = -1
    print("Down")
    self.play2()
    }
    }
    }

    })

    }

Hello, I have built an iOS app with Xcode 7.2, Swift 2.0, for i0S 9.2 I would like to add a feature where when the user waves their device in the air, a sound will be played. My problem is that, although the sound plays, it suddenly stops, and is replayed when moved again in the process of playing the sound. I would like the sound to just be played once, without any overlapping or stopping. I have included all the code related to CoreMotion, and excluded all others. Thank you.

Upvotes: 0

Views: 141

Answers (1)

Allen
Allen

Reputation: 1734

If I do understand your purpose, you probably would like to have a boolean barrier to prevent duplicated playing.

Ex:


    var isPlaying1 = false

    func play() {
        if self.isPlaying1 == true {
            return
        }
        ButtonAudioPlayer4.currentTime = 0
        ButtonAudioPlayer4.play()
        self.isPlaying1 = true
    }

    func stop() {
        if self.isPlaying1 == false {
            return
        }
        ButtonAudioPlayer4.currentTime = 0
        ButtonAudioPlayer4.stop()
        self.isPlaying1 = false
    }

Upvotes: 1

Related Questions