2017-07-09 1 views
0

Ich habe Probleme mit SDL_Mixer (mein Mangel an Erfahrung). Chunks und Musik spielen gut (mit Mix_PlayChannel und Mix_PlayMusic), und das gleichzeitige Abspielen von zwei Chunks ist kein Problem.SDL_Mixer spielt einen einzelnen Block über sich selbst möglich?

Mein Problem ist, dass ich einige chunk1 spielen möchte, und dann zweite Wiederholung von chunk1 die erste überlappend spielen. Ich versuche, einen einzelnen Block in schneller Folge zu spielen, aber stattdessen spielt er den Ton wiederholt in einem viel längeren Intervall ab (nicht so schnell wie ich es möchte). Ich habe die Konsolenausgabe getestet und meine Methode zum Abspielen/Looping ist nicht fehlerhaft, da ich Konsolenmeldungen sehen kann, die mit der richtigen Geschwindigkeit geloopt werden.

Ich habe ein Array von Chunks, die ich regelmäßig während der Initialisierung laden, mit Mix_LoadWAV();

Mix_Chunk *sounds[32]; 

Ich habe auch eine Funktion für das Spielen dieser Stücke reserviert:

void PlaySound(int snd_id) 
{ 
    if(snd_id >= 0 && snd_id < 32) 
    { 
     if(Mix_PlayChannel(-1, sounds[snd_id], 0) == -1) 
     { 
      printf("Mix_PlayChannel: %s\n",Mix_GetError()); 
     } 
    } 
} 

Der Versuch, einen einzelnen Ton mehrmals kurz hintereinander zu spielen (etwa 100 ms Verzögerung/10 Bp), bin ich der Ton gegeben Spielen in einem eingestellten, langsameren Intervall (etwa 500 ms oder so/2bps), obwohl die Funktion mit 10 bps aufgerufen wird.

Ich habe bereits "Mix_AllocateChannels (16);" um sicherzustellen, dass ich Kanäle zugewiesen habe (lassen Sie mich wissen, wenn ich das falsch verwende) und immer noch, ein einzelner Brocken aus dem Array weigert sich, mit einer bestimmten Rate zu spielen.

Irgendwelche Ideen/Hilfe wird geschätzt, sowie Kritik, wie ich diese Frage gestellt habe.

Antwort

1

Wie gesagt in der Dokumentation von SDL_mixer (https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_28.html): ".... -1 für den ersten freien unreserved channel"

Wenn Ihr Chunk also länger als 1,6 Sekunden (16 Kanäle * 100ms) ist, haben Sie nach 1,6 Sekunden keine Kanäle mehr, und Sie können keine neuen Chunks mehr abspielen, bis einer der Kanäle endet.

So gibt es grundsätzlich zwei Lösungen:

  1. mehr Kanäle zuweisen (mehr als: ChunkDuration (in sec)/Delay (in sec))
  2. Stopp ein Kanal, so dass Sie es verwenden können. (Und um es richtig zu machen, sollten Sie nicht -1 als Kanal verwenden, sondern eine Variable, die Sie jedes Mal erhöhen, wenn Sie einen Chunk spielen (vergessen Sie nicht, ihn auf 0 zurückzusetzen, wenn er der Anzahl Ihrer Kanäle entspricht))
Verwandte Themen