📄 media.cpp
字号:
{// ff
if(m_pMedia)
IMEDIA_FastForward(m_pMedia, TIME_INMILLISECONDS);
}
else if (m_nButtonIndex == BUTTON_PAUSE)
{// pause
if(m_pMedia)
{
if (IsPause())
IMEDIA_Resume(m_pMedia);
else
IMEDIA_Pause(m_pMedia);
}
}
}
break;
}
status = TRUE;
}
else if((m_nState==STATE_OPTION) && m_pMenu)
{
if (IMENUCTL_HandleEvent(m_pMenu, evt, wParam, dwParam))
status = TRUE;
}
break;
case EVT_CREATEMEDIA:
case EVT_CREATEMEDIA_QCP:
{
int nRet;
ReleaseObj((void **)(&m_pMedia));
if (evt == EVT_CREATEMEDIA)
nRet = AEEMediaUtil_CreateMedia(m_pApplet->m_pIShell, &m_md, &m_pMedia);
else
{
nRet = ISHELL_CreateInstance(m_pApplet->m_pIShell, AEECLSID_MEDIAQCP, (void **)&m_pMedia);
if (nRet == SUCCESS)
nRet = IMEDIA_SetMediaData(m_pMedia, &m_md);
}
if (SUCCESS != nRet)
; //erro IDS_ERR_CREATEMEDIA
else if (SUCCESS != IMEDIA_RegisterNotify(m_pMedia, MediaNotify, this))
;//erro IDS_ERR_MEDIA
else //success
{
if (m_bPlayResume)
{// 检查是否是resume时产生的消息
IMEDIA_GetTotalTime(m_pMedia);
if (AEE_SUCCESS == IMEDIA_Play(m_pMedia))
m_bPlayRec = TRUE;
}
m_bPlayResume = TRUE;
/*
if (SUCCESS != IMEDIA_GetTotalTime(m_pMedia))
{
IMEDIA_Play(m_pMedia);
}
*/
}
status = TRUE;
}
case EVT_COMMAND:
if (m_nState!=STATE_OPTION)
return TRUE;
m_nMenuSelect = wParam;
status = TRUE;
switch(m_nMenuSelect) {
case IDS_OPTION:
ShowOption(m_nType & 0xffff);
break;
case IDS_SHOWPIC:
case IDS_PLAY:
PlayFile(m_szFileName);
break;
case IDS_SAVEPIC:
case IDS_DOWNSOUND:
if (!CheckFileSpace(m_pApplet->m_pIShell))
{
AEERect rcScreen;
rcScreen.x=0;
rcScreen.y=0;
rcScreen.dx=m_pDevice->cxScreen;
rcScreen.dy=m_pDevice->cyScreen;
ClearScreen();
ShowResString(m_pApplet->m_pIShell, &m_pIStatic, &rcScreen, m_szName, IDS_ERR_SPACE);
m_nState=STATE_ERRO;
}
else
{
int nResult = SaveContent(m_pApplet->m_pIShell, &m_pFileMgr, m_szFileName, m_szName, m_nType, m_nID);
if (nResult == SAVEFILE_SUCCESS)
{
m_nState = STATE_OPTION;
DeleteFile(m_pApplet->m_pIShell,&m_pFileMgr,m_szFileName);
Release();
}
else
{
//保存失败
DeleteFile(m_pApplet->m_pIShell,&m_pFileMgr,m_szFileName);
AEERect rcScreen;
rcScreen.x=0;
rcScreen.y=0;
rcScreen.dx=m_pDevice->cxScreen;
rcScreen.dy=m_pDevice->cyScreen;
ClearScreen();
if (nResult == SAVEFILE_EXIST)
ShowResString(m_pApplet->m_pIShell, &m_pIStatic, &rcScreen, m_szName, IDS_ERR_FILEEXIST);
else
ShowResString(m_pApplet->m_pIShell, &m_pIStatic, &rcScreen, m_szName, IDS_ERR_SPACE);
m_nState=STATE_ERRO;
}
}
break;
case IDS_WALLPAPER:
SetWallPaper();
// Release();
break;
case IDS_SETRING:
SetRinger();
// Release();
break;
case IDS_DELETE:
// 删除文件和索引
DeleteFile(m_pApplet->m_pIShell,&m_pFileMgr,m_szFileName);
DeleteFavoriteByIndex(m_pApplet->m_pIShell, &m_pFileMgr,m_nID);
if((m_nType & 0xffff0000)==SOUND_MID)
{
RemoveRinger();
}
/*
else if (!HIDE_WALLPAPER_BUTTON&&(m_nType & 0xffff0000)==PIC_PNG||(m_nType & 0xffff0000)==PIC_GIF||(m_nType & 0xffff0000)==PIC_JPG||(m_nType & 0xffff0000)==PIC_BMP)
{
RemoveWallPaper();
}*/
Release();
break;
default:
status = FALSE;
}
}
return status;
}
void CMedia::ShowOption(int nType)
{
AECHAR szNull[1];
MEMSET(&szNull, 0, sizeof(AECHAR));
m_nState=STATE_OPTION;
if(!m_bResum)
{
ReleaseMenu();
ReleaseMedia();
ReleaseProgCtl();
ClearScreen();
ISHELL_CreateInstance(m_pApplet->m_pIShell, AEECLSID_MENUCTL, (void **) &m_pMenu);
if (m_pMenu != NULL && IMENUCTL_IsActive(m_pMenu))
{
return;
}
}
else
{
if(m_pMenu && IMENUCTL_IsActive(m_pMenu))
IMENUCTL_Redraw(m_pMenu);
return;
}
IDISPLAY_ClearScreen(m_pApplet->m_pIDisplay);
// set menu title
IMENUCTL_SetTitle(m_pMenu, RES_FILE, NULL, m_szName);
if(nType==CONTENT_SOUND)
{
if(m_bMyDoc)
{
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_PLAY, IDS_PLAY, 0);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_PLAY,IDS_PLAY,NULL,NULL);
if((m_nType & 0xffff0000)==SOUND_MID)
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_SETRING, IDS_SETRING, 0);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_SETRING,IDS_SETRING,NULL,NULL);
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_DELETE, IDS_DELETE, 0);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_DELETE,IDS_DELETE,NULL,NULL);
}
else
{
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_PLAY, IDS_PLAY, 0);
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_DOWN, IDS_DOWNSOUND, 0);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_PLAY,IDS_PLAY,NULL,NULL);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_DOWNSOUND,IDS_DOWNSOUND,NULL,NULL);
}
}
else if(nType==CONTENT_PIC)
{
if(m_bMyDoc)
{
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_FULLSCREEN, IDS_SHOWPIC, 0);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_SHOWPIC,IDS_SHOWPIC,NULL,NULL);
// if(VERSION!=2)
if((m_nType & 0xffff0000)!=PIC_BCI&&!HIDE_WALLPAPER_BUTTON)
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_SETWALLPAPER, IDS_WALLPAPER, 0);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_WALLPAPER,IDS_WALLPAPER,NULL,NULL);
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_DELETE, IDS_DELETE, 0);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_DELETE,IDS_DELETE,NULL,NULL);
}
else
{
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_FULLSCREEN, IDS_SHOWPIC, 0);
AddMenuItem(m_pMenu, NULL, szNull, BM_MENU_DOWN, IDS_SAVEPIC, 0);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_SHOWPIC,IDS_SHOWPIC,NULL,NULL);
// IMENUCTL_AddItem(m_pMenu,RES_FILE,IDS_SAVEPIC,IDS_SAVEPIC,NULL,NULL);
}
}
// implementation of lightening of main menu background color
{
AEEMenuColors colors;
colors.wMask = MC_BACK | MC_SEL_BACK;
colors.cBack = MAKE_BACK_COLOR;
colors.cSelBack = MAKE_SEL_COLOR;
IMENUCTL_SetColors(m_pMenu, &colors);
}
// end of lightening of main menu background color
IMENUCTL_EnableCommand(m_pMenu, true);
IMENUCTL_SetActive(m_pMenu, true);
IDISPLAY_Update(m_pApplet->m_pIDisplay);
}
void CMedia::Display()
{
if(m_nState==STATE_OPTION)
ShowOption(m_nType & 0xffff);
else if(m_nState==STATE_CONTENT)
PlayFile(m_szFileName);
}
void CMedia::ReleaseMenu()
{
if (m_pMenu)
{
IMENUCTL_SetActive(m_pMenu, false);
IMENUCTL_Release(m_pMenu);
}
m_pMenu = NULL;
m_nMenuSelect = 0;
}
void CMedia::MediaNotify(void *pUser, AEEMediaCmdNotify *pCmdNotify)
{
CMedia * pme = (CMedia *)pUser;
uint16 nTextID = 0;
switch (pCmdNotify->nStatus)
{
case MM_STATUS_SEEK_FAIL:
case MM_STATUS_PAUSE_FAIL:
case MM_STATUS_RESUME_FAIL:
;//nTextID = IDS_ERR_PLAYCTL_CMD;
break;
}
if (pCmdNotify->nCmd == MM_CMD_PLAY || pCmdNotify->nCmd == MM_CMD_RECORD) // IMEDIA_Play/IMEDIA_Record events
{
//nTextID = pCmdNotify->nCmd == MM_CMD_PLAY ? IDS_PLAY : IDS_RECORD;
switch (pCmdNotify->nStatus)
{
case MM_STATUS_START:
pme->m_nButtonIndex = BUTTON_STOP;
// IMENUCTL_SetSel(pme->m_pMenu, BM_STOP);
break;
case MM_STATUS_MEDIA_SPEC:
// pCmdNotify->pCmdData may point to media specs structure
// defined in AEEMediaFormats.h. Save this info.
break;
case MM_STATUS_TICK_UPDATE: // Typcally, one-second update
pme->m_dwPlayPos++;
if (!pme->m_dwTotalTime) // If no total time increase by 20!
pme->m_wPct = (pme->m_wPct + 20) % 100;
break;
case MM_STATUS_SEEK:
// nTextID = IDS_SEEK;
if (pCmdNotify->dwSize)
pme->m_dwPlayPos = (uint32)pCmdNotify->pCmdData / 1000;
break;
case MM_STATUS_PAUSE:
// nTextID = IDS_PAUSE;
if (pCmdNotify->dwSize)
pme->m_dwPlayPos = (uint32)pCmdNotify->pCmdData / 1000;
break;
case MM_STATUS_RESUME:
if (pCmdNotify->dwSize)
pme->m_dwPlayPos = (uint32)pCmdNotify->pCmdData / 1000;
break;
case MM_STATUS_DONE: // playback done
case MM_STATUS_ABORT: // playback aborted
{
// nTextID = (pCmdNotify->nStatus == MM_STATUS_DONE) ? IDS_STOP : IDS_ABORT;
pme->m_bPlayRec = FALSE;
pme->m_dwPlayPos = 0;
pme->m_wPct = 0;
pme->m_nButtonIndex = BUTTON_PLAY;
// IMENUCTL_SetSel(pme->m_pMenu, BM_PLAY);
break;
}
}
if(pme->m_nState==STATE_CONTENT)
UpdateProgCtl(pme, pCmdNotify->nCmd, pCmdNotify->nSubCmd, nTextID);
} // MM_CMD_PLAY
else if (pCmdNotify->nCmd == MM_CMD_GETTOTALTIME)
{
if (pCmdNotify->nStatus == MM_STATUS_DONE || pCmdNotify->nStatus == MM_STATUS_ABORT)
{
pme->m_dwTotalTime = ((uint32)pCmdNotify->pCmdData) / 1000;
// if (AEE_SUCCESS == IMEDIA_Play(pme->m_pMedia))
// pme->m_bPlayRec = TRUE;
// UpdateProgCtl(pme, pCmdNotify->nCmd, pCmdNotify->nSubCmd, nTextID);
}
} // MM_CMD_GETTOTALTIME
else if (pCmdNotify->nCmd == MM_CMD_SETMEDIAPARM)
{
if (pCmdNotify->nSubCmd == MM_PARM_VOLUME && pCmdNotify->nStatus == MM_STATUS_DONE)
{
if (SUCCESS == IMEDIA_GetMediaParm(pme->m_pMedia, MM_PARM_VOLUME, (int32 *)&pme->m_wVolume, NULL))
SendMediaNotify(pme, MM_CMD_GETMEDIAPARM, MM_PARM_VOLUME, MM_STATUS_DONE, (void *)(uint32)pme->m_wVolume, sizeof(pme->m_wVolume));
return;
}
} // MM_CMD_SETMEDIAPARM
else if (pCmdNotify->nCmd == MM_CMD_GETMEDIAPARM) // IMEDIA_GetMediaParm() events
{
if (pCmdNotify->nSubCmd == MM_PARM_VOLUME && pCmdNotify->nStatus == MM_STATUS_DONE)
{
pme->m_wVolume = (uint16)(uint32)pCmdNotify->pCmdData;
// UpdateProgCtl(pme, pCmdNotify->nCmd, pCmdNotify->nSubCmd, nTextID);
// Set the prog timer so that the display stays for few seconds.
//ISHELL_SetTimer(pme->m_pIShell, MP_PROG_TIMER, (PFNNOTIFY)CPlayerWin_ProgTimerNotify, pme);
}
} // MM_CMD_GETMEDIAPARM
}
/*===========================================================================
This function sends a media command notification.
===========================================================================*/
void CMedia::SendMediaNotify(CMedia *pme, int nCmd, int nSubCmd, int nStatus, void *pData, uint32 dwSize)
{
AEEMediaCmdNotify mcn;
AEECLSID cls;
if(pme->m_pMedia==NULL) return;
IMEDIA_GetClassID(pme->m_pMedia, &cls);
mcn.clsMedia = cls;
mcn.pIMedia = pme->m_pMedia;
mcn.nCmd = nCmd;
mcn.nSubCmd = nSubCmd;
mcn.nStatus = nStatus;
mcn.pCmdData = pData;
mcn.dwSize = dwSize;
MediaNotify(pme, &mcn);
}
void CMedia::ShowMedia()
{
AEERect rect;
if(!m_bResum)
{
ReleaseMenu();
// ReleaseMedia();
CancelShowPicCallback();
}
IDISPLAY_ClearScreen(m_pApplet->m_pIDisplay);
// 画背景图
// DrawPicRect(m_imgBack, 0, 0, m_pDevice->cxScreen, m_pDevice->cyScreen);
// 写标题
rect.x=0;
rect.y=0;
rect.dx=m_pDevice->cxScreen;
rect.dy=PLAYICON_HEIGHT;
IDISPLAY_DrawText(m_pApplet->m_pIDisplay, AEE_FONT_BOLD, m_szName, -1, 0, 0, &rect, IDF_RECT_FILL);
if(m_bResum)
{
return;
}
//动画
m_nPic=1;
ShowPicCallback(this);
}
boolean CMedia::IsPause()
{
boolean bChg;
if(m_pMedia==NULL) return FALSE;
int nState = IMEDIA_GetState(m_pMedia, &bChg);
if (bChg)
return FALSE;
return (nState == MM_STATE_PLAY_PAUSE || nState == MM_STATE_RECORD_PAUSE);
}
boolean CMedia::ProgCtl_Init(CProgCtl *pme, AEERect *pRectMain)
{
// AEERect rect;
int x, y;
int dxProg, dyProg;
MEMCPY(&pme->m_rectMain, pRectMain, sizeof(AEERect));
// if (ISHELL_CreateInstance(m_pApplet->m_pIShell, AEECLSID_STATIC, (void **)&pme->m_pTitle))
// return FALSE;
// ProgBar rect
dxProg = 100;//pRectMain->dx / (PROGBAR_DX_DIV);
dyProg = pRectMain->dy / PROGBAR_DY_DIV;
// x = pRectMain->x + pRectMain->dx - dxProg + 1;
x = (pRectMain->x + pRectMain->dx - dxProg)/2;// + 1;
y = pRectMain->y + pRectMain->dy / 2 - dyProg/2;
/* if (dxProg > PROGBAR_DX_OFFSET)
dxProg -= PROGBAR_DX_OFFSET;*/
SETAEERECT(&pme->m_rectBar, x, y, dxProg, dyProg);
/* SETAEERECT(&rect, pRectMain->x + 1, pRectMain->y + 1, pRectMain->dx - dxProg, pRectMain->dy);
ISTATIC_SetRect(pme->m_pTitle, &rect);
ISTATIC_SetProperties(pme->m_pTitle, ST_CENTERTEXT | ST_NOSCROLL);*/
return TRUE;
}
void CMedia::ReleaseProgCtl()
{
// if (m_ProgCtl.m_pTitle)
// ReleaseObj((void * *)&m_ProgCtl.m_pTitle);
// m_ProgCtl.m_pTitle=NULL;
}
void CMedia::UpdateProgCtl(CMedia *pme,int nCmd, int nSubCmd, uint16 wResID)
{
char sz[32];
AECHAR szBuf[32];
AECHAR m_szText[64];
if ( !ISHELL_LoadResString(pme->m_pApplet->m_pIShell, RES_FILE, wResID, m_szText, sizeof(m_szText)) )
m_szText[0] = (AECHAR)0;
if (nCmd == MM_CMD_PLAY || nCmd == MM_CMD_RECORD)
{
SPRINTF(sz, " %02d:%02d/%02d:%02d", pme->m_dwPlayPos/60, pme->m_dwPlayPos%60, pme->m_dwTotalTime/60, pme->m_dwTotalTime%60);
STRTOWSTR(sz, szBuf, sizeof(szBuf));
WSTRCAT(m_szText, szBuf);
if (pme->m_dwTotalTime)
pme->m_wPct = (uint16)((100 * pme->m_dwPlayPos) / pme->m_dwTotalTime);
}
else if (nCmd == MM_CMD_GETTOTALTIME)
{
SPRINTF(sz, " %02d:%02d/%02d:%02d", pme->m_dwPlayPos/60, pme->m_dwPlayPos%60, pme->m_dwTotalTime/60, pme->m_dwTotalTime%60);
STRTOWSTR(sz, szBuf, sizeof(szBuf));
WSTRCAT(m_szText, szBuf);
}
else if (nCmd == MM_CMD_GETMEDIAPARM && nSubCmd == MM_PARM_VOLUME)
{
SPRINTF(sz, "[%u]", pme->m_wVolume);
STRTOWSTR(sz, szBuf, sizeof(szBuf));
WSTRCAT(m_szText, szBuf);
pme->m_wPct = (100 * pme->m_wVolume) / AEE_MAX_VOLUME;
}
else
{
pme->m_wPct = 0;
}
ProgCtl_SetPos(pme, m_szText, pme->m_wPct);
IDISPLAY_Update(pme->m_pApplet->m_pIDisplay);
}
void CMedia::ProgCtl_SetPos(CMedia *pme, AECHAR *psz, uint16 wPct)
{
// int nFits;
// AEERect rect;
int nLen = WSTRLEN(psz);
AECHAR chSave = (AECHAR)0;
/* if(!pme->m_ProgCtl.m_pTitle) return;
ISTATIC_GetRect(pme->m_ProgCtl.m_pTitle, &rect);
IDISPLAY_MeasureTextEx(pme->m_pApplet->m_pIDisplay, AEE_FONT_NORMAL, psz, -1, rect.dx, &nFits);
if (nFits < nLen)
{
chSave = psz[nFits];
psz[nFits] = (AECHAR)0;
}
ISTATIC_SetText(pme->m_ProgCtl.m_pTitle, NULL, psz, AEE_FONT_NORMAL, AEE_FONT_NORMAL);
if (nFits < nLen)
psz[nFits] = chSave;
ISTATIC_Redraw(pme->m_ProgCtl.m_pTitle);*/
AEERect rc;
MEMCPY(&rc, &pme->m_ProgCtl.m_rectBar, sizeof(AEERect));
if(wPct > 100)
wPct = 100;
IDISPLAY_DrawFrame(pme->m_pApplet->m_pIDisplay, &rc, AEE_FT_RAISED, CLR_SYS_SCROLLBAR);
rc.dx = (rc.dx * wPct) / 100;
IDISPLAY_FillRect(pme->m_pApplet->m_pIDisplay, &rc, CLR_PROG_FILL);
RGBVAL clr = IDISPLAY_SetColor(pme->m_pApplet->m_pIDisplay, CLR_USER_FRAME, CLR_SYS_DK_SHADOW);
IDISPLAY_FrameRect(pme->m_pApplet->m_pIDisplay, &pme->m_ProgCtl.m_rectMain);
IDISPLAY_SetColor(pme->m_pApplet->m_pIDisplay, CLR_USER_FRAME, clr);
}
void CMedia::ReleaseMedia()
{
if (m_pMedia)
{
IMEDIA_Stop(m_pMedia);
IMEDIA_RegisterNotify(m_pMedia, NULL, NULL);
IMEDIA_Release(m_pMedia);
m_bPlayRec = FALSE;
m_dwPlayPos = 0;
m_wPct = 0;
m_pMedia = NULL;
}
CancelShowPicCallback();
}
void CMedia::Suspend()
{
if (m_pObject)
{
m_pObject->Suspend();
}
else
{
if(m_pMenu)
IMENUCTL_SetActive (m_pMenu, FALSE);
if(m_pMedia)
{
m_bPlayResume = m_bPlayRec;
ReleaseMedia();
/*
IMEDIA_RegisterNotify(m_pMedia, NULL, NULL);
if(IsPlay())
IMEDIA_Resume(m_pMedia);
CancelShowPicCallback();
*/
}
if(m_pImage)
{
IIMAGE_Stop(m_pImage);
}
if(m_nState==STATE_ERRO)
{
if(m_pIStatic)
ISTATIC_SetActive(m_pIStatic,FALSE);
}
else
ClearScreen();
}
}
void CMedia::Resume()
{
m_bResum = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -