|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 25.02.2007, 05:24 Titel: Winmm und DSound |
|
|
Mehr aus langeweile und zufall bin ich auf FreeBASIC gekommen und hab damit meinen Spass am Programmieren wieder gefunden da es nicht viele unterschiede gegenüber PowerBASIC gab.
Anfänglich über die verbesserung und vereinfacherung vieler functionen erfreut tauchten gleichzeitig aber auch neue und komplexere probleme beim Game-Development auf...
Ohne Sound ist das beste Spiel nichts, da gibts ja immernoch FMod, und so einfach und gut es auch ist, finde ich es einfacher und sinnvoller von Windows vorhandene API's zu nutzen aus Lizens und Ego gründen
Jetzt ist es aber leider nicht ganz so einfach wie ich mir das vorgestellt habe, denn leider habe ich keine ahnung wie ich die Winmm-Waveout functionen für das streamen von WAV-dateien nutzen kann und bei DSound ist es mir bislang auch nur gelungen mir alle geräte anzeigen zu lassen.
Hat hier möglicherweise einige erfahrung mit den beiden DLLs oder eine ahnung wo ich eine gut verstädnliche referenz zu den wichtigsten functionen finde ?! |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 25.02.2007, 19:55 Titel: |
|
|
Irgendwie war es nicht wirklich hilfreich,
Das problem ist das ich bei allen beschreiben und Examples, die hauptsächlich in c sind bei dem Setzen des Prioritäten Level nur zwei werte finde in der FreeBASIC Declaration sind das aber drei werte ?!
zum testen habe ich jetzt erstma:
Code: |
Dim DSobj as LPDIRECTSOUND8
Dim m as Hresult
m=DirectSoundCreate8 (NULL,@DSobj,NULL)
|
da m=0 ist geh ich davon aus das es richtig ist und geklappt hat, aber weiter...
IDirectSound8_SetCooperativeLevel(???1,DSSCL_PRIORITY,???2)
was gehört da rein und wie geht das ?? |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 25.02.2007, 20:08 Titel: |
|
|
C??? ... hast du den Link mal gelesen?!? .. da steht "VB"!!! ... das hat nix mit C zu tun ...
im grunde kannst du den VB code fast komplett in dein prog rein kopieren, udn das sollte funzen!
Dein SetCorpLevel, is die zugriffsrecht-Festlegung. Du kannst deiner Hardware sagen, welche Programme alles auf die Geräte zugreifen dürfen, oder auch nicht.
Zitat: | 4.6 Erstellen des DirectSound-Objektes
Um nun das DirectSound-Objekt zu erstellen und zu aktivieren, fügen wir in
unser Beispiellisting die DirectSoundCreate()-Methode ein und übergeben dieser
die Guid des aktiven Audiogerätes.
Set m_ds = g_dx.DirectSoundCreate (dsEnum.GetGuit(1))
SetCooperativeLevel()
Setzt den Cooperative Level der Applikation auf die Soundkarte.
object.SetCooperativeLevel(hwnd As Long, _
level As CONST_DSSCLFLAGS)
object ein gültiges DirectSound-Objekt
hwnd Windows-Handle der Aplikation
level Prioritätsstufe CONST_DSSCLFLAGS
Da Windows eine Multitaskingumgebung besitzt und mehrere Applikationen auf
die Soundkarte gleichzeitig zugreifen können, setzen wir ähnlich wie bei Direct-
Draw den Cooperative Level und schützen somit unsere Anwendung vor fehlerhaften
Zugriffen auf geschützte Bereiche.
m_ds.SetCooperativeLevel Form1.hWnd, DSSCL_NORMAL
• Normal Cooperative Level
Im normalen Cooperative Level ist es nicht möglich, das Format des primären
SoundBuffers zu ändern sowie in diesen zu schreiben. Alle Applikationen mit
diesem CooperativeLevel nutzen das Primärbufferformat 22KHz Stereo Sound
und 8 Bit Sampling. In diesem Modus ist es möglich, das Audiogerät zwischen
verschiedenen Applikationen hin und her zu schalten.
• Priority Cooperative Level
Wenn DirectSound im Priority Cooperative Level Modus ausgeführt wird, hat
Ihre Applikation das erste Recht auf die Hardwarerecourcen des Audiogerätes.
Das Format des primären Soundbuffers sowie das Komprimieren des On-
Board-Speichers des Audiogerätes ist möglich.
• Exclusive Cooperative Level
Im Exlusive Cooperative Level hat, wie der Name schon sagt, Ihre Applikation
alle exclusiven Zugriffsrechte auf das Audiogerät. Ist die Anwendung aktiv, ist
der Soundbuffer ausschließlich Ihrer Applikation zugeordnet. Andere laufende
Anwendungen haben keinen Zugriff mehr auf das Audiogerät.
• Write-primary Cooperative Level
Der höchste Cooperative Level ist der Write-primary Cooperative Level.
Wenn DirectSound mit dieser Einstellung ausgeführt wird, hat Ihre Anwendung
direkten Zugriff auf den primären Soundbuffer. In diesem Modus muss
von Ihrer Applikation direkt in den primären Soundbuffer geschrieben werden.
Wird Direct Sound nicht in dieser Einstellung ausgeführt, führen alle Versuche,
mit DirectSoundBuffer.ReadBuffer und DirectSoundBuffer.WriteBuffer
auf den Primärbuffer zuzugreifen, zwangsläufig zu einem Fehler.
Wenn Sie diesen Modus benutzen und Ihre Anwendung hat den Fokus, stoppen
alle Sekundärbuffer anderer Applikationen. Wenn Ihre Applikation den Fokus
verliert, wird der Primärbuffer als verloren gekennzeichnet. Um Ihre Anwendung
fortzusetzen, muss der Primärbuffer erneuert werden. Mehr Informationen hierzu
unter Buffer-Management.
objekt.SetCooperativeLevel (hwnd as Long, level As_
CONST_DSSCLFLAGS) |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 25.02.2007, 20:15 Titel: |
|
|
Ja, habe gesehen das es für VB ist, das versteh ich noch weniger als C
Ich weiss auch wozu der cooperativelevel ist, aber nicht wie ich ihn anwende..
ich weiss nicht was der Handle Pointer vor der CE ist und warum in FreeBasic 3 angaben sind anstatt wie überall zwei
IDirectSound8_SetCooperativeLevel(p,a,b)
Code: |
SetCooperativeLevel as function (byval as IDirectSound8 ptr, byval as HWND, byval as DWORD) as HRESULT
|
aus der IDirectSound8Vtbl |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 25.02.2007, 20:46 Titel: |
|
|
hmm .. also .. wenn du VB weniger gut kannst, als C, dann solltest FreeBasic ja gensu, wenig, gut können, wie C bzw. VB ...
Nochmal: FB is fast zu 99% Syntax-Gleich zu VB.
Zu deinem Problem.
VB ist Objekt-Orientiert
FB nicht wirklich, allerdings kann es auch auf Objekte Zugreifen.
Zitat: | objekt.SetCooperativeLevel (hwnd as Long, level As
CONST_DSSCLFLAGS) |
Zitat: | SetCooperativeLevel as function (byval as IDirectSound8 ptr, byval as HWND, byval as DWORD) as HRESULT |
Mit ein bischen Kreativität, kommt dann das hier raus:
Zitat: | objekt.SetCooperativeLevel (hwnd as Long, level As
CONST_DSSCLFLAGS)
object. = Dein DS-Objekt
HWND = Dein handel zu einem Fenster, welches die Events auffangen soll (wenn welche vergeben werden), bzw. das Fenster, welches den Hohen Prioritären Zufriff hat.
level = Die Zufriffsebene für dein programm, und das der anderen
|
Zitat: | SetCooperativeLevel as function (byval as IDirectSound8 ptr, byval as HWND, byval as DWORD) as HRESULT
byval as IDirectSound8 ptr = objekt (Ein Pointer zu diesem Objekt)
byval as HWND = HWND
byval as DWORD = LEVEL
|
PS: Result liefert einen Fehlercode, wenn es nicht erfolgreich war.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 25.02.2007, 20:49 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: |
Nochmal: FB is fast zu 99% Syntax-Gleich zu VB. |
... was man aber nur von vb classic sagen kann, .net is ja mal gar nicht mehr kompatibel und classic vb is auch nur "halb" objekt-orientiert... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 25.02.2007, 20:52 Titel: |
|
|
Stimmt. ... hätt ich hinzufügen sollen .. (/me = VB6) ... sry
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 25.02.2007, 20:53 Titel: |
|
|
ich ja auch _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 25.02.2007, 21:13 Titel: |
|
|
Hab das Programmieren durch FreeBASIC erst vor kurzem wieder für mich entdeckt... Windows,Dll und Call back Pointer operationen ect. sind absolutes neuland für mich...
bislang bin ich irgendwie nicht wirklich weitergekommen, werd es aber weiter versuchen.
danke trotzdem für den vielversprechenden versuch |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 25.02.2007, 21:17 Titel: |
|
|
Du hast eien Variable.
"DS_Objekt as Object"
In diesem erstellst du das Objekt für DirektSound (DS)
Wenn du nun irgend welche aufrufe machst, und diese benötigen das Objekt, dann verlangen sie einen Pointer zu diesem (Einen Speicherpunkt)
Diesen kannst du ganz einfach durch "objptr(DS_Objekt)" ausgeben lassen.
objptr() = ObjektPointer (Adresse der Objekt-Variable)
varptr() = VariablenPointer (Adresse der Speichrvariable)
Diesen wert übergibst du dann deiner API, und sie ist zufrieden.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 25.02.2007, 23:18 Titel: |
|
|
verdammt, warum hat mir keiner gesagt das ich ein Screen haben muss damit der mist funktioniert ???? |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 26.02.2007, 00:21 Titel: |
|
|
Nein! .. das verstehst du falsch ... du braucht kein Screen, von DS aus, sondern nur einen Handel zu einem Fenster. aber, du musst kein DirektDraw Objekt erzeugen!
Du brauchst nur ein Handel, für "eventuelle" Rückmeldungen, wenn du Events nutzen möchtest, und für die CoopModes, damit DX weis, wer was von Ihm will, und wer nicht darf.
PS: hoffe, das ich das jetzt nicht falsch verstanden hab, was du geschrieben hast
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 26.02.2007, 00:32 Titel: |
|
|
Hab das mit dem Handle einfach nicht verstanden, hab nur gelesen das es der pointer zu den ausgabefenster ist, warum auch immer, ich will ja nur ton von directx, aber nachdem ich 'n Screen und den handle als screenptr gemacht habe bekam ich eine gültige rückmeldung.... jetzt muss ich nur noch versuchen Buffer zu erzeugen, alles schritt für schritt |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 26.02.2007, 00:58 Titel: |
|
|
Lust zu lesen?
Siehe PN: HF
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Build0815
Anmeldungsdatum: 30.09.2006 Beiträge: 51
|
Verfasst am: 26.02.2007, 13:25 Titel: |
|
|
Hallo Eternal Pain,
wenn du schnell und einfach eine *.Wav Datei abspielen willst könntest du es so versuchen (habs in FB 0.17 geschrieben und getestet und Windows hat die Datei richtig abgespielt). :
Code: |
Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
'/\ Falls Fehler auftreten - MessageBox anzeigen ... /\
Const SND_SYNC = &h0 ' Sound synchron abspielen
Const SND_ASYNC = &h1 ' Sound asynchron abspielen
Const SND_NODEFAULT = &h2 ' Default (Kein Sound)
Const SND_MEMORY = &h4 '
Const SND_LOOP = &h8 ' Sound wiederholt abspielen bis zum nächsten Aufruf von sndPlaySound
Const SND_NOSTOP = &h10 ' Keine laufenden Sounds stoppen
Const SND_NOWAIT = &h2000 ' Nicht warten wenn der Treiber überlastet ist
Const SND_ALIAS = &h10000 ' Soundname ist ein Registry Alias
Const SND_ALIAS_ID = &h110000 ' Alias ist eine vordefinierte ID
Const SND_FILENAME = &h20000 ' Name ist Dateiname
Const SND_RESOURCE = &h40004
Dim tmp As Long
tmp = sndPlaySound("C:\Test.WAV", SND_ASYNC Or SND_NODEFAULT)
If tmp = 0 Then MessageBox(0, "Fehler: Wav-Datei konnte nicht geöffnet werden!", "Wav Test Programm", 16) : End
Sleep
End
|
PS: Herzlichen Dank an den ApiGuide für die Consts.
PPS: Eventuell musst du noch ein paar Zeilenumbrüche rückänging machen, weil der [Code] bereich wohl ein paar zu lange Zeilen abgeknickt hat. |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 26.02.2007, 13:49 Titel: |
|
|
Danke, aber dabei ging es mir weniger dabei EINEN Sound abzuspielen sondern eher darum mehrerer Sounds abspielen zu KÖNNEN
Spielereinen mit MCISendString und sndPlaySound ect haben keine zufriedenen ergebnisse erbracht, der Stream ist zu langsam und lässt das Programm ruckeln und sndPlaySound ist zwar schnell, aber leider kann man immer nur einen Sound gleichzeitig abspielen.... |
|
Nach oben |
|
|
Build0815
Anmeldungsdatum: 30.09.2006 Beiträge: 51
|
Verfasst am: 26.02.2007, 13:51 Titel: |
|
|
Ich hab schnell ein MCI Beispiel vom vb@rchiv nach FB "übersetzt" (naja viel gabs nicht zu ändern ), mit dem man mehrere Sounds gleichzeitig abspielen kann, vielleicht kannst dus ja doch gebrauchen.
(Mit FB 0.17 getestet)
Code: |
Declare Function mciSendString Lib "winmm.dll" _
Alias "mciSendStringA" (ByVal lpszCommand As String, _
ByVal lpszReturnString As String, _
ByVal cchReturnLength As Long, _
ByVal hwndCallback As Long) As Long
Declare Function GetShortPathName Lib "kernel32" _
Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long
' WAVE-File abspielen
Public Function WAVE_Play(ByVal sFile As String, _
ByVal sAlias As String) As Byte
Dim bResult As Byte
' Dateinamen in DOS 8.3 Format, da z.B. Sonderzeichen
' wie Leerzeichen Probleme machen
Dim sBuffer As String
Dim lResult As Long
sBuffer = Space$(255)
lResult = GetShortPathName(sFile, sBuffer, Len(sBuffer))
If lResult <> 0 Then
sFile = Left$(sBuffer, InStr(sBuffer, Chr$(0)) - 1)
' MCI öffnen
If mciSendString("open " & sFile & _
" type WaveAudio alias " & sAlias, 0, 0, 0) = 0 Then
' WAVE abspielen
mciSendString "play " & sAlias & " from 0", 0, 0, 0
End If
End If
WAVE_Play = bResult
End Function
WAVE_Play("C:\1.wav", "MyWAVE_1")
Sleep
WAVE_Play("C:\2.wav", "MyWAVE_2")
Sleep
End
|
|
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 26.02.2007, 15:08 Titel: |
|
|
Ich würde dennoch empfehlen, es mit DS zu machen. Aus dem einfachengrunde, da es dort mehr möglichkeiten gibt Soudns zu manipulieren. Es sei mal der Dopplereffekt erwähnt, der in einem guten Spiel nicht zu verachten sei.
Oder Richtungsgesteuert (3D), oder die effektivere Kontrolle der Sounds, das Mischen von Sounds, die Manipulation von Quellen und Objekten in einem, der Höhere Grad an Effiziens, durch eben DX.
Bei nem 2D game is allerdings mit MCI gut aus zu kommen, da man dann den ganzen schnickschnack nicht wirklich braucht., da es sich meist auf 3D bezieht. Gibt zwar auch sdinge für 2D, aber .. mei ..das is ansichtssache.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 26.02.2007, 15:25 Titel: |
|
|
Die sndSoundPlay und MCIsentString geschichten sind mir soweit vertraut, hab die auch alle schon ausprobiert....
das ergebniss war nicht sonderlich zufriedenstellend, wenn es mir nur darum gehen würde einen bzw mehrer Sounds abspielen zu können kann ich FMod benutzen...
Mir geht es darum die Stream-Funktionen von WinMM (Waveout) und DSound für eine ganz einfache eigene API zu nutzen weil ich gern mein eigenes Ding für meine klein Spiele hätte.
mit MCISendString kann man zwar mehrere Sound gleichzeitig abspielen aber bei einem Kleinen spiel wo ich das getestet hab, hat es immer gestockt... wie gesat sndPlanySound, nur ein Sound gleichzeitig... bleiben nur noch die DSound und WaveOut funktionen oder direkte aber veraltete DMA ausgabe.... |
|
Nach oben |
|
|
|
|
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.
|
|