Apps Can anyone fix this code?

I have tried to merge two apps, one that shows the drift angle and one that plays a sound on a condition. My goal is that a sound is played when certain level of drift is achieved. It is working, but the problem is that the sound sometimes is played many times, even overlapping itself. I would need a way to prevent the condition with the soundplay to be run so frequently, or maybe with some kind of timer that makes it wait for some seconds after the last time it was run. My knowledge of Python is almost zero, so I ask for your help. This is the code I have:

Code:
import sys
import ac
import acsys
import math

from math import log
from playsounddrift import playsound
from pydubdrift.pydub import AudioSegment

sound_played = False

SoundFile = "apps/python/D_Angle/hotshot.wav"

#configure
MaxAngle = 130
MinKMH = 10
Drift = 20

#label
AngleLabel = 0

#field
Angle = 0
Timer = 0

def acMain(ac_version):
    global AngleLabel

    # init Window
    appWindow = ac.newApp("D_Angle")
    ac.setSize(appWindow, 66, 30)
    ac.setTitle(appWindow, "")
    ac.drawBorder(appWindow, 0)
    ac.setIconPosition(appWindow, 0, -10000)
    ac.setBackgroundOpacity(appWindow, 0.3)

    # label configure
    AngleLabel = ac.addLabel(appWindow, "0°")
    ac.setPosition(AngleLabel, 33, 3)
    ac.setFontAlignment(AngleLabel, "center")
    ac.setFontSize(AngleLabel, 18)
    ac.setFontColor(AngleLabel, 1, 1, 1, 1)

def acUpdate(deltaT):
    global AngleLabel, Angle, Timer, MinKMH, sound_played, offset
    ac.setFontAlignment(AngleLabel, "center")
    ac.setPosition(AngleLabel, 33, 3)

    # raw data
    carKMH = ac.getCarState(0, acsys.CS.SpeedKMH)
    fl, fr, rl, rr = ac.getCarState(0, acsys.CS.SlipAngle)
    vx, vy, vz = ac.getCarState(0, acsys.CS.LocalVelocity)

    # model data
    Angle = getDriftAngle(rl, rr, vz)

    # spin : over angle
    if Angle > MaxAngle and carKMH > MinKMH:
        ac.setText(AngleLabel, "Spin")
        return

    # spin : lower speed
    if Angle > 60 and carKMH < MinKMH and vz > 0:
        ac.setText(AngleLabel, "Spin")
        return

    # drifting
    if carKMH > MinKMH:
        ac.setText(AngleLabel, "{:.0f}°".format(Angle))

    # Wait anim
    else:
        ac.setPosition(AngleLabel, 16, 3)
        Timer += deltaT
        ac.setFontAlignment(AngleLabel, "left")
        if int(Timer) % 3 == 0:
            ac.setText(AngleLabel, "Text1")
        if int(Timer) % 3 == 1:
            ac.setText(AngleLabel, "Text2")
        if int(Timer) % 3 == 2:
            ac.setText(AngleLabel, "Text3")

    if Angle > Drift and carKMH > MinKMH:
        if not sound_played:
            playsound(SoundFile, block = False)
            sound_played = True
            return
    else:
        sound_played = False
        return

def getDriftAngle(rl, rr, vz):
    rawAngle = math.fabs(round(rl+rr)/2)
    if vz <= 0:
        return 180 - rawAngle
    else:
        return rawAngle
 

Latest News

What would make you race in our Club events

  • Special events

    Votes: 30 24.2%
  • More leagues

    Votes: 25 20.2%
  • Prizes

    Votes: 22 17.7%
  • Trophies

    Votes: 13 10.5%
  • Forum trophies

    Votes: 7 5.6%
  • Livestreams

    Votes: 21 16.9%
  • Easier access

    Votes: 74 59.7%
  • Other? post your reason

    Votes: 19 15.3%
Back
Top