84 lines
3.1 KiB
Python
84 lines
3.1 KiB
Python
"""SoundInterval module: contains the SoundInterval class"""
|
|
|
|
from PandaModules import *
|
|
from Interval import *
|
|
|
|
class SoundInterval(Interval):
|
|
# Name counter
|
|
soundNum = 1
|
|
# create SoundInterval DirectNotify category
|
|
notify = directNotify.newCategory('SoundInterval')
|
|
# Class methods
|
|
# Create a sound interval
|
|
# If loop = 0, sound will play once, duration of the interval
|
|
# equals the duration of the sound
|
|
# If loop = 1, the sound will loop for the specified duration
|
|
# If no duration is specified, sound will loop for the duration
|
|
# of the sound, i.e. it will only play once.....usually, there
|
|
# seems to be some timing in the audio such that the stop doesn't
|
|
# kill the looping sound until the next time around if duration
|
|
# of the interval equals duration of the sound
|
|
def __init__(self, sound, loop = 0, duration = 0.0, name = None):
|
|
"""__init__(sound, loop, name)
|
|
"""
|
|
# Generate unique name
|
|
id = 'Sound-%d' % SoundInterval.soundNum
|
|
SoundInterval.soundNum += 1
|
|
# Record instance variables
|
|
self.sound = sound
|
|
self.loop = loop
|
|
self.wantSound = base.wantSfx
|
|
# If no duration given use sound's duration as interval's duration
|
|
if duration == 0.0:
|
|
if self.wantSound:
|
|
duration = self.sound.length()
|
|
if (duration == 0):
|
|
self.notify.warning('zero length duration!')
|
|
# MPG - hack for Miles bug
|
|
duration += 1.5
|
|
else:
|
|
# This will screw up any intervals that base their
|
|
# time on the duration of this sound interval
|
|
print ('SoundInterval: Warning, want-sound #f,'+
|
|
' zero sound duration assumed')
|
|
duration = 0.0
|
|
# Generate unique name if necessary
|
|
if (name == None):
|
|
name = id
|
|
# Initialize superclass
|
|
Interval.__init__(self, name, duration)
|
|
# Update stopEvent
|
|
self.stopEvent = id + '_stopEvent'
|
|
if self.wantSound:
|
|
self.stopEventList = [self.stopEvent]
|
|
|
|
def updateFunc(self, t, event = IVAL_NONE):
|
|
""" updateFunc(t, event)
|
|
Go to time t
|
|
"""
|
|
if not self.wantSound:
|
|
return
|
|
# Update sound based on current time
|
|
if (t >= self.getDuration()):
|
|
# If end of sound reached or stop event received, stop sound
|
|
self.sound.stop()
|
|
self.ignore(self.stopEvent)
|
|
elif (event == IVAL_INIT):
|
|
# IVAL_INIT event, start new sound
|
|
# If its within a 10th of a second of the start,
|
|
# start at the beginning
|
|
if (t < 0.1):
|
|
t = 0.0
|
|
# Start sound
|
|
self.sound.setTime(t)
|
|
self.sound.setLoop(self.loop)
|
|
self.sound.play()
|
|
# Accept event to kill sound
|
|
self.acceptOnce(self.stopEvent,
|
|
lambda s = self: s.sound.stop())
|
|
# Print debug information
|
|
self.notify.debug('updateFunc() - %s: t = %f' % (self.name, t))
|
|
|
|
|
|
|