Soundwiedergabe beeinflusst Grafikablauf

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Soundwiedergabe beeinflusst Grafikablauf

Beitrag von manuelmassari »

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
);
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Krishty »

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:
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.
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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Chromanoid »

@manuelmassari: Bitte nur in einem Unterforum posten.
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von manuelmassari »

Vielen Dank für die schnelle und genaue Antwort,werde dies sofort ausprobieren..hättest du ein Beispiel für eine solche professionelle Anwendung?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4853
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Schrompf »

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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Krishty »

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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
starcow
Establishment
Beiträge: 523
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von starcow »

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.
:mrgreen: :mrgreen: :mrgreen:
Sowas ist Signatur würdig!
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Schrompf
Moderator
Beiträge: 4853
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Schrompf »

starcow hat geschrieben:
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.
:mrgreen: :mrgreen: :mrgreen:
Sowas ist Signatur würdig!
Unbedingt! Gehört doppelt zitiert!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Krishty »

starcow hat geschrieben:
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.
:mrgreen: :mrgreen: :mrgreen:
Sowas ist Signatur würdig!
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 ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von manuelmassari »

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?
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Krishty »

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).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Spiele Programmierer »

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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Krishty »

Spiele Programmierer hat geschrieben:Ich sehe aber ohnehin keinen Grund zur Verwendung von MP3.
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.

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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von manuelmassari »

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??
Benutzeravatar
Schrompf
Moderator
Beiträge: 4853
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Schrompf »

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.
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von manuelmassari »

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
);
Benutzeravatar
Schrompf
Moderator
Beiträge: 4853
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Schrompf »

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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von Krishty »

Was meinst du mit „synchron“? Bevor der erste Aufruf zurückkehrt?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von manuelmassari »

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.
NytroX
Establishment
Beiträge: 362
Registriert: 03.10.2003, 12:47

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von NytroX »

Was übergibst du denn als "fdwSound" Flags?
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.
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von manuelmassari »

Genau diesen Flag habe ich gesetzt,nun stoppt zwar die Hintergrundmusik nicht, aber der "schusssound" erklingt dabei nicht mehr..
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: Soundwiedergabe beeinflusst Grafikablauf

Beitrag von manuelmassari »

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..
Antworten