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 6.0KB

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