mciSendCommand和C,我想知道如何重复循环! [英] mciSendCommand and C , I want know how to repeat loop !

查看:100
本文介绍了mciSendCommand和C,我想知道如何重复循环!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想问一个问题,如何通过mciSendCommand直接使用多媒体命令"来重复播放wavefile.

好吧,实际上,我知道当带有标志MCI_NOTIFY的Command MCI_PLAY完成时,我可以等待"MM_MCINOTIFY",然后再次开始新的播放.除非我发送"MCI_STOP"命令,否则播放不会结束.

就像遵循C语言代码

1.用MCI_NOTIFY
播放声音

MCI_PLAY_PARMS parmPlay;
static BOOL    bRepeat;

parmRec.dwCallback = hwnd;
parmRec.dwFro      = 0;
parmRec.dwTo       = 0;

bRepeat = TRUE ;

mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&parmPlay);


2.播放完成后收到通知消息

case MM_MCINOTIFY:

switch (wParam)
{
case MCI_NOTIFY_SUCCESSFUL:

     if (bRepeat)//start new Play again
     {
         mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY,
                       (DWORD)&parmPlay);
     }

     return TRUE ;
}

break ;


我想知道是否可以直接使用MCI命令通过mciSendCommand进行重复播放.玩.
sndPlaySound为此提供了一个选项(SND_LOOP).


实际上,我知道也可以使用"waveOutOpen"来简单地重复播放wavefile.

1.打开waveOut-Device

static HWAVEOUT     hWaveOut ;
static WAVEFORMATEX waveform ;

//assume wavefile is record in single channel and 8-bit, 11.025 kHz

waveform.wFormatTag      = WAVE_FORMAT_PCM ;
waveform.nChannels       = 1 ;
waveform.nSamplesPerSec  = 11025 ; //11025 Hz
waveform.nAvgBytesPerSec = 11025 ; //11025 Hz
waveform.nBlockAlign     = 1 ;
waveform.wBitsPerSample  = 8 ;
waveform.cbSize          = 0 ;

waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveform,
            (DWORD) hwnd, 0, CALLBACK_WINDOW) ;

//"waveOutOpen" sent "MM_WOM_OPEN" in message-queue
//hwnd will receive it ,which is specified in "waveOutOpen"


2. MM_WOM_OPEN

static PWAVEHDR     pWaveHdr ;
static DWORD        dwRepetitions = 1; //play 1 time when Init
static BOOL         bRpeat = TRUE ;

case MM_WOM_OPEN:

if (bRpeat) dwRepetitions = -1 ; //"-1" means repeat.

pWaveHdr->lpData          = pBuffer ; //waveDate
pWaveHdr->dwBufferLength  = dwDataLength ;
pWaveHdr->dwBytesRecorded = 0 ;
pWaveHdr->dwUser          = 0 ;
pWaveHdr->dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP ;
pWaveHdr->dwLoops         = dwRepetitions ; //times of Playing
pWaveHdr->lpNext          = NULL ;
pWaveHdr->reserved        = 0 ;

//prepare Buffer
waveOutPrepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;

//send Buffer to waveOut-Device to start playing
waveOutWrite (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;

//the playing doesn''t stop unless call waveOutPause or waveOutReset
// hwnd will receive MM_WOM_DONE, when playing stopped


我只是想知道为什么MciSendCommand没有设计出可以重复播放的Command ...


I want ask a question about how to use a "Multimedia Commands" directly to repeat-play a wavefile by mciSendCommand.

well, actually I know I could wait the "MM_MCINOTIFY" when Command MCI_PLAY with flags MCI_NOTIFY is done, and start a new play again. and playing will not be end unless I send "MCI_STOP" Command.

just like follow C language Code

1. play sound with MCI_NOTIFY

MCI_PLAY_PARMS parmPlay;
static BOOL    bRepeat;

parmRec.dwCallback = hwnd;
parmRec.dwFro      = 0;
parmRec.dwTo       = 0;

bRepeat = TRUE ;

mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&parmPlay);


2. Receive NOTIFY Message when Playing done

case MM_MCINOTIFY:

switch (wParam)
{
case MCI_NOTIFY_SUCCESSFUL:

     if (bRepeat)//start new Play again
     {
         mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY,
                       (DWORD)&parmPlay);
     }

     return TRUE ;
}

break ;


I want to know if Can I use a MCI-command directly to repeat-play by mciSendCommand.

解决方案

i didn''t find anything with mci commands for repeating the play.
sndPlaySound has an option for that (SND_LOOP).


actually I know could use "waveOutOpen" to repeat-play wavefile easy too.

1. Open waveOut-Device

static HWAVEOUT     hWaveOut ;
static WAVEFORMATEX waveform ;

//assume wavefile is record in single channel and 8-bit, 11.025 kHz

waveform.wFormatTag      = WAVE_FORMAT_PCM ;
waveform.nChannels       = 1 ;
waveform.nSamplesPerSec  = 11025 ; //11025 Hz
waveform.nAvgBytesPerSec = 11025 ; //11025 Hz
waveform.nBlockAlign     = 1 ;
waveform.wBitsPerSample  = 8 ;
waveform.cbSize          = 0 ;

waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveform,
            (DWORD) hwnd, 0, CALLBACK_WINDOW) ;

//"waveOutOpen" sent "MM_WOM_OPEN" in message-queue
//hwnd will receive it ,which is specified in "waveOutOpen"


2. MM_WOM_OPEN

static PWAVEHDR     pWaveHdr ;
static DWORD        dwRepetitions = 1; //play 1 time when Init
static BOOL         bRpeat = TRUE ;

case MM_WOM_OPEN:

if (bRpeat) dwRepetitions = -1 ; //"-1" means repeat.

pWaveHdr->lpData          = pBuffer ; //waveDate
pWaveHdr->dwBufferLength  = dwDataLength ;
pWaveHdr->dwBytesRecorded = 0 ;
pWaveHdr->dwUser          = 0 ;
pWaveHdr->dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP ;
pWaveHdr->dwLoops         = dwRepetitions ; //times of Playing
pWaveHdr->lpNext          = NULL ;
pWaveHdr->reserved        = 0 ;

//prepare Buffer
waveOutPrepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;

//send Buffer to waveOut-Device to start playing
waveOutWrite (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;

//the playing doesn''t stop unless call waveOutPause or waveOutReset
// hwnd will receive MM_WOM_DONE, when playing stopped


I just wonder why MciSendCommand didnt design a Command can repeat to play...


这篇关于mciSendCommand和C,我想知道如何重复循环!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