Page 1 sur 1

Jacobus Player (audio) Nouvelle version

Publié : sam. 09/mai/2009 18:06
par Jacobus
Pour le fun, Voilà une mise à jour du lecteur fait il y a environ 4 ans et dispo sur FreeSoundEditor j'ai dû le passer de PB 3.93 -> à PB 4.30... quelques Argh! m'ont été utiles mais ça va. J'ai apporté quelques modifs/options en même temps.
Ca fonctionne très bien avec Vista, à voir avec XP, notamment pour l'accès au volume et à l'enregistreur. Je corrigerai si nécessaire.
Pour déplacer la fenêtre, positionnez le curseur sur la barre de gadgets du bas, maintenez enfoncé et move it!

Compatible Windows XP et Vista

Télécharger au format zip : JacobusPlayer.zip
Ou au format 7z : JacobusPlayer.7z
Décompressez dans le dossier de votre choix.

Télécharger les sources (PureBasic 4.30 version complète): JacobusPlayer_PB_430_src.zip

Lecteur audio minimaliste pour wma; wav; mp3; mid
Ici avec le réglage volume ouvert et l'enregistreur micro (n'enregistre pas les morceaux lus en direct)
Image

@+ Jacobus
19h20: Edit: Je viens de corriger un chti bug. C'est toujours dispo
20h15: Edit: Ajouté > Accès à l'égaliseur volume et l'enregistreur avec XP
20h50: Edit: Corrigé > Accès à l'égaliseur volume et l'enregistreur avec XP et Vista.
11/05/09 11h34: Edit: >> Mise en ligne des sources corrigées permettant à chacun de faire le sien propre. :D

Publié : lun. 11/mai/2009 10:38
par Jacobus
Mise à jour du produit avec correction de quelques imperfections pouvant générer de la haine envers ce pauvre petit lecteur :cry: qui avait tendance à pas faire ce que l'on voulait. Bref c'est réparé. vous pouvez donc télécharger à nouveau cette petite merveille :lol:

De plus, je vous livre ici la totalité soit; le code source; les icônes et l'exécutable. Vous pouvez maintenant vous faire le vôtre.
Télécharger les sources (PureBasic 4.30 version complète): JacobusPlayer_PB_430_src.zip

Attention! Non compatible avec la version de demo de PB!

Code : Tout sélectionner

