| 
				
					|  | 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: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 26.02.2007, 21: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, 01: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, 08: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: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 16.03.2007, 13: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, 13: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, 07: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: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 17.03.2007, 11: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: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 29.03.2007, 18: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: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 20.05.2007, 23: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.
 
 |  |