Début d'un lecteur de vidéos avec les commandes MCI

Programmation d'applications complexes
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

C'est quoi, ce bug, exactement? . Parce que je commence à être un peu largué, là.

Dans le premier player que j'ai posté, c'est à dire celui qui ouvre la vidéo dans une fenêtre séparée, chez moi je ne vois aucun bug.
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Bah, faut croire que hier soir j'etais trop crevé et que j'ai utilisé mon player a la place du tien :lol: il me semblait qu'il buggait mais j'ai beau bouger les fenètres dans tous les sens ce matin rien a faire. Il marche bien !

Bah le bug c'est quand tu déplace une fenetre par dessus celle ou la video joue ca fait des "trous" dans la video et on voit le fond de la fenetre.
Il y a aussi celui ou tout disparait quand on maximise une fenetre par dessus celle de la video.
Dernière modification par Pingtix le sam. 18/déc./2004 11:03, modifié 1 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ok! :lol:
Je confirme que mon premier code n'a pas ce bug chez moi, et normalement, il ne peut pas l'avoir, puisque la fenêtre est ouverte par le système. Ce n'est pas mon code qui la gère.

Pour l'autre code que j'ai posté, celui ou je t'ai donné la procédure pour redimensionner la vidéo, tu l'as essayé?
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Pour le frafraichissement l'ai essayé, mais c'est pas aussi bien que quand c'est une fenetre a part: quand j'agite une fenetre au dessus la video, celle-ci disparait jusqu'a ce que je lache la fenetre.
Pour redimensionner, j'ai pas trop pigé: je dois mettre l'id du film et une chaine de caracteres, mais je mets quoi dedans, la taille en % ?
Pour cette histoire de callback je suis un peu largué je crois.

EDIT: Je crois avoir pigé, en fait un callback c'est un thread attaché a une fenetre et je dois faire un callback avec la procedure du meme nom qui elle meme apelle la procedure resize. c'est ca ?
Dernière modification par Pingtix le sam. 18/déc./2004 11:22, modifié 1 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

La chaine de caractère, c'est la taille et la position de l'affichage.

Exemple, pour une vidéo que tu affiches en 320 x 240, à la position x=0 y=0, la chaine donne "0 0 320 240".

Il suffit de regarder les bouts de code, c'est écrit noir sur blanc.

Pour la callback, on verra ça plus tard
Dernière modification par Chris le sam. 18/déc./2004 11:23, modifié 1 fois.
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Ok merci
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

J'ai trafiqué des procédures car j'en trouvais certaines trop compliquées Pour moi, plus c'est simple plus j'ai de chances d'arriver au bout de mon programme :lol:
Je les mets là on sait jamais peut etre que ca sera utile a quelqun d'autre.

MCI_ReSize()

Code : Tout sélectionner

Procedure MCI_ReSize(Nb,x$,y$,width$,height$) ;Déplace/Redimensionne
  i=mciSendString_("put MCI_"+Str(0)+" destination at  "+x$+" "+y$+" "+width$+" "+height$,0,0,0)
  ProcedureReturn i
EndProcedure
MCI_GetWidth() et MCI_GetHeight()

Code : Tout sélectionner

