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

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