mciSendCommand和C,我想知道如何重复循环! [英] mciSendCommand and C , I want know how to repeat loop !
问题描述
我想问一个问题,如何通过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屋!