源战役客户端
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.

224 lines
5.7 KiB

  1. ChatVoiceManager = ChatVoiceManager or BaseClass(BaseModel)
  2. function ChatVoiceManager:__init()
  3. ChatVoiceManager.Instance = self
  4. self.voice_list = {}
  5. self.click_voice_list = {}
  6. self.voice_ver_dic = {}
  7. self.voice_queue = {}
  8. local function onCheckToDelete()
  9. local delete_list = {}
  10. for id, vo in pairs(self.voice_list) do
  11. if vo:CheckCanDelete() then
  12. table.insert(delete_list, id)
  13. end
  14. end
  15. for i, id in ipairs(delete_list) do
  16. self:DeleteVoice(id)
  17. end
  18. end
  19. GlobalTimerQuest:AddPeriodQuest(onCheckToDelete, 30, -1)
  20. end
  21. function ChatVoiceManager:ClickPlay(voice_id)
  22. self.click_voice_list[voice_id] = true
  23. end
  24. function ChatVoiceManager:PushPlay(voice_id)
  25. if self.click_voice_list[voice_id] then
  26. self.click_voice_list[voice_id] = nil
  27. self:PlayVoice(voice_id)
  28. for i,v in ipairs(self.voice_queue) do
  29. if v == voice_id then
  30. table.remove(self.voice_queue, i)
  31. break
  32. end
  33. end
  34. else
  35. if self.playing_voice_id then
  36. table.insert(self.voice_queue, voice_id)
  37. else
  38. self:PlayVoice(voice_id)
  39. end
  40. -- math.randomseed(os.time())
  41. -- local delayTime = math.random(0, 100) * 0.005
  42. -- local timer_delay = GlobalTimerQuest:AddPeriodQuest(function()
  43. -- self:PlayVoice(voice_id)
  44. -- self.timer_list[voice_id] = nil
  45. -- end, delayTime, 1)
  46. -- self.timer_list[voice_id] = timer_delay
  47. end
  48. end
  49. function ChatVoiceManager:PopPlay()
  50. local popId
  51. if #self.voice_queue > 0 then
  52. popId = self.voice_queue[1]
  53. table.remove(self.voice_queue, 1)
  54. self:PlayVoice(popId)
  55. else
  56. lua_soundM:CancelMuteQuest(self)
  57. end
  58. end
  59. function ChatVoiceManager:Reset()
  60. for k,v in pairs(self.voice_list) do
  61. self:DeleteVoice(id)
  62. end
  63. self.voice_list = {}
  64. self.voice_ver_dic = {}
  65. if self.timer_play then
  66. GlobalTimerQuest:CancelQuest(self.timer_play)
  67. self.timer_play = nil
  68. end
  69. if self.playing_voice_id then
  70. self:StopVoice(self.playing_voice_id)
  71. self.playing_voice_id = nil
  72. end
  73. self.voice_queue = {}
  74. end
  75. function ChatVoiceManager:getInstance()
  76. if ChatVoiceManager.Instance==nil then
  77. ChatVoiceManager.New()
  78. end
  79. return ChatVoiceManager.Instance
  80. end
  81. --生成语音id,角色id + 时间合成
  82. function ChatVoiceManager:GenerateVoiceID()
  83. local time = tostring(TimeUtil:timeSec(os.time()))
  84. time = string.sub(time,#time - 8, #time)
  85. return tonumber(RoleManager.Instance.mainRoleInfo.role_id..time)
  86. end
  87. --生成语音路径
  88. function ChatVoiceManager:GenerateVoicePath()
  89. local voice_id = self:GenerateVoiceID()
  90. -- local
  91. local path
  92. if AppConst.DebugMode then
  93. path = AppConst.CachedVoicePath .."/testAudio.wav"
  94. else
  95. path = AppConst.CachedVoicePath .."/"..voice_id..".wav"
  96. end
  97. return voice_id, path
  98. end
  99. function ChatVoiceManager:SetVoiceVersion(voice_id,data_ver)
  100. self.voice_ver_dic[voice_id] = data_ver
  101. end
  102. function ChatVoiceManager:GetVoiceVersion(voice_id)
  103. --27为支持语音功能版本,数据未压缩
  104. return self.voice_ver_dic[voice_id] or 27
  105. end
  106. function ChatVoiceManager:GetVoice(voice_id)
  107. return self.voice_list[voice_id]
  108. end
  109. function ChatVoiceManager:DeleteVoice(voice_id)
  110. local voice_vo = self.voice_list[voice_id]
  111. if voice_vo then
  112. voice_vo:DeleteMe()
  113. self.voice_list[voice_id] = nil
  114. end
  115. end
  116. --主角录音后主动调用
  117. function ChatVoiceManager:AddMainRoleVoicePath(voice_id, voice_path)
  118. --local voice_id = self:GenerateVoiceID()
  119. local voice_vo = self:GetVoice(voice_id)
  120. if voice_vo == nil then
  121. voice_vo = VoiceVo.New()
  122. self.voice_list[voice_id] = voice_vo
  123. voice_vo.voice_id = voice_id
  124. voice_vo.voice_path = voice_path
  125. end
  126. return voice_id
  127. end
  128. --加载主角录音
  129. function ChatVoiceManager:LoadMainRoleVoiceData(voice_id, callback)
  130. local voice_vo = self:GetVoice(voice_id)
  131. if voice_vo then
  132. voice_vo:GetVoiceData(callback)
  133. end
  134. end
  135. --请求服务器返回 其他玩家的语音二进制数据
  136. function ChatVoiceManager:AddVoiceData(voice_id, voice_data)
  137. local voice_vo = self:GetVoice(voice_id)
  138. if voice_vo == nil then
  139. voice_vo = VoiceVo.New()
  140. self.voice_list[voice_id] = voice_vo
  141. voice_vo:SetVoiceData(voice_id, voice_data)
  142. end
  143. end
  144. function ChatVoiceManager:PlayVoice(voice_id)
  145. if self.playing_voice_id == voice_id then return end
  146. self:StopVoice(self.playing_voice_id)
  147. local voice_vo = self:GetVoice(voice_id)
  148. self.playing_voice_id = voice_id
  149. if voice_vo then
  150. voice_vo:Play()
  151. else
  152. print("---------------ChatVoiceManager has no this voice record to play--------------")
  153. end
  154. end
  155. function ChatVoiceManager:StopVoice(voice_id)
  156. local voiceVo = self:GetVoice(voice_id)
  157. if voiceVo then
  158. if voice_id == self.playing_voice_id then
  159. self.playing_voice_id = nil
  160. if self.timer_play then
  161. GlobalTimerQuest:CancelQuest(self.timer_play)
  162. self.timer_play = nil
  163. end
  164. if voiceVo:IsPlaying() then
  165. self:StopAudioClip(voice_id, voiceVo.voice_clip)
  166. end
  167. end
  168. end
  169. end
  170. function ChatVoiceManager:PlayAudioClip(voice_id, voice_clip)
  171. GlobalEventSystem:Fire(ChatModel.PLAY_VOICE, voice_id, voice_clip)
  172. lua_soundM:AddMuteQuest(self)
  173. local engineVer = tonumber(AppConst.EnglineVer)
  174. if engineVer >= 31 then
  175. soundMgr:PlayVoice(voice_id, voice_clip, 1)
  176. if engineVer == 31 then
  177. local trans = soundMgr.transform:Find("Voice_"..voice_id)
  178. if trans then
  179. trans:GetComponent("AudioSource").mute = false
  180. end
  181. end
  182. else
  183. soundMgr:PlayVoice(voice_id, voice_clip)
  184. local trans = soundMgr.transform:Find("Audio_"..voice_id)
  185. if trans then
  186. trans:GetComponent("AudioSource").mute = false
  187. end
  188. end
  189. self.timer_play = GlobalTimerQuest:AddPeriodQuest(function()
  190. self.playing_voice_id = nil
  191. self.timer_play = nil
  192. self:PopPlay()
  193. end, voice_clip.length, 1)
  194. end
  195. function ChatVoiceManager:StopAudioClip(voice_id, voice_clip)
  196. ChatModel:getInstance():Fire(ChatModel.STOP_VOICE_PLAY, voice_id)
  197. local trans = soundMgr.transform:Find("Voice_"..voice_id)
  198. if trans then
  199. destroy(trans.gameObject)
  200. end
  201. end