sync voice && cc with r16 code

This commit is contained in:
wangzijiao 2019-01-04 09:24:39 +08:00
parent 8ccc4b2b1f
commit 8d682c33b5
44 changed files with 661 additions and 183 deletions

View File

@ -1 +1 @@
{"version":"1.0.0.9", "md5":"ba700cada4fd3bd2a74c50fd6108431e"} {"version":"1.0.1.1", "md5":"a8c96b3d7625adb7ab1139db6016e13d"}

View File

@ -27,4 +27,6 @@ var (
PARAMS_ERR_INVALID = errors.New("参数异常") PARAMS_ERR_INVALID = errors.New("参数异常")
Net_ERR_Post = errors.New("网络异常,请稍后再试") Net_ERR_Post = errors.New("网络异常,请稍后再试")
Normal_Dlna_Mode = errors.New("普通dlna模式")
) )

View File

@ -42,8 +42,8 @@ var (
OneShot OneShotArray OneShot OneShotArray
WkupArray = [MaxWords]wakeupVal{ WkupArray = [MaxWords]wakeupVal{
MainWakeup: wakeupVal{WkupWord: MainWakeupWord, DayThresh: "0.52", NightThresh: "0.59", Major: "0", Dcheck: "0", DayThresh2: "0.36", NightThresh2: "0.36"}, MainWakeup: wakeupVal{WkupWord: MainWakeupWord, DayThresh: "0.52", NightThresh: "0.59", Major: "0", Dcheck: "0", DayThresh2: "0.36", NightThresh2: "0.36"},
NextSong: wakeupVal{WkupWord: NextSongWord, DayThresh: "0.43", NightThresh: "0.49", Major: "0", Dcheck: "0", DayThresh2: "0.28", NightThresh2: "0.28"}, NextSong: wakeupVal{WkupWord: NextSongWord, DayThresh: "0.43", NightThresh: "0.49", Major: "0", Dcheck: "0", DayThresh2: "0.29", NightThresh2: "0.29"},
VolumeAdjust: wakeupVal{WkupWord: string(VolumeUpWord + "," + VolumeDownWord), DayThresh: "0.33,0.35", NightThresh: "0.37,0.40", Major: "0,0", Dcheck: "0,0", DayThresh2: "0.25,0.23", NightThresh2: "0.25,0.23"}, VolumeAdjust: wakeupVal{WkupWord: string(VolumeUpWord + "," + VolumeDownWord), DayThresh: "0.34,0.34", NightThresh: "0.38,0.40", Major: "0,0", Dcheck: "0,0", DayThresh2: "0.25,0.23", NightThresh2: "0.25,0.23"},
} }
) )

View File

@ -144,7 +144,8 @@ const (
APP_CMD_DEVICE_EVENT Cmd = 5152 //exec vol=0 APP_CMD_DEVICE_EVENT Cmd = 5152 //exec vol=0
APP_CMD_ENV_CHANGE Cmd = 5153 APP_CMD_ENV_CHANGE Cmd = 5153
APP_CMD_TIMINGPAUSE_SET Cmd = 5154
APP_CMD_TIMINGPAUSE_QUERY Cmd = 5155
APP_CMD_CFGLIST_GET Cmd = 5998 //exec vol=0 APP_CMD_CFGLIST_GET Cmd = 5998 //exec vol=0
APP_CMD_CFGLIST_GET_RSP Cmd = 5999 //exec vol=0 APP_CMD_CFGLIST_GET_RSP Cmd = 5999 //exec vol=0
) )
@ -158,6 +159,9 @@ const (
) )
const ( const (
MSC_CMD_YUNBOX_NEXT Cmd = 9991
MSC_CMD_TIMINGPAUSE_SET Cmd = 9992
MSC_CMD_TIMINGPAUSE_CANCEL Cmd = 9993
MSC_CMD_TTS_IDLE Cmd = 9994 MSC_CMD_TTS_IDLE Cmd = 9994
) )

View File

@ -113,6 +113,10 @@ type VboxBroadcastSt struct {
CurTask uint8 `json:"curTask"` CurTask uint8 `json:"curTask"`
TimingPauseSet int64 `json:"timingPauseSet,omitempty"`
TimingPauseRemain int64 `json:"timingPauseRemain,omitempty"`
TimingPauseOnComplete bool `json:"timingPauseOnComplete,omitempty"`
DeviceMode DeviceMode `json:"deviceMode"` DeviceMode DeviceMode `json:"deviceMode"`
TimeStamp int64 `json:"timeStamp"` TimeStamp int64 `json:"timeStamp"`

View File

@ -12,6 +12,7 @@ const (
Type_Inform_TtsDelay InformType = 108 Type_Inform_TtsDelay InformType = 108
Type_Inform_TtsPush InformType = 109 //上传成对出现的tts信息流 Type_Inform_TtsPush InformType = 109 //上传成对出现的tts信息流
Type_Inform_BtOnWifiOff InformType = 110 Type_Inform_BtOnWifiOff InformType = 110
Type_Inform_TimingPause InformType = 111
) )
const ( const (
Type_Inform_Top3_Play InformType = 104 + iota Type_Inform_Top3_Play InformType = 104 + iota

View File

@ -19,6 +19,7 @@ import (
"reflect" "reflect"
"strconv" "strconv"
"time" "time"
"fmt"
) )
var ( var (
@ -256,6 +257,8 @@ func (this *HttpReq) PostAuto(reqBody interface{}, resDetail interface{}) (int,
url = api.Url + "?aes=0" url = api.Url + "?aes=0"
} }
url += fmt.Sprintf("&t=%d", time.Now().UnixNano()/1e6)
if api.IsEncrypted || api.ReqparamIsString { if api.IsEncrypted || api.ReqparamIsString {
data, _ := json.Marshal(reqBody) data, _ := json.Marshal(reqBody)
log.Println(log.DebugLog, "http req body:", string(data)) log.Println(log.DebugLog, "http req body:", string(data))

View File

@ -194,6 +194,9 @@ func coreSchedule(cmd SCmdStruct) {
case PlayerArg: case PlayerArg:
isGlobalPause = eType.GloablePause isGlobalPause = eType.GloablePause
showIcon = !eType.NotShowIcon showIcon = !eType.NotShowIcon
if eType.UserTrig == true {
ClearTimeoutTimingPause()
}
default: default:
} }
@ -213,6 +216,7 @@ func coreSchedule(cmd SCmdStruct) {
} }
eventPoint.PlayPauseEvent(eventPoint.ModelValPause, curRunningPlayer.GetPlayerStatus().Uuid) eventPoint.PlayPauseEvent(eventPoint.ModelValPause, curRunningPlayer.GetPlayerStatus().Uuid)
case SCMD_MusicPlayer_PlayOrPause: case SCMD_MusicPlayer_PlayOrPause:
ClearTimeoutTimingPause()
showIcon := false showIcon := false
if len(cmd.Arg) == 1 { if len(cmd.Arg) == 1 {
if notshow, ok := cmd.Arg[0].(bool); ok { if notshow, ok := cmd.Arg[0].(bool); ok {
@ -686,6 +690,7 @@ func changePlayer(from *SPlayer, to *SPlayer) {
} }
curRunningPlayer = to curRunningPlayer = to
PlayerChangeCheckTimingPause()
globals.ResetBroadCastTimer() globals.ResetBroadCastTimer()
} }

View File

@ -8,6 +8,7 @@ import (
"netease_control_center/modules/hardware/misc" "netease_control_center/modules/hardware/misc"
"strings" "strings"
"sync" "sync"
"fmt"
) )
var ( var (
@ -327,6 +328,10 @@ func SetPlayerStatus(status PlayerDetail) {
log.Println(log.ErrorLog, "Set player status, but not find the id:", status.PlayerId) log.Println(log.ErrorLog, "Set player status, but not find the id:", status.PlayerId)
} }
} }
if status.Status == globals.MUSIC_ST_COMPLETED {
TrigTimingPauseOnComplete()
}
} }
func GetCurPlayerId() globals.PlayerType { func GetCurPlayerId() globals.PlayerType {
@ -514,3 +519,45 @@ func TryMicAdcIdle() {
misc.IdleMicAdc() misc.IdleMicAdc()
} }
} }
func GetCurDeviceMode(print bool) (ret globals.DeviceMode) {
curPlayer := GetCurPlayer()
if print {
fmt.Printf("curplayer:%+v\n", *curPlayer)
}
if curPlayer.IsPlaying() {
ret = globals.Exec_MusicPlay_mode
} else {
if !curPlayer.IsInterrupt() {
if GetCurScheduleDomain().IsMusicDomain() == false {
ret = globals.Exec_Non_Music_Idle_mode
} else if globals.MUSIC_ST_PAUSED == curPlayer.GetPlayerStatus().Status {
ret = globals.Pause_mode
} else {
ret = globals.Idle_mode
}
} else {
// 播放器被打断过
if curPlayer.PlayAfterResume {
if GetCurScheduleDomain().IsMusicDomain() == true {
ret = globals.Exec_MusicPlay_mode
} else {
ret = globals.Exec_Non_Music_Played_mode
}
} else {
if GetCurScheduleDomain().IsMusicDomain() == false {
ret = globals.Exec_Non_Music_Idle_mode
} else if globals.MUSIC_ST_PAUSED == curPlayer.GetPlayerStatus().Status {
ret = globals.Pause_mode
} else {
ret = globals.Idle_mode
}
}
}
}
if print {
fmt.Printf("deviceMode:%+v, curplayer:%+v, domain:%+v\n", ret, curPlayer, GetCurScheduleDomain())
}
return ret
}

View File

@ -19,6 +19,7 @@ type PlayerArg struct {
NotShowIcon bool NotShowIcon bool
TtsNextPre *string TtsNextPre *string
UserTrig bool
ServerPlayerBase ServerPlayerBase
} }
@ -303,6 +304,7 @@ func (this *SPlayer) ContinuePlay() (isSuccess bool) {
return this.StartPlay(0) return this.StartPlay(0)
case difftime > GetT2Duration(): case difftime > GetT2Duration():
this.Pause(true, "") this.Pause(true, "")
ClearTimeoutTimingPause()
return true return true
} }

View File

