📄 mysoundplayer.c
字号:
// this function is called when your application is starting up
boolean mysoundplayer_InitAppData(mysoundplayer* pMe)
{
// Get the device information for this handset.
// Reference all the data by looking at the pMe->DeviceInfo structure
// Check the API reference guide for all the handy device info you can get
pMe->DeviceInfo.wStructSize = sizeof(pMe->DeviceInfo);
ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->DeviceInfo);
// The display and shell interfaces are always created by
// default, so we'll asign them so that you can access
// them via the standard "pMe->" without the "a."
pMe->pIDisplay = pMe->a.m_pIDisplay;
pMe->pIShell = pMe->a.m_pIShell;
pMe->TotalTime = 0;
pMe->PlayTime = 0;
//为所画的进度条矩形赋初值
pMe->total_rect.x= RECT_X; //进度条背景矩形
pMe->total_rect.y= RECT_Y;
pMe->total_rect.dx =RECT_CX;
pMe->total_rect.dy = RECT_CY;
pMe->rect.x= RECT_X; //进度条前景矩形
pMe->rect.y= RECT_Y;
pMe->rect.dx =RECT_CX;
pMe->rect.dy = RECT_CY;
// Insert your code here for initializing or allocating resources...
// if there have been no failures up to this point then return success
return TRUE;
}
// this function is called when your application is exiting
void mysoundplayer_FreeAppData(mysoundplayer* pMe)
{
// insert your code here for freeing any resources you have allocated...
// example to use for releasing each interface:
if ( pMe->pIMenuCtl != NULL ) // check for NULL first
{
IMENUCTL_Release(pMe->pIMenuCtl); // release the interface
pMe->pIMenuCtl = NULL; // set to NULL so no problems trying to free later
}
if ( pMe->pISoundPlayer != NULL ) // check for NULL first
{
ISOUNDPLAYER_Resume(pMe->pISoundPlayer); // release the interface
pMe->pISoundPlayer = NULL; // set to NULL so no problems trying to free later
}
}
/*==========================================================!
* @brief: 回调函数
* @param: pUser指向用户的指针
* @param: eCBType标记当前状态回调类型
* @param: eStatus标记当前状态信息
* @param: dwParam传递的数据
*/
static void SoundPlayerCBFn(void *pUser, AEESoundPlayerCmd eCBType, AEESoundPlayerStatus eStatus, uint32 dwParam )
{
int i;
mysoundplayer* pMe = (mysoundplayer*)pUser;
char szBuf [30] = {0};
AEESoundPlayerCmdData * pData = (AEESoundPlayerCmdData *) dwParam;
//--------以下的现实信息用于调试回调函数------------
// pMe->ref++;
// DBGPRINTF("=====================================");
// DBGPRINTF("the times come into CB is: %d", pMe->ref);
// DBGPRINTF("eStatus is: %d", eStatus);
// DBGPRINTF("the eCBType is: %d ", eCBType);
// DBGPRINTF("the wParam is: %d", dwParam);
//---------------------------------------------------
switch ( eStatus ) {
case AEE_SOUNDPLAYER_DONE:
//-----在回调函数中返回AEE_SOUNDPLAYER_DONE,有两种原因:-----------
// 1。由于AEE_SOUNDPLAYER_TIME_CB(即用户发出了获取时间的命令)
// ==〉用户发出获取时间的命令,并返回了DONE,
// 说明获取时间成功,总时间在pData中
//------------------------------------------------------------------
if (pData && eCBType == AEE_SOUNDPLAYER_TIME_CB) {
pMe->TotalTime = pData->dwTotalTime / 1000;
// DBGPRINTF("the total time is %d",pMe->TotalTime);
// DBGPRINTF("the e time is %d",pData->dwElapsedTime/1000);
ISOUNDPLAYER_Play(pMe->pISoundPlayer);
break;
}
//-----------------------------------------------------------------
//
// 2。由于AEE_SOUNDPLAYER_PLAY_CB(即用户的播放命令)
// ==〉用户发出播放命令,现在返回了DONE,
// 说明播放完成,此时需要激活菜单,重画进度条
//------------------------------------------------------------------
if(eCBType == AEE_SOUNDPLAYER_PLAY_CB)
{
pMe->PlayTime = pMe->TotalTime;
DrawPlayStatus( pMe);
IMENUCTL_SetActive(pMe->pIMenuCtl,TRUE);
draw_back_rect( pMe);
break;
}
break;
case AEE_SOUNDPLAYER_TICK_UPDATE:
// 在播放中,每一秒钟由此原因进入一次回调函数,可以用于计数
pMe->PlayTime++;
DrawPlayStatus( pMe);
// DBGPRINTF("the current time is %d, currint dx is %d",pMe->PlayTime, pMe->rect.dx);
// DBGPRINTF("------------------");
// DBGPRINTF("the current time is %d", pMe->PlayTime);
// DBGPRINTF("the current t/t is %d", pMe->PlayTime * (pMe->total_rect.dx-2));
// DBGPRINTF("the current dx is %d", pMe->rect.dx);
break;
case AEE_SOUNDPLAYER_RESUME:
// DBGPRINTF("resume ElapsedTime is %d", pData->dwElapsedTime );
// DBGPRINTF("resume pme Time is %d", pMe->PlayTime);
// pMe->PlayTime = pData->dwElapsedTime/1000;
break;
case AEE_SOUNDPLAYER_FFORWARD:
// DBGPRINTF("the 9 total pdata is %d",pData);
// DBGPRINTF("the 9 total time is %d",pData->dwTotalTime / 1000);
// DBGPRINTF("ElapsedTime is %d", pData->dwElapsedTime/1000 );
pMe->PlayTime = pData->dwElapsedTime/1000;
break;
case AEE_SOUNDPLAYER_AUDIO_SPEC:
// pMe->TotalTime = pData->dwTotalTime / 1000;
pMe->PlayTime = 0;
break;
default:
// DisplayOutput (pMe, "Player: Unknown status");
break;
}
/* switch ( eStatus ) {
case AEE_SOUNDPLAYER_SUCCESS:
if (pData && eCBType == AEE_SOUNDPLAYER_VOLUME_CB) {
SPRINTF (szBuf, "Current Vol: %u", pData->wVolume);
DisplayOutput (pMe, szBuf);
}
else if (eCBType == AEE_SOUNDPLAYER_PLAY_CB)
DisplayOutput (pMe, "Status: Playing");
else if ((eCBType == AEE_SOUNDPLAYER_STATUS_CB||eCBType==AEE_SOUNDPLAYER_SOUND_CB))
DisplayOutput (pMe, "Status: Success");
break;
case AEE_SOUNDPLAYER_DONE:
if (pData && eCBType == AEE_SOUNDPLAYER_TIME_CB) {
SPRINTF (szBuf, "Total (ms): %u", (uint16)pData->dwTotalTime);
DisplayOutput (pMe, szBuf);
}
else {
DisplayOutput (pMe, "Status: Stopped");
pMe->nPlayTime = 0;
}
break;
case AEE_SOUNDPLAYER_AUDIO_SPEC:
DisplayOutput (pMe, "Status: Playing");
pMe->nPlayTime = 0;
break;
case AEE_SOUNDPLAYER_REWIND:
pMe->nPlayTime = pData ? pData->dwElapsedTime/1000 : 0;
SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime);
DisplayOutput (pMe, szBuf);
DisplayOutput (pMe, "Status: Rewind done");
break;
case AEE_SOUNDPLAYER_FFORWARD:
pMe->nPlayTime = pData ? pData->dwElapsedTime/1000 : 0;
SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime);
DisplayOutput (pMe, szBuf);
DisplayOutput (pMe, "Status: FFoward done");
break;
case AEE_SOUNDPLAYER_PAUSE:
pMe->nPlayTime = pData ? pData->dwElapsedTime/1000 : 0;
SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime);
DisplayOutput (pMe, szBuf);
DisplayOutput (pMe, "Status: Paused");
break;
case AEE_SOUNDPLAYER_RESUME:
pMe->nPlayTime = pData ? pData->dwElapsedTime/1000 : 0;
SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime);
DisplayOutput (pMe, szBuf);
DisplayOutput (pMe, "Status: Resumed");
break;
case AEE_SOUNDPLAYER_TEMPO:
DisplayOutput (pMe, "SetTempo: Success");
break;
case AEE_SOUNDPLAYER_TUNE:
DisplayOutput (pMe, "SetTune: Success");
break;
case AEE_SOUNDPLAYER_TICK_UPDATE:
pMe->nPlayTime++;
SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime);
DisplayOutput (pMe, szBuf);
break;
case AEE_SOUNDPLAYER_FAILURE:
STRCPY(szBuf, "Player: failure");
DisplayOutput (pMe, szBuf);
break;
case AEE_SOUNDPLAYER_ABORTED:
pMe->nPlayTime = 0;
break;
default:
DisplayOutput (pMe, "Player: Unknown status");
break;
}*/
}
//==========================================
// 此函数用于画进度条的背景色
//
// 每次播放歌曲之前 和 播放完成后 调
//==========================================
void draw_back_rect(mysoundplayer* pMe)
{
RGBVAL clrFrame;
RGBVAL clrFill;
clrFrame = MAKE_RGB(0,255,0);
clrFill = MAKE_RGB(0,255,0);
IDISPLAY_DrawRect(pMe->pIDisplay,&pMe->total_rect,clrFrame,clrFill,IDF_RECT_FRAME|IDF_RECT_FILL);
IDISPLAY_Update(pMe->pIDisplay);
}
//==========================================
// 此函数用于画进度条的变化情况
//
// 播放过程中,每一秒钟调一次
//==========================================
void DrawPlayStatus(mysoundplayer* pMe)
{
RGBVAL clrFrame;
RGBVAL clrFill;
//AECHAR buffer[5]={0};
//int cur,nRem;
pMe->rect.dx = pMe->PlayTime * (pMe->total_rect.dx-2) / pMe->TotalTime ;
// cur = pMe->rect.dx *100 / pMe->total_rect.dx ;
// nRem = sizeof(buffer) / sizeof(AECHAR);
// WWRITELONGEX(buffer,cur,-1,&nRem);
// DBGPRINTF("the current cur is %d", cur);
clrFill = MAKE_RGB(255,0,0);
IDISPLAY_DrawRect(pMe->pIDisplay,&pMe->rect,clrFrame,clrFill,IDF_RECT_FILL);
// 显示进度条的百分比
// IDISPLAY_SetColor(pMe->pIDisplay,CLR_USER_TEXT,MAKE_RGB(255,255,255));
// IDISPLAY_DrawText(pMe->pIDisplay,AEE_FONT_NORMAL,
// buffer,-1,0,pMe->rect.y,NULL,
// IDF_ALIGN_CENTER |IDF_TEXT_TRANSPARENT );
IDISPLAY_Update(pMe->pIDisplay);
}
//===============================================
boolean my_init_menu(mysoundplayer* pMe)
{
int i;
AECHAR *szBuf;
char * szName;
AEERect rect; //定义菜单显示的区域
rect.x = MENU_RECT_X;
rect.y = MENU_RECT_Y;
rect.dx = MENU_RECT_CX; //全屏显示菜单
rect.dy = MENU_RECT_CY;
ISHELL_CreateInstance(pMe->pIShell,AEECLSID_MENUCTL,&pMe->pIMenuCtl); //创建菜单实例
szBuf = MALLOC(MAX_FILE_NAME * sizeof(AECHAR));
i=0;
while(i< pMe->NumFiles)
{
szName = get_file_name(pMe->m_szFileArray[i]);
STRTOWSTR(szName, szBuf, MAX_FILE_NAME);
//-------使用IMENUCTL_AddItem()函数添加1个不带图标的菜单----------------
IMENUCTL_AddItem(pMe->pIMenuCtl,0,0,MY_MENU_ID_M1+i,szBuf,0);
i++;
}
IMENUCTL_EnableCommand(pMe->pIMenuCtl,TRUE);
IMENUCTL_SetRect(pMe->pIMenuCtl,&rect);
IMENUCTL_SetActive(pMe->pIMenuCtl,TRUE);
return TRUE;
}
void get_file_list(mysoundplayer* pMe)
{
IFileMgr * pIFileMgr;
uint16 file_no = 0;
FileInfo fi;
if (ISHELL_CreateInstance(pMe->pIShell, AEECLSID_FILEMGR, (void **)&pIFileMgr))
{
return;
}
IFILEMGR_EnumInit(pIFileMgr, MP_MEDIA_DIR, FALSE);
while (file_no < MP_MAX_FILES && IFILEMGR_EnumNext(pIFileMgr, &fi))
{
char * szName;
// szName = get_file_name(fi.szName);
STRCPY(pMe->m_szFileArray[file_no] , fi.szName);
file_no++;
}
pMe->NumFiles = file_no;
IFILEMGR_Release(pIFileMgr);
pIFileMgr = NULL;
}
/*===========================================================================
This function returns the file name portion of the path.
===========================================================================*/
static char * get_file_name(const char * psz)
{
char * pszName = STRRCHR(psz, (int)DIRECTORY_CHAR);
if (pszName)
pszName++;
else
pszName = (char *)psz;
return pszName;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -