I wrote it while my DSound practice.
Have fun with it.
Code: Select all
; 2006 Hroudtwolf
; PureBasic-Lounge.de
; PlayDXSound
; tesed with PB 4.00
Procedure InitDXSound ()
Shared IS_DXSound_Init.l
If IS_DXSound_Init.l=0
IS_DXSound_Init.l=#True
Structure DSBCAPS
dwSize.l
dwFlags.l
dwBufferBytes.l
dwUnlockTransferRate.l
dwPlayCpuOverhead.l
EndStructure
If InitSound ()=0
ProcedureReturn #False
EndIf
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure PlayDXSound (SoundID.l,Volume.l,LoopFlag.l)
Protected PlayState.l,*SoundObject,Samplefreq.l,OrigFreqency.l
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\GetStatus(@PlayState)
If PlayState.l=1 Or PlayState.l=5
*DirectSoundBuffer\Stop()
*DirectSoundBuffer\SetCurrentPosition(0)
EndIf
*DirectSoundBuffer\SetVolume (-1000+(Volume.l*10))
*DirectSoundBuffer\Play (0,0,LoopFlag.l)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure StopDXSound (SoundID.l)
Protected *SoundObject,PlayState.l
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\GetStatus(@PlayState)
If PlayState.l=1 Or PlayState.l=5
*DirectSoundBuffer\Stop()
*DirectSoundBuffer\SetCurrentPosition(0)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndIf
EndProcedure
Procedure GetDXSoundPosition(SoundID.l)
Protected *SoundObject,DXSndPosition.l
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\GetCurrentPosition(@DXSndPosition,0)
ProcedureReturn DXSndPosition.l
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure SetDXSoundPosition(SoundID.l,DXSndPosition.l)
Protected *SoundObject
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\SetCurrentPosition(DXSndPosition.l)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure GetDXSoundFrequency(SoundID.l)
Protected *SoundObject,Frequency.l
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\GetFrequency(@Frequency)
ProcedureReturn Frequency.l
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure GetDXSoundBufferSize(SoundID.l)
Protected *SoundObject
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
DXSBCaps.DSBCAPS\dwSize=SizeOf(DSBCAPS)
*DirectSoundBuffer\GetCaps(@DXSBCaps)
ProcedureReturn DXSBCaps\dwBufferBytes
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure GetDXSoundState (SoundID.l)
Protected PlayState.l,*SoundObject
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\GetStatus(@PlayState)
If PlayState.l=1 Or PlayState.l=5
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure SetDXSoundVolume (SoundID.l,Volume.l)
Protected *SoundObject,CurrentVolume.l
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\SetVolume (-1000+(Volume.l*10))
*DirectSoundBuffer\GetVolume (@CurrentVolume)
ProcedureReturn CurrentVolume.l
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure GetDXSoundVolume (SoundID.l)
Protected *SoundObject,CurrentVolume.l
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\GetVolume (@CurrentVolume)
ProcedureReturn CurrentVolume.l
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure GetDXSoundPan (SoundID.l)
Protected *SoundObject,CurrentPan.l
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\GetPan (@CurrentPan)
ProcedureReturn CurrentPan.l
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure SetDXSoundPan (SoundID.l,SoundPan.l)
Protected *SoundObject,CurrentPan.l
*SoundObject=IsSound (SoundID.l)
If *SoundObject
*DirectSoundBuffer.IDirectSoundBuffer=PeekL(*SoundObject)
*DirectSoundBuffer\SetPan (SoundPan.l)
*DirectSoundBuffer\GetPan (@CurrentPan)
ProcedureReturn CurrentPan.l
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure LoadDXSound (SoundID.l,FileName.s)
FileID.l=ReadFile (#PB_Any,FileName.s)
If FileID.l And SoundID.l
*PreBuffer=AllocateMemory (Lof(FileID.l))
ReadData(FileID.l,*PreBuffer,Lof(FileID.l))
CatchSound (SoundID.l,*PreBuffer,Lof(FileID.l))
CloseFile (FileID.l)
FreeMemory (*PreBuffer)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure