Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Directsound mit der V_Dsound.inc

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 07.06.2007, 15:30    Titel: Directsound mit der V_Dsound.inc Antworten mit Zitat

Hi,
ich hab ja schon eine Weile mit Direktsound experimentiert und da sich keine Bugs bisher zeigten, habe ich ein kleines Tutorial dazu geschrieben und eine Zip mit Beispielen auf meiner HP eingerichtet.

Was kann man mit der V_Dsound.inc anfangen?
Damit kann man einen Teil der Möglichkeiten, den Directsound unter Windows bietet, in FreeBASIC - Programmen nutzen.
Sicher kann man schon mit den MCI-Funktionen WAV, MID und MP3 Sounddateien abspielen aber wer das schon als Geräuschkulisse in schnelleren Spielen versuchte bemerkt schnell unsynchrone Effekte.
D.h. optisch erscheint z.B. eine Explosion auf dem Bildschirm und der Knall wird verzögert aus dem Lautsprecher erschallen.
Oder schnell aufeinander folgende Geräusche werden nicht richtig wiedergegeben da nur ein Sound nach dem anderen abgespielt wird.
Das verbessert sich bei Directsound erheblich. Weiter ist es möglich die Lautstärke, die Balance und die Frequenz der wiedergegebenen WAV-Datei zu ändern.
Damit ist es möglich kleine akustische Effekt zu programmieren wie ich es bei dem Spiel Breakout versuchte.
z.B. wenn der Ball am linken Fensterrand anschlägt den Sound nur im linken Kanal auszugeben, entsprechend am rechte Fensterrand nur im rechten Kanal.

Wann setzt man Directsound am besten ein?
WAV-Dateien sind gegenüber MID und MP3 sehr große Dateien, daher ist es ratsam nur recht kurze Effekte damit zu realisieren.
Das PCM-Format der WAV's hat den Vorteil, dass es sofort, ohne Decodierung oder Wandlung, von der Soundkarte ausgegeben werden kann.
Für ein langes Hintergrundträllern eignen sich MID oder MP3, über die MCI-Funktionen abgespielt, wesentlich besser.

Was muss man in den eigenen Quelltext schreiben um die V_Dsound.inc zu nutzen?
Zunächst muss die V_Dsound.inc in das eigene Programm eingebunden werden, mit:

#Include once "V_Dsound.inc"
Ein extra includen der windows.bi kann man sich ersparen, dies wird schon in der V_Dsound.inc gemacht.

Um die Directsound Funktionen einzurichten bedarf es eines Windowhandls.
Für ein mit fbgfx (Screen, Screenres) erstelltes Fenster ist das kein Problem, mit:
Sceen 18,32
Dim As String title = "Volta's DSound"
Windowtitle title
Dim As HWND V_hwnd
v_hwnd = FindWindow(0, title) 'HWND des fbgfx-Window
ist das erledigt.

Mit diesem Handle wird der Directsound initialisiert. Schlägt bei der Initialisierung etwas fehl, wird das ganze Programm beenden.
If V_DSinit(V_hwnd) <> 0 then end
Ich habe die Initialisierung mit etlichen Fehlerabfragen bestückt, im Fehlerfall werden vor dem Programmabbruch extra Fehlerhinweise gegeben.

Danach kann man schon zwei WAV's laden, weil mit der Initialisierung zwei Soundbuffer (0 und 1) eingerichtet wurden.
V_DSLoadSound (0, "sonar.wav")
V_DSLoadSound (1, "pong.wav")
Wie weitere Soundbuffer für mehr WAV's eingerichtet werden folgt später.
Befinden sich die WAV's nicht im selben Verzeichnis muss natürlich der Pfad mit angegeben werden.

Das Abspielen der WAV's geht mit V_DStart(BufferNr) also:
V_DStart(0) 'hier wird sonar.wav abgespielt
Sleep 1000,1 '1 s warten bis abgespielt
V_DStart(1) 'hier wird pong.wav abgespielt
Ohne Sleep dazwischen würden beide WAV's (fast) gleichzeitig abgespielt.

Vor dem beenden des Programms müssen die Soundbuffer ordnungsgemäß entsorgt werden. Dies wird mit:
V_DSExit
End
automatisch für alle erstellten Soundbuffer erledigt.

Zusammengefasst als Beispielprogramm Test_VDSound_1.BAS:

Code:
#Include once "V_Dsound.inc"
Screen 18,32
Dim As String title = "Volta's DSound"
Windowtitle title
Dim As HWND V_hwnd
v_hwnd = FindWindow(0, title) 'HWND des fbgfx-Window
If V_DSinit(V_hwnd) <> 0 then end
V_DSLoadSound (0, "sonar.wav")
V_DSLoadSound (1, "pong.wav")

V_DStart(0)         'hier wird sonar.wav abgespielt
Sleep 1000,1        '1 s warten bis abgespielt
V_DStart(1)         'hier wird pong.wav abgespielt
sleep 2000          '2 s warten bis abgespielt

V_DSExit
End


