2013-07-21 2 views
0

Je veux que mon jeu joue quelques sfx. Au début, j'ouvre un fichier mp3 mciSendString("open Muzle.mp3 alias Muzle");.c threads - pourquoi mmsystem (using mciSendString) ne lit pas le fichier son?

Mon problème est que mciSendString("play Muzle from 0"); cause toujours un peu de décalage et que le jeu doit jouer les sons fréquemment.

Dans une autre question, j'ai lu que l'utilisation de threads résoudra le problème. Je suis complètement nouveau à l'utilisation des threads. Le problème est maintenant que le son ne joue pas: p. J'ai vérifié que le fil fonctionne correctement en donnant un cout à la fin.

J'ai maintenant cette fonction.

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

(j'ai essayé sans dormir trop je me demande si je dois, parce que si le fil arrive à la fin, il peut obtenir supprimé et le son ... terminé Je ne suis pas sûr comment les threads ou le mmsystem fonctionnent)

Si j'appelle simplement cette fonction Shout(), il va jouer le son, faire le sommeil (2000), puis cout. Tout a bien fonctionné. Mais je dois utiliser des discussions, donc j'essaie:

thread(Shout, "Muzle"); 

et j'ai eu l'erreur: abort() a été appelé. Je me suis découvert que je peux avoir besoin de détacher le fil:

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

Avec cela, tout semblait fonctionner très bien (au bout de 2 secondes, je vois le « Test WOI » imprimé sur la console), mais aucun son a été joué. Hmm, alors merci de lire tout ^. ^. Savez-vous comment résoudre ce problème?

Répondre

0

Vous devez probablement avoir UN thread permanent qui: 1. Attend que le son se termine avant de continuer (en supposant que c'est comme cela que vous voulez qu'il fonctionne). Vous pouvez probablement utiliser l'option "wait" pour le faire. 2. En l'absence de son, attend une commande pour jouer le son suivant - l'utilisation d'un pipe pour envoyer des messages au thread serait une telle solution, mais vous pourriez utiliser d'autres méthodes.

+0

J'ai besoin du jeu pour pouvoir jouer plusieurs sons à la fois, donc si je comprends bien, je n'utiliserai pas l'attente si je n'ai qu'un seul fil. Mais le problème est, le son ne joue pas du tout quand je l'appelle avec un fil xD. Je ne sais pas pourquoi cela arrive. –

+0

Ok, je ne sais pas exactement ce que vous devez faire. Il y a beaucoup de choses qui se présentent si vous google pour "jouer plusieurs sons avec MCI", et d'autres qui viennent avec "MCIsendstring plusieurs threads", et certaines des suggestions semblent impliquer qu'il n'est pas si facile de le faire dans un fil secondaire - je pense à cause de la façon dont fonctionne eventhandling. Si vous pensez que ma réponse ne sert à rien, je l'efface. –