
DirectSound functions
- Joakim Christiansen
- Addict
- Posts: 2452
- Joined: Wed Dec 22, 2004 4:12 pm
- Location: Norway
- Contact:
This example is fine, but (at least for me) prsents the SAME problem that the other ones: introduce some pops and ticks.inc. wrote:After investigating some time in Dshow etc. I had again a look at your code example.tomijan wrote:In above post should be "not nothing more", sory for mistake![]()
tom
The problem was that you did fill a memory buffer using the whole soundfile data where the streaming process itself just reads from that "big" memoryamount the chunks for buffering and serving to the DSoundBuffer. Honestly by this you did left the sense of a true soundfile streaming approach.
So the simple fix is just to read the chunks into the soundbuffer within the refilling loop DIRECTLY from the Soundfile and not from a previous generated full-soundfile-size temp. memoryspace.
Here's the corrected code
Edit: And again the problem of the forum engine when posting codes.... parts will be just cut off or mixed. This code still is the same size as the one above
Heres the code as file: StreamingViaDirectSound.pb
Im looking for a way to have access to the data being played so i can process it in real time, but until now all this examples (without doing modifications) intorduces some pops and ticks.

Any suggestion?
DirectSound Get Error String
DirectSound Error string return tips
Code: Select all
Procedure.s GetErrorDirectSound(result.l)
Select result
Case -2062548992
ProcedureReturn "ASSERTION!"
Case -2062548891
ProcedureReturn "STORM_ERROR_BAD_ARGUMENT"
Case -2062548890
ProcedureReturn "STORM_ERROR_GAME_ALREADY_STARTED"
Case -2062548889
ProcedureReturn "STORM_ERROR_GAME_FULL"
Case -2062548888
ProcedureReturn "STORM_ERROR_GAME_NOT_FOUND"
Case -2062548887
ProcedureReturn "STORM_ERROR_GAME_TERMINATED"
Case -2062548886
ProcedureReturn "STORM_ERROR_INVALID_PLAYER"
Case -2062548885
ProcedureReturn "STORM_ERROR_NO_MESSAGES_WAITING"
Case -2062548884
ProcedureReturn "STORM_ERROR_NOT_ARCHIVE"
Case -2062548883
ProcedureReturn "STORM_ERROR_NOT_ENOUGH_ARGUMENTS"
Case -2062548882
ProcedureReturn "STORM_ERROR_NOT_IMPLEMENTED"
Case -2062548881
ProcedureReturn "STORM_ERROR_NOT_IN_ARCHIVE"
Case -2062548880
ProcedureReturn "STORM_ERROR_NOT_IN_GAME"
Case -2062548879
ProcedureReturn "STORM_ERROR_NOT_INITIALIZED"
Case -2062548878
ProcedureReturn "STORM_ERROR_NOT_PLAYING"
Case -2062548877
ProcedureReturn "STORM_ERROR_NOT_REGISTERED"
Case -2062548876
ProcedureReturn "STORM_ERROR_REQUIRES_CODEC"
Case -2062548875
ProcedureReturn "STORM_ERROR_REQUIRES_CODEC"
Case -2062548874
ProcedureReturn "STORM_ERROR_REQUIRES_CODEC"
Case -2062548873
ProcedureReturn "STORM_ERROR_REQUIRES_UPGRADE"
Case -2062548872
ProcedureReturn "STORM_ERROR_STILL_ACTIVE"
Case -2062548871
ProcedureReturn "STORM_ERROR_VERSION_MISMATCH"
Case -2062548870
ProcedureReturn "Attempt to free a memory block which is not currently allocated."
Case -2062548869
ProcedureReturn "This memory block has been corrupted by an out-of-bounds memory write."
Case -2062548868
ProcedureReturn "Attempt to free an invalid memory block."
Case -2062548867
ProcedureReturn "This function call is invalid because the memory manager is not currently initialized."
Case -2062548866
ProcedureReturn "A block of memory was allocated but never freed."
Case -2062548865
ProcedureReturn "A resource handle was obtained but never released."
Case -2062548864
ProcedureReturn "Attempt to access beyond the bounds of an array."
Case -2062548863
ProcedureReturn "Attempt to free a NULL pointer."
Case -2062548862
ProcedureReturn "The CD keys do not match."
Case -2062548861
ProcedureReturn "The file data is corrupt."
Case -2062548860
ProcedureReturn "FATAL ERROR!"
Case -2062548859
ProcedureReturn "The requested game type is temporarily unavailable."
Case -2005532667
ProcedureReturn "DDERR_ALREADYINITIALIZED"
Case -2005532662
ProcedureReturn "DDERR_CANNOTATTACHSURFACE"
Case -2005532652
ProcedureReturn "DDERR_CANNOTDETACHSURFACE"
Case -2005532632
ProcedureReturn "DDERR_CURRENTLYNOTAVAIL"
Case -2005532617
ProcedureReturn "DDERR_EXCEPTION"
Case -2005532582
ProcedureReturn "DDERR_HEIGHTALIGN"
Case -2005532577
ProcedureReturn "DDERR_INCOMPATIBLEPRIMARY"
Case -2005532572
ProcedureReturn "DDERR_INVALIDCAPS"
Case -2005532562
ProcedureReturn "DDERR_INVALIDCLIPLIST"
Case -2005532552
ProcedureReturn "DDERR_INVALIDMODE"
Case -2005532542
ProcedureReturn "DDERR_INVALIDOBJECT"
Case -2005532527
ProcedureReturn "DDERR_INVALIDPIXELFORMAT"
Case -2005532522
ProcedureReturn "DDERR_INVALIDRECT"
Case -2005532512
ProcedureReturn "DDERR_LOCKEDSURFACES"
Case -2005532502
ProcedureReturn "DDERR_NO3D"
Case -2005532492
ProcedureReturn "DDERR_NOALPHAHW"
Case -2005532467
ProcedureReturn "DDERR_NOCLIPLIST"
Case -2005532462
ProcedureReturn "DDERR_NOCOLORCONVHW"
Case -2005532460
ProcedureReturn "DDERR_NOCOOPERATIVELEVELSET"
Case -2005532457
ProcedureReturn "DDERR_NOCOLORKEY"
Case -2005532452
ProcedureReturn "DDERR_NOCOLORKEYHW"
Case -2005532450
ProcedureReturn "DDERR_NODIRECTDRAWSUPPORT"
Case -2005532447
ProcedureReturn "DDERR_NOEXCLUSIVEMODE"
Case -2005532442
ProcedureReturn "DDERR_NOFLIPHW"
Case -2005532432
ProcedureReturn "DDERR_NOGDI"
Case -2005532422
ProcedureReturn "DDERR_NOMIRRORHW"
Case -2005532417
ProcedureReturn "DDERR_NOTFOUND"
Case -2005532412
ProcedureReturn "DDERR_NOOVERLAYHW"
Case -2005532392
ProcedureReturn "DDERR_NORASTEROPHW"
Case -2005532382
ProcedureReturn "DDERR_NOROTATIONHW"
Case -2005532362
ProcedureReturn "DDERR_NOSTRETCHHW"
Case -2005532356
ProcedureReturn "DDERR_NOT4BITCOLOR"
Case -2005532355
ProcedureReturn "DDERR_NOT4BITCOLORINDEX"
Case -2005532352
ProcedureReturn "DDERR_NOT8BITCOLOR"
Case -2005532342
ProcedureReturn "DDERR_NOTEXTUREHW"
Case -2005532337
ProcedureReturn "DDERR_NOVSYNCHW"
Case -2005532332
ProcedureReturn "DDERR_NOZBUFFERHW"
Case -2005532322
ProcedureReturn "DDERR_NOZOVERLAYHW"
Case -2005532312
ProcedureReturn "DDERR_OUTOFCAPS"
Case -2005532292
ProcedureReturn "DDERR_OUTOFVIDEOMEMORY"
Case -2005532290
ProcedureReturn "DDERR_OVERLAYCANTCLIP"
Case -2005532288
ProcedureReturn "DDERR_OVERLAYCOLORKEYONLYONEACTIVE"
Case -2005532285
ProcedureReturn "DDERR_PALETTEBUSY"
Case -2005532272
ProcedureReturn "DDERR_COLORKEYNOTSET"
Case -2005532262
ProcedureReturn "DDERR_SURFACEALREADYATTACHED"
Case -2005532252
ProcedureReturn "DDERR_SURFACEALREADYDEPENDENT"
Case -2005532242
ProcedureReturn "DDERR_SURFACEBUSY"
Case -2005532237
ProcedureReturn "DDERR_CANTLOCKSURFACE"
Case -2005532232
ProcedureReturn "DDERR_SURFACEISOBSCURED"
Case -2005532222
ProcedureReturn "DDERR_SURFACELOST"
Case -2005532212
ProcedureReturn "DDERR_SURFACENOTATTACHED"
Case -2005532202
ProcedureReturn "DDERR_TOOBIGHEIGHT"
Case -2005532192
ProcedureReturn "DDERR_TOOBIGSIZE"
Case -2005532182
ProcedureReturn "DDERR_TOOBIGWIDTH"
Case -2005532162
ProcedureReturn "DDERR_UNSUPPORTEDFORMAT"
Case -2005532152
ProcedureReturn "DDERR_UNSUPPORTEDMASK"
Case -2005532135
ProcedureReturn "DDERR_VERTICALBLANKINPROGRESS"
Case -2005532132
ProcedureReturn "DDERR_WASSTILLDRAWING"
Case -2005532112
ProcedureReturn "DDERR_XALIGN"
Case -2005532111
ProcedureReturn "DDERR_INVALIDDIRECTDRAWGUID"
Case -2005532110
ProcedureReturn "DDERR_DIRECTDRAWALREADYCREATED"
Case -2005532109
ProcedureReturn "DDERR_NODIRECTDRAWHW"
Case -2005532108
ProcedureReturn "DDERR_PRIMARYSURFACEALREADYEXISTS"
Case -2005532107
ProcedureReturn "DDERR_NOEMULATION"
Case -2005532106
ProcedureReturn "DDERR_REGIONTOOSMALL"
Case -2005532105
ProcedureReturn "DDERR_CLIPPERISUSINGHWND"
Case -2005532104
ProcedureReturn "DDERR_NOCLIPPERATTACHED"
Case -2005532103
ProcedureReturn "DDERR_NOHWND"
Case -2005532102
ProcedureReturn "DDERR_HWNDSUBCLASSED"
Case -2005532101
ProcedureReturn "DDERR_HWNDALREADYSET"
Case -2005532100
ProcedureReturn "DDERR_NOPALETTEATTACHED"
Case -2005532099
ProcedureReturn "DDERR_NOPALETTEHW"
Case -2005532098
ProcedureReturn "DDERR_BLTFASTCANTCLIP"
Case -2005532097
ProcedureReturn "DDERR_NOBLTHW"
Case -2005532096
ProcedureReturn "DDERR_NODDROPSHW"
Case -2005532095
ProcedureReturn "DDERR_OVERLAYNOTVISIBLE"
Case -2005532094
ProcedureReturn "DDERR_NOOVERLAYDEST"
Case -2005532093
ProcedureReturn "DDERR_INVALIDPOSITION"
Case -2005532092
ProcedureReturn "DDERR_NOTAOVERLAYSURFACE"
Case -2005532091
ProcedureReturn "DDERR_EXCLUSIVEMODEALREADYSET"
Case -2005532090
ProcedureReturn "DDERR_NOTFLIPPABLE"
Case -2005532089
ProcedureReturn "DDERR_CANTDUPLICATE"
Case -2005532088
ProcedureReturn "DDERR_NOTLOCKED"
Case -2005532087
ProcedureReturn "DDERR_CANTCREATEDC"
Case -2005532086
ProcedureReturn "DDERR_NODC"
Case -2005532085
ProcedureReturn "DDERR_WRONGMODE"
Case -2005532084
ProcedureReturn "DDERR_IMPLICITLYCREATED"
Case -2005532083
ProcedureReturn "DDERR_NOTPALETTIZED"
Case -2005532082
ProcedureReturn "DDERR_UNSUPPORTEDMODE"
Case -2005532081
ProcedureReturn "DDERR_NOMIPMAPHW"
Case -2005532080
ProcedureReturn "DDERR_INVALIDSURFACETYPE"
Case -2005532052
ProcedureReturn "DDERR_DCALREADYCREATED"
Case -2005532032
ProcedureReturn "DDERR_CANTPAGELOCK"
Case -2005532012
ProcedureReturn "DDERR_CANTPAGEUNLOCK"
Case -2005531992
ProcedureReturn "DDERR_NOTPAGELOCKED"
Case -2005401590
ProcedureReturn "DSERR_ALLOCATED"
Case -2005401570
ProcedureReturn "DSERR_CONTROLUNAVAIL"
Case -2005401550
ProcedureReturn "DSERR_INVALIDCALL"
Case -2005401530
ProcedureReturn "DSERR_PRIOLEVELNEEDED"
Case -2005401500
ProcedureReturn "DSERR_BADFORMAT"
Case -2005401480
ProcedureReturn "DSERR_NODRIVER"
Case -2005401470
ProcedureReturn "DSERR_ALREADYINITIALIZED"
Case -2005401450
ProcedureReturn "DSERR_BUFFERLOST"
Case -2005401440
ProcedureReturn "DSERR_OTHERAPPHASPRIO"
Case -2005401430
ProcedureReturn "DSERR_UNINITIALIZED"
EndSelect
ProcedureReturn "Not DirectSoundError"
EndProcedure
DirectSound Stream Play
DirectSound Multi Buffered Streaming Play
"error.pbi" is before post code.
"error.pbi" is before post code.
Code: Select all
;--------------------------------------------------------------
;- DirectSound Streaming Play
; Tomijan 2006
; PB4 (Single Loop only)
;
; oryaaaa 2009
; PB4.4 Beta3 (Multi Buffered )
;
;--------------------------------------------------------------
;
;XIncludeFile "error.pbi"
#BLOCKNUM = 4;
#DSBCAPS_LOCSOFTWARE = $8
#DSBCAPS_CTRLFREQUENCY = $20
#DSBCAPS_CTRLVOLUME = $80
#DSBCAPS_CTRLPAN = $40
#DSBCAPS_CTRLPOSITIONNOTIFY = $00000100
#DSBCAPS_GETCURRENTPOSITION2 =$00010000
#DSBCAPS_GLOBALFOCUS = $00008000
#DSBCAPS_PRIMARYBUFFER = $1;
#DSSCL_EXCLUSIVE = 3
#DSSCL_NORMAL = 1
#DSSCL_PRIORITY = 2
#DSSCL_WRITEPRIMARY = 4
#DD_OK = 0
#DS_OK = 0
;
#DSBPLAY_LOOPING = $1
#DSBLOCK_FROMWRITECURSOR = $1
#DSBLOCK_ENTIREBUFFER = $2
Structure DSBUFFERDESC
dwSize.l
dwFlags.l
dwBufferBytes.l
dwReserved.l
*lpwfxFormat
EndStructure
;
Structure DSBPOSITIONNOTIFY
dwOffset.l;
hEventNotify.l;
EndStructure
;
Structure DIRECTSOUND
RA_DirectSound.l
Sound.l
Notify.l
secBuflen.l
nChannels.l
EndStructure
;
;
;- Globals
Global hWndM, hEvent
Global *mem
Global *RA_DirectSound.IDirectSound8
Global *lpPrimary.IDirectSoundBuffer
Global *lpPlayBuf.IDirectSoundBuffer
Global *lpNotify.IDirectSoundNotify
Global Dim hEvent(#BLOCKNUM+1)
Global Dim Notifications.DSBPOSITIONNOTIFY(#BLOCKNUM)
Global DX8Sound.DIRECTSOUND
Procedure Delete(*obj.IUnknown)
ProcedureReturn *obj\Release()
EndProcedure
;
Procedure PrepareDX8Sound (*pWfx.WAVEFORMATEX)
Blocksize = 176400
If OpenLibrary(0,"DSOUND.DLL")
;DirectSound get interface
result.l = CallFunction(0,"DirectSoundCreate8",0,@*RA_DirectSound,0)
EndIf
If result = #Null
;Set Cooperative Level
result = *RA_DirectSound\SetCooperativeLevel(hWndM,#DSSCL_PRIORITY) ; hwnd is the WindowID
If result.l <> #DD_OK
Delete(*RA_DirectSound)
Else
; Making Primal Buffer
dsbd.DSBUFFERDESC
FillMemory(@dsbd, SizeOf(dsbd), 0)
dsbd\dwSize = SizeOf(dsbd)
dsbd\dwFlags = #DSBCAPS_PRIMARYBUFFER
result.l = *RA_DirectSound\CreateSoundBuffer(@dsbd,@*lpPrimary,0)
If result.l <> #DD_OK
Delete(*RA_DirectSound)
Fresult = #Null
EndIf
;
;WAVE FORMAT (If use ACM stream, this block remove)
*pWfx\wFormatTag = #WAVE_FORMAT_PCM
*pWfx\nChannels = 2
*pWfx\nSamplesPerSec = 44100
*pWfx\nAvgBytesPerSec = 176400
*pWfx\nBlockAlign = 4
*pWfx\wBitsPerSample = 16
*pWfx\cbSize = 0
result = *lpPrimary\SetFormat(*pWfx)
If result.l <> #DD_OK
Delete(*RA_DirectSound)
Fresult = #Null
EndIf
; Making Secondaly Buffer
dsbd\dwFlags = #DSBCAPS_GETCURRENTPOSITION2 | #DSBCAPS_GLOBALFOCUS | #DSBCAPS_CTRLPOSITIONNOTIFY
dsbd\dwBufferBytes = Blocksize * #BLOCKNUM
dsbd\lpwfxFormat = *pWfx
;
result.l = *RA_DirectSound\CreateSoundBuffer(@dsbd,@*lpPlayBuf,0)
If result.l <> #DD_OK
Delete(*RA_DirectSound)
Fresult = #Null
EndIf
; Making Notify
result.l = *lpPlayBuf\QueryInterface(?IID_DirectSoundNotify8,@*lpNotify)
If result.l <> #DD_OK
Delete(*RA_DirectSound)
Fresult = #Null
EndIf
; Making Event
For I=0 To #BLOCKNUM
hEvent(I) = CreateEvent_(#Null, #False, #False, #Null)
Next
; Setting Notify Position
;
nBlockAlign = *pWfx\nBlockAlign;
nSamplesPerSec = *pWfx\nSamplesPerSec;
dwNotifySize = nSamplesPerSec * #BLOCKNUM * nBlockAlign / #BLOCKNUM
dwNotifySize = dwNotifySize - (dwNotifySize % nBlockAlign)
For I=0 To #BLOCKNUM
Notifications(I)\dwOffset = dwNotifySize*(I)
Notifications(I)\hEventNotify = hEvent(I)
Next
*lpNotify\SetNotificationPositions(#BLOCKNUM, @Notifications(0))
DX8Sound\secBuflen = #BLOCKNUM * *pWfx\nAvgBytesPerSec
DX8Sound\Sound = *lpPlayBuf
DX8Sound\Notify = *lpNotify
DX8Sound\RA_DirectSound = *RA_DirectSound
DX8Sound\nChannels = *pWfx\nChannels
Fresult = *lpPrimary
EndIf
Else
MessageRequester("Error","Please install DirectX v.8 or above",0)
End
EndIf
If IsLibrary(0)
CloseLibrary(0)
EndIf
ProcedureReturn Fresult
EndProcedure
;
Procedure DXSound(BufMax.l) ; ******************************************
Protected *pWfx.WAVEFORMATEX
*pWfx = *mem+20
result = PrepareDX8Sound(*pWfx)
If result
dwLength.l = DX8Sound\secBuflen/#BLOCKNUM
dwLengthAll.l = DX8Sound\secBuflen
*Sound.IDirectSoundBuffer8 = DX8Sound\Sound
*Sound\SetCurrentPosition(0)
; Skip noise block
*clearmem = AllocateMemory(256)
Repeat
If CompareMemory(*mem, *clearmem, 255)
If flag
Break
EndIf
Else
flag=1
*mem+255
EndIf
ForEver
FreeMemory(*clearmem)
For I=0 To #BLOCKNUM-2
bufpos = I * dwLength
wres = *Sound\Lock(bufpos, dwLength,@StreamBuffer1,@L1,@StreamBuffer2,@L2, 0 )
If wres = #DS_OK
CopyMemory_(StreamBuffer1,*mem,L1)
*mem+L1
If L2
CopyMemory_(StreamBuffer2,*mem,L2)
EndIf
*mem+L2
lres = *Sound\Unlock(StreamBuffer1,L1,StreamBuffer2,L2)
EndIf
Next
block = #BLOCKNUM -1
*Sound\play(0,0,#DSBPLAY_LOOPING)
Repeat
wfso = WaitForMultipleObjects_(#BLOCKNUM+1, hEvent(), #False, #INFINITE)
If wfso=>0 And wfso<#BLOCKNUM
wres = *Sound\Lock(block*dwLength, dwLength,@StreamBuffer1,@Len1,@StreamBuffer2,@Len2, 0 )
If wres = #DS_OK And Len1
If BufMax<(Len1+*mem)
CopyMemory_(StreamBuffer1,*mem,BufMax-*mem)
Else
CopyMemory_(StreamBuffer1,*mem,Len1)
*mem+Len1
If Len2
If BufMax<(Len2+*mem)
CopyMemory_(StreamBuffer2,*mem,BufMax-*mem)
Else
CopyMemory_(StreamBuffer2,*mem,Len2)
*mem+Len2
EndIf
EndIf
lres = *Sound\Unlock(StreamBuffer1,Len1,StreamBuffer2,Len2)
EndIf
EndIf
block = (block +1 )% #BLOCKNUM
EndIf
If Len1=0 And Len2=0
Break
EndIf
ForEver
; Ending Process
For I=0 To #BLOCKNUM + 1
If hEvent(I)
CloseHandle_(hEvent(I))
EndIf
Next
If *lpNotify
*lpNotify\Release()
EndIf
If *lpPlayBuf
*lpPlayBuf\Release()
EndIf
If *lpPrimary
*lpPrimary\Release()
EndIf
If *RA_DirectSound
Delete(*RA_DirectSound)
EndIf
EndIf
EndProcedure
;
;
f=ReadFile(0,OpenFileRequester("Select WAV file", "", "*.wav",0))
If f
*mem = AllocateMemory(Lof(0))
*mem2 = *mem
ReadData(0,*mem,Lof(0))
wave.WAVEFORMATEX
FileSeek(0,20)
ReadData(0,@wave,SizeOf(WAVEFORMATEX))
CloseFile(0)
hWndM = OpenWindow(0,0,0,20,20,"Sound",#PB_Window_ScreenCentered)
DXSound(*mem+MemorySize(*mem))
FreeMemory(*mem2)
CloseWindow(0)
EndIf
End
;
DataSection
IID_DirectSoundBuffer8: ; DSOUND.h
Data.l $6825A449
Data.w $7524,$4D82
Data.b $92,$0F,$50,$E3,$6A,$B3,$AB,$1E
IID_DirectSoundNotify8:
Data.l $B0210783
Data.w $89CD, $11D0
Data.b $AF,$08,$00,$A0,$C9,$25,$CD,$16
EndDataSection
Last edited by oryaaaaa on Mon Sep 21, 2009 9:07 am, edited 1 time in total.