/*************************************************************************************************************************************/
/* */
/* T E S T D E L ' E N T R E E V I D E O S U R L A C A R T E " G A L I L E O " */
/* D E 'SYSTEME_SGIND?GA_IRIX' ( V E R S I O N 5.2 ) : */
/* */
/* */
/* Author of '$xtc/SGI_G.520.42$c' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */
/* */
/*************************************************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <vl/vl.h>
#include <gl/gl.h>
extern char *getenv();
#define RACINE_DU_SYSTEME_HIERARCHIQUE \
RootWindow(display,DefaultScreen(display))
#define EPAISSEUR_DU_BORD_DES_FENETRES \
0
#define MASQUE_VIDE \
(ulong)0
#define NOM_DE_LA_FENETRE \
""
#define NOM_DE_SON_ICONE \
""
#define TABULATION \
" "
#define parametre_1(noeud,parametre,valeur,type,Ntype,message) \
{ \
int codeR; \
parametres.parametre = valeur; \
fprintf(stderr,"Controle %s : Parametre=%-20s Valeur vlSetControl=%d\n",message,Ntype,valeur); \
if ((codeR = vlSetControl(serveur_video,chemin,noeud,type,¶metres)) == 0) \
{ \
} \
else \
{ \
vlPerror(" vERREUR "); \
if (vlGetControl(serveur_video,chemin,noeud,type,¶metres) == 0) \
{ \
fprintf(stderr,"%ssERREUR : Valeur vlGetControl=%d\n" \
,TABULATION \
,parametres.parametre \
); \
} \
else \
{ \
vlPerror(" gERREUR "); \
} \
} \
} \
/* Envoi d'un controle a un parametre. */
#define parametre_2(noeud,parametre1,parametre11,valeur1,parametre12,valeur2,type,Ntype,message) \
{ \
int codeR; \
parametres.parametre1.parametre11 = valeur1; \
parametres.parametre1.parametre12 = valeur2; \
fprintf(stderr,"Controle %s : Parametre=%-20s Valeur vlSetControl={%d,%d}\n",message,Ntype,valeur1,valeur2); \
if ((codeR = vlSetControl(serveur_video,chemin,noeud,type,¶metres)) == 0) \
{ \
} \
else \
{ \
vlPerror(" vERREUR "); \
if (vlGetControl(serveur_video,chemin,noeud,type,¶metres) == 0) \
{ \
fprintf(stderr,"%ssERREUR : Valeur vlGetControl={%d,%d}\n" \
,TABULATION \
,parametres.parametre1.parametre11 \
,parametres.parametre1.parametre12 \
); \
} \
else \
{ \
vlPerror(" gERREUR "); \
} \
} \
} \
/* Envoi d'un controle a deux parametres. */
main()
{
VLServer serveur_video = NULL;
int numero_de_device = -1;
char *nom_de_device;
VLDevList liste_des_devices;
VLNode Nemetteur,Nrecepteur,Ndevice;
int nombre_de_chemins=1;
VLPath chemin = -1;
VLControlValue parametres;
VLControlList *controles;
VLTransferDescriptor transfert;
Display *display;
Window fenetre;
XSizeHints indices;
XSetWindowAttributes attributs;
Window child_return;
XEvent evenement;
/* */
/* */
/* C O N N E X I O N E T P R O G R A M M A T I O N D U S E R V E U R V I D E O : */
/* */
/* */
serveur_video = vlOpenVideo("");
if (serveur_video != NULL)
{
vlRestoreSystemDefaults(serveur_video);
if (vlGetDeviceList(serveur_video,&liste_des_devices) >= 0)
{
if ((numero_de_device < (int)liste_des_devices.numDevices) && (numero_de_device >= -1))
{
Ndevice = vlGetNode(serveur_video,VL_DEVICE,0,0);
Nemetteur = vlGetNode(serveur_video,VL_SRC,VL_VIDEO,VL_ANY);
Nrecepteur = vlGetNode(serveur_video,VL_DRN,VL_SCREEN,VL_ANY);
/* Acces aux deux noeuds necessaires. */
chemin = vlCreatePath(serveur_video
,((numero_de_device == -1) ? VL_ANY : numero_de_device)
,Nemetteur,Nrecepteur
);
/* Creation du chemin... */
if (chemin >= 0)
{
vlAddNode(serveur_video,chemin,Nemetteur);
vlAddNode(serveur_video,chemin,Nrecepteur);
vlAddNode(serveur_video,chemin,Ndevice);
numero_de_device = vlGetDevice(serveur_video,chemin);
nom_de_device = liste_des_devices.devices[numero_de_device].name;
if (vlSetupPaths(serveur_video
,(VLPathList)&chemin
,nombre_de_chemins
,VL_SHARE,VL_SHARE
)
== 0)
/* Etablissement du chemin... */
{
vlSelectEvents(serveur_video,chemin,VLNoEventsMask);
controles = vlGetControlList(serveur_video,chemin);
/* Afin d'editer les controles disponibles pour ce chemin... */
if (controles != 0)
{
int indice;
VLControlInfo *liste=controles->controls;
fprintf(stderr,"\n Nemetteur=%d",Nemetteur);
fprintf(stderr,"\n Ndevice=%d",Ndevice);
fprintf(stderr,"\n Nrecepteur=%d",Nrecepteur);
fprintf(stderr,"\n nombre de controles pour ce chemin avant=%d\n"
,controles->numControls
);
for (indice=0 ; indice<controles->numControls ; indice++)
{
fprintf(stderr,"\n%s (-->%d)",liste->name,liste->node);
liste++;
}
fprintf(stderr,"\n");
}
else
{
}
parametre_1(Ndevice
,intVal,0
,VL_DEFAULT_SOURCE,"VL_DEFAULT_SOURCE",""
);
controles = vlGetControlList(serveur_video,chemin);
if (controles != 0)
{
fprintf(stderr,"\n nombre de controles pour ce chemin apres=%d\n"
,controles->numControls
);
/* Nombre de controles disponibles apres le controle 'VL_DEFAULT_SOURCE'... */
}
else
{
}
parametre_1(Ndevice
,intVal,VL_TIMING_625_SQ_PIX
,VL_TIMING,"VL_TIMING",""
);
parametre_1(Nemetteur
,intVal,5
,VL_MUXSWITCH,"VL_MUXSWITCH",""
);
/* La valeur 5 correspond actuellement au magnetoscope VHS (3 etant le disque video)... */
parametre_1(Nemetteur
,intVal,1
,1163264039,"1163264039",""
);
parametre_1(Nemetteur
,intVal,1
,1163264023,"1163264023",""
);
parametre_1(Nemetteur
,intVal,1
,1163264022,"1163264022",""
);
parametre_1(Nemetteur
,intVal,1
,1163264027,"1163264027",""
);
parametre_2(Nrecepteur
,fractVal
,numerator,1
,denominator,1
,VL_ZOOM,"VL_ZOOM",""
);
/* Programmation du format video... */
vlGetControl(serveur_video,chemin,Nrecepteur,VL_SIZE,¶metres);
/* */
/* */
/* C O N N E X I O N E T P R O G R A M M A T I O N D U S E R V E U R X 1 1 : */
/* */
/* */
display = XOpenDisplay(getenv("DISPLAY"));
/* Ouverture du display X11. */
if (display != NULL)
{
indices.width = parametres.xyVal.x + 32;
/* Le "+32" est destine a centrer l'image fenetre video dans la fenetre, ce que je n'arrive */
/* pas a faire autrement. Cette valeur a ete choisie afin qu'une image de type 'Pal' soit */
/* centree dans la fenetre video (on notera au passage qu'une image de type 'Std' ne l'est */
/* pas...). */
indices.height = parametres.xyVal.y - 4;
indices.x = 0;
indices.y = 442;
indices.flags = USPosition | USSize;
attributs.event_mask = PropertyChangeMask | ButtonPressMask;
fenetre = XCreateWindow(display
,RACINE_DU_SYSTEME_HIERARCHIQUE
,indices.x,indices.y
,indices.width,indices.height
,EPAISSEUR_DU_BORD_DES_FENETRES
,CopyFromParent
,CopyFromParent
,CopyFromParent
,CWEventMask
,&attributs
);
XSelectInput(display,fenetre,attributs.event_mask);
XSetStandardProperties(display
,fenetre
,NOM_DE_LA_FENETRE
,NOM_DE_SON_ICONE
,None
,NULL,0
,&indices
);
/* Creation de la fenetre... */
/* */
/* */
/* C O N N E X I O N E N T R E L A V I D E O E T X 1 1 : */
/* */
/* */
parametre_1(Nrecepteur
,intVal,fenetre
,VL_WINDOW,"VL_WINDOW",""
);
XMapWindow(display,fenetre);
XSync(display,False);
XTranslateCoordinates(display
,fenetre
,RACINE_DU_SYSTEME_HIERARCHIQUE
,0,0
,¶metres.xyVal.x,¶metres.xyVal.y
,&child_return
);
/* */
/* */
/* T R A N S F E R T V I D E O : */
/* */
/* */
parametre_2(Nrecepteur
,xyVal
,x,parametres.xyVal.x+8
,y,parametres.xyVal.y+1
,VL_ORIGIN,"VL_ORIGIN",""
);
transfert.mode = VL_TRANSFER_MODE_CONTINUOUS;
transfert.count = 0;
transfert.delay = 0;
transfert.trigger = VLTriggerImmediate;
if (vlBeginTransfer(serveur_video,chemin,1,&transfert)
== 0)
/* Lancement du transfert... */
{
evenement.type = LASTEvent;
while (evenement.type != ButtonPress)
{
XNextEvent(display,&evenement);
}
/* Attente arbitraire... */
vlEndTransfer(serveur_video,chemin);
/* Arret du transfert... */
}
else
{
fprintf(stderr,"\n transfert impossible");
}
/* */
/* */
/* F I N : */
/* */
/* */
XCloseDisplay(display);
}
else
{
fprintf(stderr,"\n impossible d'ouvrir le display X11");
}
}
else
{
fprintf(stderr,"\n impossible d'etablir le chemin video");
}
parametre_1(Nemetteur
,intVal,4
,VL_MUXSWITCH,"VL_MUXSWITCH",""
);
/* Afin de creer un etat de repos (noir...) et malgre le 'vlDestroyPath(...)' qui suit... */
vlDestroyPath(serveur_video,chemin);
}
else
{
fprintf(stderr,"\n impossible de creer le chemin video");
}
}
else
{
fprintf(stderr,"\n le numero de device (%d) est mauvais",numero_de_device);
}
}
else
{
fprintf(stderr,"\n impossible d'obtenir la liste des devices");
}
}
else
{
fprintf(stderr,"\n impossible d'ouvrir le serveur video");
}
vlCloseVideo(serveur_video);
}