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