Denselben Sound mehrmals gleichzeitig abspielen.

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Serge
Beiträge: 66
Registriert: 20.09.2004 20:44
Kontaktdaten:

Denselben Sound mehrmals gleichzeitig abspielen.

Beitrag von Serge »

Wenn ich einen Sound lade, ihn Abspiele und dann nach kurzer Zeit wieder abspiele, wird das erste Abspielen abgebrochen. Dies führt oft zu nicht gerade schönen Soundschnipseln.

Nunja wie könnte ich das verhindern?
Ich habe mir erst überlegt, die Soundeffekte beim abspielen mit catchsound zu laden, abzuspielen und dann zu löschen. Ich habe mit den ganzen Catch... befehlen noch nichts gemacht, aber wenn ich mich nicht irre, funktioniert es ja so, dass die Sachen gleich mit der .exe in den Speicher geladen werden und somit recht schnell zugriffsbereit sein sollten?
Aber da stellt sich trotzdem ein Problem: Man kann nicht ermitteln, ob der Soundeffekt schon zu ende abgespielt wurde oder nicht. Man könnte es mit einem Umweg übergehen, indem man die Länge zu jedem Soundeffekt in einer Datei aufschreibt und dann eine liste mit ner Laufvariable für die Sounds erstellt, die beim ablaufen dieser, gelöscht werden.
Oder gibt es da einen Sinvolleren Weg, z. B. mit Movies evtl.?
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

wenn ich dich richtig verstanden habe suchst du danach:
Syntax

PlaySound(#Sound [, Modus])
Beschreibung

Startet das Abspielen des angegebenen '#Sound's. 'Modus' ist optional und kann folgenden Wert annehmen:

0: Spielt den Sound nur einmal (Standard-Wert, wenn 'Modus' weggelassen wird)
1: Spielt den Sound fortwährend (in einer Endlos-Schleife). Nicht verfügbar unter Linux!
nach dem 2. parameter
Bild
Serge
Beiträge: 66
Registriert: 20.09.2004 20:44
Kontaktdaten:

Re: Denselben Sound mehrmals gleichzeitig abspielen.

Beitrag von Serge »

nein, nicht ganz ;)
Serge hat geschrieben:Wenn ich einen Sound lade, ihn Abspiele und dann nach kurzer Zeit wieder abspiele, wird das erste Abspielen abgebrochen. Dies führt oft zu nicht gerade schönen Soundschnipseln.
Damit meine ich natürlich dass das erste Abspielen des Sounds noch nicht zuende war :)
Ich will also, dass sich der selbe Sound sozusagen überlagert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also, der bricht wohl ab, weil er halt nur einmal im speicher steht

wenn du sicher bist, dass er sich überschneiden KANN, dann lade doch einfach 2-4 verschiedene sound nummern mit dem gleichen wav, und zähl ne variable hoch, welcher als nächster gestartet wird

braucht natürlich auch mehr speicher, vielleicht hat jemand anders noch ne bessere idee
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Serge
Beiträge: 66
Registriert: 20.09.2004 20:44
Kontaktdaten:

Beitrag von Serge »

Yoa das wäre sicher auch ne alternative, evtl. sogar besser als die von mir aufgeführte.
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Solltest du vorhaben 2 sounds - vornehmlich die selben - parallel laufen zu lassen, ohne dass der eine den anderen abbricht oder sonstwas passiert...
Gut gemeinter rat: nimm lieber Fmod...
Ich habs selbst schon versucht, kollega von mir auch, wir haben bisher keine Lösung mit PB bordmitteln gefunden (was nicht heisst dass es keine gibt), und sind deswegen auf Fod umgestiegen...
Willst du das ganze vermarkten solltest du dir mal audiere anguggen...
Beide in jedem fall besser und mit mehr funktionen versehen als die integrierten PB commands.


Mfg
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Serge
Beiträge: 66
Registriert: 20.09.2004 20:44
Kontaktdaten:

Beitrag von Serge »

Kenne mich mit exthernen Soundengines nicht so aus.
Da ich schon gerne alle Rechte an meinen Projekten haben möchte, käme da wohl nur Audiere in Frage?
Gibt es davon ne Extra library für PB oder wie baut man es ein?

