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.8KB

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