Seite 1 von 1

PB-SoundDecoder selber benutzen

Verfasst: 01.10.2005 19:51
von Deeem2031
Ich bin mir zwar sogut wie sicher, dass das niemand gebrauchen kann. Aber vielleicht irre ich mich ja auch ;)

Also ich hbe ein bischen mit DirectSound rumgespielt, was auch prima klappte, nur gibt es keine Proceduren von Msoft mitgeliefert die Sound decodieren. Also dachte ich mir ich versuchs mal mit dem OGG-Decoder von PB. Bis auf die Tatsache das PB darauf nicht ausgelegt ist und es der Decoder kein Streaming unterstützt, funzt das auch super :)

So, nu weiß ich aber nich was ich mit dem Code soll, war ja eh nur Spielerei. Desswegen stell ich ihn einfach hier rein, damit der ein oder andere vielleicht was lernt - z.B. wie man eine Decoderschnittstelle nicht gestalltet ;)

Code: Alles auswählen

UseOGGSoundDecoder()
If SoundDecoder_Check(0,?OGG,?OGG_End-?OGG) ;Decoder avaiable?
  SoundLength = SoundDecoder_GetNbSamples()/SoundDecoder_GetRate() ;(sec) 
  SoundBufferLen = (16/8)*SoundDecoder_GetNbChannels()*SoundDecoder_GetNbSamples()
  SoundBuffer = AllocateMemory(SoundBufferLen)
  If SoundBuffer
    SoundDecoder_Decode(SoundBuffer,SoundBufferLen,0) ;Decode the File to wave
    
    DS8_Init(OpenWindow(0,0,0,200,200,0,"")) ;Init DirectSound8 (i hate it, too. But DirectSound needs a window)
    Sound = DS8_CreateSound(SoundBufferLen,SoundDecoder_GetNbChannels(),SoundDecoder_GetRate(),16) ;Create a SoundBuffer
    IDS.IDirectSoundBuffer8 = PeekL(Sound) ;Get the Interface
    IDS\Lock(0,0,@p,@l,0,0,2) ;Lock to Buffer to write
    CopyMemory(SoundBuffer,p,l) ;Copy Data into DirectSoundBuffer
    IDS\UnLock(p,l,0,0)
    FreeMemory(SoundBuffer)
    
    DS8_PlaySound(Sound,#True) ;Play Sound
    sTime = ElapsedMilliseconds()
    Repeat
      Delay(10)
    Until ElapsedMilliseconds()-sTime > SoundLength*1000
    DS8_StopSound(Sound) ;because we set the Loop-Flag
    DS8_FreeSound(Sound)
  Else
    Debug "File too big"
  EndIf
EndIf

DataSection
OGG:
IncludeBinary "c:\spiele\Far Cry\Music\Music_cues\CoolerWaterScene.ogg"
OGG_End:
EndDataSection
Wer den Code selber ausprobieren will braucht 1. eine modifizierte "SoundPlugin"-Lib: http://www.deeem2031.de/PB/DirectSound/SoundPlugin (die orginale Lib enthält zwar die Befehle SoundDecoder_...(), gibt sie aber nicht an die IDE weiter) und 2. meine kleine DirectSound8-Lib: http://www.deeem2031.de/PB/DirectSound/DirectSound8

Noch'n Hinweis: Wenn ihr das Fenster, was erstellt wird, deaktiviert, hört auch der Sound auf zu spielen. Könnte man als Bug ansehen, für den Test reichts aber.

wave uber DirectSound abspielen.

Verfasst: 28.01.2006 12:56
von tomijan
Dear Deem2031,
ich bin sehr interressant fuer Ihre DirectSound Library. Kanst du eine beschreibung fuer functionen auf diese forum schreiben (besonders uber parameters). Kanst du auch ein beispiel fuer abspielen eine wave file in streaming mode senden?

Alle ihre libraries sind cool!
tomijan

Verfasst: 28.01.2006 13:45
von Deeem2031
Hm, um die DirectSound-Lib ging's hier doch gar nicht ;)

Die ist nämlich nur 'ne kl. Hilfe, kein Ersatz für das direkte Aufrufen der DirectX-Befehle (wie man ja auch an dem Bsp. sieht)

Die Befehle der Lib sind:
DS8_Init(hwnd)
Initialisiert DS8 und bindet es an das angegebene Fenster
Sound = DS8_CreateSound(SizeinBytes, Channels, SamplesPerSec,BitsPerSample)
Erstellt den SoundBuffer.
DS8_PlaySound(Sound, Loop?)
Spielt den Sound innerhalb den SoundBuffers
DS8_StopSound(Sound)
Stopt den Sound innerhalb den SoundBuffers
DS8_FreeSound(Sound)
Löscht den SoundBuffer

Wie du siehst fehlen die Befehle zum einlesen der Daten, was ich in dem Bsp mit

Code: Alles auswählen

    IDS.IDirectSoundBuffer8 = PeekL(Sound) ;Get the Interface 
    IDS\Lock(0,0,@p,@l,0,0,2) ;Lock to Buffer to write 
    CopyMemory(SoundBuffer,p,l) ;Copy Data into DirectSoundBuffer 
    IDS\UnLock(p,l,0,0)
gelöst habe.
Da ich mich aber nicht genau mit Streaming in DX8 beschäftigt habe, hab' ich kein Bsp dafür und auch nicht das Wissen um eins zu schreiben. Ich müsste selber nachgucken wie das geht, was ich aber lieber nicht mache, weil ich sonst wieder von meinem aktuellen Projekt abgelenkt werden würde.
Kann dir nur sagen das du den Buffer immer dann wieder beschreiben müsstest wenn der Inhalt abgespielt wurde. Es gibt auch Funktionen von DX8 um Proceduren aufzurufen wenn eine bestimmte Stelle im Buffer erreicht wurde, frag mich aber nicht wie die hießen.

play wave in streaming mode with directsound

Verfasst: 28.01.2006 14:07
von tomijan
Danke fuer sehr schnelle antwort!
Ich werde jetzt probieren, sehr hilfreich ist ein altest Beispiel in DX8SDK:
"..DXF\samples\multimedia\directsound\streamdata\streamdata.cpp"
sorry for mistake with your nick, should be DEEEM2031!
thanks!