Page 1 sur 1

IsSoundPlaying() GetSoundPosition() etc...

Publié : ven. 30/oct./2009 20:47
par Thyphoon
Trouvé sur le forum Anglais...
Je me dis que ça peut servir ... et je me demande si certaine commande ne sont pas multiplatforme si certain sous linux ou macos veulent tester !
inc. a écrit :From Stephan Moebius at the http://www.Purebasic-Lounge.de Board:

Code : Tout sélectionner

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


Re: IsSoundPlaying() GetSoundPosition() etc...

Publié : dim. 01/nov./2009 12:12
par Cls
Sous Linux 2.6.28.1 + KDE 3.5.10 avec PB4.30 :
Ligne 17 : Structure not found: IDirectSoundBuffer
Cette interface ne fait - elle pas partie de DirectX ?

Re: IsSoundPlaying() GetSoundPosition() etc...

Publié : dim. 01/nov./2009 12:16
par Thyphoon
Cls a écrit :Sous Linux 2.6.28.1 + KDE 3.5.10 avec PB4.30 :
Ligne 17 : Structure not found: IDirectSoundBuffer
Cette interface ne fait - elle pas partie de DirectX ?
A oui c'est bien possible :( peut être y a t'il moyen de contourner ça mais faudrait connaitre la structure utilisé sur linux et sous MacOsX... ça serait bien d'avoir ses fonctions en natif

Re: IsSoundPlaying() GetSoundPosition() etc...

Publié : dim. 01/nov./2009 12:26
par Cls
Ouaip d'autant que je vois ça dans le code :

Code : Tout sélectionner

hModule=GetModuleHandle_("dsound.dll")
Sous Nunux ça tournera jamais en l'état :( C'est clair que les intégrer à PB ça pourrait simplifier les choses.
Edit : voilà un code Delphi avec les interfaces en question : http://www.koders.com/delphi/fid0C27C9D ... =delphi#L9