bzw. Kann mir jemand sagen ob die Idee, die ich im ersten Posting aufgeführt habe funktionieren würde?
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Serge hat geschrieben:Kenne mich mit exthernen Soundengines nicht so aus.
Da ich schon gerne alle Rechte an meinen Projekten haben möchte, käme da wohl nur Audiere in Frage?
Gibt es davon ne Extra library für PB oder wie baut man es ein?
Info von PureArea.net / DLL+Tools: hat geschrieben:DLL-Komplettpaket "Audiere Sound System" mit vielen Beispielen zum Abspielen verschiedenster Musikformate (aiff, mp3, ogg, flac, mod, s3m, xm, it, wave), Erstellen eigener Töne & Geräusche, Effekte u.v.m. - Freeware (LGPL) - Homepage des Entwicklers
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Da es langsam sehr viele 'User-Libs' und 'DLL's + Tools' (wo ist eigentlich der Unterschied? Auf beiden Seiten findet man z.B. DLL's) in der PureArea gibt, sollte man hier vielleicht auch mal Kategorien (Sound, Grafik...) einführen, denn wenn man zum Beispiel Libs zum Thema Sound sucht, muss man quasi alles durchlesen, auf beiden Seiten (ich bin einfach faul :-))

Es reicht ja schon ein kleines Symbol, es muss ja nicht mal ne aufwändige Such- oder Filterfunktion sein... ansonsten kann ich zur Area nur sagen: Wow, was für ne Fundgrube (nicht zu vergessen das Codearchiv)!
Serge
Beiträge: 66
Registriert: 20.09.2004 20:44
Kontaktdaten:

Beitrag von Serge »

Hm, ich habe jetzt mal versucht Audiero einzubauen,
aber sobald ich bei einem meiner Soundeffect den Befehl "play()" aufrufe, stürtzt das Programm ab.
Ich habe auch mal versucht den Beispielcode zu verändern.

Code: Alles auswählen

If OpenLibrary(#audiere,"audiere.dll")=0
MessageRequester("","Error audiere.dll",0):End:EndIf

   
                                                ; opens a device
AudioDeviceObject.AudioDevice=AUDIERE_OpenDevice(@"winmm",@"buffer=1000,rate=44100")    
    If AudioDeviceObject=0
    MessageRequester("","Error AUDIERE_OpenDevice:",0):End:EndIf


                                                ; opens a music
SampleSourceObject.sampleSource= AUDIERE_OpenSampleSource(@"wechsel.wav",#FF_AUTODETECT) 
    If SampleSourceObject=0
    MessageRequester("","Error AUDIERE_OpenSampleSource",0):End:EndIf


                                                ; open a SoundEffect Object
SoundEffectObject.SoundEffect=AUDIERE_OpenSoundEffect(AudioDeviceObject,SampleSourceObject,#MULTIPLE)  
    If SoundEffectObject=0                                        
    MessageRequester("","Error OpenSound",0):End:EndIf 



; /**
; * Trigger playback of the sound.  If the SoundEffect is of type
; * single, This plays the sound If it isn't playing yet, and
; * starts it again If it is.  If the SoundEffect is of type
; * multiple, play() simply starts playing the sound again.
SoundEffectObject\play()                        ; play the soundEffect


MessageRequester("","Press OK to play a second sound because the SoundEffect is #MULTIBLE",0)


SoundEffectObject\play()                        ; play the soundEffect
Funktioniert einwandfrei

Veränderte Version:

Code: Alles auswählen

If OpenLibrary(#audiere,"audiere.dll")=0
MessageRequester("","Error audiere.dll",0):End:EndIf

structure test
   SampleSourceObject.sampleSource
  SoundEffectObject.SoundEffect
endstructure

dim test.test(0)
                                                ; opens a device
AudioDeviceObject.AudioDevice=AUDIERE_OpenDevice(@"winmm",@"buffer=1000,rate=44100")    
    If AudioDeviceObject=0
    MessageRequester("","Error AUDIERE_OpenDevice:",0):End:EndIf


                                                ; opens a music
test(0)\SampleSourceObject= AUDIERE_OpenSampleSource(@"wechsel.wav",#FF_AUTODETECT) 
    If SampleSourceObject=0
    MessageRequester("","Error AUDIERE_OpenSampleSource",0):End:EndIf


                                                ; open a SoundEffect Object
test(0)\SoundEffectObject=AUDIERE_OpenSoundEffect(AudioDeviceObject,test(0)\SampleSourceObject,#MULTIPLE)  
    If SoundEffectObject=0                                        
    MessageRequester("","Error OpenSound",0):End:EndIf 



; /**
; * Trigger playback of the sound.  If the SoundEffect is of type
; * single, This plays the sound If it isn't playing yet, and
; * starts it again If it is.  If the SoundEffect is of type
; * multiple, play() simply starts playing the sound again.
test(0)\SoundEffectObject\play()                        ; play the soundEffect


MessageRequester("","Press OK to play a second sound because the SoundEffect is #MULTIBLE",0)


test(0)\SoundEffectObject\play()                        ; play the soundEffect
Ich habe die Variablen in eine Structur getan.
Jetzt stürtzt das Programm ebenfalls ab.
(erst bei play, das laden und erstellen des sounds geht einwandfrei)
-> Somit kein dynamisches Arbeiten mit den Sounds möglich?

Oder woran könnte es liegen?
Antworten