Page 1 of 1

[Implemented] IsPlaying and other commands for sound

Posted: Wed Dec 12, 2007 9:24 am
by Lebostein
Hi,

it's possible to add
- IsPlayingSound
- IsPlayingModule
to check the status of playing?

Other basic and useful commands for the modplug library are:
- CatchModule
- ModulePan
and possibility to play modules in loop.

Thank you!

Posted: Wed Dec 12, 2007 2:48 pm
by blueznl
+277282737272772 :-)

Posted: Wed Dec 12, 2007 3:03 pm
by inc.
From Stephan Moebius at the www.Purebasic-Lounge.de Board:

Code: Select all

Structure DSBCAPS 
  dwSize.l 
  dwFlags.l 
  dwBufferBytes.l 
  dwUnlockTransferRate.l 
  dwPlayCpuOverhead.l 
EndStructure 

Procedure _DirectSoundCB(guid,desc,module,context) 
  CopyMemory(desc,context,256) 
  ProcedureReturn 0 
EndProcedure 

Procedure IsSoundPlaying(Sound);returns weather the Sound is playing or not. 
  Address=IsSound(Sound) 
  If Address=0:ProcedureReturn 0:EndIf 
  *DSB.IDirectSoundBuffer=PeekL(Address) 
  *DSB\GetStatus(@Status) 
  If Status=1 Or Status=5 
    ProcedureReturn 1 
  EndIf 
  ProcedureReturn 0 
EndProcedure 

Procedure GetSoundPosition(Sound);returns the current position of the Sound.(in bytes) 
  Address=IsSound(Sound) 
  If Address=0:ProcedureReturn 0:EndIf 
  *DSB.IDirectSoundBuffer=PeekL(Address) 
  *DSB\GetCurrentPosition(@Position,0) 
  ProcedureReturn Position 
EndProcedure 

Procedure SetSoundPosition(Sound,Position);sets the current position of the Sound.(in bytes) 
  Address=IsSound(Sound) 
  If Address=0:ProcedureReturn 0:EndIf 
  *DSB.IDirectSoundBuffer=PeekL(Address) 
  ProcedureReturn *DSB\SetCurrentPosition(Position) 
EndProcedure 

Procedure GetSoundSize(Sound);Returns the size of the Sound in bytes. 
  Address=IsSound(Sound) 
  If Address=0:ProcedureReturn 0:EndIf 
  *DSB.IDirectSoundBuffer=PeekL(Address) 
  Caps.DSBCAPS\dwSize=SizeOf(DSBCAPS) 
  *DSB\GetCaps(@Caps) 
  ProcedureReturn Caps\dwBufferBytes 
EndProcedure 

Procedure GetSoundFrequency(Sound) 
  Address=IsSound(Sound) 
  If Address=0:ProcedureReturn 0:EndIf 
  *DSB.IDirectSoundBuffer=PeekL(Address) 
  *DSB\GetFrequency(@Freq) 
  ProcedureReturn Freq 
EndProcedure 

Procedure.s GetSoundCardName() 
  hModule=GetModuleHandle_("dsound.dll") 
  If hModule=0:ProcedureReturn "":EndIf 
  Addr=GetProcAddress_(hModule,"DirectSoundEnumerateA") 
  If Addr=0:ProcedureReturn "":EndIf 
  String$=Space(256) 
  CallFunctionFast(Addr,@_DirectSoundCB(),String$) 
  ProcedureReturn String$ 
EndProcedure 




;Example: 
InitSound() 

MessageRequester("",GetSoundCardName()) 

File$=OpenFileRequester("Load wav-file","*.wav","wav-file |*.wav",0) 

Result=LoadSound(1,File$) 

If Result=0:MessageRequester("ERROR","Can't load sound."):End:EndIf 

OpenWindow(1,0,0,400,25,#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Play") 

PlaySound(1) 
Repeat 
  Event=WindowEvent() 
  
  SetWindowTitle(1,Str(GetSoundPosition(1))+"/"+Str(GetSoundSize(1))) 
Until Event=#PB_Event_CloseWindow Or IsSoundPlaying(1)=0


Posted: Wed Dec 12, 2007 3:09 pm
by freak
blueznl wrote:+277282737272772 :-)
We're not counting feature requests in quads... :twisted:

Code: Select all

Line 1: Overflow error: a 'long' value (.l) must be between -2147483648 and +4294967295