Wie richtet man weitere Soundbuffer ein?
Dies geschieht automatisch mit der Funktion V_DSLoadSound (BufferNr, wavName).
Die Funktion erkennt ob ein neuer Sound in einen bestehenden Soundbuffer geladen werden soll oder ob dazu ein neuer Soundbuffer angelegt werden muss.
Diese Funktion hat noch eine weitere Option, ein dritter Parameter V_DSLoadSound (BufferNr, wavName, Anzahl_Buffer) erlaubt es mehrere Soundbuffer mit der gleichen Sound zu laden.
Z.B. V_DSLoadSound (3, "ping.wav",5) lädt die Soundbuffer 3, 4, 5, 6 und 7 (5 Buffer) mit der ping.wav. Wozu man das braucht erklärt der nächste Teil.

Kann man mehrere Sounds gleichzeitig abspielen?
Ja ... aber diese müssen in verschiedenen Soundbuffern stecken. D.h. jeder Sundbuffer kann nur einmal zum abspielen gestartet werden und spielt dann, wenn er nicht vorher gestoppt wird, die WAV bis zum Ende ab.
Dann kann er erneut mit V_DStart(BufferNr) gestartet werden.
Wird mit V_DStart(BufferNr) ein Sound gestartet der noch abspielt, wird die Wiedergabe gestoppt, der Soundbuffer auf den Anfang des Sounds eingestellt und erneut gestartet.
Damit kann man schon eine ganze Salve abfeuern, wie in der Test_VDSound_2.BAS gezeigt wird, aber bei zu kurzen Zeitabständen zwischen den Soundstarts ist der einzelne Sound nicht heraus zu hören.
Mit einem Trick ist es aber möglich den gleichen Sound in sehr kurzen Zeitabständen hintereinander komplett abzuspielen.
1. Man lädt mehrere Soundbuffer mit dem gleichen Sound: V_DSLoadSound (BufferNr, wavName, Anzahl_Buffer)
2. Die Abspielfunktion V_DSPlay_one (startBufferNr, Anzahl_Buffer) sucht ab der StartBufferNr einen "freien" Buffer der abgespielt werden kann.
z.B. (Auszug aus der Test_VDSound_3.BAS)
V_DSLoadSound (0, "ping.wav", 10)
Print "Hier wird jeder Sound komplett abgespielt .."
For i = 1 To 10
V_DSPlay_one(0, 10) 'hier wird ping.wav abgespielt
Sleep 50,1
Next
Um abzuschätzen wie viel Soundbuffer man in der eigenen Anwendung braucht, bin ich davon ausgegangen, dass man Sounds in 0,1ms Abstand noch unterscheiden kann. Bei kürzeren Abständen klingt es nach einem Echo.
Bei einer WAV von ca. 0,4s habe ich 5 Buffer dimensioniert und das hat sich in der Praxis in einem schnellen Spiel bewährt.
Wenn alle Soundbuffer gerade abgespielt werden verhält sich die V_DSPlay_one - Funktion nicht wie die V_DStart.
Sie ignoriert die Abspielanforderung und gibt nur -1 als Rückgabewert.
Dieses Verhalten der V_DSPlay_one - Funktion lässt sich natürlich auch beim Abspielen eines einzelnen Soundbuffers nutzen V_DSPlay_one (BufferNr, 1), mit der Anzahl_Buffer=1 wird der Sound nur abgespielt wenn der Soundbuffer "frei" ist.

Kann man einen Sound endlos abspielen?
Ja, V_DSPlayloop (BufferNr) macht das.
Achtung: kann nur durch V_DSStop (BufferNr) gestoppt werden.

Wie kann man die Lautstärke regeln?
Directsound kann die Lautstärke eines Sounds nicht erhöhen, sondern nur verringern (darum sind auch nur negative Werte erlaubt (-10000 .. 0) ).
D.h. ist die WAV - Lautstärke der Soundkarte niedrig eingestellt oder stumm geschaltet kann sie hier nicht eingeschaltet oder lauter gemacht werden.
Abfragen der Lautstärke:
volumen = V_DSGetVol(BufferNr)

Setzen der Lautstärke:
V_DSSetVol(BufferNr, volumen)

Wie kann man die Stereobalance beeinflussen?
Werte zwischen -10000 (100% links, 0% rechts) und +10000 (0% links, 100% rechts)
Abfragen der Balance:
pan = V_DSGetPan(BufferNr)

Setzen der Balance:
V_DSSetPan(BufferNr, pan)


Wie kann man die Abspielgeschwindigkeit beeinflussen?

Hiermit kann man die Samplingrate (Abtastrate) beeinflussen.
Der Begrif 'Frequenz' dafür ist eigentlich nicht richtig aber wenn die Abtastrate (SamplesPerSec) herunter gesetzt wird klingt der Sound wie mit einer tieferen Frequenz wiedergegeben.
Abfragen der Frequenz:
frequenz = V_DSGetFreq(BufferNr)

Setzen der Frequenz:
V_DSSetFreq(BufferNr, frequenz)

In der Test_VDSound_4 sind ein paar Beispiele wie man mit Directsound - Effekte spielen kann.

