关于文件播放时程序抛出异常
下面是通过调用BREW的多媒体播放接口实现播放音乐文件的程序,第一个函数是播放回调函数,该函数在第二个函数里进行注册。第二个函数是文件播放函数,第三个函数是停止播放函数。假设通过按数字键1 调用文件播放函数,通过数字键2 调用停止播放函数。
在正常情况下,可以对文件进行播放与停止操作,也没有出现错误。但在一种情况下会出现错误,就是,我快速的,不停的进行数字1和数字2两个键交替按下。简单的说就是不停的,快速的执行 播放--停止--播放 ,操作,就会抛出:“应用程序异常...”的错误。
我估计是问题是,按了数字1后,回调函数还没有来的及注册,我就按了2。因为我重复按这两个键的速度是很快的。
不知道是不是这种原因,请高手看下,希望能提出程序中的不足之处,最好是能指出出现上面的错误的原因。
补充一点,就是我是在模拟器上进行上面的操作的。在模拟器调试状态下,出现这中错误的情况比执行状态下少很多,或着说在调试状态下不容易出现我上面说的错误。
/*********************************************************************
//函数名: popmusic_playResult
//功能描述: 响应播放回调消息
//输入参数:
//1, puser: 主程序结构体
//2, pCmdNotify: 播放器消息参数
//输出参数:
// 无
//返回值:
// 无
*********************************************************************/
static void popmusic_playResult(void *puser, AEEMediaCmdNotify *pCmdNotify)
{
//int ire;
myfirstapp* pMe = (myfirstapp*)puser;
int iMini = 0;
int iSecend = 0;
int itotletime = 0;
int iseekmode = MM_SEEK_MODE_TIME;
int iCurrent = 0;
double Addincrement = 0.00;
//MEMSET(pMe->m_szCurrPre, 0, 16);
if (pCmdNotify->nCmd == MM_CMD_PLAY || pCmdNotify->nCmd == MM_CMD_RECORD) // IMEDIA_Play/IMEDIA_Record events
{
switch (pCmdNotify->nStatus)
{
case MM_STATUS_TICK_UPDATE:
{
iCurrent = 0;
Addincrement = (1000+97)/1000.00;
pMe->m_dwPlayprs += Addincrement;
}
break;
default:
break;
}
}
else if (pCmdNotify->nCmd == MM_CMD_GETTOTALTIME)
{
if (pCmdNotify->nStatus == MM_STATUS_DONE || pCmdNotify->nStatus == MM_STATUS_ABORT)
{
MEMSET((char *)pMe->m_szTotalTime, 0, 16);
pMe->m_dwPlayprs = 0;
itotletime = (uint16)(((uint32)pCmdNotify->pCmdData) / 1000 );
pMe->m_dwTotalTime = itotletime;
IMEDIA_Play(pMe->m_pMedia); //播放文件
}
}
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;
}
}
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;
}
}
}
/*********************************************************************
//函数名: popmusic_play_file
//功能描述: 初始化IMedia接口对象,注册回调函数,以实现播放功能
//输入参数:
//1, pszFile: 歌曲全路径文件名
//2, player_handler: 播放消息回调函数
//输出参数:
// 无
//返回值:
// 无
*********************************************************************/
void popmusic_play_file(const char *pszFile, popmusic_play_notify_callback player_handler)
{
myfirstapp* pMe = pMfp;
int nRet;
char *filesz = STRDUP(pszFile);
pMe->m_md.clsData = MMD_FILE_NAME;
pMe->m_md.pData = (void *)filesz;
pMe->m_md.dwSize = 0;
pMe->szFileName = (char *)pszFile;
nRet = AEEMediaUtil_CreateMedia(pMe->pIShell, &pMe->m_md, &pMe->m_pMedia);
if(nRet == SUCCESS)
{
if(SUCCESS == IMEDIA_RegisterNotify(pMe->m_pMedia, player_handler, pMe))
{
IMEDIA_GetMediaParm(pMe->m_pMedia, MM_PARM_VOLUME, NULL, NULL);
IMEDIA_GetTotalTime(pMe->m_pMedia);
}
}
}
/*********************************************************************
//函数名: popmusic_player_stop
//功能描述: 停止播放
//输入参数:
// 无
//输出参数:
// 无
//返回值:
// 无
*********************************************************************/
void popmusic_player_stop()
{
myfirstapp* pMe = pMfp;
IMEDIA_Stop(pMe->m_pMedia);
}