Win32-Midi looping с MCISendString


Я делаю игру, и я использую midi-файлы для фоновой музыки. Вот код, который я сейчас использую:

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";
    }
}

Это отлично работает, за исключением того, что он воспроизводит песню только один раз. Я попытался зациклить его, добавив "repeat" в команду воспроизведения mci, но тогда он вообще ничего не воспроизводит. Как я могу зациклить музыку?

2 4

2 ответа:

Я посмотрел ссылку на мультимедийную командную строку на MSDN и обнаружил, что

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

Положит ли [псевдоним] воспроизводится или остановлено на "ТСН". Если он остановлен, я просто использую команду "seek [alias] to start" для перезагрузки midi-файла. Я должен упомянуть, что это вызывает задержку, когда материал вычисляется или что-то еще - так что ваша программа будет заморожена, если вы не поместите это в отдельный поток.

я знаю, что немного опоздал , но я только что столкнулся (и решил) эту проблему с:

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

Это работает для простых .wav файлов, я полагаю, что это хорошо работает и с .mid. Когда я хочу воспроизвести открытый файл, я просто посылаю 2 команды:

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