关于音乐播放程序的问题,解决了一些问题,但还是存在问题

allen1986 2009-05-04 04:37:59
在大家的帮组下,解决了一些问题,但还是存在一些问题,再次麻烦大家。
主要程序如下,音乐正在播放的时候,我是在按了 下方向键 的时候调用 my_nextsong(),接着的几个函数在下面,播放下一首歌曲。但是,当我按了下方向键后,程序抛出错误:0X*******指令引用0X********内存,该内存不能为READ之类的错误,进行调试时,程序又正常的运行了。我的理解还是在调试模式下,程序运行速度相对较慢,所以系统有时间来进行事件处理。由于刚接触BREW,所以有些地方确实不知道怎么办好。很是苦恼。希望高手能详细指点下,到底是哪个环节出了问题,该怎么弥补。


//播放下一首
void my_nextsong(void* puser)
{
pMe->m_path="media\\2009010101.mp3"; //资源确实存在,路径没有错。
popmusic_player_stop(pMe);
}
//回调函数
void my_playnotify(void *puser, AEEMediaCmdNotify *pCmdNotify)
{
myfirstapp* pMe = (myfirstapp*)puser;

if (pCmdNotify->nCmd == MM_CMD_PLAY )
{
switch (pCmdNotify->nStatus)
{
case MM_STATUS_START:
break;
case MM_STATUS_TICK_UPDATE:
pMe->m_dwPlayprs += 1; //跟新当前进度
break;
case MM_STATUS_DONE:
if(pMe->m_pMedia!=NULL)
{
IMEDIA_RegisterNotify(pMe->m_pMedia, NULL, pMe);
IMEDIA_Release(pMe->m_pMedia);
pMe->m_pMedia=NULL;
}
my_play(pMe,pMe->m_path,my_playnotify);
break;
default:
break;
}
}
else if (pCmdNotify->nCmd == MM_CMD_GETTOTALTIME)
{
if (pCmdNotify->nStatus == MM_STATUS_DONE )
{
pMe->m_dwTotalTime= (uint16)(((uint32)pCmdNotify->pCmdData) / 1000 );
IMEDIA_Play(pMe->m_pMedia);
}

}
}
//播放函数
void my_play(void* pMfp,const char *pszFile,void*)
{
myfirstapp* pMe =(myfirstapp*) 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;

if(pMe->m_pMedia!=NULL)
{
IMEDIA_Release(pMe->m_pMedia);
pMe->m_pMedia=NULL;
}
ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_MEDIAMP3, (void **)&(pMe->m_pMedia)); /* 创建pimedia对象,指定使用MP3文件 */

nRet=IMEDIA_SetMediaData(pMe->m_pMedia, &pMe->m_md); /* 设置音频信息 */
if(nRet == SUCCESS)
{ //注册回调函数
pMe->b_register = IMEDIA_RegisterNotify(pMe->m_pMedia, player_handler, pMe);
if(SUCCESS == pMe->b_register)
{
IMEDIA_GetTotalTime(pMe->m_pMedia);
}

}
}
//停止函数
void popmusic_player_stop(void* pMfp)
{
myfirstapp* pMe = (myfirstapp*)pMfp;
if(pMe->m_pMedia!=NULL)
{
IMEDIA_Stop(pMe->m_pMedia);
}
}
...全文
148 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bll218 2009-05-07
  • 打赏
  • 举报
回复
感觉流程上没什么错误,不过有一点,我觉得有问题,就是STRDUP()的内存没有FREE。但我不知道这是不是引起错误的主要原因。
allen1986 2009-05-05
  • 打赏
  • 举报
回复
这个应该不会啊,我在使用(或释放)指针之前,会进行判空的啊,如果是空指针就不会去使用啊。上面的代码看起来一大行,其实没多少啊。就麻烦大家帮忙指出问题啊。
FLYUP_CHEN 2009-05-04
  • 打赏
  • 举报
回复
在调试状态下,如果程序走到某个断点,程序停了,但是系统时钟是没有停的,所以调试的时候是好的。你看一下是不是在notify还没有到来的时候你释放了内存,导致在notify函数里使用了这段内存,造成的错误。
allen1986 2009-05-04
  • 打赏
  • 举报
回复
这样做,是在case MM_STATUS_DONE:里面释放当前的资源,重新调用my_play()啊。如果不是这样的话,那该怎么做呢?实在是不明白啊,说具体点啊。
  • 打赏
  • 举报
回复
记住一定要在事件处理后执行异步操作
tx040316 2009-05-04
  • 打赏
  • 举报
回复
我有个问题啊,你的资源是这样给的绝对路径的吗?我感觉用一个数组来放比较好吧,操作和管理都比较方便。

774

社区成员

发帖
与我相关
我的任务
社区描述
为移动开发者提供丰富的解决方案、全面的技术下载。本版以游戏、多媒体、高效能等三个技术为核心,为开发者营造一个轻松、高效的学习交流平台。
社区管理员
  • Qualcomm开发
  • 霍大神
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