void Widget::contextMenuEvent(QContextMenuEvent *event) { QMenu menu; menu.addAction(tr("删除"),this, SLOT(DelateMusic())); menu.addAction(tr("清空列表"), this, SLOT(ClearPlayList())); menu.exec(event->globalPos()); }
/*---------------------------------------------------------------------------------------- 函数名: PlayChange 参数: code:传入需要判断的码值 返回值: 1/0:连续出现50次-1时返回一次0/其余返回0 描述: 分析code值所处的作用(音量调节、录音、普通播音),并按照分类分别执行 ----------------------------------------------------------------------------------------*/ int8_t PlayChange(int32_t dwCode) { static int32_t dwValidCode; static uint8_t cntErr = 0; if ((dwCode!=-1 && (dwCode != dwValidCode || cntErr > 5))){ LOG(("dwCode:%d",dwCode)); g_bHaveCamAction = 1; dwValidCode = dwCode; ClearPlayList(); if(IsAboutMusic(dwCode)); else if(IsChangeRole(dwCode)); else if(IsVolumeCtrl(dwCode)); // else if(HaveRecord(dwCode)); else PlayBegin(dwCode); cntErr = 0; } else if(dwCode == -1){ cntErr++; }else if(dwCode == dwValidCode){ cntErr = 0; } if(cntErr >= 50){ cntErr = 0; return 0; } return 1; }
/*---------------------------------------------------------------------------------------- 函数名: DPWMPlayUninit 参数: None 返回值: None 描述: 停止PDMA操作,关闭DPWM设备 ----------------------------------------------------------------------------------------*/ static void DPWMPlayUninit(void) { DrvPDMA_EnableCH(eDRVPDMA_CHANNEL_2, eDRVPDMA_DISABLE); while(DrvPDMA_IsCHBusy(eDRVPDMA_CHANNEL_2)); DrvDPWM_DisablePDMA(); DrvDPWM_Close(); } ///*---------------------------------------------------------------------------------------- //函数名: ClearPlayList //参数: // dwPlayCurAddr:音频开始地址 // dwAudioEndAddr:音频结束的地址 //返回值: // None //描述: // 初始化一下播音参数,解码数据填满环形缓冲区,开启PDMA和DPWM播音 //----------------------------------------------------------------------------------------*/ void ClearPlayList(void) { g_cntPlayAudio = g_nCurPlayAudio = 0; g_bNoInterruptedAudio = 0; } ///*---------------------------------------------------------------------------------------- //函数名: StopPlayAudio //参数: // None //返回值: // None //描述: // 停止播音并关闭设备,从中采用让音量逐渐变小的方式避免"啪"的声音 //----------------------------------------------------------------------------------------*/ void StopPlayAudio(void) { uint8_t i,nVolumeIndexBak = 0; nVolumeIndexBak = g_nVolumeIndex; for( i=0; i < CYCLEBUFFER_SIZE/320; i++){ g_nVolumeIndex -= 1; if( (g_dwLastWritedPosition + SIREN7FRAME) > ((uint32_t)g_waCycBuffer + CYCLEBUFFER_SIZE * 2) ) g_dwLastWritedPosition = (uint32_t)g_waCycBuffer; PlayVolumeCtrl((int16_t *)g_dwLastWritedPosition,SIREN7FRAME); g_dwLastWritedPosition += SIREN7FRAME; } g_nVolumeIndex = nVolumeIndexBak; g_bStopPlay = 1; DPWMPlayUninit(); } ///*---------------------------------------------------------------------------------------- //函数名: PlayResume //参数: // dwPlayCurAddr:音频开始地址 // dwAudioEndAddr:音频结束的地址 //返回值: // None //描述: // 初始化一下播音参数,解码数据填满环形缓冲区,开启PDMA和DPWM播音 //----------------------------------------------------------------------------------------*/ void PlayResume(void) { if(g_bStopPlay){ g_bStopPlay = 0; memset(g_waCycBuffer, 0xFF, sizeof(g_waCycBuffer)); PDMAStart(); PlayWork(0, 0, 0); } } ///*---------------------------------------------------------------------------------------- //函数名: AddToPlayList //参数: // dwPlayCurAddr:音频开始地址 // dwAudioEndAddr:音频结束的地址 //返回值: // None //描述: // 初始化一下播音参数,解码数据填满环形缓冲区,开启PDMA和DPWM播音 //----------------------------------------------------------------------------------------*/ void AddToPlayList(uint32_t dwFirstCode) { if(g_cntPlayAudio != PLAY_LIST_MAX_CNT) g_dwaPlayList[g_cntPlayAudio++] = (uint16_t)dwFirstCode; else LOG(("link Audio exceed ")); } ///*---------------------------------------------------------------------------------------- //函数名: PlayList //参数: // dwPlayCurAddr:音频开始地址 // dwAudioEndAddr:音频结束的地址 //返回值: // None //描述: // 初始化一下播音参数,解码数据填满环形缓冲区,开启PDMA和DPWM播音 //----------------------------------------------------------------------------------------*/ void PlayList(void) { if((!g_bNoInterruptedAudio || g_bStopPlay) && (g_nCurPlayAudio != g_cntPlayAudio)){ PlayBegin((uint32_t)g_dwaPlayList[g_nCurPlayAudio++]); g_bNoInterruptedAudio = 1; }else if(g_nCurPlayAudio == g_cntPlayAudio){ ClearPlayList(); } }
void ProcessHead(void) { #define HEAD_AUDIO_NUM 3 static uint8_t nHeadAudioIndex = 0; if(!g_bStopPlay){ ClearPlayList(); StopPlayAudio(); }else{ PlayBegin(PEN_HEAD_AUDIO1 + nHeadAudioIndex); if((++nHeadAudioIndex) >= HEAD_AUDIO_NUM){ nHeadAudioIndex = 0; } } }
/*---------------------------------------------------------------------------------------- 函数名: PlayService 参数: None 返回值: None 描述: 播音服务的主循环,负责按键检测,数据解码并填充缓冲区,电量检测等等 ----------------------------------------------------------------------------------------*/ void PlayService(void) { KEYMSG msg; LedFlashForCam(LED_ON); while(g_nState == PLAY_STATE) { if(KEY_MsgGet(&msg)){ // LOG(("KEY:Value:%d,TYPE:%d,HOLDTIME:%d\r\n",msg.Key_MsgValue,msg.Key_MsgType,msg.Key_HoldTime)); g_bHaveKeyAction = 1; if(msg.Key_MsgValue == KEY_ON_OFF){ if(msg.Key_MsgType == KEY_TYPE_SP){ if(!g_bStopPlay) StopPlayAudio(); else PlayResume(); }else if(msg.Key_MsgType == KEY_TYPE_LP){ g_nState = PWRDOWN_STATE; } }else if(msg.Key_MsgValue == KEY_RECORD){ if(msg.Key_MsgType == KEY_TYPE_LP){ g_nState = RECORD_STATE; }else if(msg.Key_MsgType == KEY_TYPE_SP){ PlayRecord(); } }else if(msg.Key_MsgValue == KEY_MACESR){ if(msg.Key_MsgType == KEY_TYPE_LP){ g_nState = MVREC_STATE; }else if(msg.Key_MsgType == KEY_TYPE_SP){ g_nState = ESR_STATE; } }else if(msg.Key_MsgValue == KEY_TOUCH){ if(msg.Key_MsgType == KEY_TYPE_SP){ ProcessHead(); } } } PlayWork(0,0,0); PlayList(); if(!PlayChange(GetCamCode())){ // cam_init(eDRVPDMA_CHANNEL_3); //笔头初始化参数 } CommonCheck(); } ClearPlayList(); StopPlayAudio(); LedFlashForCam(LED_OFF); }