home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Warp Uncensored / OS2_WARP_UNCENSORED.ISO / rexx / vidbounc.cmd < prev   
OS/2 REXX Batch file  |  1995-04-02  |  13KB  |  282 lines

  1. /******************************************************************************/
  2. /* VIDBOUNC.CMD - Open an SMV movie (default to the shipped MACAW.AVI file),  */
  3. /* and play it, alternating the position and size of the default video        */
  4. /* playback window on the screen.                                             */
  5. /*                                                                            */
  6. /* This command file demonstrates the following concepts:                     */
  7. /*                                                                            */
  8. /* + Use of the mciRxSendMCICommand and mciRxGetErrorString REXX MM           */
  9. /*   extensions.                                                              */
  10. /* + Use of digital video Media Control Interface (MCI) string commands,      */
  11. /*   including those which:                                                   */
  12. /*                                                                            */
  13. /*   * query information about the file                                       */
  14. /*   * move the default video window around the screen                        */
  15. /*   * change the size of the video window                                    */
  16. /*   * control the playback of the SMV movie                                  */
  17. /*                                                                            */
  18. /* NOTE:  Due to the requirements of displaying digital video, this command   */
  19. /* file MUST be invoked via the command:                                      */
  20. /*                                                                            */
  21. /*                         PMREXX VIDBOUNC arguments                          */
  22. /*                                                                            */
  23. /* If you invoke VIDBOUNC directly from an OS/2 command line, you will receive*/
  24. /* an error code/message similar to the following:                            */
  25. /*                                                                            */
  26. /*        5041 = Not currently in a Presentation Manager Session.             */
  27. /*                                                                            */
  28. /******************************************************************************/
  29.  
  30. signal on halt                  /* Handle case where the user hits Ctrl+Break */
  31.                                 /* to end the program                         */
  32.  
  33. arg filename 'V='volume         /* Get the command line arguments             */
  34.                                 /* filename = The video file to use for       */
  35.                                 /*            playback                        */
  36.                                 /* 'V=nn'   = (optional) Set the volume to    */
  37.                                 /*            nn percent                      */
  38.  
  39. /* Provide help text, if desired */
  40. if filename = '?' then
  41. do
  42.    signal Help
  43. end
  44.  
  45. /* Initialize various variables */
  46.  
  47. alias = 'YIPPEE'                /* String used in each MCI command string     */
  48.  
  49. defvol = 75                     /* Default volume level                       */
  50. deffn  = 'MMOS2\MOVIES\MACAW.AVI'       /* Default SMV file name              */
  51.  
  52. screenx = 1024                  /* Assumed display horizontal resolution      */
  53. screeny = 768                   /* Assumed display vertical resolution        */
  54.  
  55.  
  56. /* If no filename was supplied, find the correct drive containing our default */
  57. /* file (assume it exists).  This also affords us the chance of ensuring that */
  58. /* OS/2 Multimedia is installed.                                              */
  59.  
  60. if filename = '' then
  61. do
  62.    /* The MMBASE environment variable will exist if OS/2 Multimedia has been  */
  63.    /* installed.  It contains the desired drive letter.                       */
  64.  
  65.    mmbase = value('MMBASE',,'OS2ENVIRONMENT')
  66.  
  67.    if mmbase = '' then
  68.    do
  69.       say 'WHOA!  OS/2 Multimedia support seems to be missing from this system.'
  70.       say 'Ensure ''MMPM/2'' is installed and the MMBASE environment variable'
  71.       say 'is set to point to d:\MMOS2 (where d: is the appropriate drive).'
  72.       exit 1
  73.    end
  74.    else
  75.    do
  76.       /* MMBASE exists, assume the first letter is the drive letter.          */
  77.       /* Assemble the default filename                                        */
  78.       filename = left(mmbase,1)':'deffn
  79.    end
  80. end
  81.  
  82. /* If no volume was specified, ensure the default value is set, to keep from  */
  83. /* blowing people out of their chairs...!                                     */
  84.  
  85. if volume = '' then volume = defvol
  86.  
  87.  
  88. /* Have the user verify the resolution of the screen */
  89.  
  90. say
  91. say 'Assuming a screen resolution of' screenx 'by' screeny'...'
  92. say 'If this is OK, press Enter.  Otherwise, enter your screen''s resolution'
  93. say 'in the form x y , where x is the width and y is the height.'
  94. pull x y
  95. if x <> '' then
  96. do
  97.    screenx = x
  98.    screeny = y
  99. end
  100.  
  101. /* Initialize the OS/2 Multimedia REXX support */
  102. call RxFuncAdd 'mciRxInit', 'MCIAPI', 'mciRxInit'
  103. call mciRxInit
  104.  
  105.  
  106. /* Open the SMV file, using the default device.  Specify an 'alias' to use    */
  107. /* on subsequent MCI commands.  Do not specify the SHAREABLE keyword, because */
  108. /* we want exclusive access to all necessary devices, since there is no way   */
  109. /* for this session to acquire its multimedia resources, should another       */
  110. /* application wrest control away from us.                                    */
  111. /*                                                                            */
  112. /* SendMCICommand is a local procedure which calls mciRxSendString...         */
  113.  
  114. say 'Opening' filename'...'
  115. cmdRC = SendMCICommand('OPEN' strip(filename) 'ALIAS' alias 'WAIT')
  116.  
  117. if cmdRC <> 0 then
  118.    signal CleanupAndExit
  119. else
  120. do
  121.  
  122.    /* Set the volume */
  123.    if SendMCICommand('SET' alias 'AUDIO VOLUME' volume 'WAIT') = 0 then
  124.       say 'Volume set to' volume'%.'
  125.  
  126.    /* Set the time format to something video-ish, for upcoming STATUS commands*/
  127.    if SendMCICommand('SET' alias 'TIME FORMAT HMSF WAIT') = 0 then
  128.       say 'Time format set to Hours:Minutes:Seconds:Frames.'
  129.  
  130.    /* Get some information about the video file and display it.               */
  131.    /* NOTE:  SendMCICommand sets the mciResults variable if there is any      */
  132.    /* return information...                                                   */
  133.  
  134.    say 'Video information:'
  135.  
  136.    if SendMCICommand('STATUS' alias 'LENGTH WAIT') = 0 then
  137.       say '  Length =' mciResults
  138.  
  139.    if SendMCICommand('STATUS' alias 'HORIZONTAL VIDEO EXTENT WAIT') = 0 then
  140.       vidx = mciResults
  141.    else vidx = 0
  142.  
  143.    if SendMCICommand('STATUS' alias 'VERTICAL VIDEO EXTENT WAIT') = 0 then
  144.       vidy = mciResults
  145.    else vidy = 0
  146.  
  147.    if vidx <> 0 & vidy <> 0 then
  148.       say '  Width and height:  'vidx 'and' vidy', respectively.'
  149.  
  150.    if SendMCICommand('STATUS' alias 'NORMAL RATE WAIT') = 0 then
  151.       say '  Frame rate:  'mciResults 'frames/second.'
  152.  
  153.    /* Now, play the video in each corner of the display at regular speed,     */
  154.    /* normal size, then play in the middle of the screen at regular speed,    */
  155.    /* normal size.  Finally, double the size of the video, center it in the   */
  156.    /* screen, and play it at a 'fast' speed.                                  */
  157.    /*                                                                         */
  158.    /* To move the default window, use the PUT command:                        */
  159.    /*                                                                         */
  160.    /*   PUT object WINDOW x y width height MOVE WAIT                          */
  161.    /*                                                                         */
  162.    /* width and height can be 0's when doing a MOVE operation.                */
  163.    /*                                                                         */
  164.    /* The FROM 0 keywords in the PLAY command mean to always start playback   */
  165.    /* from the beginning of the file.  This helps us avoid sending a SEEK     */
  166.    /* command before each PLAY.                                               */
  167.  
  168.    say 'Now playing the movie:'
  169.  
  170.    say '  Bottom left...'
  171.    if SendMCICommand('PUT' alias 'WINDOW AT 0 0 0 0 MOVE WAIT') = 0 then
  172.       call SendMCICommand 'PLAY' alias 'WAIT'
  173.  
  174.    /* Calculate right-hand X value and top-most Y value.  Since the video     */
  175.    /* extents we queried were just for the size of the video, include a fudge */
  176.    /* factor to account for the borders of the default video window           */
  177.    /* We can figure out the fudge factor fairly finely 8-) by utilizing the   */
  178.    /* WHERE command, which will give us the complete position/size of the     */
  179.    /* default playback window.                                                */
  180.  
  181.    if SendMCICommand('WHERE' alias 'WINDOW WAIT') = 0 then
  182.    do
  183.       parse value mciResults with winx winy winx2 winy2
  184.       fudgex = winx2 - winx - vidx
  185.       fudgey = winy2 - winy - vidy
  186.    end
  187.  
  188.    x = screenx - vidx - fudgex  /* Starting point for right top/bottom videos */
  189.    y = screeny - vidy - fudgey  /* Starting point for top left/right videos   */
  190.  
  191.    say '  Bottom right...'
  192.    if SendMCICommand('PUT' alias 'WINDOW AT' x '0 0 0 MOVE WAIT') = 0 then
  193.       call SendMCICommand 'PLAY' alias 'FROM 0 WAIT'
  194.  
  195.    say '  Top left...'
  196.    if SendMCICommand('PUT' alias 'WINDOW AT 0' y '0 0 MOVE WAIT') = 0 then
  197.       call SendMCICommand 'PLAY' alias 'FROM 0 WAIT'
  198.  
  199.    say '  Top right...'
  200.    if SendMCICommand('PUT' alias 'WINDOW AT' x y '0 0 MOVE WAIT') = 0 then
  201.       call SendMCICommand 'PLAY' alias 'FROM 0 WAIT'
  202.  
  203.    say '  Centered...'
  204.    if SendMCICommand('PUT' alias 'WINDOW AT' x/2 y/2 '0 0 MOVE WAIT') = 0 then
  205.       call SendMCICommand 'PLAY' alias 'FROM 0 WAIT'
  206.  
  207.    say '  Centered, "pel-doubled", playing fast (no sound)...'
  208.    x = (screenx-(vidx*2)-fudgex)/2   /* Starting x = width doubled, centered  */
  209.    x2= x + vidx*2 + fudgex           /* Ending x = Starting x + double-width  */
  210.                                      /* + borders                             */
  211.    y = (screeny-(vidy*2)-fudgey)/2   /* Starting y = height doubled, centered */
  212.    y2= y + vidy*2 + fudgey           /* Ending y = Starting y + double-width  */
  213.                                      /* + borders                             */
  214.    if SendMCICommand('PUT' alias 'WINDOW AT ' x y x2 y2 'MOVE SIZE WAIT') = 0 then
  215.       call SendMCICommand 'PLAY' alias 'FROM 0 FAST WAIT'
  216.  
  217.    say 'Playback complete...Press Enter to continue'
  218.    pull
  219. end  /* If file loaded OK */
  220.  
  221. /* Close the instance. */
  222. call SendMCICommand 'CLOSE' alias 'WAIT'
  223.  
  224. /* Do some REXX cleanup */
  225. call mciRxExit                  
  226.  
  227. exit 0
  228.  
  229.  
  230.                          /*******************************/
  231.                          /***** Various subroutines *****/
  232.                          /*******************************/
  233.  
  234. /* Call the REXX function which sends MCI string commands to OS/2 Multimedia.  */
  235. SendMCICommand:
  236.    arg command
  237.    /* Last two parameters are reserved, must be set to 0 */
  238.    rc = mciRxSendString(command, 'mciResults', '0', '0')
  239.    if rc <> 0 then
  240.    do
  241.       /* Sometimes the error return code has the 'device ID' in the high      */
  242.       /* order word, so mask off that word before querying the error string   */
  243.       if rc > 65536 then rc = X2D(right(D2X(rc),4))
  244.  
  245.       call mciRxGetErrorString rc, 'ErrorString'
  246.       say 'WHOA!  An error occurred while sending an MCI command string.'
  247.       say '  Command was "'command'"'
  248.       say '  Return code was' rc
  249.       /* Error strings only work for MCI errors */
  250.       if rc >= 5000 then              
  251.          say '  System reports "'ErrorString'"'
  252.    end
  253.    return rc
  254.  
  255.  
  256. /*  Display help text */
  257. Help:
  258.    say
  259.    say 'VIDBOUNC [filename] [V=nn]'
  260.    say
  261.    say 'Display an SMV file and play back in different spots and in different'
  262.    say 'sizes on the screen.'
  263.    say
  264.    say 'Command line arguments (both optional):'
  265.    say
  266.    say 'filename     = Name of the SMV movie file to use.'
  267.    say 'V=nn         = Set playback volume to nn%.'
  268.    exit
  269.  
  270.  
  271. /* Common cleanup routine */
  272. CleanupAndExit:
  273.    call mciRxExit               /* Clean up the MCI Rexx subfunctions         */
  274.    exit 9                       /* Return a non-zero code to .CMD caller      */
  275.  
  276.  
  277. /* Handle something like a control break */
  278. halt:
  279.    say 'Halting...'
  280.    call SendMCICommand 'CLOSE' alias 'WAIT'
  281.    exit 0
  282.