ChatVoiceManager = ChatVoiceManager or BaseClass(BaseModel) function ChatVoiceManager:__init() ChatVoiceManager.Instance = self self.voice_list = {} self.click_voice_list = {} self.voice_ver_dic = {} self.voice_queue = {} local function onCheckToDelete() local delete_list = {} for id, vo in pairs(self.voice_list) do if vo:CheckCanDelete() then table.insert(delete_list, id) end end for i, id in ipairs(delete_list) do self:DeleteVoice(id) end end GlobalTimerQuest:AddPeriodQuest(onCheckToDelete, 30, -1) end function ChatVoiceManager:ClickPlay(voice_id) self.click_voice_list[voice_id] = true end function ChatVoiceManager:PushPlay(voice_id) if self.click_voice_list[voice_id] then self.click_voice_list[voice_id] = nil self:PlayVoice(voice_id) for i,v in ipairs(self.voice_queue) do if v == voice_id then table.remove(self.voice_queue, i) break end end else if self.playing_voice_id then table.insert(self.voice_queue, voice_id) else self:PlayVoice(voice_id) end -- math.randomseed(os.time()) -- local delayTime = math.random(0, 100) * 0.005 -- local timer_delay = GlobalTimerQuest:AddPeriodQuest(function() -- self:PlayVoice(voice_id) -- self.timer_list[voice_id] = nil -- end, delayTime, 1) -- self.timer_list[voice_id] = timer_delay end end function ChatVoiceManager:PopPlay() local popId if #self.voice_queue > 0 then popId = self.voice_queue[1] table.remove(self.voice_queue, 1) self:PlayVoice(popId) else lua_soundM:CancelMuteQuest(self) end end function ChatVoiceManager:Reset() for k,v in pairs(self.voice_list) do self:DeleteVoice(id) end self.voice_list = {} self.voice_ver_dic = {} if self.timer_play then GlobalTimerQuest:CancelQuest(self.timer_play) self.timer_play = nil end if self.playing_voice_id then self:StopVoice(self.playing_voice_id) self.playing_voice_id = nil end self.voice_queue = {} end function ChatVoiceManager:getInstance() if ChatVoiceManager.Instance==nil then ChatVoiceManager.New() end return ChatVoiceManager.Instance end --生成语音id,角色id + 时间合成 function ChatVoiceManager:GenerateVoiceID() local time = tostring(TimeUtil:timeSec(os.time())) time = string.sub(time,#time - 8, #time) return tonumber(RoleManager.Instance.mainRoleInfo.role_id..time) end --生成语音路径 function ChatVoiceManager:GenerateVoicePath() local voice_id = self:GenerateVoiceID() -- local local path if AppConst.DebugMode then path = AppConst.CachedVoicePath .."/testAudio.wav" else path = AppConst.CachedVoicePath .."/"..voice_id..".wav" end return voice_id, path end function ChatVoiceManager:SetVoiceVersion(voice_id,data_ver) self.voice_ver_dic[voice_id] = data_ver end function ChatVoiceManager:GetVoiceVersion(voice_id) --27为支持语音功能版本,数据未压缩 return self.voice_ver_dic[voice_id] or 27 end function ChatVoiceManager:GetVoice(voice_id) return self.voice_list[voice_id] end function ChatVoiceManager:DeleteVoice(voice_id) local voice_vo = self.voice_list[voice_id] if voice_vo then voice_vo:DeleteMe() self.voice_list[voice_id] = nil end end --主角录音后主动调用 function ChatVoiceManager:AddMainRoleVoicePath(voice_id, voice_path) --local voice_id = self:GenerateVoiceID() local voice_vo = self:GetVoice(voice_id) if voice_vo == nil then voice_vo = VoiceVo.New() self.voice_list[voice_id] = voice_vo voice_vo.voice_id = voice_id voice_vo.voice_path = voice_path end return voice_id end --加载主角录音 function ChatVoiceManager:LoadMainRoleVoiceData(voice_id, callback) local voice_vo = self:GetVoice(voice_id) if voice_vo then voice_vo:GetVoiceData(callback) end end --请求服务器返回 其他玩家的语音二进制数据 function ChatVoiceManager:AddVoiceData(voice_id, voice_data) local voice_vo = self:GetVoice(voice_id) if voice_vo == nil then voice_vo = VoiceVo.New() self.voice_list[voice_id] = voice_vo voice_vo:SetVoiceData(voice_id, voice_data) end end function ChatVoiceManager:PlayVoice(voice_id) if self.playing_voice_id == voice_id then return end self:StopVoice(self.playing_voice_id) local voice_vo = self:GetVoice(voice_id) self.playing_voice_id = voice_id if voice_vo then voice_vo:Play() else print("---------------ChatVoiceManager has no this voice record to play--------------") end end function ChatVoiceManager:StopVoice(voice_id) local voiceVo = self:GetVoice(voice_id) if voiceVo then if voice_id == self.playing_voice_id then self.playing_voice_id = nil if self.timer_play then GlobalTimerQuest:CancelQuest(self.timer_play) self.timer_play = nil end if voiceVo:IsPlaying() then self:StopAudioClip(voice_id, voiceVo.voice_clip) end end end end function ChatVoiceManager:PlayAudioClip(voice_id, voice_clip) GlobalEventSystem:Fire(ChatModel.PLAY_VOICE, voice_id, voice_clip) lua_soundM:AddMuteQuest(self) local engineVer = tonumber(AppConst.EnglineVer) if engineVer >= 31 then soundMgr:PlayVoice(voice_id, voice_clip, 1) if engineVer == 31 then local trans = soundMgr.transform:Find("Voice_"..voice_id) if trans then trans:GetComponent("AudioSource").mute = false end end else soundMgr:PlayVoice(voice_id, voice_clip) local trans = soundMgr.transform:Find("Audio_"..voice_id) if trans then trans:GetComponent("AudioSource").mute = false end end self.timer_play = GlobalTimerQuest:AddPeriodQuest(function() self.playing_voice_id = nil self.timer_play = nil self:PopPlay() end, voice_clip.length, 1) end function ChatVoiceManager:StopAudioClip(voice_id, voice_clip) ChatModel:getInstance():Fire(ChatModel.STOP_VOICE_PLAY, voice_id) local trans = soundMgr.transform:Find("Voice_"..voice_id) if trans then destroy(trans.gameObject) end end