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