Soundwiedergabe beeinflusst Grafikablauf
-
- Beiträge: 28
- Registriert: 20.10.2012, 16:29
- Benutzertext: c++
Soundwiedergabe beeinflusst Grafikablauf
Hi Leute,ich wollte gerade das Spielebeispiel im Buch "C++ für Spieleprogrammierer" von Heiko Kalista (ein Raumgleiter schießt Asteoriden vom Himmel) mit div. Wav-Sounds vervollständigen und habe hierfür die Lösung in einer Funktion "PlaySound" gefunden. Immer wenn die Leertaste gedrückt wird und der Gleiter schießt soll ein klassischer Schuss-Ton zu hören sein. Dies funktioniert soweit auch ganz gut,nur friert das Bild während des Abspielens des Sounds immer für die Dauer der wav-Datei (ca. 1 Sekunde) ein sodass ein ein stockendes Bild entsteht. Habe versucht das Problem zu googlen,jedoch ohne Erfolg. Hat jeman eine Idee woher das kommt,bzw. wie man dies umgehen könnte? Vielen Dank schon einmal im Voraus! Hier die verwendete Funktion:
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound
);
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound
);
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
PlaySound() ist normalerweise eine synchrone Funktion, d.h, sie kehrt erst zurück, wenn sie ihre Aufgabe erledigt hat. Du suchst eine asynchrone Funktion, die sofort zurückkehrt und den Klang im Hintergrund weiter abspielt, während dein Spiel weiterläuft.
Das müsstest du erreichen können, indem du den SND_ASYNC-Schalter setzt. Steht auch in der Doku:
Das müsstest du erreichen können, indem du den SND_ASYNC-Schalter setzt. Steht auch in der Doku:
Damit dürfte es erstmal funktionieren; für professionelle Spiele nimmt man dann aber eine richtige Sound-API, die auch Lautstärkeregelung und Wiedergabegeschwindigkeit steuern kann. Die WinAPI ist nur für Benutzerschnittstellen gemacht; PlaySound() ist also für Fehler-Pings und Windows-Start-Sound gedacht, nicht für hundert Klänge pro Sekunde wie in Videospielen.SND_ASYNC The sound is played asynchronously and PlaySound returns immediately after beginning the sound. To terminate an asynchronously played waveform sound, call PlaySound with pszSound set to NULL.
SND_SYNC The sound is played synchronously, and PlaySound returns after the sound event completes. This is the default behavior.
- Chromanoid
- Moderator
- Beiträge: 4275
- Registriert: 16.10.2002, 19:39
- Echter Name: Christian Kulenkampff
- Wohnort: Lüneburg
Re: Soundwiedergabe beeinflusst Grafikablauf
@manuelmassari: Bitte nur in einem Unterforum posten.
-
- Beiträge: 28
- Registriert: 20.10.2012, 16:29
- Benutzertext: c++
Re: Soundwiedergabe beeinflusst Grafikablauf
Vielen Dank für die schnelle und genaue Antwort,werde dies sofort ausprobieren..hättest du ein Beispiel für eine solche professionelle Anwendung?
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
FMod, Wwise, Bass... gibt noch einige mehr. Das sind alles jeweils Funktionsbibliotheken von Firmen, die sie Dir zu bestimmten Lizenzbedingungen zur Verfügung stellen. Für normale Windows-Software bekommst Du die Libs zumeist kostenlos und ohne Beschränkungen, außer dass Du den Quelltext nicht bekommst.
Und eine Warnung: eine solche Soundbibliothek kann eine Menge, ist aber natürlich auch deutlich schwerer zu benutzen als der eine Funktionsaufruf, den Du bisher verwendet hast. Nimm Dir also Zeit, schau Dir die (zumeist englischsprachige) Dokumentation an oder google Dir ein Tutorial.
Und eine Warnung: eine solche Soundbibliothek kann eine Menge, ist aber natürlich auch deutlich schwerer zu benutzen als der eine Funktionsaufruf, den Du bisher verwendet hast. Nimm Dir also Zeit, schau Dir die (zumeist englischsprachige) Dokumentation an oder google Dir ein Tutorial.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
Ich würd’s später machen. Bau jetzt deine Sounds ein, mach das Spiel weiter … und wenn du in ein paar Monaten merkst, dass es stottert oder Klänge verschwinden oder so, dann fang an, dir „richtige“ Bibliotheken anzusehen. Beim ersten Mal macht man’s eh falsch, dann sollte man keine Energie darauf verschwenden, es auf die aufwendigste Art und Weise falsch zu machen.
- starcow
- Establishment
- Beiträge: 560
- Registriert: 23.04.2003, 17:42
- Echter Name: Mischa Schaub
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
:mrgreen: :mrgreen: :mrgreen:Krishty hat geschrieben:Beim ersten Mal macht man’s eh falsch, dann sollte man keine Energie darauf verschwenden, es auf die aufwendigste Art und Weise falsch zu machen.
Sowas ist Signatur würdig!
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
Unbedingt! Gehört doppelt zitiert!starcow hat geschrieben::mrgreen: :mrgreen: :mrgreen:Krishty hat geschrieben:Beim ersten Mal macht man’s eh falsch, dann sollte man keine Energie darauf verschwenden, es auf die aufwendigste Art und Weise falsch zu machen.
Sowas ist Signatur würdig!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
Pack’s ruhig in deine Signatur :D … musst mich auch nicht erwähnen. Aber bitte korrigier’s zu „aufwändigste“, bevor das die Runde macht ;)starcow hat geschrieben::mrgreen: :mrgreen: :mrgreen:Krishty hat geschrieben:Beim ersten Mal macht man’s eh falsch, dann sollte man keine Energie darauf verschwenden, es auf die aufwendigste Art und Weise falsch zu machen.
Sowas ist Signatur würdig!
-
- Beiträge: 28
- Registriert: 20.10.2012, 16:29
- Benutzertext: c++
Re: Soundwiedergabe beeinflusst Grafikablauf
Alles klar werde ich machen, ich werde ebenfalls probieren Ogg-Dateien bzw. Mp3-Dateien als Hintergrundmusik einzubauen. Soweit ich gesehen habe kann man dies mit meiner aktuellen Funktion aber nicht,ist dies korrekt?
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
Ja stimmt. Die alte WinAPI hat nur WAV-Unterstützung eingebaut (genauer: PCM). Weil das, wie gesagt, für kurze Pings in der Benutzeroberfläche ausreicht. Für MP3-Hintergrundmusik u.Ä. brauchst du dann eine fortgeschrittene Bibliothek (oder sehr viel Herumhacken in der WinAPI).
-
- Establishment
- Beiträge: 426
- Registriert: 23.01.2013, 15:55
Re: Soundwiedergabe beeinflusst Grafikablauf
Man kann auch eine API wie XAudio oder OpenAL nehmen und dann noch eine passende Lib für die Formate deiner Wahl. Für Ogg Vorbis wären das zum Beispiel LibOgg und LibVorbis. So mache ich das im Moment.
Das ist natürlich etwas mehr Arbeit als ein Komplettpacket wie Fmod, allerdings ist es dafür auch frei von allen Kosten und dann genau auf deine Zwecke zugeschnitten.
Bei MP3 kenne ich übrigens keine freie Bibliothek. Ich sehe aber ohnehin keinen Grund zur Verwendung von MP3.
Das ist natürlich etwas mehr Arbeit als ein Komplettpacket wie Fmod, allerdings ist es dafür auch frei von allen Kosten und dann genau auf deine Zwecke zugeschnitten.
Bei MP3 kenne ich übrigens keine freie Bibliothek. Ich sehe aber ohnehin keinen Grund zur Verwendung von MP3.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
Die Verbreitung, und damit die Infrastruktur? Amazon schickt die Musik nicht als Ogg, und wenn ich meine eigene Musik in einem Spiel hören möchte, soll gefälligst keine Konvertierungsarbeit anfallen.Spiele Programmierer hat geschrieben:Ich sehe aber ohnehin keinen Grund zur Verwendung von MP3.
MP3 wird zumindest unter Windows nativ unterstützt. Das ist dann natürlich keine Freie Software, aber a) hat der Endnutzer bereits die Lizenz dafür gezahlt (beim Windows-Kauf) und b) will ich bitte nicht noch hunderttausend Zeilen oder eine Distributable mehr in meinem Projekt für etwas, das mein PC sowieso schon schafft.
-
- Beiträge: 28
- Registriert: 20.10.2012, 16:29
- Benutzertext: c++
Re: Soundwiedergabe beeinflusst Grafikablauf
Habe nun probiert eine Hintergrundmusik in das Projekt einzubauen,was mit der Funktion "PlaySound" auch wunderbar geklappt hat (habe zuerst die Dateien einfach in wav umgewandelt). Habe aber nun die Problematik,dass der Sound für den Schuss die Hintergrundmusik stoppt,wahrscheinlich da derselbe Kanal gleichzeitig benutzt wird. Ich habe bereit mit ein paar Flags der Api herumgespielt (snd_nostop z.b.), leider ohne Erfolg. Weiß hier jeman Rat??
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
Ohne die PlaySound()-Funktion zu kennen, behaupte ich, dass das die Grenzen der Funktion sind. Du müsstest jetzt tatsächlich auf eine richtige Sound-API umsteigen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
-
- Beiträge: 28
- Registriert: 20.10.2012, 16:29
- Benutzertext: c++
Re: Soundwiedergabe beeinflusst Grafikablauf
Die Funktion habe ich oben angegeben , es handelt sich um eine win-API..Hier müsste es doch auch die Möglichkeit geben 2 Sounds synchron abzuspielen??
Hier die verwendete Funktion:
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound
);
Hier die verwendete Funktion:
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound
);
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
Warum "müsste" es das? Wie gesagt: die Funktion hat ihre Grenzen. Höchstwahrscheinlich ist das Phänomen so eine Grenze. Und demzufolge ist die einzige Lösung für das Problem, andere Funktionen zu benutzen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Soundwiedergabe beeinflusst Grafikablauf
Was meinst du mit „synchron“? Bevor der erste Aufruf zurückkehrt?
-
- Beiträge: 28
- Registriert: 20.10.2012, 16:29
- Benutzertext: c++
Re: Soundwiedergabe beeinflusst Grafikablauf
Mit synchron meine ich gleichzeitig,sprich die Hintergrundmusik läuft permanent und gleichzeitig sollen bei Drücken einer bestimmten Taste die Schusstöne erklingen. Die Hintergrundmusik soll dabei allerdings nicht stoppen.
Re: Soundwiedergabe beeinflusst Grafikablauf
Was übergibst du denn als "fdwSound" Flags?
Versuch mal noch SND_NOSTOP mit zu übergeben, das spielt den Sound ohne den anderen zu stoppen.
Versuch mal noch SND_NOSTOP mit zu übergeben, das spielt den Sound ohne den anderen zu stoppen.
SND_NOSTOP
The specified sound event will yield to another sound event that is already playing in the same process. If a sound cannot be played because the resource needed to generate that sound is busy playing another sound, the function immediately returns FALSE without playing the requested sound.
If this flag is not specified, PlaySound attempts to stop any sound that is currently playing in the same process. Sounds played in other processes are not affected.
-
- Beiträge: 28
- Registriert: 20.10.2012, 16:29
- Benutzertext: c++
Re: Soundwiedergabe beeinflusst Grafikablauf
Genau diesen Flag habe ich gesetzt,nun stoppt zwar die Hintergrundmusik nicht, aber der "schusssound" erklingt dabei nicht mehr..
-
- Beiträge: 28
- Registriert: 20.10.2012, 16:29
- Benutzertext: c++
Re: Soundwiedergabe beeinflusst Grafikablauf
Weiters habe ich eine andere Methode um eine Hintergrundmusik abzuspielen probiert, nämlich mit my.computer.sound.play..allerdings habe ich hier jetzt die Problematik, dass meine Entwicklungsumgebung diese Funktion nicht erkennt (ich benutze visual Studio 2008). Welchen speziellen Präprozessorbefehl muss man hier eingeben, bzw. welche lib. Einbinden? Habe im Internet leider nichts passendes gefunden, auch nicht unter msdn..