源战役客户端
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 

224 рядки
5.7 KiB

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