VoiceVo = VoiceVo or BaseClass()
|
|
function VoiceVo:__init()
|
|
end
|
|
|
|
function VoiceVo:__defineVar()
|
|
return {
|
|
voice_id = 0,
|
|
voice_path = nil,
|
|
voice_data = nil,
|
|
voice_clip = nil,
|
|
is_loading = nil,
|
|
abort_play = nil,
|
|
last_play_start_time = nil,
|
|
}
|
|
end
|
|
|
|
function VoiceVo:IsPlaying()
|
|
if not self.last_play_start_time then return false end
|
|
local leftTime = self.voice_clip.length - Status.NowTime + self.last_play_start_time
|
|
if leftTime <= 0 then
|
|
return false
|
|
else
|
|
return leftTime
|
|
end
|
|
end
|
|
|
|
function VoiceVo:Play()
|
|
if SystemRuntimePlatform.IsWindows() then
|
|
return
|
|
end
|
|
if self.is_loading then return end
|
|
if self.voice_clip and self.voice_clip.length ~= 0 then
|
|
self.last_play_start_time = Status.NowTime
|
|
ChatVoiceManager:getInstance():PlayAudioClip(self.voice_id, self.voice_clip)
|
|
elseif self.voice_data and (not self.voice_clip or self.voice_clip.length ~= 0) then
|
|
lua_soundM:CreateAudioClip(self.voice_data, ChatVoiceManager:getInstance():GetVoiceVersion(self.voice_id), function(ac)
|
|
if self.abort_play then
|
|
self.abort_play = nil
|
|
return
|
|
end
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if ac and ac ~= -1 then
|
|
self.voice_clip = ac
|
|
self:Play()
|
|
else
|
|
print("Generate audioclip by data failed!!!")
|
|
end
|
|
end)
|
|
if self.voice_clip and not self._use_delete_method then
|
|
self:Play()
|
|
end
|
|
elseif self.voice_path then
|
|
local mp3Path
|
|
if AppConst.DebugMode and not Application.isMobilePlatform then
|
|
mp3Path = self.voice_path
|
|
else
|
|
mp3Path = string.gsub(self.voice_path, ".wav", ".mp3")
|
|
SDKUtil.CallSDKFunc("ChatSpeaker", "Convert", {wavPath = self.voice_path, mp3Path = mp3Path})
|
|
end
|
|
self.is_loading = true
|
|
self:StartLoadingChecker()
|
|
local function onLoadVoiceCallback(ac)
|
|
self:StopLoadingChecker()
|
|
self.is_loading = nil
|
|
if self.abort_play then
|
|
self.abort_play = nil
|
|
return
|
|
end
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if ac and ac ~= -1 then
|
|
if ac.length >= 1 then
|
|
self.voice_clip = ac
|
|
self.voice_data = data
|
|
self:Play()
|
|
else
|
|
self.voice_clip = nil
|
|
self.voice_data = nil
|
|
Message.show("录音时间太短了!")
|
|
end
|
|
else
|
|
print("load audioclip failed!!")
|
|
end
|
|
end
|
|
lua_soundM:LoadVoice(mp3Path, onLoadVoiceCallback)
|
|
elseif self.voice_clip and self.voice_clip.length == 0 then
|
|
ChatVoiceManager:getInstance():PlayAudioClip(self.voice_id, self.voice_clip)
|
|
else
|
|
print("---------------VoiceVo play error--------------")
|
|
end
|
|
end
|
|
|
|
function VoiceVo:SetVoiceData(voice_id, voice_data)
|
|
self.voice_id = voice_id
|
|
self.voice_data = voice_data
|
|
end
|
|
|
|
function VoiceVo:GetVoiceData(callback)
|
|
if self.is_loading then return end
|
|
if self.voice_path then
|
|
local mp3Path
|
|
if AppConst.DebugMode and not Application.isMobilePlatform then
|
|
mp3Path = self.voice_path
|
|
else
|
|
mp3Path = string.gsub(self.voice_path, ".wav", ".mp3")
|
|
SDKUtil.CallSDKFunc("ChatSpeaker", "Convert", {wavPath = self.voice_path, mp3Path = mp3Path})
|
|
end
|
|
self.is_loading = true
|
|
self:StartLoadingChecker()
|
|
local function onLoadVoiceCallback(ac, data)
|
|
local cModel = ChatModel:getInstance()
|
|
self:StopLoadingChecker()
|
|
cModel.loading_voice = nil
|
|
self.is_loading = nil
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if ac and ac ~= -1 then
|
|
if ac.length >= 1 then
|
|
self.voice_clip = ac
|
|
self.voice_data = data
|
|
if callback then
|
|
callback(self.voice_data, self.voice_clip.length)
|
|
if cModel.end_speech_data and cModel.end_speech_data ~= "" then
|
|
Message.show(cModel.end_speech_data)
|
|
end
|
|
end
|
|
else
|
|
self.voice_clip = nil
|
|
self.voice_data = nil
|
|
Message.show("录音时间太短了!")
|
|
end
|
|
else
|
|
print("Load Voice Failed!!!")
|
|
end
|
|
cModel.end_speech_data = nil
|
|
end
|
|
lua_soundM:LoadVoice(mp3Path, onLoadVoiceCallback)
|
|
else
|
|
print("Can't not load data from a nil voice path!!")
|
|
end
|
|
end
|
|
|
|
function VoiceVo:StartLoadingChecker()
|
|
self:StopLoadingChecker()
|
|
ChatModel:getInstance().timer_loading = GlobalTimerQuest:AddPeriodQuest(function()
|
|
ChatModel:getInstance().loading_voice = nil
|
|
self.abort_play = nil
|
|
print("Generate voice data overtime!!")
|
|
end, 3, 1)
|
|
end
|
|
|
|
function VoiceVo:StopLoadingChecker()
|
|
if ChatModel:getInstance().timer_loading then
|
|
GlobalTimerQuest:CancelQuest(ChatModel:getInstance().timer_loading)
|
|
end
|
|
end
|
|
|
|
function VoiceVo:Stop()
|
|
if self.is_loading then
|
|
self.abort_play = true
|
|
else
|
|
ChatVoiceManager:getInstance():StopAudioClip(self.voice_id, self.voice_clip)
|
|
end
|
|
end
|
|
|
|
function VoiceVo:CheckCanDelete()
|
|
if self.last_play_start_time and Status.NowTime - self.last_play_start_time > 10 then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function VoiceVo:__delete()
|
|
self:Stop()
|
|
soundMgr:StopVoice(self.voice_id, self.voice_clip)
|
|
self.voice_data = nil
|
|
self.voice_clip = nil
|
|
end
|