@ -0,0 +1,156 @@
package schedule
import (
"time"
"netease_control_center/interfaces/log"
"netease_control_center/globals"
"fmt"
"netease_control_center/interfaces/http"
)
type TimingPauseDuration time.Duration
func (this TimingPauseDuration) TimeName() string {
sec := int(time.Duration(this).Seconds())
mins := sec / 60
if time.Duration(this) < time.Minute {
return fmt.Sprintf("%d秒", sec)
} else if time.Duration(this) < time.Hour {
return fmt.Sprintf("%d分钟", mins)
} else {
if yu := mins % 60; yu == 0 {
return fmt.Sprintf("%d小时", mins/60)
} else {
return fmt.Sprintf("%d小时%d分钟", mins/60, yu)
}
}
}
func (this TimingPauseDuration) Vui_Timeout() (tmp string) {
return this.TimeName() + "的定时关闭时间到了,已为你关闭音源"
}
func (this TimingPauseDuration) Vui_Cancel() string {
return "好的,已为你取消了" + this.TimeName() + "后的定时关闭"
}
func Vui_Timeout() string {
if setDuration == 0 {
return "你还没有设置定时关闭呢"
} else {
return TimingPauseDuration(setDuration).Vui_Timeout()
}
}
var (
timingPause_time time.Time = time.Now()
timingPause_timer *time.Timer = nil
pauseOnComplete bool = false
setDuration time.Duration
)
func IstimingPauseRunning() bool {
if pauseOnComplete == true || time.Now().Before(timingPause_time) {
return true
} else {
return false
}
}
func GetTPTimeName() string {
return TimingPauseDuration(setDuration).TimeName()
}
func GetTimeDurationOfTimingPause() (remainMillisecond int64, IsPauseOnComplete bool, toSetMillisecond int64) {
remain := timingPause_time.Sub(time.Now())
if remain > 0 {
return int64(remain.Nanoseconds() / 1e6), pauseOnComplete, int64(setDuration.Nanoseconds() / 1e6)
} else {
return int64(0), pauseOnComplete, int64(setDuration.Nanoseconds() / 1e6)
}
}
//player stataus trig
func TrigTimingPauseOnComplete() {
if pauseOnComplete == true && !time.Now().Before(timingPause_time) {
log.Println(log.DebugLog, "Play Complete, do pause!")
//hang dad,add delay to avoid ihwplayer bug
time.AfterFunc(300*time.Millisecond, func() {
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: true, NotShowIcon: true})
})
go http.InformMsgToServer(http.Type_Inform_TimingPause, TimingPauseDuration(setDuration).Vui_Timeout())
ClearTimingPause()
}
}
func ClearTimeoutTimingPause() {
if pauseOnComplete == true && time.Now().After(timingPause_time) {
ClearTimingPause()
log.Println(log.DebugLog, "ClearTimeoutTimingPause!")
}
}
//Player change, clear player status
func PlayerChangeCheckTimingPause() {
if pauseOnComplete == true && !time.Now().Before(timingPause_time) {
ClearTimingPause()
}
}
func ClearTimingPause() (vui string) {
if now, set := time.Now(), timingPause_time; now.Before(set) {
vui = fmt.Sprintf("好的,已为你取消了%s后的定时关闭", TimingPauseDuration(set.Sub(now)).TimeName())
} else if pauseOnComplete {
vui = "好的,已为你取消定时关闭"
} else {
vui = "你还没有设置定时关闭呢"
}
pauseOnComplete = false
if timingPause_timer != nil {
timingPause_timer.Stop()
}
timingPause_time = time.Now()
setDuration = 0
globals.ResetBroadCastTimer()
return
}
func timingPauseTimeout() {
log.Println(log.DebugLog, "TimingPause timeout!")
if GetCurPlayerId() == globals.PlayerType_Wifi && pauseOnComplete == true {
if GetCurDeviceMode(false).IsActive() {
log.Println(log.DebugLog, "Cur is wifi player, wait to play complete to pause!")
} else {
ClearTimingPause()
log.Println(log.DebugLog, "Player not active, stop timingPause!")
}
} else {
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: true, NotShowIcon: true})
go http.InformMsgToServer(http.Type_Inform_TimingPause, TimingPauseDuration(setDuration).Vui_Timeout())
ClearTimingPause()
}
}
func SetTimingPause(remainMillisecond *int64, IsPauseOnComplete *bool) {
if remainMillisecond != nil {
afterDuration := time.Duration(*remainMillisecond) * time.Millisecond
if timingPause_timer != nil {
timingPause_timer.Stop()
}
setDuration = afterDuration
timingPause_time = time.Now().Add(afterDuration)
timingPause_timer = time.AfterFunc(afterDuration, timingPauseTimeout)
}
if IsPauseOnComplete != nil && IstimingPauseRunning() == true {
pauseOnComplete = *IsPauseOnComplete
}
log.Println(log.DebugLog, "Set timingPause:", setDuration, pauseOnComplete)
globals.ResetBroadCastTimer()
}

View File

@ -89,7 +89,7 @@ func DlnaCmdProcess(cmdid uint32, msg string) {
//player.SetDlnaPausePhone(true) //player.SetDlnaPausePhone(true)
player.DlnaPlaySeek = true player.DlnaPlaySeek = true
eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_App) eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_App)
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true}) // 不显示icon SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true, UserTrig:true}) // 不显示icon
} else { } else {
log.Println(log.DebugLog, "dlna player is not playing, ignore pause.") log.Println(log.DebugLog, "dlna player is not playing, ignore pause.")
} }

View File

