📄 mymedia.c
字号:
return;
if (bCenter)
{
x = pRect->x + (pRect->dx / 2) - (ii.cxFrame / 2);
y = pRect->y + (pRect->dy / 2) - (ii.cy / 2);
}
else
{
x = pRect->x;
y = pRect->y;
}
IIMAGE_Start(pImage, x, y);
}
static char * MP_GetFileName(const char * psz)
{
char * pszName = STRRCHR(psz, (int)DIRECTORY_CHAR);
if (pszName)
pszName++;
else
pszName = (char *)psz;
return pszName;
}
static void MP_FitStaticText(IDisplay * pd, IStatic * ps, AEEFont font, AECHAR * pszText)
{
int nFits;
AEERect rect;
int nLen = WSTRLEN(pszText);
AECHAR chSave = (AECHAR)0;
ISTATIC_GetRect(ps, &rect);
IDISPLAY_MeasureTextEx(pd, font, pszText, -1, rect.dx, &nFits);
if (nFits < nLen)
{
chSave = pszText[nFits];
pszText[nFits] = (AECHAR)0;
}
ISTATIC_SetText(ps, NULL, pszText, AEE_FONT_NORMAL, font);
if (nFits < nLen)
pszText[nFits] = chSave;
}
static void MP_FrameRect(IDisplay * pd, AEERect * pRect)
{
RGBVAL clr = IDISPLAY_SetColor(pd, CLR_USER_FRAME, CLR_SYS_DK_SHADOW);
IDISPLAY_FrameRect(pd, pRect);
IDISPLAY_SetColor(pd, CLR_USER_FRAME, clr);
}
static void CPlayerWin_UpdateProgCtl(CPlayerWin * pme, int nCmd, int nSubCmd, uint16 wResID)
{
char sz[32];
AECHAR szBuf[32];
if (pme->m_bProgTimer)
return;
if ( !ISHELL_LoadResString(pme->a.m_pIShell, MEDIA_RES_FILE, wResID, pme->m_szText, sizeof(pme->m_szText)))
pme->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(pme->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(pme->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(pme->m_szText, szBuf);
pme->m_wPct = (100 * pme->m_wVolume) / AEE_MAX_VOLUME;
}
else
{
pme->m_wPct = 0;
}
CProgCtl_SetPos(&pme->m_ProgCtl, pme->m_szText, pme->m_wPct);
IDISPLAY_Update(pme->a.m_pIDisplay);
}
static void CProgCtl_SetPos(CProgCtl * pme, AECHAR * psz, uint16 wPct)
{
MP_FitStaticText(pme->m_pIDisplay, pme->m_pTitle, AEE_FONT_NORMAL, psz);
ISTATIC_Redraw(pme->m_pTitle);
CProgCtl_DrawHist(pme, wPct);
MP_FrameRect(pme->m_pIDisplay, &pme->m_rectMain);
}
static void CProgCtl_DrawHist(CProgCtl * pme, uint16 wPct)
{
AEERect rc;
MEMCPY(&rc, &pme->m_rectBar, sizeof(AEERect));
if(wPct > 100)
wPct = 100;
IDISPLAY_DrawFrame(pme->m_pIDisplay, &rc, AEE_FT_RAISED, CLR_SYS_SCROLLBAR);
rc.dx = (rc.dx * wPct) / 100;
IDISPLAY_FillRect(pme->m_pIDisplay, &rc, MP_CLR_PROG_FILL);
}
/*===========================================================================
FUNCTION Media_HandleEvent
DESCRIPTION
This is the EventHandler for this app. All events to this app are handled in this
function. All APPs must supply an Event Handler.
PROTOTYPE:
boolean Media_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)
PARAMETERS:
pi: Pointer to the AEEApplet structure. This structure contains information specific
to this applet. It was initialized during the AEEClsCreateInstance() function.
ecode: Specifies the Event sent to this applet
wParam, dwParam: Event specific data.
DEPENDENCIES
none
RETURN VALUE
TRUE: If the app has processed the event
FALSE: If the app did not process the event
SIDE EFFECTS
none
===========================================================================*/
static boolean MyMedia_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
CPlayerWin * pme = (CPlayerWin *)pi;
switch (eCode)
{
case EVT_APP_START:
// Add your code here .....
AutoImage_DrawSplash(pme);
return(TRUE);
case EVT_APP_STOP:
// Add your code here .....
return TRUE;
case EVT_KEY: // Process key event
case EVT_COMMAND: // Process menu command event
case EVT_CREATEMEDIA: // Create media
case EVT_COPYRIGHT_END: // Copyright dialog ended
return CPlayerWin_HandleEvent(pme, eCode, wParam, dwParam);
default:
break;
}
return FALSE;
}
static boolean CPlayerWin_HandleEvent(CPlayerWin * po, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
CPlayerWin * pme = po;
boolean bRet = TRUE;
if (MP_ISEVTKEY(eCode))
{
return IMENUCTL_HandleEvent(pme->m_pPlayerMenu, eCode, wParam, dwParam);
}
// Process create media events...
if (eCode == EVT_CREATEMEDIA )
{
AEEMediaUtil_CreateMedia(pme->a.m_pIShell, &pme->m_md, &pme->m_pMedia);
IMEDIA_RegisterNotify(pme->m_pMedia, CPlayerWin_MediaNotify, pme);
// MP_ErrorDlg(pme->m_pOwner, IDS_ERR_MEDIA);
return TRUE;
}
// If this event is not EVT_COMMAND, then return...
if (!MP_ISEVTCMD(eCode))
return FALSE;
// Process EVT_COMMAND...
switch (wParam)
{
case IDM_PM_PLAY:
if (CPlayerWin_IsPause(pme))
IMEDIA_Resume(pme->m_pMedia);
else if (SUCCESS != IMEDIA_GetTotalTime(pme->m_pMedia))
{
if (AEE_SUCCESS == IMEDIA_Play(pme->m_pMedia))
pme->m_bPlayRec = TRUE;
}
break;
case IDM_PM_STOP:
IMEDIA_Stop(pme->m_pMedia);
break;
case IDM_PM_REWIND:
IMEDIA_Rewind(pme->m_pMedia, MP_SEEK_TIME);
break;
case IDM_PM_FF:
IMEDIA_FastForward(pme->m_pMedia, MP_SEEK_TIME);
break;
case IDM_PM_PAUSE:
if (CPlayerWin_IsPause(pme))
IMEDIA_Resume(pme->m_pMedia);
else
IMEDIA_Pause(pme->m_pMedia);
break;
case IDM_PM_UP:
{
uint16 wVol = pme->m_wVolume + MP_VOLUME_STEP;
wVol = (wVol > AEE_MAX_VOLUME) ? AEE_MAX_VOLUME : wVol;
IMEDIA_SetVolume(pme->m_pMedia, wVol);
break;
}
case IDM_PM_DOWN:
{
int16 nVol = (int16)pme->m_wVolume - MP_VOLUME_STEP;
nVol = (nVol < 0) ? 0 : nVol;
IMEDIA_SetVolume(pme->m_pMedia, (uint16)nVol);
break;
}
default:
bRet = FALSE;
break;
}
return bRet;
}
static boolean CPlayerWin_IsPause(CPlayerWin * pme)
{
boolean bChg;
int nState = IMEDIA_GetState(pme->m_pMedia, &bChg);
if (bChg)
return FALSE;
return (nState == MM_STATE_PLAY_PAUSE || nState == MM_STATE_RECORD_PAUSE);
}
static void CPlayerWin_MediaNotify(void * pUser, AEEMediaCmdNotify * pCmdNotify)
{
CPlayerWin * pme = (CPlayerWin *)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
{
if(pCmdNotify->nCmd == MM_CMD_PLAY)
nTextID = IDS_PLAY;
switch (pCmdNotify->nStatus)
{
case MM_STATUS_START://开始播放
IMENUCTL_SetSel(pme->m_pPlayerMenu, IDM_PM_STOP);
break;
case MM_STATUS_MEDIA_SPEC://IMediaMIDI类型
break;
case MM_STATUS_TICK_UPDATE:
pme->m_dwPlayPos++;
if (!pme->m_dwTotalTime)
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: //回放
case MM_STATUS_ABORT: //回放忽略
{
if(pCmdNotify->nStatus == MM_STATUS_DONE)
nTextID = IDS_STOP;
pme->m_bPlayRec = FALSE;
pme->m_dwPlayPos = 0;
pme->m_wPct = 0;
IMENUCTL_SetSel(pme->m_pPlayerMenu, IDM_PM_PLAY);
AutoImage_Redraw(pme, TRUE);
break;
}
}
CPlayerWin_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;
CPlayerWin_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)
{
IMEDIA_GetMediaParm(pme->m_pMedia, MM_PARM_VOLUME, NULL, NULL);
return;
}
} // MM_CMD_SETMEDIAPARM
else if (pCmdNotify->nCmd == MM_CMD_GETMEDIAPARM) // IMEDIA_GetMediaParm()事件
{
if (pCmdNotify->nSubCmd == MM_PARM_VOLUME && pCmdNotify->nStatus == MM_STATUS_DONE)
{
pme->m_wVolume = (uint16)(uint32)pCmdNotify->pCmdData;
pme->m_bProgTimer = FALSE;
CPlayerWin_UpdateProgCtl(pme, pCmdNotify->nCmd, pCmdNotify->nSubCmd, IDS_VOLUME);
pme->m_bProgTimer = TRUE;
// Set the prog timer so that the display stays for few seconds.
//设置进度条停止进度一段时间
ISHELL_SetTimer(pme->a.m_pIShell, MP_PROG_TIMER, (PFNNOTIFY)CPlayerWin_ProgTimerNotify, pme);
}
} // MM_CMD_GETMEDIAPARM
}
static void CPlayerWin_ProgTimerNotify(CPlayerWin * pme)
{
pme->m_bProgTimer = FALSE;
if (!pme->m_bPlayRec)
AutoImage_Redraw(pme, TRUE);
}
static void AutoImage_DrawSplash(CPlayerWin * pme)
{
// pme->m_bActive
if (pme->m_bActive)
{
AutoImage_Redraw(pme, FALSE);
CMediaPlayer_PlayFile(pme, pme->m_pszFile);
return;
}
//从资源文件中装载图象并显示,同时,设置在一定时间内回调此函数。
{
IImage * pi = ISHELL_LoadResImage(pme->a.m_pIShell, MEDIA_RES_FILE, IDB_LOGO);
if (pi)
{
AEERect rect;
IDISPLAY_ClearScreen(pme->a.m_pIDisplay);
SETAEERECT(&rect, 0, 0, pme->m_cxWidth, pme->m_cyHeight);
MP_DrawImage(pi, &rect, TRUE);
IDISPLAY_Update(pme->a.m_pIDisplay);
MP_RELEASEIF(pi);
}
pme->m_bActive = TRUE;
ISHELL_SetTimer(pme->a.m_pIShell, MP_SPLASH_TIMER, (PFNNOTIFY)AutoImage_DrawSplash, pme);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -