2011-01-04 6 views
2

Ich versuche, ein Schulprojekt mit SDL 1.2 zu beenden, aber ich habe einen Haken gefunden, den ich nicht verstehen kann.Kann ich Mix_OpenAudio und SDL_OpenAudio im selben Spiel verwenden?

Das Spiel hat mehrere Spielstatusmodule mit jeweils einer Funktion int Run (SDL_Surface * screen);

In jedem Modul, Run() Audio initialisiert, läuft durch die Schleife schließt dann Audio vor der Rückkehr.

alle Module verwenden Mix_OpenAudio() und Mix_CloseAudio()/init deinit den Ton und fein zusammenarbeiten.

Die einzige Ausnahme ist das Film-Movie-Modul, wo ich SDL_FFMpeg verwendet habe, um einen Film zu zeigen. Dieses Modul zwingt mich, stattdessen SDL_OpenAudio() zu verwenden.

SDL_OpenAudio nicht das erste Mal mit dem Fehler „Audio-Gerät ist bereits geöffnet“, aber dann funktioniert das zweite Mal.

Nachdem ich den Film Modul ausgeführt haben, alle der Ton in den anderen Modulen nicht mehr funktioniert, obwohl alle ihre Funktionen 0 für Erfolg zurück.

Wer hat eine Idee, was los ist?

+0

Code aus den relevanten Modulen anzeigen? – freedrull

+0

ugh ... danke trotzdem..aber was das Problem endlich gelöst hat, macht mich wütend. Ich wurde schließlich satt und steckte nur 5 weitere SDL_CloseAudio() Anrufe am Ende jedes Moduls ... und wüsste es nicht, das Problem ging weg! Also entfernte ich die zusätzlichen Anrufe nacheinander bis ...... Ich hatte die gleiche Nummer wie zu Beginn, außer dass es immer noch funktionierte ... – bitwise

+1

Der obige Kommentar klingt, als ob dein Compiler nicht bemerkt hätte, dass es Änderungen gab . Das kann Passieren. Eine Sache, die Sie tun sollten, wenn Sie darüber verwirrt sind, warum die Dinge nicht funktionieren, ist, den Compiler zu zwingen, das ganze Projekt neu zu kompilieren. Löschen Sie alle OBJ-Dateien von Hand oder verwenden Sie den Befehl "clear project" in Ihrer IDE. Nochmal laufen und sehen, ob es jetzt funktioniert. Wenn es immer noch nicht funktioniert, frage SO. ;-) – AudioDroid

Antwort

3

The conflicts chapter sagt dies:

Wenn SDL_mixer Funktionen Sie Notwendigkeit, die folgenden Funktionen von SDL zu vermeiden:

SDL_OpenAudio Verwenden Mix_OpenAudio statt.

deshalb denke ich, die Antwort auf Ihre Frage ist: Sie nicht SDL_OpenAudio() und MIX_OpenAudio() Funktionen mischen.

+0

Jan 4: "Ich versuche ein Schulprojekt mit SDL 1.2 zu beenden" du bist ein bisschen spät =) – bitwise

+0

@Nick Besser spät, dann nie;) –

0

SDL_OpenAudio() und SDL_CloseAudio() ist ein Paar Funktion, wenn Sie offen Audio einige, wo müssen Sie es schließen, oder Sie werden den Fehler wie

Audiogerät erhalten, ist bereits geöffnet

Bei der Verwendung von SDL_OpenAudio() handelt es sich um ein Singleton, bei dem es sich um einen SDL-Quellcode handelt. Möglicherweise finden Sie ein current_audio-Objekt, und dies ist das globale Audioobjekt. Wenn Sie mehrere Audiodateien gleichzeitig öffnen, kann dies zu einem Wettlauf führen.

Ich denke, diese Paar-Funktion eignet sich nur für Audio/Video-Wiedergabe, nicht für das Spiel (im Spiel kann mehrere Audio-Quelle zur gleichen Zeit sein), weil Sie wahrscheinlich nicht mehrere Audio-/Video-Zeit gleichzeitig spielen Zeit in einem einzigen Prozess. Bevor Sie mit der Wiedergabe einer Video-/Audiodatei beginnen, müssen Sie sicherstellen, dass der Audio-Status der SDL SDL_AUDIO_STOPPED lautet, indem Sie SDL_GetAudioStatus() anrufen. Nach einer Audio/Video-Datei spielen, sollten Sie so etwas tun:

SDL_LockAudio(); 
SDL_CloseAudio(); 
SDL_UnlockAudio(); 

Dadurch wird sichergestellt, dass das Audio vollständig zu stoppen.BTW, der Lock/Unlock-Vorgang soll sicherstellen, dass Ihr Audio-Callback-Code nicht an dem Punkt läuft.

Verwandte Themen