130 lines
4.5 KiB
Python
130 lines
4.5 KiB
Python
from pandac.PandaModules import AudioSound
|
|
from direct.interval.SoundInterval import SoundInterval
|
|
|
|
class CogdoGameSfx:
|
|
|
|
def __init__(self, audioSound, audioMgr, source = None):
|
|
self._audioSound = audioSound
|
|
self._audioMgr = audioMgr
|
|
self._source = source
|
|
|
|
def destroy(self):
|
|
self._audioMgr.removeSound(self._audioSound)
|
|
del self._audioSound
|
|
del self._audioMgr
|
|
del self._source
|
|
|
|
def getAudioSound(self):
|
|
return self._audioSound
|
|
|
|
def play(self, loop = False, playRate = 1.0, volume = 1.0, source = None):
|
|
if source is None:
|
|
source = self._source
|
|
self._audioMgr.playSound(self._audioSound, loop=loop, source=source, playRate=playRate, volume=volume)
|
|
return
|
|
|
|
def loop(self, playRate = 1.0, volume = 1.0, source = None):
|
|
if source is None:
|
|
source = self._source
|
|
self.play(loop=True, source=source, playRate=playRate, volume=volume)
|
|
return
|
|
|
|
def stop(self):
|
|
self._audioMgr.stopSound(self._audioSound)
|
|
|
|
|
|
class CogdoGameAudioManager:
|
|
notify = directNotify.newCategory('CogdoGameAudioManager')
|
|
|
|
def __init__(self, musicFiles, sfxFiles, listener, cutoff = 75):
|
|
self._sfxFiles = sfxFiles
|
|
self._listener = listener
|
|
self._cutoff = cutoff
|
|
self.currentMusic = None
|
|
self._music = {}
|
|
for name, filePath in musicFiles.items():
|
|
self._music[name] = base.loadMusic(filePath)
|
|
|
|
self._audioSounds = []
|
|
self._soundIvals = {}
|
|
base.cogdoGameAudioMgr = self
|
|
return
|
|
|
|
def destroy(self):
|
|
del base.cogdoGameAudioMgr
|
|
self.stopAll()
|
|
self.currentMusic = None
|
|
del self.currentMusic
|
|
self._music.clear()
|
|
del self._sfxFiles
|
|
del self._audioSounds
|
|
return
|
|
|
|
def stopMusic(self):
|
|
if self.currentMusic is not None:
|
|
self.currentMusic.stop()
|
|
return
|
|
|
|
def playMusic(self, name, loop = True, swap = False):
|
|
time = 0.0
|
|
if self.currentMusic is not None:
|
|
if swap:
|
|
time = self.currentMusic.getTime()
|
|
self.stopMusic()
|
|
self.currentMusic = self._music[name]
|
|
self.currentMusic.setTime(time)
|
|
self.currentMusic.setLoop(loop)
|
|
self.currentMusic.play()
|
|
return
|
|
|
|
def createSfx(self, name, source = None):
|
|
sound = loader.loadSfx(self._sfxFiles[name])
|
|
self._audioSounds.append(sound)
|
|
gameSfx = CogdoGameSfx(sound, self, source)
|
|
return gameSfx
|
|
|
|
def removeSound(self, audioSound):
|
|
self._audioSounds.remove(audioSound)
|
|
|
|
def _cleanupSoundIval(self, audioSound):
|
|
if audioSound in self._soundIvals:
|
|
ival = self._soundIvals[audioSound]
|
|
if ival.isPlaying():
|
|
ival.finish()
|
|
del self._soundIvals[audioSound]
|
|
|
|
def createSfxIval(self, sfxName, volume = 1.0, duration = 0.0, startTime = 0.0, source = None, cutoff = None):
|
|
sound = loader.loadSfx(self._sfxFiles[sfxName])
|
|
self._audioSounds.append(sound)
|
|
return self._createSoundIval(sound, volume=volume, startTime=startTime, duration=duration, source=source, cutoff=cutoff)
|
|
|
|
def _createSoundIval(self, audioSound, volume = 1.0, duration = 0.0, startTime = 0.0, source = None, register = False, cutoff = None):
|
|
if cutoff == None:
|
|
cutoff = self._cutoff
|
|
ival = SoundInterval(audioSound, node=source, duration=duration, startTime=startTime, cutOff=cutoff, seamlessLoop=True, listenerNode=self._listener)
|
|
return ival
|
|
|
|
def playSound(self, audioSound, loop = False, source = None, playRate = 1.0, volume = 1.0):
|
|
audioSound.setPlayRate(playRate)
|
|
if source is not None and loop:
|
|
self._cleanupSoundIval(audioSound)
|
|
ival = self._createSoundIval(audioSound, volume=volume, source=source)
|
|
self._soundIvals[audioSound] = ival
|
|
ival.loop()
|
|
else:
|
|
base.playSfx(audioSound, looping=loop, node=source, volume=volume, listener=self._listener, cutoff=self._cutoff)
|
|
return
|
|
|
|
def stopSound(self, audioSound):
|
|
if audioSound in self._soundIvals:
|
|
self._cleanupSoundIval(audioSound)
|
|
elif audioSound.status() == AudioSound.PLAYING:
|
|
audioSound.stop()
|
|
|
|
def stopAllSfx(self):
|
|
for audioSound in self._audioSounds:
|
|
self.stopSound(audioSound)
|
|
|
|
def stopAll(self):
|
|
self.stopMusic()
|
|
self.stopAllSfx()
|