Shuvit game master repo. http://shuvit.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sound_man.py 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #sound_man.py
  2. #shuvit sound effects manager
  3. import bge
  4. import aud
  5. def init_sounds(self):
  6. #pop
  7. self.pop = sounds('pop')
  8. self.land = sounds('land')
  9. self.roll = sounds('roll')
  10. self.revert = sounds('revert')
  11. self.engine_idle = sounds('engine_idle')
  12. self.roll.loop = True
  13. self.grind_cement = sounds('grind_cement')
  14. self.grind_cement.loop = True
  15. self.grind_cement.pingpong = True
  16. self.grind_rail = sounds('grind_rail')
  17. self.grind_rail.loop = True
  18. self.grind_rail.pingpong = True
  19. self.engine_idle.loop = True
  20. #self.pop.name = 'pop'
  21. class sound_manager:
  22. def __init__(self):
  23. self.queue = []
  24. self.history = []
  25. self.h_queue = []
  26. self.gd = bge.logic.globalDict
  27. init_sounds(self)
  28. #self.pop = sounds()
  29. def queue_sound(self, sound):
  30. self.queue.append(sound)
  31. def remove_sound(self, sound):
  32. self.queue.remove(sound)
  33. def play_queue(self):
  34. if self.queue is not []:
  35. #pass
  36. self.h_queue = self.queue.copy()
  37. #print('og', self.h_queue, self.queue)
  38. for ev in self.queue:
  39. #get function from string at position 0 of event
  40. result = getattr(self, ev[0])
  41. #print(result)
  42. #print(result.name)
  43. if result.loop:
  44. result.loop_play(ev[1], ev[2], ev[3], ev[4])
  45. else:
  46. result.play(ev[1], ev[2])
  47. self.queue.remove(ev)
  48. self.queue = []
  49. def play_hist(self):
  50. if self.h_queue is not []:
  51. #pass
  52. for ev in self.h_queue:
  53. #get function from string at position 0 of event
  54. result = getattr(self, ev[0])
  55. #print(result)
  56. #print(result.name)
  57. #if result.name == 'roll':
  58. if result.loop:
  59. result.loop_play(ev[1], ev[2], ev[3], ev[4])
  60. else:
  61. result.play(ev[1], ev[2])
  62. #self.queue.remove(ev)
  63. def update(self):
  64. self.play_queue()
  65. #print('queued sounds', self.queue)
  66. def stop_sound(self, sound):
  67. c = getattr(self, sound[0])
  68. if c.handle_buffered:
  69. c.handle_buffered.stop()
  70. def Record(self):
  71. self.history.append(self.h_queue)
  72. #self.history.insert(0, self.h_queue)
  73. #print(self.h_queue, 'appended to history')
  74. #self.history.append(self.h_queue)
  75. #print('appending', self.h_queue)
  76. l = len(self.history)
  77. if l > ((self.gd['replay_record_length'])):
  78. self.history.pop(0)
  79. #self.history.pop(self.gd['replay_record_length'])
  80. #self.history.pop(0)
  81. #print(l, 'history length', ((self.gd['replay_record_length']) -1))
  82. def h_Playback(self, frame):
  83. #frame *= 2
  84. #frame = int(frame /2)
  85. try:
  86. self.h_queue = self.history[frame]
  87. #self.h_queue2 = self.history[frame-1]
  88. #print(self.history[frame], self.queue, frame, 'replay queue')
  89. except:
  90. print('replay audio not playing', frame, len(self.history))
  91. #print('h_queue', self.h_queue, frame)
  92. if self.h_queue is not []:
  93. for ev in self.h_queue:
  94. result = getattr(self, ev[0])
  95. #print('ev0', ev[0])
  96. if result.loop:
  97. #result.loop_play(ev[1], ev[2], ev[3], ev[4])
  98. pass
  99. else:
  100. result.play(ev[1], ev[2])
  101. #print('... playing', result.name, frame, len(self.history))
  102. # if self.h_queue2 is not []:
  103. # for ev in self.h_queue2:
  104. # result = getattr(self, ev[0])
  105. # if result.loop:
  106. # result.loop_play(ev[1], ev[2], ev[3], ev[4])
  107. # else:
  108. # result.play(ev[1], ev[2])
  109. #print(self.history)
  110. class sounds(sound_manager):
  111. def __init__(self, name):
  112. self.name = name
  113. self.obj = None
  114. self.loop = False
  115. self.pingpong = False
  116. self.listener_obj = None
  117. self.pitch = 1.0
  118. self.volume = 0.9
  119. self.device = aud.device()
  120. self.path = bge.logic.expandPath('//sounds')
  121. self.factory = aud.Factory(self.path + '/' + self.name + '.wav')
  122. self.factory_buffered = aud.Factory.buffer(self.factory)
  123. self.handle_buffered = None
  124. #self.handle = self.device.play(factory)
  125. def play(self, obj, listener):
  126. scene = bge.logic.getCurrentScene()
  127. self.device.distance_model = aud.AUD_DISTANCE_MODEL_LINEAR
  128. self.device.listener_location = obj.worldPosition
  129. self.device.listener_velocity = obj.getLinearVelocity()
  130. self.device.volume = self.volume
  131. handle_buffered = self.device.play(self.factory_buffered)
  132. handle_buffered.relative = False
  133. handle_buffered.location = listener.worldPosition
  134. handle_buffered.velocity = listener.getLinearVelocity()
  135. handle_buffered.distance_maximum = 50
  136. handle_buffered.distance_reference = .1
  137. def loop_play(self, obj, listener, v = 0.0, p = 0.0):
  138. scene = bge.logic.getCurrentScene()
  139. self.device.distance_model = aud.AUD_DISTANCE_MODEL_LINEAR
  140. self.device.listener_location = obj.worldPosition
  141. self.device.listener_velocity = obj.getLinearVelocity()
  142. #self.device.volume = self.volume
  143. if not self.handle_buffered or not self.handle_buffered.status:
  144. self.handle_buffered = self.device.play(self.factory_buffered)
  145. #print(self.handle_buffered.status)
  146. self.factory_buffered.loop(-1)
  147. if self.pingpong:
  148. self.factory_buffered.pingpong()
  149. try:
  150. self.handle_buffered.volume = v
  151. self.handle_buffered.pitch = p
  152. self.handle_buffered.relative = False
  153. self.handle_buffered.location = listener.worldPosition
  154. self.handle_buffered.velocity = listener.getLinearVelocity()
  155. self.handle_buffered.distance_maximum = 50
  156. self.handle_buffered.distance_reference = .1
  157. except:
  158. pass
  159. def main(cont):
  160. own = cont.owner
  161. if 'sound_man_inited' not in own:
  162. own['sound_man_inited'] = True
  163. sm = sound_manager()
  164. own['sndmgr'] = sm
  165. dict = bge.logic.globalDict
  166. #if not dict['playback']:
  167. #own['sndmgr'].Record()
  168. if not dict['playback']:
  169. own['sndmgr'].update()
  170. #if dict['playback']:
  171. #own['sndmgr'].Playback()