Viel Spass damit
Volta


Dateien in der V_Dsound.zip:
V_Dsound.txt
V_DSound.inc
Test_VDSound_1.BAS
Test_VDSound_1.exe
Test_VDSound_2.BAS
Test_VDSound_2.exe
Test_VDSound_3.BAS
Test_VDSound_3.exe
Test_VDSound_4.BAS
Test_VDSound_4.exe
PING.WAV
PONG.WAV
LIVE.WAV
SONAR.WAV
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 08.06.2007, 17:14    Titel: Antworten mit Zitat

Hi volta,
nachdem ich das Tutorial nochmal durchgesehen habe, bin ich immer
noch nicht auf meinen Fehler gekommen..
Gib mir bitte einen Schubs in die richtige Richtung zwinkern
Daß die 'großen' Dateien nicht abgespielt werden, liegt mglw. an ihrer Größe,
dies trifft auf Anyway.Wav(Nein, die ist nicht extra für Dusky_Joe) aber nicht zu traurig
Im Zip-File sind Source & Inc & die Sounddateien..
Für den schnellen Überblick ist dieser
Code:

#Include once "V_Dsound.inc"
Screen 18, 32
Dim As String Title="yPing"
WindowTitle Title
Const MaxFile=6, GehtNicht=0 'Bei GehtNicht=4 werden nur die volta Dateien benutzt, das funzt..
Dim As HWND y_hwnd
Dim As Long i
Dim As String Files(1 To MaxFile)={"Ping.Wav", "Live.Wav", "Anyway.wav", "Begin.wav", "Reply.wav", "NoReply.wav"}
y_hwnd=FindWindow(0, Title) 'HWND des fbgfx-Window
If V_DSinit(y_hwnd)<>0 Then
  ?Title &" failed to init sound :-(("
  End
End If
?"FB 0.17f"
For i=1 To MaxFile-GehtNicht
  ?Files(i)
  V_DSLoadSound(i-1, Files(i))
Next i

For i=1 To MaxFile-GehtNicht
  V_DStart(i-1) 'hier wird Puffer(i-1) abgespielt
  Sleep 1000, 1 '1 s warten bis abgespielt
Next i

V_DSExit

End
'V_DSound
'Fehler
'Anyway.wav Chanels?.
'btw: Was zahlt Chanel für die Reklame? :rofl:
btw:
mit sndPlaySound funktionierts..
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 08.06.2007, 22:01    Titel: Antworten mit Zitat

Hi,
ja da fehlt noch etwas in der Beschreibung grinsen
Deine Waves haben nicht das Standardformat (22kHz, 16bit, stereo) sondern 11.25kHz, 8bit und mono.
Wie man das umstellt kommt in Kürze.

Ha, achtet da doch einer auf Schleichwerbung?
Irgenwie muss ich mich ja finanzieren! lachen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 08.06.2007, 22:49    Titel: Antworten mit Zitat

ooooh,
man kann derzeit alte Beiträge nicht editieren und muss seeeeehr viiiiel Gedult haben.
Mit
V_DSWAVEFORMAT (v_Channels , v_SamplesPerSec , v_BitsPerSample)
also
Code:
...
V_DSWAVEFORMAT (1, 11025, 8)
If V_DSinit(V_hwnd) <> 0 then end
...
kannst du die 'Begin.wav' abspielen.

Die 'Anyway.Wav' ist vermutlich irgendwie gepackt??
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 08.06.2007, 23:30    Titel: Antworten mit Zitat

Dankeschön, volta grinsen
Anyway.Wav habe ich aus dem Netz irgendwoher, eine Sprachausgabe von leo.org?
Ich habe sie auch nicht bearbeitet..
volta hat Folgendes geschrieben:
Irgenwie muss ich mich ja finanzieren! lachen

Dafür habe ich natürlich vollstes Verständnis happy
..und um deinen Bekanntheitsgrad zu steigern, befindet sich jetzt auch ein Link
auf deine Homepage auf ytwinky.freebasic.de..
Aber wem erzähl ich das, der Suchdienst weiß das bestimmt schon vor lachen auf dem Boden rollen
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 05.08.2007, 15:54    Titel: Antworten mit Zitat

Die Frage kommt zwar etwas spät, aber wie kann ich die Länge eines Sounds ermitteln?

MfG Caran
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 05.08.2007, 20:09    Titel: Antworten mit Zitat

Hi,
eine Längenangabe habe ich in der VDSound nicht vorgesehen, ist auch meines Wissens nicht in DirectSound enthalten.

Eine überschlägige Berechnung kann man nach folgendem Schema machen:
Abspielzeit = Länge_der_WAV / Abtastrate / (mono=1 ; stereo=2) / (8bit=1 ; 16bit=2)

Also eine 25MB - Wav in 22KHz/s, 16Bit, Stereo
s= 25600 / 22 / 2 /2 ~ 290sek = 4'50Minuten
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 06.08.2007, 13:05    Titel: Antworten mit Zitat

Hi Volta,
danke für die schnelle Antwort.
MfG Caran
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz