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:

Winmm und DSound
Gehe zu Seite Zurück  1, 2
 
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: 26.02.2007, 22:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.02.2007, 02:08    Titel: Antworten mit Zitat

Danke, das war mal ein wirklich gutes Beispiel, ich denke das ich jetzt mit dem Rest alleine weiterkomme....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 04.03.2007, 09:05    Titel: Antworten mit Zitat

Um das Thema noch einmal aufzugreifen... DSound ist ja nun fast geklärt (Mein Verstand versucht es immernoch zu verarbeiten grinsen )
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 16.03.2007, 14:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 16.03.2007, 14:23    Titel: Antworten mit Zitat

Cool, ich dachte schon der Thread wäre gestorben lächeln
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 grinsen Tada Tada *gg* muss ich mir in ruhe mal ansehen.... Aber vorallem danke für deine bemühungen um das Thema
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 17.03.2007, 08:08    Titel: Antworten mit Zitat

@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 grinsen
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 zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 17.03.2007, 12:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 29.03.2007, 19:25    Titel: Antworten mit Zitat

so.. ,
kann man schon ein wenig damit spielen grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 21.05.2007, 00:13    Titel: Antworten mit Zitat

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. grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
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