[ok] Lecteur OGG bouffeur de ressources

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[ok] Lecteur OGG bouffeur de ressources

Message par Ar-S »

Salut,

Pour tuer le temps je me suis mis à me coder un petit lecteur d'OGG utilisant un canvas pour afficher la progression et la modifier si besoin.
Il fonctionne mais me bouffe pas mal de ressources (entre 25 et 29% du proce)
Je pense que c'est lié au dessin constant de la progressbar en canvas que j'ai mis jsute après mon repeat.

Vu que la progression doit être constante, je ne vois pas comment faire autrement.
Si vous avez une idée.

Code : Tout sélectionner

; OOg / Flac - Canvas Player  by Ar-S

If InitSound() = 0
  MessageRequester("Error", "Sound system is not available",  0)
  End
EndIf
UseOGGSoundDecoder()



Enumeration GUI
  #WIN
  #BTPLAYPAUSE
  #BTstop
  #Canvastime
  #ZIK
  #AFFICH
  
  #F
  #T
EndEnumeration


Global.s Fichier = "piano.ogg"
SON = LoadSound(#ZIK,Fichier)

Global F = LoadFont(#F, "Arial", 10)

#PLAY   = 1
#PAUSE  = 0
#RESUME = 2
#STOP   = 3

Global WX,WY,WL,WH ; Position taille fenetre
Global LC,HC,XC,YC ; Position taille Canvas
Global Li,Hi,Xi,Yi ; Position taille image lecture
Global DureeSON = SoundLength(#ZIK, #PB_Sound_Millisecond)
Global Duree_EN_SECONDE = DureeSON / 1000
Global.b JOUE
Global En_Minutes =  Duree_EN_SECONDE/60
Global En_Sec     =  Duree_EN_SECONDE%60
Global.s Duree_Totale


; Ajout des 0 pour l'esthétique
If En_Minutes < 10
  EM.s = "0" + Str(En_Minutes) + "m"
Else
  EM.s = Str(En_Minutes) + "m"
EndIf

If En_Sec < 10
  ES.s = "0" + Str(En_Sec) + "s"  
Else
  ES.s = Str(En_Sec) + "s"
EndIf

Duree_Totale = EM + ES


Fichier = RemoveString(Fichier,GetExtensionPart(fichier),0)


JOUE = #STOP
WX = #PB_Ignore
WY = #PB_Ignore
WL = 600
WH = 400

LC = WL
HC = 40
Li = 1
Hi = 20
Xi = 0
Yi = 0


; Barre de progression et %
Macro DrawBar(L)
  StartDrawing(CanvasOutput(#Canvastime))
  Box(0,0,LC,HC,$0)
  Box(0,10,L,20,$00ff00)
  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(F)
  If BarPOS/6 <= 93
    XX = BarPOS+5
    CC = $00CCFF
  Else
    XX = BarPOS-35
    CC = $0
  EndIf
  DrawText(XX, 10, Str(BarPOS/6) + " %", CC)
  
 StopDrawing()
EndMacro





Procedure Quitte()
  Exit = 1
EndProcedure


If OpenWindow(#win, WX,WY,WL,WH,"Lecteur",#PB_Window_SystemMenu)

  StringGadget(#AFFICH,0,0,WL,25,"",#PB_String_ReadOnly)
  ButtonGadget(#BTPLAYPAUSE,  0,85,100,30,"Jouer")
  ButtonGadget(#BTSTOP,     101,85,100,30,"Stop")
  CanvasGadget(#Canvastime,0,40,LC,HC,#PB_Canvas_ClipMouse)
  StartDrawing(CanvasOutput(#Canvastime))
  Box(0,0,LC,HC,$0)
  StopDrawing()
  
  
  Repeat
    
    
    If SoundStatus(#zik) = #PB_Sound_Playing Or SoundStatus(#zik) = #PB_Sound_Paused
      Posi_SON = GetSoundPosition(#ZIK, #PB_Sound_Millisecond)
      
      ; Ajout des 0 pour l'esthétique
      SEC = Posi_SON / 1000
      MIN = SEC/60
      If MIN < 10
      Minute.s = "0" + Str(MIN)
      Else
      Minute.s = Str(MIN)
      EndIf
      
      RESTE = SEC % 60
      If RESTE < 10
        Seconde.s = "0" + Str(RESTE)
      Else
        Seconde.s = Str(RESTE)
      EndIf
      
      
      Duree2.s = Minute + "m" + Seconde + "s"
      SetGadgetText(#AFFICH, " >> " + Fichier + " : " + Duree2.s + " / " + Duree_Totale )
      
      PlayPOS = (Posi_SON * DureeSON) /LC
      BarPOS.f =  Posi_SON / DureeSON * LC 
      DrawBar(BarPOS)
      
      ElseIf SoundStatus(#ZIK) = #PB_Sound_Stopped
        
        Posi_SON = 0
        DrawBar(BarPOS)
        
      EndIf
      
    
      Select WaitWindowEvent(1)

          
        Case #PB_Event_Gadget  
          
          Select EventGadget()
              
            Case #BTstop  
                JOUE = #STOP
                StopSound(#zik)
                SetSoundPosition(#zik,0)
                BarPOS = 0
                
                
            Case #BTPLAYPAUSE
              
              If JOUE = #STOP
                JOUE = #PLAY
                SetGadgetText(#BTPLAYPAUSE,"Lecture en cours")
                PlaySound(#zik,#PB_Sound_Millisecond,80)
                
                
              ElseIf  JOUE = #PLAY
                JOUE = #PAUSE
                SetGadgetText(#BTPLAYPAUSE,"Lecture en pause")
                PauseSound(#ZIK)
                
              ElseIf JOUE = #PAUSE
                  JOUE = #RESUME
                  SetGadgetText(#BTPLAYPAUSE,"Lecture en cours")
                  ResumeSound(#ZIK)
                  
                  
              ElseIf JOUE = #RESUME
                JOUE = #PAUSE     
                SetGadgetText(#BTPLAYPAUSE,"Lecture en pause")
                PauseSound(#ZIK)
                
              EndIf
                              
              
              
              
            Case #Canvastime
   
              
              
              Select EventType()
                  
                  
                Case #PB_EventType_MouseEnter
                  SetGadgetAttribute(#Canvastime, #PB_Canvas_Cursor, #PB_Cursor_Hand)
                  
                Case #PB_EventType_MouseLeave
                  SetGadgetAttribute(#Canvastime, #PB_Canvas_Cursor, #PB_Cursor_Default)
                  
                  
                Case #PB_EventType_LeftButtonDown
                  Xcurs = GetGadgetAttribute(#Canvastime,#PB_Canvas_MouseX)
                  BarPOS = Xcurs ; DrawBar(Xcurs)
                  NewPos = Xcurs * (DureeSON/LC)
                  SetSoundPosition(#ZIK, NewPos, #PB_Sound_Millisecond)

                  
              EndSelect
              
                  
              
              
              
          EndSelect
          
          
   
         
         Case #PB_Event_CloseWindow
           Exit=1
           
     EndSelect
     
   Until exit = 1
   
   
   
 EndIf
 
   End   
   
   
Dernière modification par Ar-S le mer. 09/sept./2015 18:16, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Lecteur OGG bouffeur de ressources

Message par falsam »

Spock a écrit :je rigole ??? ptet avec un Delay() bien placé !!
Qui sert à rien on te l'a dit et répété :mrgreen:

1 - J'ai placé les lignes à l'intérieur du select de ta boucle événementielle

Code : Tout sélectionner

If SoundStatus(#zik) = #PB_Sound_Playing Or SoundStatus(#zik) = #PB_Sound_Paused
     ......
EndIf
2 - J'ai commenté cette ligne

Code : Tout sélectionner

SetGadgetText(#AFFICH, " >> " + Fichier + " : " + Duree2 + " / " + Duree_Totale )
Telle qu'elle était placé, elle t'augmente ton occupation CPU de > à 10%

Ta variable Duree2.s qui se trouvait sur cette ligne, est déclarée au début du code.
Un petit if pour empêcher la mise à jour de la bar quand le morceau n'est pas joué.

Je pense qu'avec ces quelques changements, ta consommation cpu passe de 23% à environ 1%. (23% c'était le code initial sur mon pc).

Tu dé-commenteras cette ligne pour voir la différence d'occupation CPU.

Code : Tout sélectionner

; OOg / Flac - Canvas Player  by Ar-S
If InitSound() = 0
  MessageRequester("Error", "Sound system is not available",  0)
  End
EndIf
UseOGGSoundDecoder()
Enumeration GUI
  #WIN
  #BTPLAYPAUSE
  #BTstop
  #Canvastime
  #ZIK
  #AFFICH
  #F
  #T
EndEnumeration
Global.s Fichier =  "piano.ogg"
SON = LoadSound(#ZIK,Fichier)
Global F = LoadFont(#F, "Arial", 10)
#PLAY   = 1
#PAUSE  = 0
#RESUME = 2
#STOP   = 3
Global WX,WY,WL,WH ; Position taille fenetre
Global LC,HC,XC,YC ; Position taille Canvas
Global Li,Hi,Xi,Yi ; Position taille image lecture
Global DureeSON = SoundLength(#ZIK, #PB_Sound_Millisecond)
Global Duree_EN_SECONDE = DureeSON / 1000
Global.b JOUE
Global En_Minutes =  Duree_EN_SECONDE/60
Global En_Sec     =  Duree_EN_SECONDE%6

Global.s Duree_Totale, Duree2.s 

Global BarPOS.f
; Ajout des 0 pour l'esthétique
If En_Minutes < 10
  EM.s = "0" + Str(En_Minutes) + "m"
Else
  EM.s = Str(En_Minutes) + "m"
EndIf
If En_Sec < 10
  ES.s = "0" + Str(En_Sec) + "s" 
Else
  ES.s = Str(En_Sec) + "s"
EndIf
Duree_Totale = EM + ES
Fichier = RemoveString(Fichier,GetExtensionPart(fichier),0)
JOUE = #STOP
WX = #PB_Ignore
WY = #PB_Ignore
WL = 600
WH = 400
LC = WL
HC = 40
Li = 1
Hi = 20
Xi = 0
Yi = 0
; Barre de progression et %
Macro DrawBar(L)
  StartDrawing(CanvasOutput(#Canvastime))
  Box(0,0,LC,HC,$0)
  Box(0,10,L,20,$00ff00)
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(F)
  If BarPOS/6 <= 93
    XX = BarPOS+5
    CC = $00CCFF
  Else
    XX = BarPOS-35
    CC = $0
  EndIf
  DrawText(XX, 10, Str(BarPOS/6) + " %", CC)
  StopDrawing()
EndMacro

Procedure Quitte()
  Exit = 1
EndProcedure

If OpenWindow(#win, WX,WY,WL,WH,"Lecteur",#PB_Window_SystemMenu)
  StringGadget(#AFFICH,0,0,WL,25,"",#PB_String_ReadOnly)
  ButtonGadget(#BTPLAYPAUSE,  0,85,100,30,"Jouer")
  ButtonGadget(#BTSTOP,     101,85,100,30,"Stop")
  CanvasGadget(#Canvastime,0,40,LC,HC,#PB_Canvas_ClipMouse)
  StartDrawing(CanvasOutput(#Canvastime))
  Box(0,0,LC,HC,$0)
  StopDrawing()
  
  Repeat
    Select WaitWindowEvent(1000)
      Case #PB_Event_Gadget 
        Select EventGadget()
          Case #BTstop 
            JOUE = #STOP
            StopSound(#zik)
            SetSoundPosition(#zik,0)
            BarPOS = 0
          Case #BTPLAYPAUSE
            If JOUE = #STOP
              JOUE = #PLAY
              SetGadgetText(#BTPLAYPAUSE,"Lecture en cours")
              PlaySound(#zik,#PB_Sound_Millisecond,80)
            ElseIf  JOUE = #PLAY
              JOUE = #PAUSE
              SetGadgetText(#BTPLAYPAUSE,"Lecture en pause")
              PauseSound(#ZIK)
            ElseIf JOUE = #PAUSE
              JOUE = #RESUME
              SetGadgetText(#BTPLAYPAUSE,"Lecture en cours")
              ResumeSound(#ZIK)
            ElseIf JOUE = #RESUME
              JOUE = #PAUSE     
              SetGadgetText(#BTPLAYPAUSE,"Lecture en pause")
              PauseSound(#ZIK)
            EndIf
            
          Case #Canvastime
            Select EventType()
              Case #PB_EventType_MouseEnter
                SetGadgetAttribute(#Canvastime, #PB_Canvas_Cursor, #PB_Cursor_Hand)
              Case #PB_EventType_MouseLeave
                SetGadgetAttribute(#Canvastime, #PB_Canvas_Cursor, #PB_Cursor_Default)
              Case #PB_EventType_LeftButtonDown
                Xcurs = GetGadgetAttribute(#Canvastime,#PB_Canvas_MouseX)
                BarPOS = Xcurs ; DrawBar(Xcurs)
                NewPos = Xcurs * (DureeSON/LC)
                SetSoundPosition(#ZIK, NewPos, #PB_Sound_Millisecond)
            EndSelect            
        EndSelect
        
      Case #PB_Event_CloseWindow
        Exit=1
        
      Default
        If SoundStatus(#zik) = #PB_Sound_Playing Or SoundStatus(#zik) = #PB_Sound_Paused
          Posi_SON = GetSoundPosition(#ZIK, #PB_Sound_Millisecond)
          ; Ajout des 0 pour l'esthétique
          SEC = Posi_SON / 1000
          MIN = SEC/60
          If MIN < 10
            Minute.s = "0" + Str(MIN)
          Else
            Minute.s = Str(MIN)
          EndIf
          RESTE = SEC % 60
          If RESTE < 10
            Seconde.s = "0" + Str(RESTE)
          Else
            Seconde.s = Str(RESTE)
          EndIf
          Duree2 = Minute + "m" + Seconde + "s"
          
          ;Decommente pour voir la différence de temps cpu
          ;SetGadgetText(#AFFICH, " >> " + Fichier + " : " + Duree2 + " / " + Duree_Totale )
          
          PlayPOS = (Posi_SON * DureeSON) /LC
          BarPOS =  Posi_SON / DureeSON * LC
          If mem_PlayPOS<>PlayPOS
            SetGadgetText(#AFFICH, " >> " + Fichier + " : " + Duree2 + " / " + Duree_Totale )
            DrawBar(BarPOS)
            mem_PlayPOS=PlayPOS
            
          EndIf
        ElseIf SoundStatus(#ZIK) = #PB_Sound_Stopped
          If Posi_SON <> 0 
            Duree2 = "00m00s"
            SetGadgetText(#AFFICH, " >> " + Fichier + " : " + Duree2 + " / " + Duree_Totale )
            Posi_SON = 0
            DrawBar(BBarPOS)
          EndIf
        EndIf
    EndSelect
  Until exit = 1
EndIf
End 
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Lecteur OGG bouffeur de ressources

Message par falsam »

Spock a écrit :t'as vu le rafraichissement de ta barre ??
ça saccade !! Grave ! l'avancé de ta barre se fait par pas !! c'est naze !
l'avancé de ta barre se fait par pas !! c'est naze !
Chez moi tout va bien. Pas de saccade. Il fonctionne visuellement de la même manière que ton code. La mauvaise fois dans tes mots n'a pas de limite Spock (ça saccade, Grave, Naze)

Si ton pc rame tant que ça malgré ton i7 et tes mégarams, diminue le WaitWindowEvent() en le passant à 10 par exemple.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Lecteur OGG bouffeur de ressources

Message par falsam »

Spock a écrit :ton truc marche si tu mets

Code : Tout sélectionner

WaitWindowEvent(2)
au lieu de WaitWindowEvent(1000)
Sur mon PC 1000 ou 2 ne change rien. Ca reste fluide et toujours avec une consommation CPU de 1% environ quand on lit le fichier et 0 sans lecture.

Fais un effort et avoue que sans Delay() ça fonctionne bien :mrgreen: héhé
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Lecteur OGG bouffeur de ressources

Message par falsam »

Spock a écrit :je n'ai rien a avouer , c'est un fait, ça fonctionne , je l'ai ecris plus haut !
Bien sur que ton code fonctionne mais tu as ajouté un Delay pour pallier à un défaut de conception. Tu es un mauvais joueur Spock !!
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Lecteur OGG bouffeur de ressources

Message par Ar-S »

Ne vous prenez pas le bec pour moi mes loulous.
Merci à vous deux. Je vais regardé ça à tête reposé, là je suis épuisé et me tape une crève carabinée.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [ok] Lecteur OGG bouffeur de ressources

Message par G-Rom »

Tu rajoutes seulement :
If SoundStatus(#zik) = #PB_Sound_Playing Or SoundStatus(#zik) = #PB_Sound_Paused

If Timer < ElapsedMilliseconds()
Timer = ElapsedMilliseconds()+10

et tu ferme le endif avant le elseif pour le son qui n'est pas joué , je passe de 13% d'occupation à 0/1% , ce qui prend tu temps , c'est le dessin , pas les events.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [ok] Lecteur OGG bouffeur de ressources

Message par falsam »

G-Rom a écrit : ce qui prend tu temps , c'est le dessin
Non G-Rom. Si tu commentes la ligne

Code : Tout sélectionner

SetGadgetText(#AFFICH, " >> " + Fichier + " : " + Duree2 + " / " + Duree_Totale )
Tu vas voir que le %Cpu diminue enormément.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [ok] Lecteur OGG bouffeur de ressources

Message par G-Rom »

SetGadgetText fait quoi a ton avis ? tu café ? :mrgreen:
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [ok] Lecteur OGG bouffeur de ressources

Message par falsam »

G-Rom a écrit :SetGadgetText fait quoi a ton avis ? tu café ? :mrgreen:
Ha ha ha mais Monsieur G-Rom est taquin ce soir. :mrgreen:

Je dis seulement que cette ligne est mal placé dans le code initial d'Ar-s et provoque une consommation inutile du processeur. Avant de dire ça, j'ai fait quelques tests.

Ceci dit, j'ai donné un code corrigé et sans ajout de rustine comme un Delay() par exemple. En mode lecture il utilise 1% environ du cpu.

Précision, je ne dis pas que ta solution ne fonctionne pas. Je dis seulement que ton affirmation est fausse.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [ok] Lecteur OGG bouffeur de ressources

Message par G-Rom »

Mon affirmation , c'est que c'est le dessin qui pose problème , setgadgettext & drawbar sont très consomatrice de CPU , pour palier a cela , tu les lances à intervalles régulier , pas à chaque tour de boucle , on appelle cela de la temporisation , mon affirmation est donc valable , je ne relève pas de vos discours de sourd sur les delay() les doubles boucles , etc... en 2 lignes supplémentaire le problème est réglé et le sujet clos. et je ne touche pas au code d'Ars. ;)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [ok] Lecteur OGG bouffeur de ressources

Message par falsam »

G-Rom a écrit :le problème est réglé et le sujet clos
Le problème était réglé bien avant que tu postes ton commentaire. Tu as vu il y avait un [ok]

Je ne répondrais plus sur ce sujet car tu es le chef et le chef a toujours raison hein ? même quand il a tord cette fois-çi.

PS: N'oublie pas de le locker
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [ok] Lecteur OGG bouffeur de ressources

Message par G-Rom »

Je suis le chef de personne , le secret de la liberté c'est de ne travailler pour personne et de ne faire travailler personne ;)
Mon navigateur étant allumé toute la journée , je suis tombé sur le sujet il n'y avait pas encore de réponse, et quand je suis rentré , le topic était rempli par les 2 ténors du forum. d'ailleurs quand j'ai voullu appuyer sur Envoyer , j'ai eu un message de tentative de connection trop nombreuse , j'ai eu le droit au capcha pour me connecté , je constate que je ne passerais pas le balais chez toi (cherchez pas à comprendre , discutions entre moi & Failsam) :mrgreen:
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [ok] Lecteur OGG bouffeur de ressources

Message par Mesa »

Il est vrai que le canvas en lui-même peut très vite consommer du temps processeur si on ne fait pas attention à la boucle.

Ici, on a affaire à un cas typique où le Timer va nous aider grandement (même si l'astuce de GROM est suffisant dans ce petit code).

Avec un timer, je dépasse rarement le 1% ! ! !
Difficile de faire mieux (peut-être avec bindxxx() ?)

@ARS, dommage que tu n'utilises pas toutes les possibilités de PureBasic, voir le code ci-dessous :wink:

Code : Tout sélectionner

; OOg / Flac - Canvas Player  by Ar-S

If InitSound() = 0
  MessageRequester("Error", "Sound system is not available",  0)
  End
EndIf
UseOGGSoundDecoder()

Enumeration GUI
  #WIN
  #BTPLAYPAUSE
  #BTstop
  #Canvastime
  #ZIK
  #AFFICH
  
  #F
  #T
EndEnumeration


Global.s Fichier = #PB_Compiler_Home + "Examples\3D\Data\Roar.ogg"
SON = LoadSound(#ZIK,Fichier)

Global F = LoadFont(#F, "Arial", 10, #PB_Font_Bold )

#PLAY   = 1
#PAUSE  = 0
#RESUME = 2
#STOP   = 3

Global WX,WY,WL,WH ; Position taille fenetre
Global LC,HC,XC,YC ; Position taille Canvas
Global Li,Hi,Xi,Yi ; Position taille image lecture
Global DureeSON = SoundLength(#ZIK, #PB_Sound_Millisecond)
Global Duree_EN_SECONDE = DureeSON / 1000
Global.b JOUE
Global En_Minutes =  Duree_EN_SECONDE/60
Global En_Sec     =  Duree_EN_SECONDE%60
Global.s Duree_Totale


; Ajout des 0 pour l'esthétique
; If En_Minutes < 10
;   EM.s = "0" + Str(En_Minutes) + "m"
; Else
;   EM.s = Str(En_Minutes) + "m"
; EndIf
EM.s = RSet(Str(En_Minutes), 2, "0") + "m"

; If En_Sec < 10
;   ES.s = "0" + Str(En_Sec) + "s"  
; Else
;   ES.s = Str(En_Sec) + "s"
; EndIf
ES.s = RSet(Str(En_Sec), 2, "0") + "s"

Duree_Totale = EM + ES

;Fichier = RemoveString(Fichier,GetExtensionPart(fichier),0)
;Debug GetPathPart(Fichier)+GetFilePart(Fichier, #PB_FileSystem_NoExtension); reste le point '.' a enlevé !
;En supposant que l'on reste sous windows et que l'extension n'a que 3 lettres:
Fichier = Left(Fichier, Len(Fichier)-4)

JOUE = #STOP
WX = #PB_Ignore
WY = #PB_Ignore
WL = 600
WH = 400

LC = WL
HC = 40
Li = 1
Hi = 20
Xi = 0
Yi = 0


; Barre de progression et %
Macro DrawBar(L)
  StartDrawing(CanvasOutput(#Canvastime))
  Box(0,0,LC,HC,$0)
  Box(0,10,L,20,$00ff00)
  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(F)
  ;   If BarPOS/6 <= 93
  ;     XX = BarPOS+5
  ;     CC = $00CCFF
  ;   Else
  ;     XX = BarPOS-35
  ;     CC = $0
  ;   EndIf
  ;DrawText(XX, 10, Str(BarPOS/6) + " %", CC);==> Très difficile à voir, va trop vite
  If BarPOS <= LC/2
    CC = $FFFFFF
  Else   
    CC = $0000FF;$0
  EndIf
  
  DrawText(LC/2, 10, Str(BarPOS/6) + " %", CC)
  
  StopDrawing()
EndMacro


Procedure Quitte()
  Exit = 1
EndProcedure


If OpenWindow(#win, WX,WY,WL,WH,"Lecteur",#PB_Window_SystemMenu)
  
  StringGadget(#AFFICH,0,0,WL,25,"",#PB_String_ReadOnly)
  ButtonGadget(#BTPLAYPAUSE,  0,85,100,30," Lecture en cours ")
  ButtonGadget(#BTSTOP,     101,85,100,30," Stop ")
  ;Toujours les problèmes de DPI
  ResizeGadget(#BTPLAYPAUSE, #PB_Ignore, #PB_Ignore, GadgetWidth(#BTPLAYPAUSE ,#PB_Gadget_RequiredSize), #PB_Ignore)
  ResizeGadget(#BTSTOP, GadgetWidth(#BTPLAYPAUSE), #PB_Ignore, GadgetWidth(#BTPLAYPAUSE), #PB_Ignore)
  SetGadgetText(#BTPLAYPAUSE,"Jouer")
  
  CanvasGadget(#Canvastime,0,40,LC,HC,#PB_Canvas_ClipMouse)
  StartDrawing(CanvasOutput(#Canvastime))
  Box(0,0,LC,HC,$0)
  StopDrawing()
  
  AddWindowTimer(#win, 0, 10)
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_Timer
        ; Ajouter: If EventTimer() = 0 ... si le programme utilise plusieurs timers
        If SoundStatus(#zik) = #PB_Sound_Playing Or SoundStatus(#zik) = #PB_Sound_Paused
          
          Posi_SON = GetSoundPosition(#ZIK, #PB_Sound_Millisecond)
          
          ; Ajout des 0 pour l'esthétique
          SEC = Posi_SON / 1000
          MIN = SEC/60
          ; 			If MIN < 10
          ; 			Minute.s = "0" + Str(MIN)
          ; 			Else
          ; 			Minute.s = Str(MIN)
          ; 			EndIf
          Minute.s = RSet(Str(MIN), 2, "0")
          
          
          RESTE = SEC % 60
          ; 			If RESTE < 10
          ; 				Seconde.s = "0" + Str(RESTE)
          ; 			Else
          ; 				Seconde.s = Str(RESTE)
          ; 			EndIf
          Seconde.s = RSet(Str(RESTE), 2, "0")
          ;Debug RESTE
          
          Duree2.s = Minute + "m" + Seconde + "s"
          SetGadgetText(#AFFICH, " >> " + Fichier + " : " + Duree2.s + " / " + Duree_Totale )
          
          PlayPOS = (Posi_SON * DureeSON) /LC
          BarPOS.f =  Posi_SON / DureeSON * LC 
          DrawBar(BarPOS)
          
        ElseIf SoundStatus(#ZIK) = #PB_Sound_Stopped
          
          Posi_SON = 0
          DrawBar(BarPOS)
          
        EndIf
        
      Case #PB_Event_Gadget  
        
        Select EventGadget()
            
          Case #BTstop  
            JOUE = #STOP
            StopSound(#zik)
            SetSoundPosition(#zik,0)
            BarPOS = 0
            
            
          Case #BTPLAYPAUSE
            
            If JOUE = #STOP
              JOUE = #PLAY
              SetGadgetText(#BTPLAYPAUSE,"Lecture en cours")
              PlaySound(#zik,#PB_Sound_Millisecond,80)
              
              
            ElseIf  JOUE = #PLAY
              JOUE = #PAUSE
              SetGadgetText(#BTPLAYPAUSE,"Lecture en pause")
              PauseSound(#ZIK)
              
            ElseIf JOUE = #PAUSE
              JOUE = #RESUME
              SetGadgetText(#BTPLAYPAUSE,"Lecture en cours")
              ResumeSound(#ZIK)
              
              
            ElseIf JOUE = #RESUME
              JOUE = #PAUSE     
              SetGadgetText(#BTPLAYPAUSE,"Lecture en pause")
              PauseSound(#ZIK)
              
            EndIf
            
            
          Case #Canvastime
            
            Select EventType()    
                
              Case #PB_EventType_MouseEnter
                SetGadgetAttribute(#Canvastime, #PB_Canvas_Cursor, #PB_Cursor_Hand)
                
              Case #PB_EventType_MouseLeave
                SetGadgetAttribute(#Canvastime, #PB_Canvas_Cursor, #PB_Cursor_Default)         
                
              Case #PB_EventType_LeftButtonDown
                Xcurs = GetGadgetAttribute(#Canvastime,#PB_Canvas_MouseX)
                BarPOS = Xcurs ; DrawBar(Xcurs)
                NewPos = Xcurs * (DureeSON/LC)
                SetSoundPosition(#ZIK, NewPos, #PB_Sound_Millisecond)       
                
            EndSelect
 
        EndSelect
 
      Case #PB_Event_CloseWindow
        Exit=1
        
    EndSelect
    
  Until exit = 1

EndIf

End   

M.
Répondre