@ -255,6 +255,13 @@ func HTTPSERVER_test(w http.ResponseWriter, r *http.Request, ps httprouter.Param
} }
switch args[0] { switch args[0] {
case "timingpause":
t,_ := strconv.Atoi(args[1])
b,_ := strconv.ParseBool(args[2])
set := int64(1000*t)
schedule.SetTimingPause(&set, &b)
fmt.Fprintln(w, "time:", t, " Pause On Complete:", b)
case "fespa_set": case "fespa_set":
switch args[1] { switch args[1] {
case "once": case "once":

View File

@ -594,6 +594,9 @@ func systemServiceTaskRegiste() {
tmp += fmt.Sprintln(" Tag:", *GitTag, " build time:", BuildDate, " Hv:", *Hv) tmp += fmt.Sprintln(" Tag:", *GitTag, " build time:", BuildDate, " Hv:", *Hv)
tmp += fmt.Sprintln(" OemManufature:", OemManufature, " OemManufactureCheckOk:", OemManufactureCheckOk) tmp += fmt.Sprintln(" OemManufature:", OemManufature, " OemManufactureCheckOk:", OemManufactureCheckOk)
tmp += fmt.Sprintln(" MicClose:", IsMicClose, "MicCloseTrig:", MicCloseTrig, "IsMicLightOn:", IsMicLightOn) tmp += fmt.Sprintln(" MicClose:", IsMicClose, "MicCloseTrig:", MicCloseTrig, "IsMicLightOn:", IsMicLightOn)
if remain, pauseOnC,set := GetTimeDurationOfTimingPause(); true {
tmp += fmt.Sprintln("TimingPause: remain(millisecond):", remain, " pauseOnComplete:", pauseOnC, " setTime:", set)
}
tmp += fmt.Sprintf(" cronMic:%+v\n", micControl) tmp += fmt.Sprintf(" cronMic:%+v\n", micControl)
tmp += fmt.Sprintln(" laststatusicon:", GetLastStatusIcon()) tmp += fmt.Sprintln(" laststatusicon:", GetLastStatusIcon())
tmp += fmt.Sprintln(" lasticon:", GetLastIcon()) tmp += fmt.Sprintln(" lasticon:", GetLastIcon())

View File

@ -33,11 +33,11 @@ const (
) )
func MscToastLed_Before() { func MscToastLed_Before() {
if IsMicClose == false { //if IsMicClose == false {
vui.IconLed_iconMusic004.Show() vui.IconLed_iconMusic004.Show()
tmp := DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_START} tmp := DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_START}
led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{uint8(adau1761.MustGetVol())}) led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{uint8(adau1761.MustGetVol())})
} //}
switch nembd.Host(*ActualHv) { switch nembd.Host(*ActualHv) {
case nembd.HostPv1C: case nembd.HostPv1C:
@ -65,11 +65,11 @@ func MscToastFinish(arg TtsPlayerArg) {
func volChangeCb(params *NoticePlayerParams) { func volChangeCb(params *NoticePlayerParams) {
params.BeforeSpecialFunc = func() { params.BeforeSpecialFunc = func() {
if IsMicClose == false { //if IsMicClose == false {
AlwaysShowVolumeIcon() AlwaysShowVolumeIcon()
tmp := DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_START} tmp := DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_START}
led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{uint8(adau1761.MustGetVol())}) led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{uint8(adau1761.MustGetVol())})
} //}
} }
params.SpecialFunc = func(arg TtsPlayerArg) { params.SpecialFunc = func(arg TtsPlayerArg) {
//if IsMicClose == false { //if IsMicClose == false {
@ -207,6 +207,34 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
ntp.SetUnixTimeToLocal(retData.TimeStamp, 5*time.Minute, true) ntp.SetUnixTimeToLocal(retData.TimeStamp, 5*time.Minute, true)
switch Cmd(retData.Cmd) { switch Cmd(retData.Cmd) {
case MSC_CMD_TIMINGPAUSE_SET:
backupstatus := IstimingPauseRunning()
var toastContent string
var tmp struct {
Data struct{
PauseOnComplate bool `json:"pauseOnComplate"`
RemainTime int64 `json:"timeOffset"`
} `json:"data"`
}
if err := json.Unmarshal([]byte(retData.Detail), &tmp); err == nil {
SetTimingPause(&tmp.Data.RemainTime, &tmp.Data.PauseOnComplate)
if backupstatus == true {
toastContent = "好的,已将你的定时调整成了" + GetTPTimeName() + "后关闭"
} else {
toastContent = "好的,我会在" + GetTPTimeName() + "后关闭音响"
}
MscToastTts(toastContent, retData.RspId, true, false, nil)
http.InformMsgToServer(http.Type_Inform_TtsDelay, toastContent)
} else {
log.Println(log.ErrorLog, "Decode server data err:", err)
}
case MSC_CMD_TIMINGPAUSE_CANCEL:
tts := ClearTimingPause()
MscToastTts(tts, retData.RspId, true, false, nil)
http.InformMsgToServer(http.Type_Inform_TtsDelay, tts)
case MSC_CMD_IOTWIFIPARING: case MSC_CMD_IOTWIFIPARING:
SendSCmd(SCMD_SuperTask_Enter_IOT_WifiParing) SendSCmd(SCMD_SuperTask_Enter_IOT_WifiParing)
@ -234,7 +262,7 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
// 不显示icon // 不显示icon
log.Println(log.DebugLog, "pause music by chat interrupt") log.Println(log.DebugLog, "pause music by chat interrupt")
eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_Server) eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_Server)
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true}) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true, UserTrig:true})
} }
} }
@ -389,6 +417,10 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
} }
} }
case MSC_CMD_YUNBOX_NEXT:
//yunbox mode, treat as pause, no voice and icon
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true})
case MSC_CMD_PAUSE: case MSC_CMD_PAUSE:
//SendSCmd(SCMD_MusicPlayer_Pause, nil) //SendSCmd(SCMD_MusicPlayer_Pause, nil)
//player.SoundEffectPlayCmd(CMD_SE_PLAY, vui.SoundNotice_Scaozuofankui001.GetPath()) //player.SoundEffectPlayCmd(CMD_SE_PLAY, vui.SoundNotice_Scaozuofankui001.GetPath())
@ -406,11 +438,11 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
vui.IconLed_IconChaozuo001.Show() vui.IconLed_IconChaozuo001.Show()
case Exec_MusicPlay_mode: case Exec_MusicPlay_mode:
eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_Server) eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_Server)
SendSCmd(SCMD_MusicPlayer_Pause, nil) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true, UserTrig: true})
case Exec_Non_Music_Played_mode: case Exec_Non_Music_Played_mode:
// 不显示icon // 不显示icon
eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_Server) eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_Server)
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true}) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true, UserTrig:true})
} }
case MSC_CMD_NEXT, MSC_CMD_PRE: case MSC_CMD_NEXT, MSC_CMD_PRE:
// prd reverse : 20180316 // prd reverse : 20180316
@ -445,7 +477,7 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
case PlayerType_Dlna: case PlayerType_Dlna:
if retData.Desc != MSC_CMD_ONE_SHOT_WAKEUP && retData.Desc != MSC_CMD_ONE_SHOT { if retData.Desc != MSC_CMD_ONE_SHOT_WAKEUP && retData.Desc != MSC_CMD_ONE_SHOT {
log.Println(log.DebugLog, "not one shot cmd for dlna in pause mode, just return") log.Println(log.DebugLog, "not one shot cmd for dlna, server will deal it, so just return")
/*MscToastTts(TTS_NOT_UNSUPPORT, retData.RspId, true, false, nil) //lupeng 20190908 #PV1-4216 /*MscToastTts(TTS_NOT_UNSUPPORT, retData.RspId, true, false, nil) //lupeng 20190908 #PV1-4216
if retData.Desc == MSC_CMD_ONE_SHOT_WAKEUP { if retData.Desc == MSC_CMD_ONE_SHOT_WAKEUP {
@ -475,9 +507,11 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
} }
_, err := GetMusicListNew(PlayerType_Wifi, true, serverListParams) _, err := GetMusicListNew(PlayerType_Wifi, true, serverListParams)
if nil != err { if nil != err {
NoticePlayerSendSCmd(SCMD_SuperTask_Tts_Play, MusicErrTtsMap[string(MUSIC_LIST_NULL)], CONST_AUDIO_ID, AdSrcType_TTS,
TTS_LEVEL_1, true, false)
log.Println(log.ErrorLog, err.Error()) log.Println(log.ErrorLog, err.Error())
if !strings.EqualFold(err.Error(), Normal_Dlna_Mode.Error()) {
NoticePlayerSendSCmd(SCMD_SuperTask_Tts_Play, MusicErrTtsMap[string(MUSIC_LIST_NULL)], CONST_AUDIO_ID, AdSrcType_TTS,
TTS_LEVEL_1, true, false)
}
} else { } else {
go http.InformLocalMsgToServer(http.Type_Inform_TtsPush, int(MSC_CMD_NEXT), TTS_MUSIC_NEXT, TTS_MUSIC_NEXT) //上传信息流 go http.InformLocalMsgToServer(http.Type_Inform_TtsPush, int(MSC_CMD_NEXT), TTS_MUSIC_NEXT, TTS_MUSIC_NEXT) //上传信息流
} }
@ -493,6 +527,7 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
case GetScenePlayerId(), PlayerType_Wifi, PlayerType_Bt, PlayerType_Airplay: case GetScenePlayerId(), PlayerType_Wifi, PlayerType_Bt, PlayerType_Airplay:
if retData.Desc == MSC_CMD_ONE_SHOT || retData.Desc == MSC_CMD_ONE_SHOT_WAKEUP { if retData.Desc == MSC_CMD_ONE_SHOT || retData.Desc == MSC_CMD_ONE_SHOT_WAKEUP {
log.Println(log.DebugLog, "one shot cmd for next song") log.Println(log.DebugLog, "one shot cmd for next song")
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true, UserTrig:false})
/*播放反馈声音prd暂时不需要 /*播放反馈声音prd暂时不需要
PlayNoticeAsync(AdSrcType_FILE, vui.SoundNotice_Shuanxing001.GetPath(), WAKEUP_AUDIO_ID, false, nil, func(id uint32, reason NoticeStopReason) { PlayNoticeAsync(AdSrcType_FILE, vui.SoundNotice_Shuanxing001.GetPath(), WAKEUP_AUDIO_ID, false, nil, func(id uint32, reason NoticeStopReason) {
log.Println(log.WarningLog, "one shot cmd audio sound end") log.Println(log.WarningLog, "one shot cmd audio sound end")
@ -500,7 +535,7 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
} }
case PlayerType_Dlna: case PlayerType_Dlna:
if retData.Desc != MSC_CMD_ONE_SHOT_WAKEUP && retData.Desc != MSC_CMD_ONE_SHOT { if retData.Desc != MSC_CMD_ONE_SHOT_WAKEUP && retData.Desc != MSC_CMD_ONE_SHOT {
log.Println(log.DebugLog, "not one shot cmd for dlna in pause mode, just return") log.Println(log.DebugLog, "not one shot cmd for dlna, server will deal it, so just return")
/*MscToastTts(TTS_NOT_UNSUPPORT, retData.RspId, true, false, nil) //lupeng 20190908 #PV1-4216 /*MscToastTts(TTS_NOT_UNSUPPORT, retData.RspId, true, false, nil) //lupeng 20190908 #PV1-4216
if retData.Desc == MSC_CMD_ONE_SHOT_WAKEUP { if retData.Desc == MSC_CMD_ONE_SHOT_WAKEUP {
@ -530,9 +565,11 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
} }
_, err := GetMusicListNew(PlayerType_Wifi, true, serverListParams) _, err := GetMusicListNew(PlayerType_Wifi, true, serverListParams)
if nil != err { if nil != err {
NoticePlayerSendSCmd(SCMD_SuperTask_Tts_Play, MusicErrTtsMap[string(MUSIC_LIST_NULL)], CONST_AUDIO_ID, AdSrcType_TTS,
TTS_LEVEL_1, true, false)
log.Println(log.ErrorLog, err.Error()) log.Println(log.ErrorLog, err.Error())
if !strings.EqualFold(err.Error(), Normal_Dlna_Mode.Error()) {
NoticePlayerSendSCmd(SCMD_SuperTask_Tts_Play, MusicErrTtsMap[string(MUSIC_LIST_NULL)], CONST_AUDIO_ID, AdSrcType_TTS,
TTS_LEVEL_1, true, false)
}
} else { } else {
go http.InformLocalMsgToServer(http.Type_Inform_TtsPush, int(MSC_CMD_NEXT), TTS_MUSIC_NEXT, TTS_MUSIC_NEXT) //上传信息流 go http.InformLocalMsgToServer(http.Type_Inform_TtsPush, int(MSC_CMD_NEXT), TTS_MUSIC_NEXT, TTS_MUSIC_NEXT) //上传信息流
} }
@ -653,7 +690,7 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
if PlayListSrcRec.BizType != BIZ_TYPE_MUSIC { if PlayListSrcRec.BizType != BIZ_TYPE_MUSIC {
SendSCmd(SCMD_MusicPlayer_Play, nil) SendSCmd(SCMD_MusicPlayer_Play, nil)
} else { } else {
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true}) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{GloablePause: false, NotShowIcon: true, UserTrig:true})
} }
//检查是否网络缓存播放失败 //检查是否网络缓存播放失败
@ -783,11 +820,11 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
MscToastTts(tmp.Tts, retData.RspId, true, tmp.Keep, func(params *NoticePlayerParams) { MscToastTts(tmp.Tts, retData.RspId, true, tmp.Keep, func(params *NoticePlayerParams) {
if Cmd(retData.Cmd) == MSC_CMD_COLLECT_MUSIC { if Cmd(retData.Cmd) == MSC_CMD_COLLECT_MUSIC {
params.BeforeExecFunc = func() { params.BeforeExecFunc = func() {
if IsMicClose == false { //if IsMicClose == false {
vui.IconLed_IconChaozuo005.Show() vui.IconLed_IconChaozuo005.Show()
tmp := DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_START} tmp := DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_START}
led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{uint8(adau1761.MustGetVol())}) led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{uint8(adau1761.MustGetVol())})
} //}
switch Cmd(retData.Cmd) { switch Cmd(retData.Cmd) {
case MSC_CMD_COLLECT_MUSIC: case MSC_CMD_COLLECT_MUSIC:
@ -1394,7 +1431,11 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
DataType: http.DATA_TYPE_STRING}) DataType: http.DATA_TYPE_STRING})
} }
specialFuncBackup := ttsRepeatInfo.NoticePlayerParams.SpecialFunc
ttsRepeatInfo.NoticePlayerParams.SpecialFunc = func(arg TtsPlayerArg) { ttsRepeatInfo.NoticePlayerParams.SpecialFunc = func(arg TtsPlayerArg) {
if specialFuncBackup != nil {
specialFuncBackup(arg)
}
//检查是否网络缓存播放失败 //检查是否网络缓存播放失败
if arg.StopReason == NoticeStopReason_Error { if arg.StopReason == NoticeStopReason_Error {
go MscToastFile(vui.SoundNotice_Song_Get_Timeout.GetPath(), CONST_AUDIO_ID, false, false, nil) go MscToastFile(vui.SoundNotice_Song_Get_Timeout.GetPath(), CONST_AUDIO_ID, false, false, nil)
@ -1495,11 +1536,13 @@ func MscSuccessCommand(msg *[]byte, msglen uint32) {
return return
} }
PlayListSrcRec.ModeId = tmp.ModeInfoDto.NewModeId
log.Printf(log.DebugLog, "Detail:%+v tmp:%+v\n", retData.Detail, tmp) log.Printf(log.DebugLog, "Detail:%+v tmp:%+v\n", retData.Detail, tmp)
SendSCmdStruct(SCmdStruct{SCmd: SCMD_MusicPlayer_Pause, Arg: []interface{}{PlayerArg{NotShowIcon: true}}, ExecCb: func(cb SCmdStructExecCb) { SendSCmdStruct(SCmdStruct{SCmd: SCMD_MusicPlayer_Pause, Arg: []interface{}{PlayerArg{NotShowIcon: true, UserTrig:true}}, ExecCb: func(cb SCmdStructExecCb) {
tmp := GetCurVboxBroadcastSt(false) tmpSt := GetCurVboxBroadcastSt(false)
tmp.PlayerStPtr.ContinuousTaskSt = MUSIC_ST_IDLE tmpSt.PlayerStPtr.ContinuousTaskSt = MUSIC_ST_IDLE
TrigBroadcastStatus(tmp) TrigBroadcastStatus(tmpSt)
ResetWifiPlayer() ResetWifiPlayer()
}}) }})
@ -1550,10 +1593,44 @@ func AppSuccessCommand(msg *[]byte, msglen uint32) {
// return // return
//} //}
switch app.CmdId { switch app.CmdId {
case APP_CMD_TIMINGPAUSE_SET:
var tmp struct {
RemainTime *int64 `json:"timingPauseRemain"`
TimingPauseOnComplete *bool `json:"timingPauseOnComplete"`
Switch bool `json:"timingPauseSwitch"`
}
if err := json.Unmarshal([]byte(app.Detail), &tmp); err == nil {
if tmp.Switch == true {
SetTimingPause(tmp.RemainTime, tmp.TimingPauseOnComplete)
} else {
ClearTimingPause()
}
}
var tmp2 struct {
RemainTime int64 `json:"timingPauseRemain"`
SetTime int64 `json:"timingPauseSet"`
TimingPauseOnComplete bool `json:"timingPauseOnComplete"`
}
tmp2.RemainTime, tmp2.TimingPauseOnComplete, tmp2.SetTime = GetTimeDurationOfTimingPause()
SendCmdByYunxin(APP_CMD_TIMINGPAUSE_SET, tmp2, false, app.MsgId)
case APP_CMD_TIMINGPAUSE_QUERY:
var tmp struct {
RemainTime int64 `json:"timingPauseRemain"`
SetTime int64 `json:"timingPauseSet"`
TimingPauseOnComplete bool `json:"timingPauseOnComplete"`
}
tmp.RemainTime, tmp.TimingPauseOnComplete, tmp.SetTime = GetTimeDurationOfTimingPause()
SendCmdByYunxin(APP_CMD_TIMINGPAUSE_QUERY, tmp, false, app.MsgId)
case APP_CMD_DEVICE_EVENT: case APP_CMD_DEVICE_EVENT:
var tmp DeviceEventStruct var tmp DeviceEventStruct
if err = json.Unmarshal([]byte(app.Detail), &tmp); err == nil { if err = json.Unmarshal([]byte(app.Detail), &tmp); err == nil {
switch tmp.EventType { switch tmp.EventType {
case DeviceEventType_QueryDevStatus:
ResetBroadCastTimer()
case DeviceEventType_IotWifiParing: case DeviceEventType_IotWifiParing:
var ev DeviceEventAction var ev DeviceEventAction
if iot_running { if iot_running {
@ -1561,11 +1638,12 @@ func AppSuccessCommand(msg *[]byte, msglen uint32) {
} else { } else {
ev = DeviceEventAction_End ev = DeviceEventAction_End
} }
SendEventnByYunxinWithRid(DeviceEventType_IotWifiParing, ev, app.ReplyId, false, nil) SendEventnByYunxinWithRid(DeviceEventType_IotWifiParing, ev, app.MsgId, false, nil)
default: default:
log.Println(log.DebugLog, "Un support event status query!", tmp.EventType) log.Println(log.DebugLog, "Un support event status query!", tmp.EventType)
} }
} }
case APP_CMD_MUSIC_PLAY: case APP_CMD_MUSIC_PLAY:
RestoreDefaultVolWhen0() RestoreDefaultVolWhen0()
if len(app.Detail) < 1 { if len(app.Detail) < 1 {
@ -1607,12 +1685,12 @@ func AppSuccessCommand(msg *[]byte, msglen uint32) {
SendSCmd(SCMD_MusicPlayer_Play) SendSCmd(SCMD_MusicPlayer_Play)
case APP_CMD_MUSIC_PAUSE: case APP_CMD_MUSIC_PAUSE:
eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_App) eventPoint.SetEpOsSouce("F141", eventPoint.EpOs_App)
SendSCmd(SCMD_MusicPlayer_Pause) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{UserTrig:true})
case APP_CMD_MUSIC_NEXT: case APP_CMD_MUSIC_NEXT:
RestoreDefaultVolWhen0() RestoreDefaultVolWhen0()
mode := getCurDeviceMode(true) mode := getCurDeviceMode(true)
if Exec_MusicPlay_mode == mode { if Exec_MusicPlay_mode == mode {
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{NotShowIcon: true}) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{NotShowIcon: true, UserTrig:false})
} }
base := ServerPlayerBase{Action: MUSIC_ACTION_NEXT, ActionSrc: MUSIC_ACTION_SRC_APP} base := ServerPlayerBase{Action: MUSIC_ACTION_NEXT, ActionSrc: MUSIC_ACTION_SRC_APP}
@ -1624,7 +1702,7 @@ func AppSuccessCommand(msg *[]byte, msglen uint32) {
RestoreDefaultVolWhen0() RestoreDefaultVolWhen0()
mode := getCurDeviceMode(true) mode := getCurDeviceMode(true)
if Exec_MusicPlay_mode == mode { if Exec_MusicPlay_mode == mode {
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{NotShowIcon: true}) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{NotShowIcon: true, UserTrig:false})
} }
PlayListSrcRec.ListHasEnd = false //歌单播放结束标志位false PlayListSrcRec.ListHasEnd = false //歌单播放结束标志位false
@ -1759,7 +1837,7 @@ func AppSuccessCommand(msg *[]byte, msglen uint32) {
RestoreDefaultVolWhen0() RestoreDefaultVolWhen0()
mode := getCurDeviceMode(true) mode := getCurDeviceMode(true)
if Exec_MusicPlay_mode == mode { if Exec_MusicPlay_mode == mode {
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{NotShowIcon: true}) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{NotShowIcon: true, UserTrig:false})
} }
var ret struct { var ret struct {
@ -1798,7 +1876,7 @@ func AppSuccessCommand(msg *[]byte, msglen uint32) {
mode := getCurDeviceMode(true) mode := getCurDeviceMode(true)
if Exec_MusicPlay_mode == mode { if Exec_MusicPlay_mode == mode {
SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{NotShowIcon: true}) SendSCmd(SCMD_MusicPlayer_Pause, PlayerArg{NotShowIcon: true, UserTrig:false})
} }
var tmp VboxChangeInfo var tmp VboxChangeInfo
err := json.Unmarshal([]byte(app.Detail), &tmp) err := json.Unmarshal([]byte(app.Detail), &tmp)
@ -2265,6 +2343,7 @@ func ignoreCmdInDAB() bool {
return PlayerType_Wifi != GetCurPlayerId() return PlayerType_Wifi != GetCurPlayerId()
} }
// Deprecated: use schedule.GetCurDeviceMode instead of this
func getCurDeviceMode(print bool) (ret DeviceMode) { func getCurDeviceMode(print bool) (ret DeviceMode) {
curPlayer := GetCurPlayer() curPlayer := GetCurPlayer()
if print { if print {

View File

@ -844,17 +844,17 @@ loop_finishConnectWifi:
} }
tmpconfig.BeforeSpecialFunc = func() { tmpconfig.BeforeSpecialFunc = func() {
if IsMicClose == false { //if IsMicClose == false {
tmp := schedule.DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_START} tmp := schedule.DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_START}
led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{}) led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{})
} //}
} }
tmpconfig.SpecialFunc = func(arg schedule.TtsPlayerArg) { tmpconfig.SpecialFunc = func(arg schedule.TtsPlayerArg) {
if IsMicClose == false { //if IsMicClose == false {
tmp := schedule.DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_STOP} tmp := schedule.DirectLed{EffectId: atservice.GUIDE_EFFECT_ID_EXEC_CMD, Action: atservice.GUIDE_ACTION_STOP}
led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{}) led_mcu.DirectLedControl(tmp.EffectId, tmp.Action, tmp.StartLampNum, []byte{})
} //}
DoOnceInit() DoOnceInit()
} }
player.NoticePlayerSendSCmd2(schedule.SCMD_SuperTask_Tts_Ctrl_Play, tmpconfig) player.NoticePlayerSendSCmd2(schedule.SCMD_SuperTask_Tts_Ctrl_Play, tmpconfig)

View File

@ -154,7 +154,9 @@ func DbusYunxinSysMsgControl(data []byte) {
go http.InformMsgToServer(http.Type_Inform_TtsDelay, tmp.Tts) go http.InformMsgToServer(http.Type_Inform_TtsDelay, tmp.Tts)
} }
specialFuncBackup := tmpconfig.SpecialFunc
tmpconfig.SpecialFunc = func(arg schedule.TtsPlayerArg) { tmpconfig.SpecialFunc = func(arg schedule.TtsPlayerArg) {
specialFuncBackup(arg)
//检查是否网络缓存播放失败 //检查是否网络缓存播放失败
if arg.StopReason == schedule.NoticeStopReason_Error { if arg.StopReason == schedule.NoticeStopReason_Error {
go MscToastFile(vui.SoundNotice_Song_Get_Timeout.GetPath(), CONST_AUDIO_ID, false, false, nil) go MscToastFile(vui.SoundNotice_Song_Get_Timeout.GetPath(), CONST_AUDIO_ID, false, false, nil)
@ -254,10 +256,21 @@ func DbusYunxinSysMsgControl(data []byte) {
case YxSCmd_ChangeAccountMode: case YxSCmd_ChangeAccountMode:
log.Println(log.DebugLog, "Change account mode!") log.Println(log.DebugLog, "Change account mode!")
schedule.SendSCmdStruct(schedule.SCmdStruct{SCmd: schedule.SCMD_MusicPlayer_Pause, Arg: []interface{}{schedule.PlayerArg{NotShowIcon: true}}, ExecCb: func(cb schedule.SCmdStructExecCb) { var tmp struct {
tmp := GetCurVboxBroadcastSt(false) ModeId int64 `json:"modeid"`
tmp.PlayerStPtr.ContinuousTaskSt = MUSIC_ST_IDLE }
TrigBroadcastStatus(tmp) err := json.Unmarshal([]byte(cmd.Detail), &tmp)
if err != nil {
log.Println(log.ErrorLog, err.Error())
break
}
PlayListSrcRec.ModeId = tmp.ModeId
schedule.SendSCmdStruct(schedule.SCmdStruct{SCmd: schedule.SCMD_MusicPlayer_Pause, Arg: []interface{}{schedule.PlayerArg{NotShowIcon: true, UserTrig:true}}, ExecCb: func(cb schedule.SCmdStructExecCb) {
tmpSt := GetCurVboxBroadcastSt(false)
tmpSt.PlayerStPtr.ContinuousTaskSt = MUSIC_ST_IDLE
TrigBroadcastStatus(tmpSt)
player.ResetWifiPlayer() player.ResetWifiPlayer()
}}) }})

View File

@ -194,7 +194,7 @@ func alarmPlay(alarm *globals.DbusAlarmRemind, canExec bool) {
SendEventByYunxin(DeviceEventType_Alarm, DeviceEventAction_Start, map[string]interface{}{"id": alarm.Id, "timestamp": alarm.ComingTime.Unix() * 1000, "ringtimestamp": time.Now().Unix() * 1000}) SendEventByYunxin(DeviceEventType_Alarm, DeviceEventAction_Start, map[string]interface{}{"id": alarm.Id, "timestamp": alarm.ComingTime.Unix() * 1000, "ringtimestamp": time.Now().Unix() * 1000})
if curAlarm == nil { if curAlarm == nil {
//to alarm is nil means cur no alarm ring and need backup volume! //to alarm is nil means cur no alarm ring and need backup volume!
time.Sleep(10 * time.Millisecond) time.Sleep(80 * time.Millisecond)
preVolume, _ = adau1761.GetVol() preVolume, _ = adau1761.GetVol()
if preVolume > globals.DefaultVol.GetCfgListVui() { if preVolume > globals.DefaultVol.GetCfgListVui() {
VolSet(preVolume) VolSet(preVolume)

View File

@ -40,6 +40,8 @@ func GetCurVboxBroadcastSt(print bool) VboxBroadcastSt {
st.DeviceMode = getCurDeviceMode(print) st.DeviceMode = getCurDeviceMode(print)
st.ModeId = PlayListSrcRec.ModeId st.ModeId = PlayListSrcRec.ModeId
st.TimingPauseRemain,st.TimingPauseOnComplete,st.TimingPauseSet = schedule.GetTimeDurationOfTimingPause()
st.CurTask = uint8(schedule.GetCurScheduleDomain()) st.CurTask = uint8(schedule.GetCurScheduleDomain())
if st.CurrentStatus == SCENE_FIELD_ST && len(schedule.GetCurScenePlayerDetail().Uuid) == 0 { if st.CurrentStatus == SCENE_FIELD_ST && len(schedule.GetCurScenePlayerDetail().Uuid) == 0 {

View File

@ -9,6 +9,7 @@ import (
"netease_control_center/globals" "netease_control_center/globals"
"netease_control_center/interfaces" "netease_control_center/interfaces"
"netease_control_center/interfaces/log" "netease_control_center/interfaces/log"
"netease_control_center/interfaces/schedule"
) )
var ( var (
@ -29,6 +30,9 @@ func BroadcastStatus(st globals.VboxBroadcastSt) {
} }
}() }()
//final pack broadcastSt
st.TimingPauseRemain,st.TimingPauseOnComplete, st.TimingPauseSet = schedule.GetTimeDurationOfTimingPause()
boxData, err := json.Marshal(st) boxData, err := json.Marshal(st)
if err != nil { if err != nil {
log.Println(log.WarningLog, err.Error()) log.Println(log.WarningLog, err.Error())

View File

@ -129,7 +129,7 @@ func volChangefunc(vol int) {
if schedule.GetCurPlayer().IsPlaying() || (schedule.GetCurPlayer().InterruptStatus && schedule.GetCurPlayer().PlayAfterResume) { if schedule.GetCurPlayer().IsPlaying() || (schedule.GetCurPlayer().InterruptStatus && schedule.GetCurPlayer().PlayAfterResume) {
ctrlMusicByVol = true ctrlMusicByVol = true
schedule.SendSCmd(schedule.SCMD_MusicPlayer_Pause, nil) schedule.SendSCmd(schedule.SCMD_MusicPlayer_Pause, schedule.PlayerArg{UserTrig:true, NotShowIcon:true, GloablePause:true})
} }
} else { } else {
CurVboxVolSt.MuteVol = false CurVboxVolSt.MuteVol = false

View File

@ -108,6 +108,7 @@ const (
DeviceEventType_Alarm DeviceEventType = 1 DeviceEventType_Alarm DeviceEventType = 1
DeviceEventType_FirstWifiParing DeviceEventType = 2 DeviceEventType_FirstWifiParing DeviceEventType = 2
DeviceEventType_IotWifiParing DeviceEventType = 3 DeviceEventType_IotWifiParing DeviceEventType = 3
DeviceEventType_QueryDevStatus DeviceEventType = 4
) )
type DeviceEventAction int type DeviceEventAction int

View File

@ -176,7 +176,14 @@ func DirectLedControl(EffectId GUIDE_EFFECT_ID, Action GUIDE_ACTION, StartLampNu
defer LastDirectLed.Lock.Unlock() defer LastDirectLed.Lock.Unlock()
var toShowLed DirectLed var toShowLed DirectLed
toShowLed.EffectId = EffectId tmpEffectId := EffectId
//执行灯目前不随声音而动,改为长亮
if tmpEffectId == GUIDE_EFFECT_ID_EXEC_CMD {
//log.Println(log.WarningLog, "exec cmd: EffectId = ", EffectId, ", action = ", Action)
tmpEffectId = GUIDE_EFFECT_ID_LIGHT_CMD
}
toShowLed.EffectId = tmpEffectId
toShowLed.Action = Action toShowLed.Action = Action
toShowLed.StartNum = StartLampNum toShowLed.StartNum = StartLampNum
toShowLed.Data = data toShowLed.Data = data
@ -214,6 +221,13 @@ func DirectLedClear(id GUIDE_EFFECT_ID) {
if LastDirectLed.EffectId == GUIDE_EFFECT_ID_VOICE_INPUT { if LastDirectLed.EffectId == GUIDE_EFFECT_ID_VOICE_INPUT {
LastDirectLed.EffectId = GUIDE_EFFECT_ID_CLEAR LastDirectLed.EffectId = GUIDE_EFFECT_ID_CLEAR
} }
//执行灯目前不随声音而动,改为长亮, 需要渐变退出
if id == GUIDE_EFFECT_ID_EXEC_CMD {
//log.Println(log.WarningLog, "DirectLedClear, EffectId = ", LastDirectLed.EffectId, ", action = ", LastDirectLed.Action)
LastDirectLed.EffectId = GUIDE_EFFECT_ID_LIGHT_CMD
}
LastDirectLed.Action = GUIDE_ACTION_STOP LastDirectLed.Action = GUIDE_ACTION_STOP
LastDirectLed.Data = []byte{} LastDirectLed.Data = []byte{}
ShowDirectLed(LastDirectLed) ShowDirectLed(LastDirectLed)

View File

@ -51,6 +51,7 @@ const (
GUIDE_EFFECT_ID_MIC_OFF GUIDE_EFFECT_ID = 40 //禁Mic灯 GUIDE_EFFECT_ID_MIC_OFF GUIDE_EFFECT_ID = 40 //禁Mic灯
GUIDE_EFFECT_ID_VOLUME_ADJUST GUIDE_EFFECT_ID = 41 GUIDE_EFFECT_ID_VOLUME_ADJUST GUIDE_EFFECT_ID = 41
GUIDE_EFFECT_ID_SYSTEM_ERR GUIDE_EFFECT_ID = 60 //错误灯 GUIDE_EFFECT_ID_SYSTEM_ERR GUIDE_EFFECT_ID = 60 //错误灯
GUIDE_EFFECT_ID_LIGHT_CMD GUIDE_EFFECT_ID = 66 //长亮
GUIDE_EFFECT_ID_CLEAR GUIDE_EFFECT_ID = 163 GUIDE_EFFECT_ID_CLEAR GUIDE_EFFECT_ID = 163
GUIDE_EFFECT_ID_MIC_STAT_OFF GUIDE_EFFECT_ID = 227 //mic status on/off GUIDE_EFFECT_ID_MIC_STAT_OFF GUIDE_EFFECT_ID = 227 //mic status on/off
GUIDE_EFFECT_ID_DO_NOTHING GUIDE_EFFECT_ID = 255 GUIDE_EFFECT_ID_DO_NOTHING GUIDE_EFFECT_ID = 255

View File

@ -56,7 +56,15 @@ func uartInit() error {
return errors.New("port open error!") return errors.New("port open error!")
} else { } else {
flushUart() //flush uart data flushUart() //flush uart data
sPort.Close()
sPort, err = serial.OpenPort(c)
if err != nil {
log.Println(log.ErrorLog, err)
return errors.New("port open error!")
} else {
flushUart() //flush uart data
go uartReadStart() go uartReadStart()
}
} }
return err return err

View File

@ -567,6 +567,12 @@ func GetMusicListNew(playerType PlayerType, ttsNow bool, serverList http.MusicLi
} }
}() }()
list, code, _, err := http.GetMusicListDoNew(serverList) list, code, _, err := http.GetMusicListDoNew(serverList)
if int(ERR_SUCCESS) == code && serverList.Source == int(PlayerType_Dlna) {
log.Println(log.WarningLog, "server is return OK for normal dlna")
return nil, Normal_Dlna_Mode
}
if nil != err { if nil != err {
if http.SERVER_RET_NIL_OR_INVALID_LIST == code { if http.SERVER_RET_NIL_OR_INVALID_LIST == code {
log.Println(log.WarningLog, "nil music list") log.Println(log.WarningLog, "nil music list")
@ -575,7 +581,9 @@ func GetMusicListNew(playerType PlayerType, ttsNow bool, serverList http.MusicLi
} }
if http.SERVER_RET_TRIG_CMD_OK == code { if http.SERVER_RET_TRIG_CMD_OK == code {
log.Println(log.WarningLog, "server is return OK") //pause@clould music mode
schedule.SendSCmd(schedule.SCMD_MusicPlayer_Pause, schedule.PlayerArg{GloablePause: false, NotShowIcon: true, UserTrig:false})
log.Println(log.WarningLog, "server is return OK for clould music mode")
return nil, nil return nil, nil
} }
@ -954,15 +962,15 @@ func mscToastFile(file string, uuid string, needRepeat bool, keep bool, configCh
tmpconfig.IconOut = vui.IconLed_DoNothing tmpconfig.IconOut = vui.IconLed_DoNothing
tmpconfig.BeforeSpecialFunc = func() { tmpconfig.BeforeSpecialFunc = func() {
if IsMicClose == false { //if IsMicClose == false {
ttsExecVuiStart() ttsExecVuiStart()
} //}
} }
tmpconfig.SpecialFunc = func(arg schedule.TtsPlayerArg) { tmpconfig.SpecialFunc = func(arg schedule.TtsPlayerArg) {
if IsMicClose == false { //if IsMicClose == false {
ttsExecVuiStop() ttsExecVuiStop()
} //}
//检查是否网络缓存播放失败 //检查是否网络缓存播放失败
if arg.StopReason == schedule.NoticeStopReason_Error { if arg.StopReason == schedule.NoticeStopReason_Error {
@ -989,15 +997,15 @@ func mscToastTts(tts string, RespId string, needRepeat bool, keep bool, configCh
tmpconfig.IconOut = vui.IconLed_DoNothing tmpconfig.IconOut = vui.IconLed_DoNothing
tmpconfig.BeforeSpecialFunc = func() { tmpconfig.BeforeSpecialFunc = func() {
if IsMicClose == false { //if IsMicClose == false {
ttsExecVuiStart() ttsExecVuiStart()
} //}
} }
tmpconfig.SpecialFunc = func(arg schedule.TtsPlayerArg) { tmpconfig.SpecialFunc = func(arg schedule.TtsPlayerArg) {
if IsMicClose == false { //if IsMicClose == false {
ttsExecVuiStop() ttsExecVuiStop()
} //}
//检查是否网络缓存播放失败 //检查是否网络缓存播放失败
if arg.StopReason == schedule.NoticeStopReason_Error { if arg.StopReason == schedule.NoticeStopReason_Error {

View File

@ -3791,13 +3791,13 @@ func getPrepareNextAction() MusicChangeAction {
tmpMaxpage := MusicLenType(max(int(NormalListMap[NORMAL_LIST_PAGE].MaxPage), NormalListMap[NORMAL_LIST_PAGE].List.Len())) tmpMaxpage := MusicLenType(max(int(NormalListMap[NORMAL_LIST_PAGE].MaxPage), NormalListMap[NORMAL_LIST_PAGE].List.Len()))
back, _ := NormalListMap[NORMAL_LIST_PAGE].GetLast() back, _ := NormalListMap[NORMAL_LIST_PAGE].GetLast()
if nil != LocalMusicList[curMusicList].GetValidFrontBackSong(false) && if MUSIC_SHARE_RCMD == PlayListSrcRec.MusicSrc { //云村推荐只有一首歌直接从服务器拉取
ret = ACTION_ADD_LIST_MUSIC_SHARE
} else if nil != LocalMusicList[curMusicList].GetValidFrontBackSong(false) &&
LocalMusicList[curMusicList].GetCurPos().Value.(*SongInfo).Id != LocalMusicList[curMusicList].GetValidFrontBackSong(false).Id { LocalMusicList[curMusicList].GetCurPos().Value.(*SongInfo).Id != LocalMusicList[curMusicList].GetValidFrontBackSong(false).Id {
ret = ACTION_PLAY_DIRECT ret = ACTION_PLAY_DIRECT
} else if PRIVATE_FM == PlayListSrcRec.MusicSrc { } else if PRIVATE_FM == PlayListSrcRec.MusicSrc {
ret = ACTION_ADD_LIST_FM ret = ACTION_ADD_LIST_FM
} else if MUSIC_SHARE_RCMD == PlayListSrcRec.MusicSrc {
ret = ACTION_ADD_LIST_MUSIC_SHARE
} else if NormalListMap[NORMAL_LIST_PAGE].HasMore { } else if NormalListMap[NORMAL_LIST_PAGE].HasMore {
// 还有分页 // 还有分页
ret = ACTION_NEXT_PAGE_REPLACE_LIST ret = ACTION_NEXT_PAGE_REPLACE_LIST
@ -3868,13 +3868,13 @@ func getNextPrevAction(needNextAction bool) MusicChangeAction {
var ret MusicChangeAction var ret MusicChangeAction
back, _ := NormalListMap[NORMAL_LIST_PAGE].GetLast() back, _ := NormalListMap[NORMAL_LIST_PAGE].GetLast()
if needNextAction { if needNextAction {
if nil != LocalMusicList[curMusicList].GetValidFrontBackSong(false) && if MUSIC_SHARE_RCMD == PlayListSrcRec.MusicSrc { //云村推荐只有一首歌直接从服务器拉取
ret = ACTION_ADD_LIST_MUSIC_SHARE
} else if nil != LocalMusicList[curMusicList].GetValidFrontBackSong(false) &&
LocalMusicList[curMusicList].GetCurPos().Value.(*SongInfo).Id != LocalMusicList[curMusicList].GetValidFrontBackSong(false).Id { LocalMusicList[curMusicList].GetCurPos().Value.(*SongInfo).Id != LocalMusicList[curMusicList].GetValidFrontBackSong(false).Id {
ret = ACTION_PLAY_DIRECT ret = ACTION_PLAY_DIRECT
} else if PRIVATE_FM == PlayListSrcRec.MusicSrc { } else if PRIVATE_FM == PlayListSrcRec.MusicSrc {
ret = ACTION_ADD_LIST_FM ret = ACTION_ADD_LIST_FM
} else if MUSIC_SHARE_RCMD == PlayListSrcRec.MusicSrc {
ret = ACTION_ADD_LIST_MUSIC_SHARE
} else if NormalListMap[NORMAL_LIST_PAGE].HasMore { } else if NormalListMap[NORMAL_LIST_PAGE].HasMore {
// 还有分页 // 还有分页
ret = ACTION_NEXT_PAGE_REPLACE_LIST ret = ACTION_NEXT_PAGE_REPLACE_LIST
@ -3914,13 +3914,13 @@ func getNextPrevAction(needNextAction bool) MusicChangeAction {
} }
} }
} else { } else {
if nil != LocalMusicList[curMusicList].GetValidFrontBackSong(true) && if MUSIC_SHARE_RCMD == PlayListSrcRec.MusicSrc { //云村推荐只有一首歌直接从服务器拉取
ret = ACTION_ADD_LIST_MUSIC_SHARE
} else if nil != LocalMusicList[curMusicList].GetValidFrontBackSong(true) &&
LocalMusicList[curMusicList].GetCurPos().Value.(*SongInfo).Id != LocalMusicList[curMusicList].GetValidFrontBackSong(true).Id { LocalMusicList[curMusicList].GetCurPos().Value.(*SongInfo).Id != LocalMusicList[curMusicList].GetValidFrontBackSong(true).Id {
ret = ACTION_PLAY_DIRECT ret = ACTION_PLAY_DIRECT
} else if PRIVATE_FM == PlayListSrcRec.MusicSrc { } else if PRIVATE_FM == PlayListSrcRec.MusicSrc {
ret = ACTION_PLAY_BACK ret = ACTION_PLAY_BACK
} else if MUSIC_SHARE_RCMD == PlayListSrcRec.MusicSrc {
ret = ACTION_ADD_LIST_MUSIC_SHARE
} else if NormalListMap[NORMAL_LIST_PAGE].CurPos.Value.(*PageNode).PageIndex >= 2 { } else if NormalListMap[NORMAL_LIST_PAGE].CurPos.Value.(*PageNode).PageIndex >= 2 {
// 前一分页 // 前一分页
ret = ACTION_PRE_PAGE_REPLACE_LIST ret = ACTION_PRE_PAGE_REPLACE_LIST

View File

@ -74,7 +74,8 @@ int Netease_audiobypass_init(struct audio_bypass **bypass, void **cae,
(*bypass)->queue = queue_init((*bypass)->queue_buf, cap); (*bypass)->queue = queue_init((*bypass)->queue_buf, cap);
(*bypass)->running = 0; (*bypass)->running = 0;
(*bypass)->chan = chan; (*bypass)->chan = chan;
queue_set_name((*bypass)->queue, "audiobypass");
queue_set_debugcode((*bypass)->queue, 1);
exit: exit:
return ret; return ret;
} }
@ -98,13 +99,19 @@ static void *audiobypass_read_thread(void *param) {
char *buf = NULL; char *buf = NULL;
int bufsize = 0; int bufsize = 0;
while (bypass->running) { while (bypass->running) {
queue_set_debugcode(bypass->queue, 2);
bufsize = queue_read(bypass->queue, &buf); bufsize = queue_read(bypass->queue, &buf);
if (!buf) if (!buf)
continue; continue;
queue_set_debugcode(bypass->queue, 3);
if (bypass->chan & AUDIO_BYPASS_CHANNEL_MSC_IAT) { if (bypass->chan & AUDIO_BYPASS_CHANNEL_MSC_IAT) {
Netease_IAT_write(buf, bufsize); Netease_IAT_write(buf, bufsize);
} }
queue_set_debugcode(bypass->queue, 4);
#ifdef ENABLE_YUNXIN #ifdef ENABLE_YUNXIN
if (bypass->chan & AUDIO_BYPASS_CHANNEL_YUNXIN) { if (bypass->chan & AUDIO_BYPASS_CHANNEL_YUNXIN) {
Netease_yunxin_writeaudio(buf, bufsize); Netease_yunxin_writeaudio(buf, bufsize);
@ -112,7 +119,9 @@ static void *audiobypass_read_thread(void *param) {
#endif #endif
free(buf); free(buf);
buf = NULL; buf = NULL;
queue_set_debugcode(bypass->queue, 5);
} }
queue_set_debugcode(bypass->queue, 6);
n_debug("Audio bypass thread exit"); n_debug("Audio bypass thread exit");
return NULL; return NULL;
} }

View File

@ -98,7 +98,7 @@ void setVadStatus(VadStatus status) { vad_status = status; }
void BaseInit() { void BaseInit() {
memset(g_uuid, 0, sizeof(g_uuid)); memset(g_uuid, 0, sizeof(g_uuid));
memset(g_songInfo, 0, sizeof(g_songInfo)); memset(g_songInfo, 0, sizeof(g_songInfo));
g_pChipId = GetCpuSerial(); g_pChipId = GetCpuChipId();
pthread_mutex_init(&lock, NULL); pthread_mutex_init(&lock, NULL);
} }
void BaseLock() { pthread_mutex_lock(&lock); } void BaseLock() { pthread_mutex_lock(&lock); }

View File

@ -30,10 +30,20 @@ audio_queue_t *queue_init(void *base, int capacity) {
queue->front = 0; queue->front = 0;
queue->rear = 0; queue->rear = 0;
queue->more = true; queue->more = true;
queue->debugCode = 0;
queue->name[0] = 0;
return queue; return queue;
} }
void queue_set_name(audio_queue_t *queue, char *name) {
strncpy(queue->name, name, sizeof(queue->name));
}
void queue_set_debugcode(audio_queue_t *queue, int code) {
queue->debugCode = code;
}
void queue_destroy(audio_queue_t *queue) { void queue_destroy(audio_queue_t *queue) {
if (NULL != queue) { if (NULL != queue) {
pthread_mutex_destroy(&(queue->mutex)); pthread_mutex_destroy(&(queue->mutex));
@ -164,9 +174,9 @@ int queue_read(audio_queue_t *queue, char **data) {
temp_buff = (char *)malloc(queueLen); temp_buff = (char *)malloc(queueLen);
if (NULL == temp_buff) { if (NULL == temp_buff) {
//printf("queue_read malloc error queueLen%d\n", queueLen); printf("queue_read malloc error queueLen%d\n", queueLen);
pthread_mutex_unlock(&(queue->mutex)); pthread_mutex_unlock(&(queue->mutex));
return 0; return 0;
} }
if (queue->front + queueLen <= queue->capacity - 1) { if (queue->front + queueLen <= queue->capacity - 1) {

View File

@ -22,6 +22,8 @@ typedef struct audio_queue_t {
int front; // 队头索引 int front; // 队头索引
int rear; // 队尾索引 int rear; // 队尾索引
int more; // 写完标记 int more; // 写完标记
char name[20]; //名称
int debugCode; //用来debug
} audio_queue_t; } audio_queue_t;
#ifdef __cplusplus #ifdef __cplusplus
@ -64,6 +66,9 @@ void queue_set_more(audio_queue_t* queue, int more);
int queue_get_more(audio_queue_t* queue); int queue_get_more(audio_queue_t* queue);
void queue_set_name(audio_queue_t *queue, char *name);
void queue_set_debugcode(audio_queue_t *queue, int code);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -38,7 +38,7 @@ enum {
// fprintf(stderr, format, ##arg) // fprintf(stderr, format, ##arg)
#ifdef NETEASE_TOAST #ifdef NETEASE_TOAST
#define n_toast(fmt, arg...) printf(fmt, ##arg) #define n_toast(fmt, arg...) n_printf(fmt, ##arg)
#else #else
#define n_toast(fmt, arg...) \ #define n_toast(fmt, arg...) \
do { \ do { \
@ -46,7 +46,7 @@ enum {
#endif #endif
#ifdef NETEASE_DEBUG #ifdef NETEASE_DEBUG
#define n_debug(fmt, arg...) do{printf(fmt, ##arg);}while(0) #define n_debug(fmt, arg...) n_printf(fmt, ##arg)
#else #else
#define n_debug(fmt, arg...) \ #define n_debug(fmt, arg...) \
do { \ do { \
@ -54,7 +54,7 @@ enum {
#endif #endif
#ifdef NETEASE_ERROR #ifdef NETEASE_ERROR
#define n_error(fmt, arg...) printf(fmt, ##arg) #define n_error(fmt, arg...) n_printf(fmt, ##arg)
#else #else
#define n_error(fmt, arg...) \ #define n_error(fmt, arg...) \
do { \ do { \

View File

@ -116,6 +116,7 @@ int netease_session_destroy(struct IAT_HD *hd);
int netease_audio_write(const char *sessionID, const void *waveData, int netease_audio_write(const char *sessionID, const void *waveData,
unsigned int waveLen, int audioStatus, int *epStatus, unsigned int waveLen, int audioStatus, int *epStatus,
int *recogStatus); int *recogStatus);
int netease_dc_wakeup_upload(char* pSession);
const char *netease_get_result(const char *sessionID, int *rsltStatus, const char *netease_get_result(const char *sessionID, int *rsltStatus,
int waitTime, int *errorCode); int waitTime, int *errorCode);

View File

@ -33,6 +33,10 @@ int Netease_nduilite_init(duilite_callback wakeup_callback,
duilite_callback doa_callback, duilite_callback doa_callback,
duilite_callback beamforming_callback, duilite_callback beamforming_callback,
duilite_callback vad_callback); duilite_callback vad_callback);
int Netease_nduilite_reinit(duilite_callback wakeup_callback,
duilite_callback doa_callback,
duilite_callback beamforming_callback,
duilite_callback vad_callback);
void Netease_nduilite_writeaudio(const void *audioData, unsigned int audio_len); void Netease_nduilite_writeaudio(const void *audioData, unsigned int audio_len);
int Netease_duilite_vad_start(); int Netease_duilite_vad_start();
int Netease_duilite_vad_stop(char IsLock); // 1 lock, other unlock int Netease_duilite_vad_stop(char IsLock); // 1 lock, other unlock

View File

@ -29,8 +29,7 @@ extern "C" {
** Types ** Types
** ------------------------------------------------------------------------ */ ** ------------------------------------------------------------------------ */
typedef void* REACORD_HANDLE; typedef void* REACORD_HANDLE;
typedef void (*recordrecord_audio_fn)(const void *audio, unsigned int audio_len, int err_code); typedef void (*record_audio_fn)(const void *audio, unsigned int audio_len, int err_code, audio_queue_t *queue);
typedef void (*record_audio_fn)(const void *audio, unsigned int audio_len, int err_code);
/* Configuration for a stream */ /* Configuration for a stream */

View File

@ -34,6 +34,8 @@ void Netease_yunxin_login();
char *Netease_yunxin_dbus_getstatus(); char *Netease_yunxin_dbus_getstatus();
int Netease_yunxin_init(struct audio_bypass **bypass); int Netease_yunxin_init(struct audio_bypass **bypass);
void Netease_yunxin_writeaudio(const char *inputbuf, size_t inputsize); void Netease_yunxin_writeaudio(const char *inputbuf, size_t inputsize);
void Netease_yunxin_sendmsg_offline(char *data);
void Netease_yunxin_sendmsg_online(char *data);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View File

@ -51,6 +51,8 @@ when who why
/* ------------------------------------------------------------------------ /* ------------------------------------------------------------------------
** Macros ** Macros
** ------------------------------------------------------------------------ */ ** ------------------------------------------------------------------------ */
//#define BACKUP_ORIG_AUDIO
//#define BACKUP_FINAL_AUDIO
/* ------------------------------------------------------------------------ /* ------------------------------------------------------------------------
** Defines ** Defines
@ -243,6 +245,16 @@ int Duilite_doa_cb(void *userdata, int type, char *msg, int len) {
BaseUnlock(); BaseUnlock();
} }
json_decref(js); json_decref(js);
for(int i = 0; i < sizeof(g_pQuickWkKey) / sizeof(g_pQuickWkKey[0]); i++)
{
if(strcmp(getVoiceWakeupword(), g_pQuickWkKey[i]) == 0)
{
netease_dc_wakeup_upload("");
break;
}
}
} }
} }
@ -298,9 +310,10 @@ static void CAEAudioCb(const void *audioData, unsigned int audioLen, int param1,
#endif #endif
static void record_audio_cb(const void *audio, unsigned int audio_len, static void record_audio_cb(const void *audio, unsigned int audio_len,
int err_code) { int err_code, audio_queue_t *queue) {
unsigned long long cachetime; unsigned long long cachetime;
queue_set_debugcode(queue, 5);
#ifdef DEBUG_WASTE_TIME #ifdef DEBUG_WASTE_TIME
Netease_caltime(&cachetime, 1); Netease_caltime(&cachetime, 1);
#endif #endif
@ -312,6 +325,7 @@ static void record_audio_cb(const void *audio, unsigned int audio_len,
#if USED_NETEASE_FMAE #if USED_NETEASE_FMAE
if (1) { if (1) {
#elif USED_NETEASE_DUILITE #elif USED_NETEASE_DUILITE
queue_set_debugcode(queue, 6);
Netease_nduilite_writeaudio(audio, audio_len); Netease_nduilite_writeaudio(audio, audio_len);
debug_waste_time("duilite_writeaudio", &cachetime); debug_waste_time("duilite_writeaudio", &cachetime);
if (1) { if (1) {
@ -324,6 +338,7 @@ static void record_audio_cb(const void *audio, unsigned int audio_len,
// unsigned char* pBuf = (unsigned char*)audio; // unsigned char* pBuf = (unsigned char*)audio;
#if 1 #if 1
if (Netease_IAT_GetStatus() == IAT_STATUS_AUDIOIN) { if (Netease_IAT_GetStatus() == IAT_STATUS_AUDIOIN) {
queue_set_debugcode(queue, 7);
DCWriteAudioRec(audio, audio_len); DCWriteAudioRec(audio, audio_len);
debug_waste_time("DCWriteAudioRec", &cachetime); debug_waste_time("DCWriteAudioRec", &cachetime);
} }
@ -350,15 +365,18 @@ static void record_audio_cb(const void *audio, unsigned int audio_len,
isSendCache = 1; isSendCache = 1;
} }
#endif #endif
queue_set_debugcode(queue, 8);
__cacheCAEAudio((unsigned char *)audio, audio_len); __cacheCAEAudio((unsigned char *)audio, audio_len);
debug_waste_time("__cacheCAEAudio", &cachetime); debug_waste_time("__cacheCAEAudio", &cachetime);
#endif #endif
#if USED_NETEASE_FMAE && ENABLE_MODULE_XUNFEICAE #if USED_NETEASE_FMAE && ENABLE_MODULE_XUNFEICAE
queue_set_debugcode(queue, 9);
ret = FMAEAudioWrite(g_hFMAE, audio, audio_len); ret = FMAEAudioWrite(g_hFMAE, audio, audio_len);
// printf("write %d at %p ret = %d\n", audio_len, audio, ret); // printf("write %d at %p ret = %d\n", audio_len, audio, ret);
#elif ENABLE_MODULE_XUNFEICAE #elif ENABLE_MODULE_XUNFEICAE
queue_set_debugcode(queue, 10);
Netease_CAEAudioWrite(caeconfig, audio, audio_len); Netease_CAEAudioWrite(caeconfig, audio, audio_len);
#endif #endif
// n_debug("write finish!\n"); // n_debug("write finish!\n");
@ -480,7 +498,7 @@ static PDBUS_MSG_PACK DBusMessageCb(uv_loop_t *pLoop, DBusConnection *pConn,
tmp = json_dumps(js, 0); tmp = json_dumps(js, 0);
if (!!tmp) { if (!!tmp) {
#ifdef ENABLE_YUNXIN #ifdef ENABLE_YUNXIN
Netease_yunxin_sendmsg1(tmp); Netease_yunxin_sendmsg_online(tmp);
#endif #endif
free(tmp); free(tmp);
} else { } else {
@ -494,7 +512,7 @@ static PDBUS_MSG_PACK DBusMessageCb(uv_loop_t *pLoop, DBusConnection *pConn,
case CMD_YUNXIN_SENDMSG: case CMD_YUNXIN_SENDMSG:
#ifdef ENABLE_YUNXIN #ifdef ENABLE_YUNXIN
Netease_yunxin_sendmsg(pMsg->pMsg); Netease_yunxin_sendmsg_offline(pMsg->pMsg);
#endif #endif
break; break;
@ -515,6 +533,12 @@ static PDBUS_MSG_PACK DBusMessageCb(uv_loop_t *pLoop, DBusConnection *pConn,
Netease_duilite_fespa_set(pMsg->pMsg); Netease_duilite_fespa_set(pMsg->pMsg);
break; break;
case CMD_NDUILITE_SDK_REINIT:
Netease_nduilite_reinit(Duilite_wakeup_cb, Duilite_doa_cb,
Duilite_beforming_cb, Duilite_vad_cb);
Netease_duilite_fespa_set(pMsg->pMsg);
break;
default: default:
break; break;
} }
@ -678,7 +702,7 @@ void main(int argc, char **argv) {
n_debug("Dbus init success\n"); n_debug("Dbus init success\n");
} else { } else {
n_error("Dbus init fail: %d\n", ret); n_error("Dbus init fail: %d\n", ret);
// return; return;
} }
#if USED_NETEASE_FMAE #if USED_NETEASE_FMAE

View File

@ -83,6 +83,11 @@ int Netease_duilite_fespa_set(char *arg) {
return -1; return -1;
} }
if (1 != duiliteok) {
n_error("duilite not ok!\n");
return -3;
}
ret = duilite_fespa_set(fespa, arg); ret = duilite_fespa_set(fespa, arg);
n_debug("Set arg to duilite(ret=%d):%s\n", ret, arg); n_debug("Set arg to duilite(ret=%d):%s\n", ret, arg);
} }
@ -151,7 +156,7 @@ int Netease_duilite_vad_start() {
#if USED_NETEASE_DUILITE_VAD #if USED_NETEASE_DUILITE_VAD
int ret = -1; int ret = -1;
if (NULL != duilitevad) { if (NULL != duilitevad && 1 == duiliteok) {
duiliteLock("vad_start"); duiliteLock("vad_start");
if (vadstatus == 1) { if (vadstatus == 1) {
n_debug("Begin to stop, in start!\n"); n_debug("Begin to stop, in start!\n");
@ -164,6 +169,8 @@ int Netease_duilite_vad_start() {
duiliteUnlock("vad_start"); duiliteUnlock("vad_start");
return ret; return ret;
} else { } else {
n_error("Duilite check err, duilitevad:0x%p, duiliteok:%d\n", duilitevad,
duiliteok);
return -1; return -1;
} }
#else #else
@ -175,7 +182,7 @@ int Netease_duilite_vad_stop(char IsLock) {
#if USED_NETEASE_DUILITE_VAD #if USED_NETEASE_DUILITE_VAD
int ret = 0; int ret = 0;
n_debug("Begin to stop vad!\n"); n_debug("Begin to stop vad!\n");
if (NULL != duilitevad) { if (NULL != duilitevad && 1 == duiliteok) {
if (1 == IsLock) { if (1 == IsLock) {
duiliteLock(" vad_stop "); duiliteLock(" vad_stop ");
} }
@ -189,6 +196,8 @@ int Netease_duilite_vad_stop(char IsLock) {
} }
return ret; return ret;
} else { } else {
n_error("Duilite check err, duilitevad:0x%p, duiliteok:%d\n", duilitevad,
duiliteok);
return -1; return -1;
} }
#else #else
@ -199,7 +208,7 @@ int Netease_duilite_vad_stop(char IsLock) {
int Neteaase_duilite_vad_cancel() { int Neteaase_duilite_vad_cancel() {
#if USED_NETEASE_DUILITE_VAD #if USED_NETEASE_DUILITE_VAD
int ret = 0; int ret = 0;
if (NULL != duilitevad) { if (NULL != duilitevad && 1 == duiliteok) {
duiliteLock(" vad_cancel "); duiliteLock(" vad_cancel ");
if (1 == vadstatus) { if (1 == vadstatus) {
ret = duilite_vad_cancel(duilitevad); ret = duilite_vad_cancel(duilitevad);
@ -208,6 +217,9 @@ int Neteaase_duilite_vad_cancel() {
duiliteUnlock(" vad_cancel "); duiliteUnlock(" vad_cancel ");
return ret; return ret;
} else { } else {
n_error("Duilite check err, duilitevad:0x%p, duiliteok:%d\n", duilitevad,
duiliteok);
return -1; return -1;
} }
#else #else
@ -278,6 +290,7 @@ int Netease_nduilite_init(duilite_callback wakeup_callback,
duilite_callback doa_callback, duilite_callback doa_callback,
duilite_callback beamforming_callback, duilite_callback beamforming_callback,
duilite_callback vad_callback) { duilite_callback vad_callback) {
int ret = 0;
char *auth_cfg = "{\"appKey\":\"15205715844583be\",\"secretKey\":" char *auth_cfg = "{\"appKey\":\"15205715844583be\",\"secretKey\":"
"\"e3eee41c3276bd027f2814f6cf3b8991\", " "\"e3eee41c3276bd027f2814f6cf3b8991\", "
@ -285,19 +298,20 @@ int Netease_nduilite_init(duilite_callback wakeup_callback,
"aiengine-2.9.5-15205715844583be.provision\", " "aiengine-2.9.5-15205715844583be.provision\", "
"\"serialNumber\":\"/mnt/UDISK/device.number\"}"; "\"serialNumber\":\"/mnt/UDISK/device.number\"}";
///*初始化时默认采用夜间唤醒阈值thresh=0.64;major=0;thresh2=0.42 时间同步成功后再根据实际时间来切换阈值*/ ///*初始化时默认采用夜间唤醒阈值thresh=0.59;major=0;thresh2=0.36
char *cfg = ///时间同步成功后再根据实际时间来切换阈值*/
"{\"aecBinPath\": " char *cfg = "{\"aecBinPath\": "
"\"/usr/share/netease/duilite/fespa/" "\"/usr/share/netease/duilite/fespa/"
"AEC_ch8-2-ch6_2ref_NTES_20180413_v0.9.3.bin\", " "AEC_ch8-2-ch6_2ref_NTES_20180413_v0.9.3.bin\", "
"\"wakeupBinPath\": " "\"wakeupBinPath\": "
"\"/usr/share/netease/duilite/fespa/" "\"/usr/share/netease/duilite/fespa/"
"wakeup_aihome_ntes_20180817_pre.bin\", " "wakeup_aihome_ntes_20180914_pre.bin\", "
"\"beamformingBinPath\": " "\"beamformingBinPath\": "
"\"/usr/share/netease/duilite/fespa/" "\"/usr/share/netease/duilite/fespa/"
"UCA_asr_ch8-2-ch6_70mm_netease_20180425_v1.1.9.bin\", " "UCA_asr_ch8-2-ch6_70mm_netease_20180425_v1.1.9.bin\", "
"\"env\": \"words=di da di da;thresh=0.64;major=0;thresh2=0.42;\", " "\"env\": \"words=di da di "
"\"rollBack\": 0}"; "da;thresh=0.59;major=0;dcheck=0;thresh2=0.36;\", "
"\"rollBack\": 0}";
#if USED_NETEASE_DUILITE_VAD #if USED_NETEASE_DUILITE_VAD
char *vad_cfg = "{\"resBinPath\": " char *vad_cfg = "{\"resBinPath\": "
@ -310,8 +324,13 @@ int Netease_nduilite_init(duilite_callback wakeup_callback,
} }
n_debug("Begin to init duilite!\n"); n_debug("Begin to init duilite!\n");
if (0 != duilite_library_load(auth_cfg)) { if (NULL == _duilitelock) {
n_error("Duilite library load fail!\n"); _duilitelock = native_mutex_create(NULL, NULL);
}
ret = duilite_library_load(auth_cfg);
if (0 != ret) {
n_error("Duilite library load fail!(%d)\n", ret);
return 0; return 0;
} }
fespa = duilite_fespa_new(cfg); fespa = duilite_fespa_new(cfg);
@ -319,6 +338,7 @@ int Netease_nduilite_init(duilite_callback wakeup_callback,
n_debug("fespa new success!\n"); n_debug("fespa new success!\n");
} else { } else {
n_error("fespa new fail!\n"); n_error("fespa new fail!\n");
duilite_library_release();
return 0; return 0;
} }
@ -327,13 +347,14 @@ int Netease_nduilite_init(duilite_callback wakeup_callback,
oem_vad_cb = vad_callback; oem_vad_cb = vad_callback;
if (NULL == duilitevad) { if (NULL == duilitevad) {
n_debug("Vad new fail!\n"); n_debug("Vad new fail!\n");
duilite_fespa_delete(fespa);
duilite_library_release();
return 0; return 0;
} else { } else {
n_debug("Vad new success!\n"); n_debug("Vad new success!\n");
} }
#endif #endif
_duilitelock = native_mutex_create(NULL, NULL);
duilite_fespa_register(fespa, DUILITE_CALLBACK_FESPA_WAKEUP, duilite_fespa_register(fespa, DUILITE_CALLBACK_FESPA_WAKEUP,
wakeup_callback, NULL); wakeup_callback, NULL);
duilite_fespa_register(fespa, DUILITE_CALLBACK_FESPA_DOA, doa_callback, duilite_fespa_register(fespa, DUILITE_CALLBACK_FESPA_DOA, doa_callback,
@ -394,7 +415,7 @@ void Netease_nduilite_writeaudio(const void *audioData,
return; return;
} }
n_debug("Write nduilite data, len:%d\n", audio_len); //n_debug("Write nduilite data, len:%d\n", audio_len);
ret = duilite_fespa_feed(fespa, audioData, audio_len); ret = duilite_fespa_feed(fespa, audioData, audio_len);
#if 0 #if 0
@ -416,3 +437,29 @@ void Netease_nduilite_writeaudio(const void *audioData,
free(newbuf); free(newbuf);
#endif #endif
} }
int Netease_nduilite_reinit(duilite_callback wakeup_callback,
duilite_callback doa_callback,
duilite_callback beamforming_callback,
duilite_callback vad_callback) {
if (1 == duiliteok) {
duiliteok = 0;
n_debug("Duilite reinit sdk!\n");
usleep(15000);
if (NULL != fespa) {
duilite_fespa_delete(fespa);
fespa = NULL;
}
if (NULL != duilitevad) {
duilite_vad_delete(duilitevad);
duilitevad = NULL;
}
duilite_library_release();
Netease_nduilite_init(wakeup_callback, doa_callback,
beamforming_callback, vad_callback);
}
return 1;
}

View File

@ -45,7 +45,7 @@
#define APP_POSTURL ("wss://vbox-asr.3.163.com/websocket") #define APP_POSTURL ("wss://vbox-asr.3.163.com/websocket")
#endif #endif
#define AISPEECH_SDK_VERSION "aispeech_1806060936" #define AISPEECH_SDK_VERSION "aispeech_1809201704"
// extern unsigned int g_bIsUsedTestServer; // extern unsigned int g_bIsUsedTestServer;
@ -193,13 +193,75 @@ int netease_session_destroy(struct IAT_HD *hd) {
static char g_doabuf[32]; static char g_doabuf[32];
int netease_dc_wakeup_upload(char* pSession)
{
#if USED_NETEASE_DC
json_t *js = NULL;
char *tmpdata = NULL;
DataColleParam dcParam;
char *Uuid = getUuid();
if (Uuid[0] == '\0') {
Netease_dbus_initargs();
Uuid = "this is default uuid";
}
DCEndSession();
memset(g_doabuf, 0, 32);
// sprintf(g_doabuf, "%d", hd->angle);
sprintf(g_doabuf, "%d", getAng());
dcParam.URL = GetCurServerAddr(DC_MODULE);
LOG_EX(LOG_Info, "DC URL: %s\n", dcParam.URL);
// dcParam.userId = Uuid;
// dcParam.speakerId = getChipId();
// dcParam.sessionId = hd->sessionId;
// dcParam.doa = g_doabuf;
// wakeupWord 思必驰唤醒回调提供
// major 思必驰唤醒回调提供
// status 思必驰唤醒回调提供
// confidence 思必驰唤醒回调提供
// doa 思必驰唤醒回调提供
// sessionid 会话创建成功id号
// wakeupsdk sdk厂家及版本
// deviceid 音箱ID
// userid 用户ID
js = json_pack("{s:s, s:i, s:i, s:f, s:i, s:s, s:s, s:s, s:s}",
"wakeupWord", getVoiceWakeupword(), "major", getVoiceMajor(),
"status", getVoiceStatus(), "confidence",
getVoiceConfidence(), "doa", getAng(), "sessionid",
pSession, "wakeupsdk", AISPEECH_SDK_VERSION, "deviceid",
getChipId(), "userid", Uuid);
if (js) {
tmpdata = json_dumps(js, 0);
if (tmpdata) {
dcParam.info = tmpdata;
}
n_debug("Dc config:%s\n", tmpdata);
json_decref(js);
}
// printf("+++++++++++dcParam.doa = %s\n", dcParam.doa);
DCStartSession(dcParam);
if (tmpdata) {
free(tmpdata);
}
LOG_EX(LOG_Debug, "Beging WK Data\n");
DCWriteAudioWk(getDCCachebuf(), WAKE_CACHE_DATA_SIZE);
LOG_EX(LOG_Debug, "End WK Data\n");
// g_isSessionOn = 1;
#endif
}
int netease_session_create(struct IAT_HD *hd, char *recType, char *confirmParam, int netease_session_create(struct IAT_HD *hd, char *recType, char *confirmParam,
char *playerStatus) { char *playerStatus) {
int errcode; int errcode;
#if USED_NETEASE_DC
json_t *js = NULL;
char *tmpdata;
#endif
SRCParam srcParam; SRCParam srcParam;
char *Uuid = getUuid(); char *Uuid = getUuid();
@ -296,61 +358,7 @@ int netease_session_create(struct IAT_HD *hd, char *recType, char *confirmParam,
hd->sessionId); hd->sessionId);
} }
#if USED_NETEASE_DC netease_dc_wakeup_upload(hd->sessionId);
DCEndSession();
DataColleParam dcParam;
memset(g_doabuf, 0, 32);
// sprintf(g_doabuf, "%d", hd->angle);
sprintf(g_doabuf, "%d", getAng());
dcParam.URL = GetCurServerAddr(DC_MODULE);
LOG_EX(LOG_Info, "DC URL: %s\n", dcParam.URL);
// dcParam.userId = Uuid;
// dcParam.speakerId = getChipId();
// dcParam.sessionId = hd->sessionId;
// dcParam.doa = g_doabuf;
// wakeupWord 思必驰唤醒回调提供
// major 思必驰唤醒回调提供
// status 思必驰唤醒回调提供
// confidence 思必驰唤醒回调提供
// doa 思必驰唤醒回调提供
// sessionid 会话创建成功id号
// wakeupsdk sdk厂家及版本
// deviceid 音箱ID
// userid 用户ID
js = json_pack("{s:s, s:i, s:i, s:f, s:i, s:s, s:s, s:s, s:s}",
"wakeupWord", getVoiceWakeupword(), "major", getVoiceMajor(),
"status", getVoiceStatus(), "confidence",
getVoiceConfidence(), "doa", getAng(), "sessionid",
hd->sessionId, "wakeupsdk", AISPEECH_SDK_VERSION, "deviceid",
getChipId(), "userid", Uuid);
if (js) {
tmpdata = json_dumps(js, 0);
if (tmpdata) {
dcParam.info = tmpdata;
}
n_debug("Dc config:%s\n", tmpdata);
json_decref(js);
}
// printf("+++++++++++dcParam.doa = %s\n", dcParam.doa);
DCStartSession(dcParam);
if (tmpdata) {
free(tmpdata);
}
LOG_EX(LOG_Debug, "Beging WK Data\n");
DCWriteAudioWk(getDCCachebuf(), WAKE_CACHE_DATA_SIZE);
LOG_EX(LOG_Debug, "End WK Data\n");
// g_isSessionOn = 1;
#endif
return MSP_SUCCESS; return MSP_SUCCESS;
} }

