Win32 - Midi looping with MCISendString

匿名 (未验证) 提交于 2019-12-03 01:20:02

问题:

I'm making a game, and I'm using midi files for the background music. Here's the code I'm currently using:

void Game::play_music() {     // Start the music:     if(map.levelnumber % 2 == 0)     {         mciSendString(L"open MUSIC01.MID type sequencer alias Music1", NULL, 0, NULL);         mciSendString(L"play Music1", NULL, 0, NULL);         playing = "Music1";     } else {         mciSendString(L"open MUSIC02.MID type sequencer alias Music2", NULL, 0, NULL);         mciSendString(L"play Music2", NULL, 0, NULL);         playing = "Music2";     } }

This works great, except it only plays the song once through. I tried to loop it by adding "repeat" in the mci play command, but then it doesn't play anything at all. How can I loop the music?

回答1:

I looked at the multimedia command string reference on MSDN and found out that

TCHAR tch[100]; mciSendString("status [alias] mode", tch, 100, NULL);

will put whether [alias] is playing or stopped into "tch". If it's stopped, I just use the "seek [alias] to start" command to reload the midi file. I should mention that this causes a delay while stuff is computing or whatever - so your program will freeze if you don't put this in a separate thread.



回答2:

I know i'm a little late but i just encountered (and solved) this issue with:

mciSendString("seek [alias] to start", tch, 100, NULL);

This works for simple .wav files, i suppose it does well with .mid too. When i want to play an opened file, i just send 2 commands:

mciSendString("seek [alias] to start",NULL,100,NULL); mciSendString("play [alias]",NULL,0,NULL);


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!