如何实现MCI循环播放音乐.

时间:2022-04-04 10:56:10
各位高人,晚辈求教,问个老掉牙的问题,如何实现MCI循环播放音乐?望前辈们不惜辛苦唠叨两句

9 个解决方案

#1


加一个定时器
如:SetTimer(1,100,NULL);//每0.1秒检查一次

定时器里:
获取当前文件播放的的播放进度
如果进度=0,那么再重新播放文件

#2


哇,好主意

#3


哇,好主意,等我试试

#4


应该是判断当前的进度 大于等于 文件的长度

#5


发送play命令时设置MCI_NOTIFY标志,在播放完毕后会发送一个通知,
MCI_PLAY_PARMS mciPlay; 
mciPlay.dwCallback = (DWORD)hWnd; <== 通知消息的目标窗口句柄, 我们这里假设是一个对话框CDlg
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);


然后在对话框类CDlg中添加消息响应函数
ON_MESSAGE( MM_MCINOTIFY, &CDlg::OnMciNotify)

...
LRESULT CDlg::OnMciNotify(WPARAM wParam, LPARAM lParam)
{

if ( wParam == MCI_NOTIFY_SUCCESSFUL )
{
                //重新定位到文件的起始位置
MCI_SEEK_PARMS parms;
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START , (DWORD)&parms );
                 // 重新发送 play 命令 
 play();
return 0L;
}

#6


mci函数有一个获取播放状态的函数,可以利用一下

TCHAR songstatus[MAX_PATH];
TCHAR resName[MAX_PATH+20];
wsprintf(resName,"status %s mode",shortPathName);
mciSendString(resName,songstatus,MAX_PATH,0);
switch(cycle)
{

case 2://列表循环 
if(strcmp(songstatus,"playing")==0)
{

}
else
{
if(strcmp(songstatus,"stopped")==0)
{

PlayNextSong3(hwnd);
}
}
break;
}


//循环播放模式 
void PlayNextSong3(HWND hwnd)
{
TCHAR resName[MAX_PATH+10];
TCHAR buf[MAX_PATH];
indexSong=SendDlgItemMessage(hwnd,ID_LB,LB_GETCURSEL,0,0);
SendDlgItemMessage(hwnd,ID_LB,LB_GETTEXT,indexSong,(LPARAM)currentSong);
lstrcpy(preSongName,currentSong);
StopMusic(hwnd,preSongName);
indexSong+=1;
if(indexSong+1>count)
{
SendDlgItemMessage(hwnd,ID_LB,LB_SETCURSEL,-1,0);
PlayNextSong2(hwnd);
}
else
{
SendDlgItemMessage(hwnd,ID_LB,LB_SETCURSEL,indexSong,0);
SendDlgItemMessage(hwnd,ID_LB,LB_GETTEXT,indexSong,(LPARAM)currentSong);
GetShortPathName(currentSong,shortPathName,MAX_PATH);
wsprintf(resName,"play %s",shortPathName);
mciSendString(resName,buf,sizeof(buf),NULL);
GetLength(hwnd,currentSong);
}

#7


当然你需要一个定时器每隔1秒钟看看歌曲是否停止

#8


综合一下下~~~~

#9


还是5楼的方法更加好,设置定时器会影响软件运行的效率

#1


加一个定时器
如:SetTimer(1,100,NULL);//每0.1秒检查一次

定时器里:
获取当前文件播放的的播放进度
如果进度=0,那么再重新播放文件

#2


哇,好主意

#3


哇,好主意,等我试试

#4


应该是判断当前的进度 大于等于 文件的长度

#5


发送play命令时设置MCI_NOTIFY标志,在播放完毕后会发送一个通知,
MCI_PLAY_PARMS mciPlay; 
mciPlay.dwCallback = (DWORD)hWnd; <== 通知消息的目标窗口句柄, 我们这里假设是一个对话框CDlg
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);


然后在对话框类CDlg中添加消息响应函数
ON_MESSAGE( MM_MCINOTIFY, &CDlg::OnMciNotify)

...
LRESULT CDlg::OnMciNotify(WPARAM wParam, LPARAM lParam)
{

if ( wParam == MCI_NOTIFY_SUCCESSFUL )
{
                //重新定位到文件的起始位置
MCI_SEEK_PARMS parms;
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START , (DWORD)&parms );
                 // 重新发送 play 命令 
 play();
return 0L;
}

#6


mci函数有一个获取播放状态的函数,可以利用一下

TCHAR songstatus[MAX_PATH];
TCHAR resName[MAX_PATH+20];
wsprintf(resName,"status %s mode",shortPathName);
mciSendString(resName,songstatus,MAX_PATH,0);
switch(cycle)
{

case 2://列表循环 
if(strcmp(songstatus,"playing")==0)
{

}
else
{
if(strcmp(songstatus,"stopped")==0)
{

PlayNextSong3(hwnd);
}
}
break;
}


//循环播放模式 
void PlayNextSong3(HWND hwnd)
{
TCHAR resName[MAX_PATH+10];
TCHAR buf[MAX_PATH];
indexSong=SendDlgItemMessage(hwnd,ID_LB,LB_GETCURSEL,0,0);
SendDlgItemMessage(hwnd,ID_LB,LB_GETTEXT,indexSong,(LPARAM)currentSong);
lstrcpy(preSongName,currentSong);
StopMusic(hwnd,preSongName);
indexSong+=1;
if(indexSong+1>count)
{
SendDlgItemMessage(hwnd,ID_LB,LB_SETCURSEL,-1,0);
PlayNextSong2(hwnd);
}
else
{
SendDlgItemMessage(hwnd,ID_LB,LB_SETCURSEL,indexSong,0);
SendDlgItemMessage(hwnd,ID_LB,LB_GETTEXT,indexSong,(LPARAM)currentSong);
GetShortPathName(currentSong,shortPathName,MAX_PATH);
wsprintf(resName,"play %s",shortPathName);
mciSendString(resName,buf,sizeof(buf),NULL);
GetLength(hwnd,currentSong);
}

#7


当然你需要一个定时器每隔1秒钟看看歌曲是否停止

#8


综合一下下~~~~

#9


还是5楼的方法更加好,设置定时器会影响软件运行的效率