View File

@ -112,6 +112,7 @@ static void *QueueReadThread(void *param) {
printf("QueueReadThread record :%p\n", record); printf("QueueReadThread record :%p\n", record);
while (record->runing) { while (record->runing) {
char *data_buff = NULL; char *data_buff = NULL;
queue_set_debugcode(record->queue, 2);
readLen = queue_read(record->queue, &data_buff); readLen = queue_read(record->queue, &data_buff);
if (0 == readLen) { if (0 == readLen) {
printf("queue_read readLen = 0\n"); printf("queue_read readLen = 0\n");
@ -121,13 +122,15 @@ static void *QueueReadThread(void *param) {
if (record->buff_size != readLen) { if (record->buff_size != readLen) {
// printf("\nqueue_read readLen %d\n", readLen); // printf("\nqueue_read readLen %d\n", readLen);
} }
printf("\nqueue_read readLen %d\n", readLen); //printf("\nqueue_read readLen %d\n", readLen);
if (record->cb) if (record->cb)
record->cb(data_buff, readLen, NETEASE_SUCCESS); record->cb(data_buff, readLen, NETEASE_SUCCESS, record->queue);
free(data_buff); free(data_buff);
queue_set_debugcode(record->queue, 3);
} }
queue_set_debugcode(record->queue, 4);
printf("QueueReadThread end, running:%d \n", record->runing); printf("QueueReadThread end, running:%d \n", record->runing);
return NULL; return NULL;
} }

View File

@ -249,7 +249,7 @@ int Netease_yunxin_checklogin() {
return loginStatus; return loginStatus;
} }
void Netease_yunxin_sendmsg(char *data) { void Netease_yunxin_sendmsg_offline(char *data) {
json_t *tmp = NULL; json_t *tmp = NULL;
char msgid[LEN_UNIXMS] = {0}; char msgid[LEN_UNIXMS] = {0};
char bduser[LEN_UUID] = {0}; char bduser[LEN_UUID] = {0};
@ -269,15 +269,16 @@ void Netease_yunxin_sendmsg(char *data) {
return; return;
} }
tmp = json_pack("{s:i, s:s, s:i, s:s, s:s, s:i}", kNIMMsgKeyToType, tmp = json_pack("{s:i, s:s, s:i, s:s, s:s, s:i, s:i}", kNIMMsgKeyToType,
kNIMSessionTypeP2P, kNIMMsgKeyToAccount, bduser, kNIMSessionTypeP2P, kNIMMsgKeyToAccount, bduser,
kNIMMsgKeyType, kNIMMessageTypeCustom, kNIMMsgKeyBody, data, kNIMMsgKeyType, kNIMMessageTypeCustom, kNIMMsgKeyBody, data,
kNIMMsgKeyClientMsgid, msgid, kNIMMsgKeyHistorySave, 1); kNIMMsgKeyClientMsgid, msgid, kNIMMsgKeyHistorySave, 1,
kNIMMsgKeySetMsgOffline, 1);
if (!!tmp) { if (!!tmp) {
char *body = json_dumps(tmp, 0); char *body = json_dumps(tmp, 0);
if (!!body) { if (!!body) {
n_toast("YunXin send msg: %s\n", body); n_toast("YunXin send offline msg: %s\n", body);
nim_talk_send_msg(body, NULL, NULL, NULL); nim_talk_send_msg(body, NULL, NULL, NULL);
free(body); free(body);
} else { } else {
@ -295,7 +296,7 @@ void Netease_yunxin_sendmsg(char *data) {
} }
} }
void Netease_yunxin_sendmsg1(char *data) { void Netease_yunxin_sendmsg_online(char *data) {
json_t *tmp = NULL; json_t *tmp = NULL;
char msgid[LEN_UNIXMS]; char msgid[LEN_UNIXMS];
char bduser[LEN_UUID]; char bduser[LEN_UUID];
@ -315,15 +316,16 @@ void Netease_yunxin_sendmsg1(char *data) {
return; return;
} }
tmp = json_pack("{s:i, s:s, s:i, s:s, s:s, s:i}", kNIMMsgKeyToType, tmp = json_pack("{s:i, s:s, s:i, s:s, s:s, s:i, s:i}", kNIMMsgKeyToType,
kNIMSessionTypeP2P, kNIMMsgKeyToAccount, bduser, kNIMSessionTypeP2P, kNIMMsgKeyToAccount, bduser,
kNIMMsgKeyType, kNIMMessageTypeCustom, kNIMMsgKeyBody, data, kNIMMsgKeyType, kNIMMessageTypeCustom, kNIMMsgKeyBody, data,
kNIMMsgKeyClientMsgid, msgid, kNIMMsgKeyHistorySave, 0); kNIMMsgKeyClientMsgid, msgid, kNIMMsgKeyHistorySave, 0,
kNIMMsgKeySetMsgOffline, 0);
if (!!tmp) { if (!!tmp) {
char *body = json_dumps(tmp, 0); char *body = json_dumps(tmp, 0);
if (!!body) { if (!!body) {
// n_toast("YunXin send msg: %s\n", body); // n_toast("YunXin send online msg: %s \n", body);
nim_talk_send_msg(body, NULL, NULL, NULL); nim_talk_send_msg(body, NULL, NULL, NULL);
free(body); free(body);
} else { } else {

BIN
lib/libduilite/lib/libduilite.so Normal file → Executable file

Binary file not shown.

Binary file not shown.