2013-07-21 4 views
0

Я хочу, чтобы в моей игре было несколько sfx. Сначала я открываю несколько файлов MP3 mciSendString("open Muzle.mp3 alias Muzle");.c threads - почему mmsystem (используя mciSendString) не воспроизводит звуковой файл?

Моя проблема в том, что mciSendString("play Muzle from 0"); по-прежнему вызывает небольшое отставание, и игра должна часто воспроизводить звуки.

В другом вопросе я прочитал, что использование потоков решит проблему. Я совершенно новичок в использовании потоков. Проблема в том, что звук не воспроизводится: p. Я проверил, что поток работает правильно, давая cout в конце.

У меня есть эта функция сейчас:.

void Shout(string SoundName){ 
    string FNstr; 
    wstring FNwstr; 
    FNstr = "play " + SoundName + " from 0"; 
    FNwstr.assign(FNstr.begin(), FNstr.end()); 
    mciSendString(FNwstr.c_str(), NULL, 0, NULL); 
    Sleep(2000); 
    cout << "Test woi\n"; 
} 

(я пытался без сна тоже интересно, если мне это нужно, потому что если поток достигает конца, он может получить удаленные и звук прекращается ... Я не уверен, как работают нити или mmsystem)

Если я просто назову эту функцию Shout(), она будет воспроизводить звук, выполнять Sleep (2000), а затем cout. Все работало нормально. Но я должен использовать потоки, поэтому я стараюсь:

thread(Shout, "Muzle"); 

и у меня возникла ошибка: вызывается abort(). Я понял, что я, возможно, потребуется, чтобы отделить нить:

thread t(Shout, "Muzle"); 
t.detach(); 

С этим, все выглядело работать нормально (через 2 секунды, я вижу «Test WOI», напечатанный на консоли), но ни один звук не воспроизводится.

Хм, спасибо за чтение всего ^. ^. Вы знаете, как решить эту проблему?

ответ

0

Возможно, у вас есть постоянная постоянная резьба, которая: 1. Ожидает, что звук будет закончен, прежде чем двигаться дальше (при условии, что это так, как вы хотите, чтобы он работал). Возможно, вы можете использовать опцию "wait". 2. Если вы не воспроизводите звук, ждет команды для воспроизведения следующего звука - использование pipe для отправки сообщений в поток будет одним из таких решений, но вы можете использовать другие методы.

+0

Мне нужна игра, чтобы иметь возможность воспроизводить сразу несколько звуков, поэтому, если я правильно понимаю, я не буду использовать ожидание, если у меня будет только один поток. Но проблема в том, что звук вообще не воспроизводится, когда я вызываю его с помощью потока xD. Я не знаю, почему это происходит. –

+0

Хорошо, я точно не знаю, что вам нужно делать. Есть много вещей, которые возникают, если вы google для «воспроизведения нескольких звуков с помощью MCI» и других, которые придумывают «несколько потоков MCIsendstring», и некоторые из предложений, по-видимому, подразумевают, что это не так просто сделать в вторичный поток - я думаю, из-за того, как работает обработка событий. Если вы чувствуете, что мой ответ не пригодится, я его удалю. –