Procedure.s MCI_GetWidth(Nb)   ; Renvoie la largeur du film
  a$=Space(#MAX_PATH)
  i=mciSendString_("where MCI_"+Str(Nb)+" source",@a$,#MAX_PATH,0)
  ProcedureReturn StringField(a$,3," ")
EndProcedure

Code : Tout sélectionner

Procedure.s MCI_GetHeight(Nb)   ; Renvoie la hauteur du film
  a$=Space(#MAX_PATH)
  i=mciSendString_("where MCI_"+Str(Nb)+" source",@a$,#MAX_PATH,0)
  ProcedureReturn StringField(a$,4," ")


J'ai un probleme avec l'MCI, mon trackbargadget avance plus vite que la deconne et je pige pas pourquoi.
Voila le code, c'est pas tres bien rangé mais c'est parceque je n'ai pas fini.
Il faut la libtoolbarxp. Quand aux icones des boutons, elle sont ici

Code : Tout sélectionner

IncludeFile "MCI_Procs.pb"
Structure SH_FILEINFO
  hIcon.l
  iIcon.l
  dwAttributes.l
  szDisplayName.b[#MAX_PATH]
  szTypeName.b[80]
EndStructure 
Global Play2 ;{
  Play2 = CatchImage(0, ?Play2)
  Global pause2
  pause2 = CatchImage(1, ?pause2)
  Global stop2
  stop2 = CatchImage(2, ?stop2)
  Global toolbarxp16 ;}
Enumeration
  #pingtixplayer
  #play
  #pause
  #stop
  #volume
  #MenuBar_0
  #fouvrir
  #fquitter
  #cplay
  #cpause
  #cstop
  #aapropos
  #zx1demi
  #zx1
  #zx2
  #zx3
  #Statut
  #play2
  #fullscreen
  #plus
  #moins
  #progression
  #fcd
EndEnumeration
;-Procedures
Procedure resize()
  ;ResizeMovie(0,25,WindowWidth(),WindowHeight()-94)
  MCI_ReSize(0,"0","25",Str(WindowWidth()),Str(WindowHeight()-94))
  If tkbg=1
  ResizeGadget(#progression,0,WindowHeight()-70,WindowWidth(),20)
  EndIf
EndProcedure
Procedure.l ExtractSmallIconFile(IconPath.s)
  SHGetFileInfo_(IconPath, 0, @InfosFile.SH_FILEINFO, SizeOf(SH_FILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
  ProcedureReturn InfosFile\hIcon
EndProcedure
Procedure Open_player()
  If OpenWindow(#pingtixplayer,100,100,230,100, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget,"Pingtix Player");= 0 Or CreateGadgetList(WindowID()) = 0
    If CreateMenu(#MenuBar_0, WindowID())
      MenuTitle("Fichier")
      MenuItem(#fouvrir, "Ouvrir")
      MenuItem(#fcd,"CD audio")
      MenuItem(#fquitter, "Quitter")
      MenuTitle("Contrôle")
      MenuItem(#cplay, "Play")
      MenuItem(#cpause, "Pause")
      MenuItem(#cstop, "Stop")
      MenuTitle("Affichage")
      OpenSubMenu("Zoom")
      MenuItem(#zx1demi,"1/2x")
      MenuItem(#zx1,"1x")
      MenuItem(#zx2,"2x")
      MenuItem(#zx3,"3x")
      MenuTitle("Aide")
      MenuItem(#aapropos, "A propos")
    EndIf
    play3 = ExtractSmallIconFile(Play2$)
    pause3 = ExtractSmallIconFile(pause2$)
    stop3 = ExtractSmallIconFile("stop.ico") 
    CreateGadgetList(WindowID())
    CreateToolBarXP(WindowID(), 16, 0)
    CatchImage(3, ?toolbarxp16)
    SetToolBarXPShape(UseImage(3), RGB(237, 241, 252), GetSysColor_(#COLOR_3DFACE), 300) ; Commenter cette fonction pour voir la barre d'outils par défaut
    SetToolBarXPTextColor(0, RGB(255, 0, 0))
    ToolBarXPStart()
    ToolBarXPButton(#play, Play2, "Play")
    ToolBarXPButton(#pause, pause2, "Pause")
    ToolBarXPButton(#stop, stop2, "Stop")
    ToolBarXPEnd()
  EndIf
  If CreateStatusBar(#Statut, WindowID()) 
    AddStatusBarField(200000)
  EndIf
hSeek=TrackBarGadget(#progression,220,4,80,20,0,1000000)
  
EndProcedure
Procedure ReadyMovie()
  azik$=zik$
  zik$ = OpenFileRequester("Fichier à lire", "", "Fichiers Video|*.avi;*.divx;*.mkv;*.mov;*.mpeg;*.mpg;*.wmv|Tous|*.*",0)
  If zik$ <> ""
        If azik$ <> zik$
        MCI_Free(0)
        EndIf
    MCI_Load(0,zik$)
    TrackBarGadget(#volume,170,4, 50,20,0,1000)
    SetGadgetState(#volume, 1000) :volume=1000
    

    ResizeWindow(Val(MCI_GetWidth(0)),Val(MCI_GetHeight(0))+94)
    StatusBarText(#Statut,0,"Durée: "+Str(MCI_GetLength(0))+"s " +Str(MCI_GetLength(0))+" Frames, " +zik$ ,0)
    StatusBarText(#Statut,1,zik$,0) 
  MCI_Parent(0,WindowID())
    width=Val(MCI_GetWidth(0))
    
    MCI_Play(0)
    MCI_ReSize(0,"0","25",Str(WindowWidth()),Str(WindowHeight()-94))
    ResizeGadget(#progression,0,WindowHeight()-70,WindowWidth(),20)
    ;SendMessage_(hSeek, #TBM_SETRANGEMAX,#True,MCI_GetLength(0))
    SendMessage_(hSeek, #TBM_SETRANGEMAX,#True,MCI_GetLength(0))
  EndIf
EndProcedure
;-Debut
Open_player()
  UseOGGSoundDecoder()
Repeat 
    progression = MCI_GetPosition(0)
      SetWindowTitle(#pingtixplayer,"Pingtix Player" +Str(MCI_GetPosition(0))+" "+Str(MCI_GetLength(0)))
      SetGadgetState(#progression,MCI_GetPosition(0))
    Select WindowEvent()
      Case 0
        Delay(20)
      Case #PB_Event_Gadget
        Select EventGadgetID() 
          Case #play
              MCI_Play(0)
          Case #pause
            MCI_Pause(0)
          Case #stop
            MCI_Stop(0)
          Case #volume
            volume = GetGadgetState(#volume)
            MCI_SetVolume(0,volume)
          Case #progression
            np=GetGadgetState(#progression)
            MCI_Seek(0,np)
        EndSelect
      Case #PB_Event_Menu
        Select EventMenuID()
          Case #fouvrir
            ReadyMovie()
          Case #fquitter
            End 
          Case #cplay
              MCI_Play(0) 
          Case #cpause
            MCI_Pause(0)
          Case #cstop
            MCI_Stop(0)
          Case #aapropos
            MessageRequester("A propos", "Pingtix Player" + Chr(10)+"Programmé par Pingtix" + Chr(10)+"© Rileck Corp" , #MB_OK|#MB_ICONINFORMATION)
          Case #zx1demi
          Case #zx1
          Case #zx2
          Case #zx3
        EndSelect
      Case #PB_Event_SizeWindow
       resize() 
    Case #PB_Event_CloseWindow
      End
    EndSelect
    ForEver
  End
  
DataSection ;{
Play2: IncludeBinary "play.ico"
pause2: IncludeBinary "pause.ico"
stop2: IncludeBinary "stop.ico"
toolbarxp16: IncludeBinary "ToolBarXP 16.bmp"
EndDataSection ;}
Dernière modification par Pingtix le sam. 18/déc./2004 15:49, modifié 3 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Procedure MCI_ReSize(Nb,x$,y$,width$,height$) ;Déplace/Redimensionne
i=mciSendString_("put MCI_"+Str(0)+" destination at "+x$+" "+y$+" "+width$+" "+height$,0,0,0)
ProcedureReturn i
EndProcedure
Tu appelles ça simple, toi :lol:

Je suis en train de faire une librairie qui reprend la syntaxe de la lib "Movie".
Je pense pouvoir en poster une première version ce soir ou demain au plus tard.
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Bah ouais c'est plus facile quand chaque mesure est séparée, comme dans la lib movie. Mais bon c'est que mon avis.
Une lib ? 8O Yéé c'est exactement ce qu'il me faut !

EDIT: Fanchement Chris je sais pas comment tu fais, mais ton player marche impec et moi quand je fais un copier coller du code dans mon programme ca marche pas :-( Je comprends pas !

EDIT: Comment faire pour changer la valeur max d'un trackbargadget ? J'ai essayé de faire

Code : Tout sélectionner

SendMessage_(hSeek, #TBM_SETRANGEMAX,#True,MCI_GetLength(IdFilm))
comme dans ton programme mais ca na marche pas :-/
Ce fait 2 heures que je cherche je crois que je vais laisser tomber :?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Qu'est-ce que ça t'affiche, comme erreur? (Tout en bas de la fenêtre du debugger)

Sinon, la variable hSeek, c'est le handle du TrackBarGadget que tu obtiens, soit à la création, en mettant hSeek = TrackBarGadget(.....), soit par GadgetId(#TonGadget)

Il faut faire attention que la variable hSeek soit globale si tu l'utilises à la fois dans les procédures et dans le reste du prog.

Quand tu utilises le SendMessage_(), il faut que le fichier vidéo soit ouvert. Rien que le fait de changer ta commande de place, en la remontant d'une ligne ou en la descendant, peut résoudre le problème.

Comme je n'ai pas ton code, c'est tout ce que je peux te dire.
Ce fait 2 heures que je cherche je crois que je vais laisser tomber
T'est pas très patient, on dirait :lol:
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Ma variable était pas globale :-/
Je commencais à avoir mal à la tete au bout de deux heures c'est pour ca que j'suis allé faire autre chose :lol:
Répondre