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