IsSoundPlaying() GetSoundPosition() etc...

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

IsSoundPlaying() GetSoundPosition() etc...

Message 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

Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

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

Message 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 ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message 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
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

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

Message 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
Répondre