;JSPLAYER 1 - P.B.3.93 - 06/2005
;JSPLAYER 1.1 - Upgrade to P.B.4.30 - 05/2009
;Jacobus (d'après lecteur MP3 de Dominique B & AlphaSND)
;************************************************************************************************
;
;Librairies utilisées 
;  - PureColor de Gnozal
;  - Droopy's lib

;Programme fonctionnel pour Windows  Xp ou Vista

;-Constantes 
Enumeration 
  #WINDOW_Player
  
  #GADGET_USER = 1  ;Initialise la liste des gadgets pour l'usage de la callback
  #GADGET_ChoixRep
  #GADGET_Play 
  #GADGET_Pause        
  #GADGET_Stop 
  #GADGET_Volume 
  #GADGET_Recorder    
  #GADGET_ChampRep 
  #GADGET_ListMP3   
  #GADGET_ToPlay  
  #GADGET_Rest 
  #GADGET_TotalToPlay 
  #GADGET_TotalRest 
  #GADGET_PlayAll  
  #GADGET_Always   
  #GADGET_TextList   
  #GADGET_About
  #GADGET_Help 
  #GADGET_Quit
  #GADGET_Reduce  
  #GADGET_Website
  #GADGET_SoundProgress
  #GADGET_PercentSoundProgress 
EndEnumeration 

;- Create Directories
Global curdir.s, AppliDir$
curdir.s = Space(#MAX_PATH)
GetModuleFileName_(GetModuleHandle_(0), @curdir, #MAX_PATH)
AppliDir$ = GetPathPart(curdir)

;-variables 
Global MciReponse.s, MessErreur.s, buffer.s, TimeLeft.i, TotalTime.i, NbSongs.i, SongPlaying.i
Global PauseActif.b, Rep.s
Global *HandleMemory.i
Global maxsize.i
maxsize = 100

;-Images 
Global Image0,Image1,Image2,Image3,Image4,Image5,Image6,Image7,Image8,Image9;,Image10
Global Image11,Image12,Image13,Image14,Image15

Image0 = CatchImage(0, ?Image0)
Image1 = CatchImage(1, ?Image1)
Image2 = CatchImage(2, ?Image2)
Image3 = CatchImage(3, ?Image3)
Image4 = CatchImage(4, ?Image4)
Image5 = CatchImage(5, ?Image5)
Image6 = CatchImage(6, ?Image6)
Image7 = CatchImage(7, ?Image7)
Image8 = CatchImage(8, ?Image8)
Image9 = CatchImage(9, ?Image9)
; Image10 = CatchImage(10, ?Image10)
Image11 = CatchImage(11, ?Image11)
Image12 = CatchImage(12, ?Image12)
Image13 = CatchImage(13, ?Image13)
Image14 = CatchImage(14, ?Image14)
Image15 = CatchImage(15, ?Image15)

;For easy, place your pictures in one folder into the current directory
DataSection 
Image0 : IncludeBinary "Data_img\Player01.ico"
Image1 : IncludeBinary "Data_img\Explore.ico"
Image2 : IncludeBinary "Data_img\Pause.ico"
Image3 : IncludeBinary "Data_img\btn_pause2.bmp"
Image4 : IncludeBinary "Data_img\Play.ico"
Image5 : IncludeBinary "Data_img\StopPlay.ico"
Image6 : IncludeBinary "Data_img\User.ico"
Image7 : IncludeBinary "Data_img\Web02.ico"
Image8 : IncludeBinary "Data_img\Egaliser.ico" 
Image9 : IncludeBinary "Data_img\Record.ico"   
; Image10 : IncludeBinary "Data_img\Waitsound.ico"  
Image11 : IncludeBinary "Data_img\Help_b.ico"
Image12 : IncludeBinary "Data_img\Quitter_01.ico"
Image13 : IncludeBinary "Data_img\About.ico"
Image14 : IncludeBinary "Data_img\PlayNext.ico"
Image15 : IncludeBinary "Data_img\Down.ico"
EndDataSection

;-TOOLTIPS (Eddy)
;{ Utils 
Enumeration 
   #TOOLTIPM_NO_ICON=0 
   #TOOLTIPM_INFO_ICON 
   #TOOLTIPM_WARNING_ICON 
   #TOOLTIPM_ERROR_ICON 
EndEnumeration 
Structure TooltipManagerParams 
   ID.l 
   IsBalloon.l 
   ColorText.l 
   ColorBack.l 
   Title.s 
   IconForTitle.l 
   MaxWidth.l 
   Manager.l 
EndStructure 
Global NewList TooltipManagers.TooltipManagerParams() 
Procedure FindDefaultTooltipManager(Window, unused) 
   ; ========================================== 
   ; Find Default Purebasic TOOLTIP Handle 
   ; ========================================== 
   Protected WindowClass.s=Space(255) 
   If GetClassName_(Window, @WindowClass, Len(WindowClass)) 
      If LCase(WindowClass)=LCase("ToolTips_Class32") 
         If GetWindowThreadProcessId_(Window, 0)=GetCurrentThreadId_() 
            
            AddElement(TooltipManagers()) 
            TooltipManagers()\Title="" 
            TooltipManagers()\IconForTitle=0 
            TooltipManagers()\IsBalloon=GetWindowLong_(Window, #GWL_STYLE) 
            TooltipManagers()\MaxWidth=SendMessage_(Window, #TTM_GETMAXTIPWIDTH, 0, 0) 
            TooltipManagers()\ColorText=SendMessage_(Window, #TTM_GETTIPTEXTCOLOR, 0, 0) 
            TooltipManagers()\ColorBack=SendMessage_(Window, #TTM_GETTIPBKCOLOR, 0, 0) 
            TooltipManagers()\ID=#PB_Ignore 
            TooltipManagers()\Manager=Window 
            
            ProcedureReturn 0 
         EndIf 
      EndIf 
   EndIf 
   ProcedureReturn 1 
EndProcedure 
;} 

;{ TooltipManager Functions 
ProcedureDLL.b UseTooltipManager(ID=#PB_Ignore) ;Use specific TooltipManager, returns true if success 
   ForEach TooltipManagers() 
      If TooltipManagers()\ID=ID 
         ; ==================== 
         ; Modify Parameters 
         ; ==================== 
         Protected TooltipManager=TooltipManagers()\Manager 
         SetWindowLong_(TooltipManager, #GWL_STYLE, TooltipManagers()\IsBalloon) 
         SendMessage_(TooltipManager, #TTM_SETTIPTEXTCOLOR, TooltipManagers()\ColorText, 0) 
         SendMessage_(TooltipManager, #TTM_SETTIPBKCOLOR, TooltipManagers()\ColorBack, 0) 
         SendMessage_(TooltipManager, #TTM_SETTITLE, TooltipManagers()\IconForTitle, TooltipManagers()\Title) 
         SendMessage_(TooltipManager, #TTM_SETMAXTIPWIDTH, 0, TooltipManagers()\MaxWidth) 
         ; SetWindowLong_(TooltipManager,#GWL_EXSTYLE,#WS_EX_TOPMOST) ;If StickWindow enabled 
         ; SendMessage_(TooltipManager,#TTM_SETDELAYTIME,#TTDT_INITIAL,200) 
         ; SendMessage_(TooltipManager,#TTM_SETDELAYTIME,#TTDT_AUTOPOP,10000) 
         ; ==================== 
         ; Refresh Content 
         ; ==================== 
         SendMessage_(TooltipManager, #TTM_UPDATE, 0, 0) 
         ProcedureReturn #True 
      EndIf 
   Next 
    
   ProcedureReturn #False 
EndProcedure 
ProcedureDLL.l CreateTooltipManager(ID, IsBalloon=#False, ColorText=#PB_Ignore, ColorBack=#PB_Ignore, Title.s="", IconForTitle=#PB_Ignore, MaxWidth=#PB_Ignore) ;Create TooltipManager, returns non-zero if success 
   If ID=#PB_Ignore 
      ProcedureReturn 0 
   EndIf 
    
   CompilerIf #PB_Compiler_Version<430 
      Protected TooltipManagersCount=CountList(TooltipManagers()) 
   CompilerElse 
      Protected TooltipManagersCount=ListSize(TooltipManagers()) 
   CompilerEndIf 
    
   If TooltipManagersCount=0 
      ; ========================================== 
      ; Start Default Purebasic TOOLTIP 
      ; ========================================== 
      Protected ButtonWithTip=ButtonGadget(#PB_Any, 10, 30, 250, 30, "New Button with Tooltip") 
      If ButtonWithTip And IsGadget(ButtonWithTip) 
         GadgetToolTip(ButtonWithTip, "New Tooltip") 
         FreeGadget(ButtonWithTip) 
          
         ;find the default tooltip handle... 
         EnumWindows_(@FindDefaultTooltipManager(), #Null) 
      EndIf 
   EndIf 
    
   CompilerIf #PB_Compiler_Version<430 
      TooltipManagersCount=CountList(TooltipManagers()) 
   CompilerElse 
      TooltipManagersCount=ListSize(TooltipManagers()) 
   CompilerEndIf 
    
   If TooltipManagersCount And IsBalloon<>#PB_Ignore 
      ; ========================================== 
      ; Overwrite existing TooltipManager ID 
      ; (If necessary) 
      ; ========================================== 
      ForEach TooltipManagers() 
         If TooltipManagers()\ID=ID 
            DeleteElement(TooltipManagers()) 
            Break 
         EndIf 
      Next 
      
      ; ========================================== 
      ; Register new TooltipManager ID 
      ; (With Or without Default parameters) 
      ; ========================================== 
      UseTooltipManager() 
      Protected DefaultIsBalloon=TooltipManagers()\IsBalloon 
      Protected DefaultColorText=TooltipManagers()\ColorText 
      Protected DefaultColorBack=TooltipManagers()\ColorBack 
      Protected DefaultMaxWidth=TooltipManagers()\MaxWidth 
      Protected DefaultManager=TooltipManagers()\Manager 
      
      AddElement(TooltipManagers()) 
      TooltipManagers()\ID=ID 
      If IsBalloon=#False 
         TooltipManagers()\IsBalloon=DefaultIsBalloon 
      Else 
         TooltipManagers()\IsBalloon=#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON | #TTS_ALWAYSTIP 
      EndIf 
      If ColorText=#PB_Ignore 
         TooltipManagers()\ColorText=DefaultColorText 
      Else 
         TooltipManagers()\ColorText=ColorText 
      EndIf 
      If ColorBack=#PB_Ignore 
         TooltipManagers()\ColorBack=DefaultColorBack 
      Else 
         TooltipManagers()\ColorBack=ColorBack 
      EndIf 
      If MaxWidth=#PB_Ignore 
         TooltipManagers()\MaxWidth=DefaultMaxWidth 
      Else 
         TooltipManagers()\MaxWidth=MaxWidth 
      EndIf 
      If IconForTitle=#PB_Ignore 
         TooltipManagers()\IconForTitle=#TOOLTIPM_INFO_ICON 
      Else 
         TooltipManagers()\IconForTitle=IconForTitle 
      EndIf 
      TooltipManagers()\Title=Left(Trim(Title), 255) 
      TooltipManagers()\Manager=DefaultManager 
      
      ProcedureReturn TooltipManagers()\Manager 
   EndIf 
EndProcedure 
;} 


;Création des préférences utilisateur pour le dossier de musique favori chargé au démarrage
Procedure Pref_user()
  Rep.s = PathRequester("Sélectionnez le répertoire où se trouvent les musiques que vous voulez écouter :", Rep)
  CreateINI = CreatePreferences(AppliDir$+"JSPlayer.ini")  ;crée le fichier ini dans le répertoire de l'application
  If CreateINI <>0
    WritePreferenceString("Répertoire",Rep)
    ClosePreferences() 
  Else 
    MessageRequester("Erreur d'écriture","Le fichier de configuration n'a pu être créé",64)
  EndIf  
EndProcedure 
;Traitement des instructions qui seront envoyées à l'API
Procedure.l Mci(Cde.s)  
  *HandleMemory = AllocateMemory(256)
  If *HandleMemory
    Retour.l = mciSendString_(Cde, *HandleMemory, 256, 0) ; Utilisation de l'API magique! C'est là que les instructions sont traitées.
    MciReponse = PeekS(*HandleMemory)
    ProcedureReturn Retour
  EndIf 
EndProcedure
; Transformation du temps de l'instruction MCI en une forme utilisable pour l'affichage et la lecture.
Procedure.s GetHourFormat(LengthInSeconds)
  Minutes.l = LengthInSeconds / 60
  Seconds.l = LengthInSeconds - Minutes*60
  If Seconds < 10  ; Then seconds will be written as 01, 02, or 03 instead of 1, 2, or 3
    Null$ = "0"
  Else
    Null$ = ""
  EndIf
  ProcedureReturn Str(Minutes)+":"+Null$+Str(Seconds)
EndProcedure
;Gestion de la lecture 
Procedure PlayMCI(ToPlay.s)
  If Mci("open " + Chr(34) + GetGadgetText(#GADGET_ChampRep) + ToPlay + Chr(34) + " alias Morceau") <> 0  ;Tente d'ouvrir le morceau sélectionné  
    MessageRequester("File Error", "Erreur à l'ouverture du fichier !"+Chr(13)+""+Chr(13)+"Si ce fichier est protégé il nécessite peut-être des droits de lecture spécifiques", #MB_ICONWARNING)
    End 
  Else   
    Mci("set Morceau time format ms")   
    Mci("seek Morceau to end wait")  
    Mci("status Morceau position wait")  
    TotalTime = Val(MciReponse)          ; Récupère la durée du morceau utile pour les indicateurs numériques et graphiques
    maxsize = TotalTime/1000             ; actualise la valeur max de la progressbar en fonction du fichier à lire
    SetGadgetText (#GADGET_TotalRest, GetHourFormat(TotalTime/1000)) ; converti et affiche le temps pour qu'il soit lisible.
    Mci("seek Morceau to start")
    Mci("play Morceau from 1 notify")       
  EndIf
EndProcedure
;Combien de chansons dans le répertoire ?
Procedure compter_titres(Dossier.s)
  Dossier= Rep
  If ExamineDirectory(n, Dossier, "*.*")  : nb=0
    Repeat 
      FileType = NextDirectoryEntry(n)  
      If FileType = 1            
        FileName$ = DirectoryEntryName(n)
        If FileName$ <> "." And FileName$ <> ".."
          Ext$ = LCase(Right(FileName$,4)); 4 chars in extension, with the point !
          If Ext$ = ".wav" Or Ext$ = ".mp3" Or Ext$ = ".mid" Or Ext$ = ".wma" ; count only this extension files
            nb + 1
          EndIf  
        EndIf 
      EndIf 
    Until FileType = 0
    FinishDirectory(n) 
  EndIf  
  ProcedureReturn nb ; le nombre de fichiers trouvés
EndProcedure
; Procédure de Recherche des préférences utilisateur pour les charger au démarrage si elles existent
Procedure ExaminePrefs()
  If OpenPreferences(AppliDir$+"JSPlayer.ini")<>0
    Rep.s = ReadPreferenceString ("Répertoire", "")
  EndIf 
  ClosePreferences()  
  NbSongs = 0 
  If Rep
    SetGadgetText(#GADGET_ChampRep, GetPathPart(Rep))
    SetGadgetText(#GADGET_TextList," Contenu : " + Str(compter_titres(Rep))+" titres")
  EndIf 
  ClearGadgetItems(#GADGET_ListMP3)
  If ExamineDirectory(0, GetGadgetText(#GADGET_ChampRep), "*.*")
    Repeat
      FileType = NextDirectoryEntry(0)
      If FileType
        FileName$ = DirectoryEntryName(0)
        If FileName$ <> "." And FileName$ <> ".."
          Ext$ = LCase(Right(FileName$,4))
          If Ext$ = ".wav" Or Ext$ = ".mp3" Or Ext$ = ".mid" Or Ext$ = ".wma" 
            AddGadgetItem(#GADGET_ListMP3, -1, FileName$)
            NbSongs = NbSongs + 1
          EndIf
        EndIf
      EndIf 
    Until FileType = 0 
    SetGadgetState(#GADGET_ListMP3, 0) 
   FinishDirectory(0)
  Else
    MessageRequester("Erreur","Impossible d'examiner ce répertoire: " + GetGadgetText(#GADGET_ChampRep),0)
  EndIf
EndProcedure 
;Callback qui va nous permettre de rendre la fenêtre transparente (en fait qui prend le fond d'écran comme arrière plan de fenêtre)
;Utile si vous souhaitez faire une plus grande fenêtre 'spéciale'
Procedure.l myCallback(hWnd.l,uMsg.l,wParam.l,lParam.l)
   Select uMsg
      Case #WM_ERASEBKGND
         ProcedureReturn
      Case #WM_PAINT
         For i=1 To 23 ; Doit correspondre au nombre exact de gadgets !! (voir enumeration)
            x = GadgetX(i)
            y = GadgetY(i)
            SetRect_(Rect.RECT,x,y,x+GadgetWidth(i),y+GadgetHeight(i))
            ValidateRect_(hWnd,Rect)
            RedrawWindow_(GadgetID(i),0,0,$407)
         Next
         PaintDesktop_(BeginPaint_(hWnd,ps.PAINTSTRUCT))
         EndPaint_(hWnd,ps)
      Case #WM_SIZING,#WM_MOVING
         InvalidateRect_(hWnd,0,1)
   EndSelect
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
;-OpenWindow
If OpenWindow(#WINDOW_Player, 0, 0, 470, 70,"Jacobus Player", #PB_Window_BorderLess | #PB_Window_ScreenCentered)   
  ;Création d'un handle sur une zone de mémoire allouée.
  *HandleMemory = GlobalAlloc_(#GMEM_FIXED, 256)    
  ;Utilisation des Tooltips d'Eddy
  CreateTooltipManager(0, #True)
  CreateTooltipManager(1, #True, #PB_Ignore, #PB_Ignore, "", 0,150)
  UseTooltipManager(1)
  
    ButtonImageGadget(#GADGET_USER, 0, 0,  40 , 30,Image6)
    GadgetToolTip(#GADGET_USER, "Présélectionnez un répertoire qui sera chargé automatiquement à chaque démarrage.")
    
    ButtonImageGadget(#GADGET_ChoixRep, 40, 0,  40 , 30,Image1)
    GadgetToolTip(#GADGET_ChoixRep, "Naviguez sur votre système pour y trouver un répertoire contenant des fichiers musicaux et le charger pour l'écoute .")
        
    OptionGadget(#GADGET_PlayAll,82, 5, 12 , 13, "") ;tout lire
    OptionGadget(#GADGET_Always, 95, 5, 12 , 13, "") ;Tout lire et recommencer (en boucle)
    SetGadgetState(#GADGET_PlayAll, 1) ; sélection par défaut
    GadgetToolTip(#GADGET_PlayAll, "Lire tout le répertoire, titre après titre. Arrêt de la lecture à la fin du répertoire.")
    GadgetToolTip(#GADGET_Always, "Lecture des morceaux en boucle. Tout lire en continu (lit tout le répertoire et recommence)")
    
    ButtonImageGadget(#GADGET_Play,     110,  0,  40 , 30,Image4)
    GadgetToolTip(#GADGET_Play, "Lance la lecture du morceau de musique sélectionné")
    
    ButtonImageGadget(#GADGET_Pause,    110,  0,  40 , 30,Image2,#PB_Button_Toggle)
    GadgetToolTip(#GADGET_Pause, "Interrompt momentannément la lecture en cours du morceau de musique ")
    SetGadgetAttribute(#GADGET_Pause, #PB_Button_PressedImage, Image14)
    HideGadget(#GADGET_Pause,1)
    
    ButtonImageGadget(#GADGET_Stop,  150, 0,40,30,Image5)
    GadgetToolTip(#GADGET_Stop, "Arrête la lecture du morceau de musique et le ramène à son point de départ ")
    
    ButtonImageGadget(#GADGET_Volume,190,0,40,30,Image8)
    GadgetToolTip(#GADGET_Volume, "Régler le volume général")
    
    ButtonImageGadget(#GADGET_Recorder,230,0,40,30,Image9)
    GadgetToolTip(#GADGET_Recorder, "Ouvrir l'enregistreur")
    
    ButtonImageGadget(#GADGET_Quit,270,0,40,30,Image12)
    GadgetToolTip(#GADGET_Quit, "Quitter Jacobus Player")
    
    ButtonImageGadget(#GADGET_About,310,0,40,30,Image13)
    GadgetToolTip(#GADGET_About, "A propos de Jacobus Player")
    
    ButtonImageGadget(#GADGET_Help,350,0,40,30,Image11)
    GadgetToolTip(#GADGET_Help, "Ouvrir l'aide")
    
    ButtonImageGadget(#GADGET_Reduce,390,0,40,30,Image15)
    GadgetToolTip(#GADGET_Reduce, "Réduire dans la barre des tâches") 
       
    ButtonImageGadget(#GADGET_Website,430,0,40,30,Image7)
    GadgetToolTip(#GADGET_Website, "Se connecter à freesoundeditor.com")
    
    StringGadget(#GADGET_ChampRep, 0, 30, 275, 20, "")
    PureCOLOR_SetGadgetColor(#GADGET_ChampRep, RGB($0,$FF,$FF), RGB($00,$00,$00))
    SetGadgetText(#GADGET_ChampRep, "")
        
    ComboBoxGadget(#GADGET_ListMP3,275,30,195,20)
    PureCOLOR_SetGadgetColor(#GADGET_ListMP3, RGB($0,$FF,$FF), RGB($00,$00,$00))
        
    TextGadget(#GADGET_TextList,0,50,105,18,"Contenu : Vide",#PB_Text_Border)
    PureCOLOR_SetGadgetColor(#GADGET_TextList, RGB($0,$FF,$FF), RGB($00,$00,$00))
    
    TextGadget(#GADGET_ToPlay,     105, 50, 40,  15, " Temps:")
    PureCOLOR_SetGadgetColor(#GADGET_ToPlay, RGB($60,$60,$60), RGB($BF,$C0,$CC))
    TextGadget(#GADGET_Rest,       145, 50, 35,  18, "",#PB_Text_Border|#PB_Text_Center)
    PureCOLOR_SetGadgetColor(#GADGET_Rest, RGB($0,$FF,$FF), RGB($00,$00,$00))
    
    TextGadget(#GADGET_TotalToPlay,180, 50, 40, 15, " Durée:")
    PureCOLOR_SetGadgetColor(#GADGET_TotalToPlay, RGB($60,$60,$60), RGB($BF,$C0,$CC))
    TextGadget(#GADGET_TotalRest,  220, 50, 35, 18, "",#PB_Text_Border|#PB_Text_Center)
    PureCOLOR_SetGadgetColor(#GADGET_TotalRest, RGB($0,$FF,$FF), RGB($00,$00,$00))
    
    ProgressBarGadget(#GADGET_SoundProgress,255,50,185,18,0,maxsize)
    GadgetToolTip(#GADGET_SoundProgress, "Etat d'avancement de la lecture")
    TextGadget(#GADGET_PercentSoundProgress,440,50,30,18,"",#PB_Text_Border|#PB_Text_Center)
    PureCOLOR_SetGadgetColor(#GADGET_PercentSoundProgress, RGB($0,$FF,$FF), RGB($00,$00,$00))
    
  SetGadgetText(#GADGET_TotalRest, "0:00.")  ; Le '.' est nécessaire pour détecter la fin.
  
  ExaminePrefs() ; Chargement des préférences si existantes
  
 ;Image d'arrière plan (le fond d'écran) par la callback. 
 ;Si vous préférez une grande fenêtre elle affichera le thème du bureau.
 SetWindowCallback(@myCallback(),#WINDOW_Player)
 InvalidateRect_(WindowID(#WINDOW_Player),0,1)
  
;-PROGRAMME  
  ;La boucle d'événements. Toutes les actions utilisateur sont traitées ici. 
  ;Lorsqu'une action se produit, EventID n'est pas 0 et il nous suffit de voir ce qu'il se passe...
  ;
  Repeat  ; Boucle jusqu'à ce que l'utilisateur décide de fermer le programme.
    
    Repeat  ; Attente d'un évènement...
      EventID = WindowEvent()      
      If EventID = 0  ; En veille lorsqu'il ne se passe rien.
        Sleep_(20)    ; 20 milliseconds
      EndIf     
      ; Pour voir ce qu'il se passe
      Mci("status Morceau position")
      TimeLeft = Val(MciReponse)
      SetGadgetText (#GADGET_Rest, GetHourFormat(TimeLeft/1000))     
      Lecture.f = (TimeLeft/1000)/maxsize*100 ;calcul de la progression. Place le résultat dans un Float à cause des possibles virgules
      SetGadgetState(#GADGET_SoundProgress,Lecture) ;affichage de la progression
      SetGadgetText(#GADGET_PercentSoundProgress, Str(GetGadgetState(#GADGET_SoundProgress))+" %")
      UpdateWindow_(GadgetID(#GADGET_PercentSoundProgress)) ; sensé rafraîchir l'affichage de la progressbar... pas indispensable avec WindowEvent()
      ; Si on est à la fin du morceau...
      If GetGadgetText(#GADGET_Rest) = GetGadgetText(#GADGET_TotalRest)
        Mci("close Morceau")
        HideGadget(#GADGET_Play,0)         ; Affiche le bouton 'Play'
        HideGadget(#GADGET_Pause,1)        ; Cache le bouton 'Pause'
        SetGadgetState(#GADGET_Pause,0)    ; Mode normal et non enfoncé.
        GadgetToolTip(#GADGET_Pause, "Interrompre momentannément la lecture en cours du morceau de musique ")
        ; Quand l'option 'Tout lire' est sélectionnée.
        If GetGadgetState(#GADGET_PlayAll) = 1
          SongPlaying = GetGadgetState(#GADGET_ListMP3) + 1  ; le morceau suivant sera joué         
          ; Si il y a une autre chanson à jouer, (un morceau à suivre) nous continuons.
          If SongPlaying < NbSongs
            SetGadgetState(#GADGET_ListMP3, SongPlaying )
            CurrentMP3.s = GetGadgetText(#GADGET_ListMP3)
            PlayMCI(CurrentMP3)
            HideGadget(#GADGET_Play,1)
            HideGadget(#GADGET_Pause,0)
            SetGadgetState(#GADGET_Pause,0)
            GadgetToolTip(#GADGET_Pause, "Interrompre momentannément la lecture en cours du morceau de musique ")
          EndIf         
          If SongPlaying = NbSongs And GetGadgetState(#GADGET_Always)
            SetGadgetState(#GADGET_ListMP3, 0)
            CurrentMP3 = GetGadgetText(#GADGET_ListMP3)
            PlayMCI(CurrentMP3)
            HideGadget(#GADGET_Play,0)
            HideGadget(#GADGET_Pause,1)
            SetGadgetState(#GADGET_Pause,0)
            GadgetToolTip(#GADGET_Pause, "Interrompre momentannément la lecture en cours du morceau de musique ")
          EndIf                   
        Else
         ;Sinon c'est l'option lecture en boucle qui est activée.
          If GetGadgetState(#GADGET_Always) = 1
            CurrentMP3 = GetGadgetText(#GADGET_ListMP3)
            PlayMCI(CurrentMP3)
            HideGadget(#GADGET_Play,0)
            HideGadget(#GADGET_Pause,1)
            SetGadgetState(#GADGET_Pause,0)
            GadgetToolTip(#GADGET_Pause, "Interrompre momentannément la lecture en cours du morceau de musique ")
          EndIf
        EndIf
      EndIf
      
    Until EventID <> 0  ; Tant qu'il y a un évènement
    
;-Fonctions des gadgets (les boutons sont gérés par une action directe)
    Select EventID 
      Case #PB_Event_Gadget 
        Select EventGadget()
          
          Case #GADGET_ChoixRep
            NbSongs = 0 
            Rep = PathRequester("Sélectionnez le répertoire où se trouvent les musiques que vous voulez écouter :", Rep)            
            If Rep
              SetGadgetText(#GADGET_ChampRep, GetPathPart(Rep))
              SetGadgetText(#GADGET_TextList," Contenu : " + Str(compter_titres(Rep))+" titres")
            EndIf           
            ClearGadgetItems(#GADGET_ListMP3)           
            ; Recherche des MP3, WMA, WAV et MID s'il y en a.
            If ExamineDirectory(0, GetGadgetText(#GADGET_ChampRep), "*.*")
              Repeat
                FileType = NextDirectoryEntry(0)
                If FileType
                  FileName$ = DirectoryEntryName(0)
                  If FileName$ <> "." And FileName$ <> ".."
                    Ext$ = LCase(Right(FileName$,4)) ; exemple: 4 = . + w + a + v  => 4 caracteres dans l'extension, ne pas oublier le point.
                    If Ext$ = ".wav" Or Ext$ = ".mp3" Or Ext$ = ".mid" Or Ext$ = ".wma" 
                      AddGadgetItem(#GADGET_ListMP3, -1, FileName$)
                      NbSongs = NbSongs + 1
                    EndIf
                  EndIf
                EndIf
                
              Until FileType = 0
              SetGadgetState(#GADGET_ListMP3, 0)
              FinishDirectory(0)  
            Else
              MessageRequester("Erreur","Impossible d'examiner ce répertoire: " + GetGadgetText(#GADGET_ChampRep),0)
            EndIf
            
          Case #GADGET_Play
            SongPlaying = 0  ; Démarrage avec la première chanson de la liste (ComboBoxGadget) si pas de sélection.
            CurrentMP3 = GetGadgetText(#GADGET_ListMP3) ; on sélectionne le morceau affiché dans la combobox
            PlayMCI(CurrentMP3)                         ; démarre la lecture de ce morceau
            HideGadget(#GADGET_Play,1)  ; Cache le bouton 'play'
            HideGadget(#GADGET_Pause,0) ; Affiche le bouton 'Pause' à la place 
            
          Case #GADGET_Pause
           Etat = GetGadgetState(#GADGET_Pause) ; Etat = enfoncé ou normal
           If Etat = 1 ; si enfoncé...         
            Mci("pause Morceau wait")
            GadgetToolTip(#GADGET_Pause, "Reprendre la lecture du morceau de musique en cours")
           ElseIf Etat = 0 ; si normal...
            Mci("play Morceau from " + Str(TimeLeft))
            GadgetToolTip(#GADGET_Pause, "Interrompre momentannément la lecture en cours du morceau de musique ")
           EndIf  
            
                      
          Case #GADGET_Stop
            PauseActif = 0
            Mci("close Morceau")
            SetGadgetText(#GADGET_TotalRest, "0:00.")  ; Le '.' est nécessaire pour détecter la fin. 
            HideGadget(#GADGET_Play,0)
            HideGadget(#GADGET_Pause,1)
            
            
          Case #GADGET_Volume
           ;Vista = c:\windows\system32\SndVol.exe
           ;XP    = c:\windows\system32\sndvol32.exe
           If OSVersion() <= #PB_OS_Windows_XP
             If RunProgram(GetSystemDirectory()+"\sndvol32.exe");<>0
              Else 
              MessageRequester("ERREUR", "Le gestionnaire de volume n'a pas été trouvé!",16)
             EndIf
           Else 
            If RunProgram(GetSystemDirectory()+"\SndVol.exe");<>0
             Else 
              MessageRequester("ERREUR", "Le gestionnaire de volume n'a pas été trouvé!",16)
            EndIf 
           EndIf 
            
          Case #GADGET_Recorder
           ;Vista = c:\windows\system32\SoundRecorder.exe
           ;XP    = c:\windows\system32\sndrec32.exe
           If OSVersion() <= #PB_OS_Windows_XP
             If RunProgram(GetSystemDirectory()+"\sndrec32.exe");<>0
              Else 
              MessageRequester("ERREUR", "Le gestionnaire de volume n'a pas été trouvé!",16)
             EndIf
           Else 
            If RunProgram(GetSystemDirectory()+"\SoundRecorder.exe");<>0
             Else 
              MessageRequester("ERREUR", "Le gestionnaire de volume n'a pas été trouvé!",16)
            EndIf 
           EndIf 
            
                       
          Case #GADGET_About
            info$ = FormatDate(" le %dd.%mm.%yyyy à %hh:%ii:%ss",#PB_Compiler_Date)
            TextConcept$ = "Jacobus Player : Mp3 ; Wav ; Wma ; Midi"+Chr(13)
            TextConcept$ = TextConcept$ + "D'après un lecteur Mp3 de DominiqueB & Fred Laboureur"+Chr(13)
            TextConcept$ = TextConcept$ + "Skin et modifications par Jacobus"+Chr(13)
            TextConcept$ = TextConcept$ + "----------------------------------------------------------------"+Chr(13)
            TextConcept$ = TextConcept$ + "Version 1.0.06.05 - freeware"+Chr(13)
            TextConcept$ = TextConcept$ + "PureBasic v 3.93"+Chr(13)
            TextConcept$ = TextConcept$ + "Utilisation des librairies : "+Chr(13)
            TextConcept$ = TextConcept$ + "   - PureColor de Gnozal"+Chr(13)
            TextConcept$ = TextConcept$ + "   - SkinWin de Danilo"+Chr(13)
            TextConcept$ = TextConcept$ + "Os de développement : Windows Me et XP home sp2 (2005)"+Chr(13)+""+Chr(13)
            TextConcept$ = TextConcept$ + "----------------------------------------------------------------"+Chr(13)
            TextConcept$ = TextConcept$ + "Nouvelle Version 1.1.05.09 - freeware"+Chr(13)
            TextConcept$ = TextConcept$ + "PureBasic v 4.30"+Chr(13)
            TextConcept$ = TextConcept$ + "Utilisation des librairies : "+Chr(13)
            TextConcept$ = TextConcept$ + "   - PureColor de Gnozal"+Chr(13)
            TextConcept$ = TextConcept$ + "   - Droopy's Lib"+Chr(13)
            TextConcept$ = TextConcept$ + "Os de développement : Windows Vista Ultimate SP1 32 bits (2009)"+Chr(13)+""+Chr(13)
            TextConcept$ = TextConcept$ + "----------------------------------------------------------------"+Chr(13)
            TextConcept$ = TextConcept$ + "Remerciements à la communauté purebasicienne dans son ensemble."+Chr(13)
            TextConcept$ = TextConcept$ + "Ce logiciel est utilisable et redistribuable gratuitement"+Chr(13)
            MessageRequester("CONCEPTION ET DEVELOPPEMENT",TextConcept$+"Dernière compilation :"+info$,#MB_ICONINFORMATION)
            
          Case #GADGET_Help        : MessageRequester("Utilisation de ce lecteur","Un bouton permet de naviguer sur le système de l'utilisateur et de choisir un dossier contenant la musique à écouter. Il est possible de présélectionner un dossier contenant la musique préférée de l'utilisateur. Celui-ci sera alors automatiquement sélectionné au démarrage du programme."+Chr(13)+""+Chr(13)+"Le nombre de morceaux de musique contenu dans le dossier sélectionné est affiché en bas à gauche."+Chr(13)+""+Chr(13)+"Les titres sont listés dans une combobox permettant de choisir l'un ou l'autre."+Chr(13)+""+Chr(13)+"Deux options de lecture : "+Chr(13)+"- Tout lire. La case est cochée par défaut et la lecture commence au premier titre listé jusqu'au dernier, les uns après les autres. La lecture s'arrête à l'issue."+Chr(13)+"- Lecture continue. Si cette case est cochée, une fois que tous les titres contenus dans le dossier ont été lus, la lecture recommence depuis le premier titre, et ainsi de suite."+Chr(13)+""+Chr(13)+"Un bouton PLAY permet de lancer la lecture du titre sélectionné."+Chr(13)+"Un bouton PAUSE interrompt la lecture en cours qui reste en attente."+Chr(13)+"Un bouton RELANCE redémarre la lecture là où elle avait été interrompue par le bouton PAUSE."+Chr(13)+"STOP arrête la lecture en cours et remet le morceau de musique à son point de départ."+Chr(13)+""+Chr(13)+"Trois indicateurs numériques :"+Chr(13)+"- Temps : Indique le temps de lecture écoulé en minutes et secondes du morceau en cours."+Chr(13)+"- Durée : Indique la durée totale en minutes et secondes du morceau en cours."+Chr(13)+"- Pourcentage: Indique le pourcentage total du morceau en cours qui a été lu. La barre de progression reprend ce pourcentage en mode graphique."+Chr(13)+""+Chr(13)+"Si vous tentez de lire un morceau de musique protégé, le lecteur vous l'indique puis se ferme."+Chr(13)+""+Chr(13)+"Deux nouvelles options :"+Chr(13)+"- Le réglage du volume / player / général / Windows"+Chr(13)+"- L'accès direct à l'enregistreur Windows"+Chr(13)+""+Chr(13)+"@+ Jacobus",#MB_ICONINFORMATION)
            
          Case #GADGET_Quit    : Quit = 1
            
          Case #GADGET_Reduce     : ShowWindow_(WindowID(#WINDOW_Player), #SW_MINIMIZE)
            
          Case #GADGET_USER : Pref_user() : ExaminePrefs()
            
          Case #GADGET_Website   : RunProgram("http://www.freesoundeditor.com")
                                   
        EndSelect
        
      Case #WM_LBUTTONDOWN  : SendMessage_(WindowID(#WINDOW_Player), #WM_NCLBUTTONDOWN, #HTCAPTION, 0) ; capture la fenêtre avec la souris
         ;Clic bouton gauche maintenu enfoncé sur la barre du bas pour déplacer la fenêtre  
        
      Case #PB_Event_CloseWindow : Quit = 1
        
    EndSelect
    
  Until Quit = 1
   PureCOLOR_ClearAllGadgetColors(); Free all gadgets colors  
EndIf  ; End OpenWindow
 GlobalFree_(*HandleMemory)  ; Ne pas oublier de libérer le buffer préalablement créé!                       
End 
;Voilà, vous avez un lecteur audio fonctionnel. 
@+ Jacobus

Publié : lun. 11/mai/2009 17:38
par Ar-S
Merci pour ce prog.

Dans le zip manque le bt_pause (ref : image3)

D'ailleurs je voudrais bien savoir à quoi servent les 2 boutons radio ?

a l'occase j'ajouterai un petit ufmod histoire de lire aussi les xm :)

Les autres plus à apporter...

- Gestion du glisser/deposer de morceaux/dossiers
- morceau de musique démarrant automatiquement lors de sa sélection dans la playlist même si un morceau est déjà en lecture (actuellement faut stopper le morceau en cour d'abord)
- Trackbar pour avancer le morceau
- Vérification que la fenêtre "master Volume" soit pas déjà ouverte pour éviter de l'ouvrir plusieurs fois (pareil pour SoundRecorder.exe)
- la possibilité de jouer les morceaux en random, de les répéter...
- Amélioration graphique :) (bon ça c'est du détail)


En tout cas c'est sympa de partager :P :P :P

Publié : lun. 11/mai/2009 17:57
par jbernard13
Trés bon job Jacobus , bravo :o

Publié : lun. 11/mai/2009 18:30
par Jacobus
Oui, l'image Image3: ne sert pas et il suffit de commenter dans DataSection, CatchImage() et Global pour alléger un peu.

Les boutons radios ou options servent à choisir le mode de lecture.
- 1/ Lit tout le contenu du dossier sélectionné, soit chaque morceau de la combobox, puis Stop!
- 2/ Fait pareil que le 1/ mais recommence depuis le début après, ad vitam eternam...
a l'occase j'ajouterai un petit ufmod histoire de lire aussi les xm
Je sais pas ce que c'est des xm !?? un nouveau format de fichier son?
Les autres plus à apporter...
Te gène pas :lol: perso cela me suffisait, mais si t'en veux plus vas y et fais nous partager. Si j'ai encore un peu de temps pour ça, je ferais quelque update... mais pour l'instant ça ira.

@JB13, Merci et amuses toi bien avec, mets le à ta sauce à toi pour en faire un spécial Jbernard13.