|
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 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 26.02.2007, 22:55 Titel: |
|
|
Hi,
das war mein erster Ansatz zu DSound in FB,
ist noch lange nicht fertig ..
Code: | 'nach Einführung in DirectSound
'http://www.anmabagima.de/DXCpp/dsound1.html
#Include "windows.bi"
#include once "win/mmsystem.bi"
#Include once "win/dsound.bi"
Dim As LPDIRECTSOUND lpDSound 'das Zentrale DirectSound-Objekt
Dim As LPDIRECTSOUNDBUFFER lpDSPrim 'der Primäre Sounpuffer
Dim As LPDIRECTSOUNDBUFFER lpDSWork 'Arbeits-Soundpuffer
Dim As HWND hwnd
Dim erg As HRESULT
Dim soundBuffDesc As DSBUFFERDESC 'Beschreibung des Soundpuffers
Dim As WAVEFORMATEX wFormat 'wFormat wird die Daten über das Ausgabeformat halten
Dim As String title="DSound"
Screen 18,32
Windowtitle title
hwnd = FindWindow( 0, title ) 'Hwnd des fbgfx-Window
'initDirectSound
'Erstellen des zentralen DirectSound-Objektes
erg = DirectSoundCreate(NULL, @lpDSound, NULL)
If erg <> DS_OK Then
MessageBox(hwnd, "Fehler bei Create DirectSound-Objekt", "Fehler:", MB_ICONERROR + MB_OK)
End
End If
'Kooperationsebene setzen
erg = lpDSound->lpVtbl->SetCooperativeLevel(lpDSound, hwnd, DSSCL_PRIORITY)
If erg <> DS_OK Then
MessageBox(hwnd, "Fehler bei SetCooperativeLevel", "Fehler:", MB_ICONERROR + MB_OK)
End
End If
'Beschreibung des Soundpuffers füllen
soundBuffDesc.dwSize = Sizeof(soundBuffDesc) 'DX-Standard
soundBuffDesc.dwFlags = DSBCAPS_PRIMARYBUFFER'primärer SoundPuffer
soundBuffDesc.dwBufferBytes = 0 'Puffergrösse muss 0 Byte sein für primären Puffer
soundBuffDesc.lpwfxFormat = NULL 'Pufferformat muss NULL sein für primären Puffer
'Soundpuffer erzeugen
erg = lpDSound->lpVtbl->CreateSoundBuffer(lpDSound, @soundBuffDesc, @lpDSPrim, NULL)
If erg <> DS_OK Then
MessageBox(hwnd, "Fehler bei Create DirectSoundPuffer", "Fehler:", MB_ICONERROR + MB_OK)
End
End If
'hier folgt die Einstellung des Ausgabeformats des Soundpuffers
'soll dann aus dem WaveHdr entnommen werden
wFormat.wFormatTag = WAVE_FORMAT_PCM 'welches Format ?
wFormat.nChannels = 2 ' 2 Kanäle
wFormat.nSamplesPerSec = 22050 '22Khz Samplingrate
wFormat.wBitsPerSample = 16 '16 Bits / Sample
wFormat.nBlockAlign = wFormat.wBitsPerSample / 8 * wFormat.nChannels
wFormat.nAvgBytesPerSec = wFormat.nSamplesPerSec * wFormat.nBlockAlign
erg = lpDSPrim->lpVtbl->SetFormat(lpDSPrim, @wFormat)
If erg <> DS_OK Then
MessageBox(hwnd, "Konnte Ausgabeformat nicht setzen!", "Fehler:", MB_ICONERROR + MB_OK)
lpDSPrim->lpVtbl->Release(lpDSPrim) 'primären Puffer frei geben
End
End If
'...WAV-laden
'...abspielen
'...
'Aufräumarbeiten, Puffer frei geben
If lpDSWork <> NULL Then lpDSWork->lpVtbl->Release(lpDSWork)
If lpDSPrim <> NULL Then lpDSPrim->lpVtbl->Release(lpDSPrim)
If lpDSound <> NULL Then lpDSound->lpVtbl->Release(lpDSound)
?"bis dahin verdisch..."
Sleep
End |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.02.2007, 02:08 Titel: |
|
|
Danke, das war mal ein wirklich gutes Beispiel, ich denke das ich jetzt mit dem Rest alleine weiterkomme.... |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 04.03.2007, 09:05 Titel: |
|
|
Um das Thema noch einmal aufzugreifen... DSound ist ja nun fast geklärt (Mein Verstand versucht es immernoch zu verarbeiten )
Aber dazu noch einmal die Frage, wie kann ich WAV mit hilfer de WaveOut Funktionen aus der Winmm.dll streamen, bzw buffern und abspielen... ?! _________________
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 16.03.2007, 14:18 Titel: |
|
|
zweiter Teil, jetzt kann man schon mal was hören..
aber immer noch nicht fertig...
Code: | 'nach Einführung in DirectSound
'http://www.anmabagima.de/DXCpp/dsound1.html
#Include once "windows.bi"
#include once "win/mmsystem.bi"
#Include once "win/dsound.bi"
Dim As LPDIRECTSOUND VDSound 'das Zentrale DirectSound-Objekt
Dim As LPDIRECTSOUNDBUFFER DSPrimBuf 'der Primäre Sounpuffer
Dim As LPDIRECTSOUNDBUFFER DSWorkBuf 'Arbeits-Soundpuffer
Dim Shared As HWND hwnd
Dim erg As HRESULT
Dim soundBuffDesc As DSBUFFERDESC 'Beschreibung des Soundpuffers
Dim As WAVEFORMATEX wFormat 'wFormat wird die Daten über das Ausgabeformat halten
Sub FehlerBox (text As String)
MessageBox(hwnd, "Fehler " + Chr(10,10) + text, "ERROR :((", MB_ICONERROR + MB_OK)
End 1
End Sub
Dim As String title = "DSound"
Screen 18,32
Windowtitle title
hwnd = FindWindow(0, title) 'Hwnd des fbgfx-Window
'----------------------initDirectSound
'Erstellen des zentralen DirectSound-Objektes
erg = DirectSoundCreate(NULL, @VDSound, NULL)
If erg <> DS_OK Then FehlerBox("bei Create DirectSound-Objekt")
'Kooperationsebene setzen
erg = VDSound->lpVtbl->SetCooperativeLevel(VDSound, hwnd, DSSCL_PRIORITY)
If erg <> DS_OK Then FehlerBox("bei SetCooperativeLevel")
'Beschreibung des Soundpuffers füllen
soundBuffDesc.dwSize = Sizeof(soundBuffDesc) 'DX-Standard
soundBuffDesc.dwFlags = DSBCAPS_PRIMARYBUFFER'primärer SoundPuffer
soundBuffDesc.dwBufferBytes = 0 'Puffergrösse muss 0 Byte sein für primären Puffer
soundBuffDesc.lpwfxFormat = NULL 'Pufferformat muss NULL sein für primären Puffer
'Soundpuffer erzeugen
erg = VDSound->lpVtbl->CreateSoundBuffer(VDSound, @soundBuffDesc, @DSPrimBuf, NULL)
If erg <> DS_OK Then FehlerBox("bei Create DirectSoundPuffer")
'hier folgt die Einstellung des Ausgabeformats des Soundpuffers
wFormat.wFormatTag = WAVE_FORMAT_PCM 'welches Format ?
wFormat.nChannels = 2 ' 2 Kanäle
wFormat.nSamplesPerSec = 22050 '22Khz Samplingrate
wFormat.wBitsPerSample = 16 '16 Bits / Sample
wFormat.nBlockAlign = wFormat.wBitsPerSample / 8 * wFormat.nChannels
wFormat.nAvgBytesPerSec = wFormat.nSamplesPerSec * wFormat.nBlockAlign
erg = DSPrimBuf->lpVtbl->SetFormat(DSPrimBuf, @wFormat)
If erg <> DS_OK Then
DSPrimBuf->lpVtbl->Release(DSPrimBuf) 'primären Puffer frei geben
FehlerBox("kann Ausgabeformat nicht setzen!")
End If
'------------------------LoadWave
'Der erste Teil lädt die Datei
Dim As String filename = "C:\WINDOWS\Media\tada.wav"
Dim As HMMIO wavefile
Dim As MMCKINFO parent, child
Dim As WAVEFORMATEX wavefmt
Dim As DSBUFFERDESC bufdesc
Dim As Byte Ptr write1, write2
Dim As Uinteger length1,length2
wavefile = mmioOpen (filename, 0, MMIO_READ Or MMIO_ALLOCBUF)
If wavefile = 0 Then
FehlerBox("beim laden von " + filename)
End If
'ist WAVE Datei?
parent.fccType = mmioFOURCC("W", "A", "V", "E")
mmioDescend(wavefile, @parent, 0, MMIO_FINDRIFF)
'welches PCM-Format?
child.fccType = mmioFOURCC("f", "m", "t", " ")
mmioDescend(wavefile, @child, @parent, 0)
mmioRead(wavefile, Cast(Byte Ptr, @wavefmt), Sizeof(wavefmt))
If wavefmt.wFormatTag <> WAVE_FORMAT_PCM Then
FehlerBox("falsches Format von " + filename)
End If
'Wo sind die PCM-Daten?
mmioAscend(wavefile, @child, 0)
child.ckid = mmioFOURCC("d", "a", "t", "a")
mmioDescend (wavefile, @child, @parent, MMIO_FINDCHUNK)
'Anhand des Formates der Wave-Daten nun einen Soundpuffer erzeugen
bufdesc.dwSize = Sizeof(DSBUFFERDESC)
bufdesc.dwFlags = DSBCAPS_STATIC Or DSBCAPS_LOCSOFTWARE
bufdesc.dwBufferBytes = child.cksize
bufdesc.lpwfxFormat = @wavefmt
erg = VDSound->lpVtbl->CreateSoundBuffer(VDSound, @bufdesc, @DSWorkBuf, NULL)
If erg <> DS_OK Then FehlerBox("kann Soundpuffer nicht erzeugen")
'Sounddaten der Wavedatei in Arbeits-Soundpuffer lesen
'wir müssen den Puffer sperren (LOCK) und erhalten einen Zeiger auf die Sounddaten
erg = DSWorkBuf->lpVtbl->Lock(DSWorkBuf, 0, bufdesc.dwBufferBytes, _
@write1, @length1, @write2, @length2, 0)
If erg <> DS_OK Then FehlerBox("bei Soundbuffer Lock")
'- da kopieren wir die Wavedaten hin.
'nun die Wave-Daten in den Soundpuffer übertragen
If write1 > 0 Then mmioRead(wavefile, write1, length1)
'wenn length1 kleiner als die gesammte Pufferlänge dann zeigt write2 auf den restlichen Teil
If write2 > 0 Then mmioRead(wavefile, write2, length2)
'Soundpuffer wieder entsperren
DSWorkBuf->lpVtbl->Unlock(DSWorkBuf, write1, length1, write2, length2)
'Wave-Datei schließen
mmioClose(wavefile, 0)
'------------------Sound abspielt
' den eben erstellten Sound abspielt, wieder und wieder
DSWorkBuf->lpVtbl->Play(DSWorkBuf, 0, 0, DSBPLAY_LOOPING)
do
? time
sleep 500
loop while inkey=""
' das Abspielen anhalten
DSWorkBuf->lpVtbl->Stop(DSWorkBuf)
'------------------Aufräumarbeiten, Puffer frei geben
If DSWorkBuf <> NULL Then DSWorkBuf->lpVtbl->Release(DSWorkBuf)
If DSPrimBuf <> NULL Then DSPrimBuf->lpVtbl->Release(DSPrimBuf)
If VDSound <> NULL Then VDSound->lpVtbl->Release(VDSound)
?"bis dahin verdisch..."
Sleep
End |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 16.03.2007, 14:23 Titel: |
|
|
Cool, ich dachte schon der Thread wäre gestorben
beim überfliegen ist mir gerade aufgefallen das Du die gleichen Variablen ganz anders declariert hast ??
Edit: BTW: hat inzwischen vielleicht jemand mehr erfahrungen mit den WaveOut Funktionen von Winmm gemacht ?
Edit2: @volta, hat sich erübrigt *g* dachte Teil2 geht da weiter wo Teil1 aufhört Tada Tada *gg* muss ich mir in ruhe mal ansehen.... Aber vorallem danke für deine bemühungen um das Thema _________________
|
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 17.03.2007, 08:08 Titel: |
|
|
@Volta:
Hi, habe gerade ein wenig mit deiner DSoundRoutine Experimentiert, immerhin ist deine gegenüber meiner Funktionstüchtig, auch wenn mir der Grund dafür noch nicht ganz klar ist, allerdings bin ich da auf einiges gestossen was mich schon wieder an DirectSound zweifeln lässt.
1. Die Sache mit dem WindowsHandle, wenn man das Fenster wechselt spielt leider auch kein sound mehr, habe schon ein paar versuche gemacht, aber leider ohne erfolg. Das muss sich doch noch irgendwie anders einstellen lassen?
2. Grosse Files zu buffern ist böse
Leider habe ich auch nur beschreibungen über DSound gefunden wo man mit Primären- und Arbeitsbuffern arbeitet, aber man muss einen Sound ggf. doch auch streamen können?
Nachtrag:
zu 1: nach einigem suchen und probieren glaube ich beinahe das es kein übergreifendes Window Handle gibt?!
Hab inzwischen den Sound in allen möglichen versuchen bei allen möglichen gelegenheiten abspielen lassen, am lustigsten dabei ist das abspielen durch drücken der Windows Start Taste _________________
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 17.03.2007, 12:05 Titel: |
|
|
doch, beides ist möglich.
Man kann den Sound weiter abspielen lassen wenn das Fenster den Focus verliert.
Mit zusätzlichem Prog-aufwand geht auch streaming, für das nachladen muss man selber sorgen.
Aber soweit bin ich noch nicht.
Erst einmal habe ich die Teile in einzelne Funktionen zerlegt, die Fehlerbehandlung überarbeitet und ausprobiert wie man mehrere Wavs gleichzeitig abspielt und was alles an den Sounds einzustellen ist.
Wenn das alles als inc-Datei funktioniert sehe ich mal weiter. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 29.03.2007, 19:25 Titel: |
|
|
so.. ,
kann man schon ein wenig damit spielen
Hier ist die "V_DSound.bas" http://www.freebasic.de/fbnp/?view=656
Code: | 'FB_DSound.bas
#Include "V_DSound.bas"
'Version 0.01 ; 29.03.2007 by Volta
'DSound abspielen
Dim As HWND hwnd
Dim As Integer f
Dim As String title = "Voltas - DirectSound"
Screen 18,32
Windowtitle title
hwnd = FindWindow(0, title) 'Hwnd des fbgfx-Window
V_DSinit(hwnd)
V_DSLoadSound (0, "C:\WINDOWS\Media\tada.wav")
V_DSLoadSound (1, "C:\WINDOWS\Media\ding.wav",5)'in Buffer 1 bis 5 einlesen
V_DSPlayloop(0)' Buffer 0 abspielt, wieder und wieder
f = V_DSGetFreq(0)'Abspielfrequenz auslesen
?V_DSGetPan(0)
?V_DSGetVol(0)
Do
? Time, f, V_DSGetPos(0)
f -=100
V_DSSetFreq(0,f)'Abspielfrequenz setzen
V_DSPlay_one(1,5)
Sleep 300
Loop While Inkey=""
' das Abspielen anhalten
V_DSStop(0)
V_DSStop(1)
' Puffer frei geben
V_DSExit
?"bis dahin verdisch..."
Sleep
End |
Ich glaube nicht das schon alles fehlerfrei ist! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 21.05.2007, 00:13 Titel: |
|
|
Hi,
endlich mal eine kleine Anwendung für den DirectSound
Im engl. Forum hat Deleter einen schönen Breakout Clon veröffentlicht (http://www.freebasic.net/forum/viewtopic.php?p=69483#69483)
diesen habe ich etwas mit Directsound aufgemotzt.
Auf meiner HP habe ich einen Download mit allen Wav-Dateien eingerichtet. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
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.
|
|