home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / VSCPPv4.zip / VACPP / IBMCPP / HELP / MMSSPG.INF (.txt) < prev    next >
OS/2 Help File  |  1995-03-10  |  814KB  |  17,626 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Notices ΓòÉΓòÉΓòÉ
  3.  
  4. First Edition (October 1994) 
  5.  
  6. The following paragraph does not apply to the United Kingdom or any country 
  7. where such provisions are inconsistent with local law:  INTERNATIONAL BUSINESS 
  8. MACHINES CORPORATION PROVIDES THIS PUBLICATION "AS IS" WITHOUT WARRANTY OF ANY 
  9. KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  10. WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Some states 
  11. do not allow disclaimer of express or implied warranties in certain 
  12. transactions, therefore, this statement may not apply to you. 
  13.  
  14. This publication could include technical inaccuracies or typographical errors. 
  15. Changes are periodically made to the information herein; these changes will be 
  16. incorporated in new editions of the publication. IBM may make improvements 
  17. and/or changes in the product(s) and/or the program(s) described in this 
  18. publication at any time. 
  19.  
  20. It is possible that this publication may contain reference to, or information 
  21. about, IBM products (machines and programs), programming, or services that are 
  22. not announced in your country.  Such references or information must not be 
  23. construed to mean that IBM intends to announce such IBM products, programming, 
  24. or services in your country. 
  25.  
  26. Requests for technical information about IBM products should be made to your 
  27. IBM authorized reseller or IBM marketing representative. 
  28.  
  29.  
  30. ΓòÉΓòÉΓòÉ 1.1. Copyright Notices ΓòÉΓòÉΓòÉ
  31.  
  32. COPYRIGHT LICENSE: This publication contains printed sample application 
  33. programs in source language, which illustrate OS/2 programming techniques. You 
  34. may copy, modify, and distribute these sample programs in any form without 
  35. payment to IBM, for the purposes of developing, using, marketing or 
  36. distributing application programs conforming to the OS/2 application 
  37. programming interface. 
  38.  
  39. Each copy of any portion of these sample programs or any derivative work, which 
  40. is distributed to others, must include a copyright notice as follows: "(C) 
  41. (your company name) (year).  All rights reserved." 
  42.  
  43. (C) Copyright International Business Machines Corporation 1994. All rights 
  44. reserved. 
  45. Note to U.S. Government Users - Documentation related to restricted rights - 
  46. Use, duplication or disclosure is subject to restrictions set forth in GSA ADP 
  47. Schedule Contract with IBM Corp. 
  48.  
  49.  
  50. ΓòÉΓòÉΓòÉ 1.2. Disclaimers ΓòÉΓòÉΓòÉ
  51.  
  52. References in this publication to IBM products, programs, or services do not 
  53. imply that IBM intends to make these available in all countries in which IBM 
  54. operates. Any reference to an IBM product, program or service is not intended 
  55. to state or imply that only IBM's product, program, or service may be used. Any 
  56. functionally equivalent product, program, or service that does not infringe any 
  57. of IBM's intellectual property rights or other legally protectable rights may 
  58. be used instead of the IBM product, program, or service. Evaluation and 
  59. verification of operation in conjunction with other products, programs, or 
  60. services, except those expressly designated by IBM, are the user's 
  61. responsibility. 
  62.  
  63. IBM may have patents or pending patent applications covering subject matter in 
  64. this document. The furnishing of this document does not give you any license to 
  65. these patents. You can send license inquiries, in writing, to the IBM Director 
  66. of Licensing, IBM Corporation, 500 Columbus Avenue, Thornwood NY 10594, U.S.A. 
  67.  
  68.  
  69. ΓòÉΓòÉΓòÉ 1.3. Trademarks ΓòÉΓòÉΓòÉ
  70.  
  71. The following terms, denoted by an asterisk (*) in this publication, are 
  72. trademarks of the IBM Corporation in the United States or other countries: 
  73.  
  74. Audio Visual Connection
  75. IBM
  76. Common User Access
  77. CUA
  78. Multimedia Presentation Manager/2
  79. OS/2
  80. Presentation Manager
  81. Workplace Shell
  82.  
  83. The following terms, denoted by a double asterisk (**) in this publication, are 
  84. trademarks of other companies as follows. Other trademarks are trademarks of 
  85. their respective companies. 
  86.  
  87.  Helvetica                     Linotype Company 
  88.  Pro AudioSpectrum 16          Media Vision, Inc. 
  89.  Sound Blaster                 Creative Labs, Inc. 
  90.  
  91.  
  92. ΓòÉΓòÉΓòÉ 2. Introduction ΓòÉΓòÉΓòÉ
  93.  
  94. This book provides guidelines for developing multimedia subsystems. Each 
  95. subsystem component is described in detail in individual chapters.  Models are 
  96. used to complement the information provided by component sample program 
  97. templates. 
  98.  
  99.  
  100. ΓòÉΓòÉΓòÉ 2.1. Related Publications ΓòÉΓòÉΓòÉ
  101.  
  102. The following diagram provides an overview of the OS/2 Technical Library. 
  103.  
  104. Books can be ordered by calling toll free 1-800-879-2755 weekdays between 8:30 
  105. a.m. and 7:00 p.m. (EST). In Canada, call 1-800-465-4234. 
  106.  
  107.  
  108. ΓòÉΓòÉΓòÉ 2.2. Additional Multimedia Information ΓòÉΓòÉΓòÉ
  109.  
  110.  Multimedia REXX - (online) 
  111.            Describes REXX functions that enable media control interface string 
  112.            commands to be sent from an OS/2 command file to control multimedia 
  113.            devices.  This online book is provided with OS/2 multimedia. 
  114.  
  115.  Guide to Multimedia User Interface Design - (41G2922) 
  116.            Describes design concepts to be considered when designing a CUA 
  117.            multimedia interface that is consistent within a particular 
  118.            multimedia product and across other products. 
  119.  
  120.  OS/2 Multimedia Device Driver Developers:  The Device Driver Source Kit for 
  121.  OS/2 contains documented source code and detailed information on how to build 
  122.  a virtual device driver (VDD) and audio physical device driver (PDD) for OS/2 
  123.  multimedia. 
  124.  
  125.  The kit covers the complete range of OS/2 physical and virtual device drivers, 
  126.  from printers, displays, SCSIs and CD-ROM drives, to the device drivers for 
  127.  Pen for OS/2 and OS/2 multimedia. Comprehensive descriptions of all the device 
  128.  driver interfaces and system services are included. 
  129.  
  130.  
  131. ΓòÉΓòÉΓòÉ 2.3. Using This Online Book ΓòÉΓòÉΓòÉ
  132.  
  133. Before you begin to use this online book, it would be helpful to understand how 
  134. you can: 
  135.  
  136.    o  Expand the Contents to see all available topics 
  137.    o  Obtain additional information for a highlighted word or phrase 
  138.    o  Use action bar choices. 
  139.  
  140.  How To Use the Contents 
  141.  
  142.  When the Contents window first appears, some topics have a plus (+) sign 
  143.  beside them.  The plus sign indicates that additional topics are available. 
  144.  
  145.  To expand the Contents if you are using a mouse, select the plus sign (+).  If 
  146.  you are using a keyboard, use the Up or Down Arrow key to highlight the topic, 
  147.  and press the plus key (+). 
  148.  
  149.  To view a topic, double-click on the topic (or press the Up or Down Arrow key 
  150.  to highlight the topic, and then press Enter). 
  151.  
  152.  How To Obtain Additional Information 
  153.  
  154.  After you select a topic, the information for that topic appears in a window. 
  155.  Highlighted words or phrases indicate that additional information is 
  156.  available.  You will notice that certain words in the following paragraph are 
  157.  highlighted in green letters, or in white letters on a black background. These 
  158.  are called hypertext terms.  If you are using a mouse, double-click on the 
  159.  highlighted word.  If you are using a keyboard, press the Tab key to move to 
  160.  the highlighted word, and then press the Enter key.  Additional information 
  161.  will appear in a window. 
  162.  
  163.  How To Use Action Bar Choices 
  164.  
  165.  Several choices are available for managing information presented in the 
  166.  M-Control Program/2 Programming Reference.  There are three pull-down menus on 
  167.  the action bar:  the Services menu, the Options menu, and the Help menu. 
  168.  
  169.  The actions that are selectable from the Services menu operate on the active 
  170.  window currently displayed on the screen.  These actions include the 
  171.  following: 
  172.  
  173.  Bookmark 
  174.     Sets a place holder so you can retrieve information of interest to you. 
  175.  
  176.     When you place a bookmark on a topic, it is added to a list of bookmarks 
  177.     you have previously set.  You can view the list, and you can remove one or 
  178.     all bookmarks from the list.  If you have not set any bookmarks, the list 
  179.     is empty. 
  180.  
  181.     To set a bookmark, do the following: 
  182.  
  183.    1. Select a topic from the Contents. 
  184.  
  185.    2. When that topic appears, choose the Bookmark option from the Services 
  186.       menu. 
  187.  
  188.    3. If you want to change the name used for the bookmark, type the new name 
  189.       in the field. 
  190.  
  191.    4. Select the Place radio button (or press the Up or Down Arrow key to 
  192.       select it). 
  193.  
  194.    5. Select OK.  The bookmark is then added to the bookmark list. 
  195.  
  196.  Search 
  197.     Finds occurrences of a word or phrase in the current topic, selected 
  198.     topics, or all topics. 
  199.  
  200.     You can specify a word or phrase to be searched.  You can also limit the 
  201.     search to a set of topics by first marking the topics in the Contents list. 
  202.  
  203.     To search for a word or phrase in all topics, do the following: 
  204.  
  205.    1. Choose the Search option from the Services pull-down. 
  206.  
  207.    2. Type the word or words to be searched. 
  208.  
  209.    3. Select All sections. 
  210.  
  211.    4. Select Search to begin the search. 
  212.  
  213.    5. The list of topics where the word or phrase appears is displayed. 
  214.  
  215.  Print 
  216.     Prints one or more topics.  You can also print a set of topics by first 
  217.     marking the topics in the Contents list. 
  218.  
  219.     You can print one or more topics.  You can also print a set of topics by 
  220.     first marking the topics on the Contents list. 
  221.  
  222.     To print the document Contents list, do the following: 
  223.  
  224.    1. Select Print from the Services menu. 
  225.  
  226.    2. Select Contents. 
  227.  
  228.    3. Select Print. 
  229.  
  230.    4. The Contents list is printed on your printer. 
  231.  
  232.  Copy 
  233.     Copies a topic you are viewing to a file you can edit. 
  234.  
  235.     You can copy a topic you are viewing into a temporary file named TEXT.TMP. 
  236.     You can later edit that file by using an editor such as the System Editor. 
  237.  
  238.     To copy a topic, do the following: 
  239.  
  240.    1. Expand the Contents list and select a topic. 
  241.  
  242.    2. When the topic appears, select Copy to file from the Services menu. 
  243.  
  244.     The system copies the text pertaining to that topic into the temporary 
  245.     TEXT.TMP file. 
  246.  
  247.     For information on any of the other choices in the Services menu, highlight 
  248.     the choice and press the F1 key. 
  249.  
  250.  Options 
  251.     Changes the way the Contents is displayed. 
  252.  
  253.     You can control the appearance of the Contents list. 
  254.  
  255.     To expand the Contents and show all levels for all topics, select Expand 
  256.     all from the Options menu. 
  257.  
  258.     For information on any of the other choices in the Options menu, highlight 
  259.     the choice and press the F1 key. 
  260.  
  261.  
  262. ΓòÉΓòÉΓòÉ 3. Multimedia Subsystems Overview ΓòÉΓòÉΓòÉ
  263.  
  264. OS/2* multimedia (referred to as Multimedia Presentation Manager/2* or MMPM/2 
  265. in previous releases) has an extendable architecture that makes it possible to 
  266. add new functions, devices, and multimedia data formats as the technology of 
  267. multimedia advances.  This chapter provides a general overview of the subsystem 
  268. components provided with the OS/2 multimedia system.  Subsequent chapters 
  269. include detailed guidelines on how to develop and install your own OS/2 
  270. multimedia subsystem through the use of the sample programs illustrated in the 
  271. following figure. Each sample program serves as a template that can be modified 
  272. easily to meet your multimedia requirements. Use these sample programs to 
  273. develop and install media control drivers, stream handlers, and I/O procedures 
  274. for OS/2 multimedia. 
  275.  
  276.  
  277. ΓòÉΓòÉΓòÉ 3.1. OS/2 Multimedia System Architecture ΓòÉΓòÉΓòÉ
  278.  
  279. The following figure illustrates the subsystem components provided by the OS/2 
  280. multimedia system.  These subsystems (media control drivers, stream handlers, 
  281. and I/O procedures) are controlled by managers that oversee a range of 
  282. activities in the OS/2 multimedia environment. 
  283.  
  284. At the Ring 3 level, OS/2 multimedia employs a Media Device Manager (MDM), 
  285. which manages logical media devices representing audio adapters, CD-ROM drives, 
  286. and other hardware devices.  Amongst its duties, MDM determines which process 
  287. gains access when two or more applications attempt to control a media device. 
  288.  
  289. The Sync/Stream Manager (SSM) is also available to manage streaming and 
  290. synchronization calls initiated by the media control drivers.  This eliminates 
  291. the need for each media driver to provide its own solution for these common 
  292. multimedia requirements.  Pairs of stream handlers implement the transport of 
  293. data from a source to a target device while the SSM provides coordination and 
  294. central management of data buffers and synchronization data. 
  295.  
  296. Lastly, the MMIO Manager enables subsystem components such as media control 
  297. drivers and applications to access and manipulate a variety of data objects, 
  298. including images, graphics, digital audio, and digital video.  These objects 
  299. can be stored in a variety of file formats on a variety of storage systems. 
  300. The MMIO Manager uses installable I/O procedures to direct the input and output 
  301. associated with reading from and writing to different types of storage systems 
  302. or file formats. 
  303.  
  304.  
  305. ΓòÉΓòÉΓòÉ 3.2. Extendable Device Support ΓòÉΓòÉΓòÉ
  306.  
  307. The system architecture of OS/2 multimedia extensions is designed to be 
  308. extendable.  This level of modularity allows independent development of support 
  309. for new hardware devices, logical media devices, and file formats. 
  310.  
  311. Examples of media control interface devices are listed in the following table. 
  312. The purpose of the table is to show the logical device types that can be 
  313. supported and already have media control interface definitions. Devices 
  314. currently supported by OS/2 multimedia are indicated by (X) marks. 
  315.  
  316. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  317. ΓöéMedia Device  ΓöéOS/2      ΓöéString        ΓöéConstant                          Γöé
  318. ΓöéType          ΓöéMultimediaΓöé              Γöé                                  Γöé
  319. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  320. ΓöéAmplifier     ΓöéX         Γöéampmix        ΓöéMCI_DEVTYPE_AUDIO_AMPMIX          Γöé
  321. Γöémixer         Γöé          Γöé              Γöé                                  Γöé
  322. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  323. ΓöéAudio tape    Γöé          Γöéaudiotape     ΓöéMCI_DEVTYPE_AUDIO_TAPE            Γöé
  324. Γöéplayer        Γöé          Γöé              Γöé                                  Γöé
  325. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  326. ΓöéCD audio      ΓöéX         Γöécdaudio       ΓöéMCI_DEVTYPE_CD_AUDIO              Γöé
  327. Γöéplayer        Γöé          Γöé              Γöé                                  Γöé
  328. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  329. ΓöéCD-XA player  ΓöéX         Γöécdxa          ΓöéMCI_DEVTYPE_CDXA                  Γöé
  330. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  331. ΓöéDigital audio Γöé          Γöédat           ΓöéMCI_DEVTYPE_DAT                   Γöé
  332. Γöétape          Γöé          Γöé              Γöé                                  Γöé
  333. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  334. ΓöéDigital video ΓöéX         Γöédigitalvideo  ΓöéMCI_DEVTYPE_DIGITAL_VIDEO         Γöé
  335. Γöéplayer        Γöé          Γöé              Γöé                                  Γöé
  336. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  337. ΓöéHeadphone     Γöé          Γöéheadphone     ΓöéMCI_DEVTYPE_HEADPHONE             Γöé
  338. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  339. ΓöéMicrophone    Γöé          Γöémicrophone    ΓöéMCI_DEVTYPE_MICROPHONE            Γöé
  340. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  341. ΓöéMonitor       Γöé          Γöémonitor       ΓöéMCI_DEVTYPE_MONITOR               Γöé
  342. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  343. ΓöéOther         Γöé          Γöéother         ΓöéMCI_DEVTYPE_OTHER                 Γöé
  344. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  345. ΓöéVideo overlay Γöé          Γöévideooverlay  ΓöéMCI_DEVTYPE_OVERLAY               Γöé
  346. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  347. ΓöéSequencer     ΓöéX         Γöésequencer     ΓöéMCI_DEVTYPE_SEQUENCER             Γöé
  348. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  349. ΓöéSpeaker       Γöé          Γöéspeaker       ΓöéMCI_DEVTYPE_SPEAKER               Γöé
  350. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  351. ΓöéVideodisc     ΓöéX         Γöévideodisc     ΓöéMCI_DEVTYPE_VIDEODISC             Γöé
  352. Γöéplayer        Γöé          Γöé              Γöé                                  Γöé
  353. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  354. ΓöéVideo         Γöé          Γöévideotape     ΓöéMCI_DEVTYPE_VIDEOTAPE             Γöé
  355. Γöétape/cassette Γöé          Γöé              Γöé                                  Γöé
  356. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  357. ΓöéWaveform audioΓöéX         Γöéwaveaudio     ΓöéMCI_DEVTYPE_WAVEFORM_AUDIO        Γöé
  358. Γöéplayer        Γöé          Γöé              Γöé                                  Γöé
  359. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  360.  
  361. Note:  M-Control Program Version 2.01, which supports the M-Motion Video 
  362.        Adapter/A, provides overlay extensions for OS/2 multimedia. 
  363.  
  364.  
  365. ΓòÉΓòÉΓòÉ 3.3. Media Control Drivers ΓòÉΓòÉΓòÉ
  366.  
  367. The media control interface provides the primary mechanism for application 
  368. control of media devices.  The top layer consists of the Media Device Manager 
  369. (MDM), which provides resource management for media devices.  The bottom layer 
  370. consists of media control drivers (MCDs) - dynamic link libraries that 
  371. implement the function of a media device. 
  372.  
  373. Applications interact with the media control interface (and thus with media 
  374. devices) in two ways, through either a procedural interface (mciSendCommand) or 
  375. a string interface (mciSendString).  However, before an MCD can interpret a 
  376. string command, the MDM must use a command table to change the string into an 
  377. equivalent procedural command. 
  378.  
  379. MCDs do not directly control hardware devices.  Instead, they pass commands 
  380. through a subsystem or physical device driver interface.  This arrangement 
  381. frees MCDs from having to be knowledgeable about the hardware in order to 
  382. implement its function.  However, MCDs have to be knowledgeable about the means 
  383. of implementing that function.  For example, a CD-Audio player that is 
  384. implemented using a CD-ROM drive with a built-in Digital-to-Analog Converter 
  385. (DAC) can perform its function by simply issuing device IOCtl commands to the 
  386. drive's device driver.  However, a CD-Audio player that uses a separate Digital 
  387. Signal Processor (DSP) for playback of the digital audio data is implemented 
  388. quite differently, calling functions to manage a DSP coprocessor and data 
  389. transfer between the drive and the coprocessor. 
  390.  
  391. MCDs can also use the services of the other OS/2 multimedia subsystems such as 
  392. the Stream Programming Interface (SPI).  This subsystem provides data streaming 
  393. services that allow stream-handlers to control the flow of data from one device 
  394. to another in real time, maintaining a continuous flow of data between physical 
  395. devices. 
  396.  
  397.  
  398. ΓòÉΓòÉΓòÉ 3.4. I/O Procedures ΓòÉΓòÉΓòÉ
  399.  
  400. Multimedia input/output (MMIO) services provides both I/O and CODEC procedures. 
  401. I/O procedures are message-based handlers, which direct the input and output 
  402. associated with reading and writing to different types of storage systems or 
  403. file formats.  Applications and the MMIO subsystem communicate to I/O 
  404. procedures (DLL files) through the use of MMIO messages.  When MMIO receives a 
  405. request from an application through a function call, the MMIO Manager sends a 
  406. predefined message for that operation to the I/O procedure responsible for that 
  407. particular file format or storage system.  In turn, the I/O procedure performs 
  408. operations based on the messages it receives from the MMIO Manager or an 
  409. application. 
  410.  
  411. These messages are designed for efficient communications to all I/O procedures. 
  412. The I/O procedures, however, must be able to process the messages or pass them 
  413. on to a child I/O procedure.  For example, if an I/O procedure receives a 
  414. message requesting the compression of data object, the I/O procedure must be 
  415. able to process the message, or pass the message to a CODEC procedure. The 
  416. following figure illustrates the interaction of I/O and CODEC procedures in the 
  417. MMIO subsystem. 
  418.  
  419. The MMIO Manager calls the following types of procedures: 
  420.  
  421.  File Format 
  422.            A file format procedure is an I/O procedure that manipulates data at 
  423.            the element level, with each procedure handling a different element 
  424.            type such as audio, image, or MIDI.  It processes the data "within" 
  425.            the object and does not rely on any other file format I/O procedures 
  426.            to process the data.  However, a file format procedure might need to 
  427.            call a storage system I/O procedure to obtain data within a file 
  428.            containing multiple elements. 
  429.  
  430.  Storage System 
  431.            A storage system procedure is an I/O procedure that "unwraps" a data 
  432.            object for a file format procedure to access.  Storage system 
  433.            procedures are unaware of the format of the data object contained 
  434.            within the wrapper. 
  435.  
  436.  CODEC 
  437.            A CODEC procedure operates on data within a file or buffer.  Based 
  438.            on the data content, an I/O procedure can load a CODEC procedure to 
  439.            either compress or decompress data. 
  440.  
  441.  
  442. ΓòÉΓòÉΓòÉ 3.5. Stream Handlers ΓòÉΓòÉΓòÉ
  443.  
  444. The multimedia system provides stream handlers at both the system kernel level 
  445. (Ring 0) and the application level (Ring 3). Stream handlers are at Ring 0 and 
  446. Ring 3 because some streams are ideally controlled by a direct connection 
  447. between the stream handler and a device's physical device driver (PDD).  Other 
  448. streams are not associated with a data source or target, which maps physically 
  449. to a specific device.  For example, the file system stream handler is a DLL, 
  450. because all file system input/output (I/O) functions are available as Ring 3 
  451. OS/2 functions, and service all file system devices.  This eliminates the need 
  452. to build a specific stream handler device driver for every device the file 
  453. system can access. 
  454.  
  455. Stream handlers are responsible for controlling the flow of application data, 
  456. in a continuous, real-time manner.  Each handler can establish multiple data 
  457. stream instances, where each stream involves data of a specific type; for 
  458. example, MIDI (Musical Instrument Digital Interface) or ADPCM (Adaptive Delta 
  459. Pulse Code Modulation).  The application, through the use of a media control 
  460. driver, invokes an SPI function to create the stream and another SPI function 
  461. to activate the data stream.  The application does not have to continuously 
  462. invoke SPI functions to maintain data flow.  Instead, the stream handler keeps 
  463. the I/O continuous, simplifying the operations of the application. 
  464.  
  465.  
  466. ΓòÉΓòÉΓòÉ 4. Media Control Drivers ΓòÉΓòÉΓòÉ
  467.  
  468. This section shows you how to write a media control driver (MCD) by 
  469. illustrating the programming interfaces used by streaming and nonstreaming 
  470. MCDs.  The following discussion focuses on the MCDs depicted in the Duet Player 
  471. sample programs (see the OS/2 Multimedia Application Programming Guide for 
  472. details.) The waveform audio MCD uses SPI data streaming services to handle the 
  473. creation and management of source and target stream handlers.  However, the CD 
  474. audio MCD typically has no data flow associated with it as most CD audio 
  475. devices process data internally (internal to the device without any help from 
  476. the main CPU). 
  477.  
  478. Source code is provided for the following media control driver samples located 
  479. in the \TOOLKIT\SAMPLES\MM subdirectory: 
  480.  
  481.  Media Control Driver Template (MCDTEMP) 
  482.            Provides a basic template to write an MCD.  Refer to the ADMCT and 
  483.            CDMCIDRV subdirectories for specific streaming or MMIO samples. 
  484.  
  485.  Waveform Audio Media Control Driver (ADMCT) 
  486.            Provides an example of how to control a streaming device.  Streaming 
  487.            devices use the services of the Sync/Stream Manager (SSM) of OS/2 
  488.            multimedia to control the data stream from a source location to a 
  489.            target location.  For example, the audio adapter used in Duet Player 
  490.            I is a streaming device which plays back waveform audio files stored 
  491.            on the user's hard disk.  The PM application sends a request to the 
  492.            Media Device Manager (MDM) to play the file.  In turn, the MDM calls 
  493.            the waveform audio MCD, which uses stream handlers to buffer data 
  494.            from the waveform file on disk (source) to the audio adapter 
  495.            (target). 
  496.  
  497.  CD Media Control Driver (CDMCIDRV) 
  498.            Provides an example of how to control a nonstreaming device. 
  499.            Nonstreaming devices stream data within the device.  A device that 
  500.            streams data internally does not need to use buffered I/O because 
  501.            the source and destination of the data is within the device. 
  502.            Therefore, a nonstreaming device does not require the use of the SSM 
  503.            subsystem of OS/2 multimedia.  For example, the CD-ROM device used 
  504.            in Duet Player II is a nonstreaming device.  When the CD audio MCD 
  505.            receives a PLAY, PAUSE, or STOP command from the program, it issues 
  506.            the appropriate IOCtls to the CD-ROM device to perform the function. 
  507.            The hardware does all the work, relaying the digital information off 
  508.            the disc, translating it into an audio signal, and piping it to a 
  509.            port such as a headphone jack. 
  510.  
  511.  
  512. ΓòÉΓòÉΓòÉ 4.1. Media Control Driver Architecture ΓòÉΓòÉΓòÉ
  513.  
  514. The objects that receive the device control commands issued by multimedia 
  515. applications using mciSendCommand or mciSendString are called media control 
  516. drivers.  Media control drivers are OS/2 dynamic link libraries (DLLs) that 
  517. provide a level of hardware independence for applications.  The Media Device 
  518. Manager (MDM) provides the interface to these media objects.  The MDM also 
  519. provides a level of component management, making it possible for an application 
  520. to synchronize its use of MCDs as well as share MCDs with other applications. 
  521.  
  522. The following figure illustrates the MCDs provided with the OS/2 multimedia 
  523. system. 
  524.  
  525.  
  526. ΓòÉΓòÉΓòÉ 4.2. Media Control Driver Entry Point ΓòÉΓòÉΓòÉ
  527.  
  528. All MCDs have commands passed to them in the same way, regardless of whether 
  529. they support streaming or nonstreaming devices.  Applications call either the 
  530. mciSendCommand or mciSendString functions to pass commands to the entry point, 
  531. mciDriverEntry.  In addition, some commands are generated by the MDM itself. 
  532. These are the commands for saving and restoring an instance. 
  533.  
  534. The following table shows the parameters associated with mciDriverEntry. 
  535.  
  536. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  537. ΓöéParameters               ΓöéDescription                        Γöé
  538. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  539. ΓöéPVOID pInstance          ΓöéPointer to instance structure of   Γöé
  540. Γöé                         Γöédriver.                            Γöé
  541. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  542. ΓöéUSHORT usMessage         ΓöéThe requested action to be         Γöé
  543. Γöé                         Γöéperformed.                         Γöé
  544. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  545. ΓöéULONG ulParam1           ΓöéFlag for the message.  This flag isΓöé
  546. Γöé                         Γöédefined separately for each        Γöé
  547. Γöé                         Γöémessage.                           Γöé
  548. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  549. ΓöéPVOID pParam2            ΓöéSecond data parameter, whose       Γöé
  550. Γöé                         Γöéinterpretation is dependent on the Γöé
  551. Γöé                         Γöémessage.                           Γöé
  552. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  553. ΓöéUSHORT usUserParm        ΓöéUser parameter returned on         Γöé
  554. Γöé                         Γöénotification message.              Γöé
  555. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  556.  
  557. The function of mciDriverEntry is to switch, based on the message, and perform 
  558. the appropriate task.  An example of a message is MCI_OPEN. 
  559.  
  560. Your driver must be able to handle messages in the following fashion: 
  561.  
  562.    1. Your driver must handle all the required messages. 
  563.  
  564.    2. Your driver must handle device-type messages for its particular class of 
  565.       device. 
  566.  
  567.       For example, if you are writing an MCD for a videodisc player, you must 
  568.       parse the videodisc-specific messages. 
  569.  
  570.    3. Your driver must handle messages that are specific to the device your 
  571.       driver supports. Suppose your driver controls a device that is one of the 
  572.       following device types: 
  573.  
  574.            CD-ROM/XA 
  575.            CD Audio 
  576.            Wave Audio 
  577.            Sequencer 
  578.            Digital Video 
  579.            Amp Mixer 
  580.            Videodisc 
  581.  
  582.       MDM has already defined device-type messages for these devices, which 
  583.       means a command table exists for each of these device types. If you want 
  584.       to support device-specific messages, you must create a device-specific 
  585.       command table. 
  586.  
  587.  If your driver is for a device type other than the device types listed, you 
  588.  must create a command table that includes both the device-type messages and 
  589.  the device-specific messages. 
  590.  
  591.  
  592. ΓòÉΓòÉΓòÉ 4.3. Types of Command Messages ΓòÉΓòÉΓòÉ
  593.  
  594. The Media Device Interface is a set of defined and extendable media control 
  595. commands.  How the MCD communicates with the appropriate hardware device 
  596. drivers to perform the requested command message is completely up to the MCD. 
  597. Device commands used by MCDs are grouped into required, basic, and system 
  598. command messages. 
  599.  
  600. Note:  Refer to the OS/2 Multimedia Programming Reference for syntax and 
  601.        associated parameters. 
  602.  
  603.  
  604. ΓòÉΓòÉΓòÉ 4.3.1. Required Command Messages ΓòÉΓòÉΓòÉ
  605.  
  606. Required commands are recognized by all devices and have actions common to all 
  607. media devices. The following table lists the required commands that must be 
  608. supported by your MCD. 
  609.  
  610. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  611. ΓöéMessage             ΓöéDescription                             Γöé
  612. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  613. ΓöéMCI_CLOSE           ΓöéCloses the device.                      Γöé
  614. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  615. ΓöéMCI_GETDEVCAPS      ΓöéGets the capabilities of a device.      Γöé
  616. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  617. ΓöéMCI_INFO            ΓöéGets textual information from the       Γöé
  618. Γöé                    Γöédevice.                                 Γöé
  619. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  620. ΓöéMCI_OPEN            ΓöéInitializes an instance of the device.  Γöé
  621. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  622. ΓöéMCI_STATUS          ΓöéGets status information from the device.Γöé
  623. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  624. ΓöéMCIDRV_SAVE         ΓöéIs sent from MDM to MCDs to save the    Γöé
  625. Γöé                    Γöécontext.                                Γöé
  626. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  627. ΓöéMCIDRV_RESTORE      ΓöéIs sent from MDM to MCDs to restore the Γöé
  628. Γöé                    Γöéstate of an inactive device context.    Γöé
  629. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  630.  
  631. The required command messages use a ULONG for the ulParam1 parameter that 
  632. contains any flags for the command message.  They also use the pParam2 
  633. parameter for a pointer to a message-specific data structure.  Your MCD might 
  634. create extended commands by adding new flags and data structure fields to those 
  635. already defined.  When you extend a command message, your MCD must still 
  636. support the required flags and fields. 
  637.  
  638. The following table identifies the flags and data structures of the required 
  639. command messages.  For a complete reference of media control interface 
  640. commands, refer to the OS/2 Multimedia Programming Reference. 
  641.  
  642. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  643. ΓöéMessage         ΓöéParameters (ulParam1)     ΓöéData Structure (pParam2)      Γöé
  644. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  645. ΓöéMCI_CLOSE       ΓöéMCI_NOTIFY                ΓöéMCI_GENERIC_PARMS             Γöé
  646. Γöé                ΓöéMCI_WAIT                  Γöé                              Γöé
  647. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  648. ΓöéMCI_GETDEVCAPS  ΓöéMCI_NOTIFY                ΓöéMCI_GETDEVCAPS_PARMS          Γöé
  649. Γöé                ΓöéMCI_WAIT                  Γöé                              Γöé
  650. Γöé                ΓöéMCI_STATUS                Γöé                              Γöé
  651. Γöé                ΓöéMCI_GETDEVCAPS_EXTENDED   Γöé                              Γöé
  652. Γöé                ΓöéMCI_GETDEVCAPS_MESSAGE    Γöé                              Γöé
  653. Γöé                ΓöéMCI_GETDEVCAPS_ITEM       Γöé                              Γöé
  654. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  655. ΓöéMCI_INFO        ΓöéMCI_NOTIFY                ΓöéMCI_INFO_PARMS                Γöé
  656. Γöé                ΓöéMCI_WAIT                  Γöé                              Γöé
  657. Γöé                ΓöéMCI_INFO_PRODUCT          Γöé                              Γöé
  658. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  659. ΓöéMCI_OPEN        ΓöéMCI_WAIT                  ΓöéMMDRV_OPEN_PARMS              Γöé
  660. Γöé                ΓöéMCI_OPEN_SHARABLE         Γöé                              Γöé
  661. Γöé                ΓöéMCI_OPEN_ELEMENT          Γöé                              Γöé
  662. Γöé                ΓöéMCI_OPEN_MMIO             Γöé                              Γöé
  663. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  664. ΓöéMCI_STATUS      ΓöéMCI_NOTIFY                ΓöéMCI_STATUS_PARMS              Γöé
  665. Γöé                ΓöéMCI_WAIT                  Γöé                              Γöé
  666. Γöé                ΓöéMCI_STATUS_CLIPBOARD      Γöé                              Γöé
  667. Γöé                ΓöéMCI_TRACK                 Γöé                              Γöé
  668. Γöé                ΓöéMCI_STATUS_ITEM           Γöé                              Γöé
  669. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  670. ΓöéMCIDRV_RESTORE  ΓöéMCI_WAIT                  ΓöéMCI_GENERIC_PARMS             Γöé
  671. Γöé                ΓöéMCI_SHAREABLE             Γöé                              Γöé
  672. Γöé                ΓöéMCI_EXCLUSIVE             Γöé                              Γöé
  673. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  674. ΓöéMCIDRV_SAVE     ΓöéMCI_WAIT                  ΓöéMCI_GENERIC_PARMS             Γöé
  675. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  676.  
  677.  
  678. ΓòÉΓòÉΓòÉ 4.3.2. Opening an MCD ΓòÉΓòÉΓòÉ
  679.  
  680. MCI_OPEN is the first message received by the MCD. This message instructs the 
  681. driver to create and initialize an instance of a particular device.  The MCD 
  682. must allocate and initialize the instance structure.  Note that the MCI_OPEN 
  683. message does not make the instances active. 
  684.  
  685. Because the MDM needs to pass additional information to the drivers, the open 
  686. structure for MCDs is different from the MCI_OPEN_PARMS structure.  In 
  687. addition, the MCDs need to return information to the MDM.  If the application 
  688. requests a NOTIFY on the MCI_OPEN message, the MCD sends back the open NOTIFY 
  689. on the MCIDRV_RESTORE message.  This is transparent to the application. The MCD 
  690. does not receive any of the following flags on an MCI_OPEN: 
  691.  
  692.    o  MCI_OPEN_ALIAS 
  693.    o  MCI_NOTIFY 
  694.    o  MCI_OPEN_TYPE_ID 
  695.  
  696.  On the MCI_OPEN message, pParam2 points to the MMDRV_OPEN_PARM structure 
  697.  located in the MMDRVOS2.H file.  This structure contains information for the 
  698.  MCD. 
  699.  
  700.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  701.   ΓöéField                   ΓöéIn/Out  ΓöéDescription                               Γöé
  702.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  703.   ΓöéHWND hwndCallback       ΓöéIn      ΓöéWindow handle used for mciDriverNotify.   Γöé
  704.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  705.   ΓöéUSHORT  usDeviceID      ΓöéIn      ΓöéDevice ID assigned to this instance.  ThisΓöé
  706.   Γöé                        Γöé        Γöéfield is filled in by MDM.                Γöé
  707.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  708.   ΓöéUSHORT  usDeviceType    ΓöéIn      ΓöéDevice type number for this instance.     Γöé
  709.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  710.   ΓöéUSHORT  usDeviceOrd     ΓöéIn      ΓöéDevice ordinal number for this instance.  Γöé
  711.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  712.   ΓöéPVOID  pInstance        ΓöéInOut   ΓöéPointer to instance structure initialized Γöé
  713.   Γöé                        Γöé        Γöéby driver.  The driver fills in this      Γöé
  714.   Γöé                        Γöé        Γöéparameter.                                Γöé
  715.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  716.   ΓöéCHAR   szDevDLLName[260]ΓöéIn      ΓöéCharacter string containing               Γöé
  717.   Γöé                        Γöé        Γöédevice-specific DLL name to call for the  Γöé
  718.   Γöé                        Γöé        Γöéopen.                                     Γöé
  719.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  720.   ΓöéPSZ  pszElementName     ΓöéIn      ΓöéTypically a file name.  If OPEN_PLAYLIST  Γöé
  721.   Γöé                        Γöé        Γöéis specified, this is a pointer to a      Γöé
  722.   Γöé                        Γöé        Γöémemory playlist.  If OPEN_MMIO is         Γöé
  723.   Γöé                        Γöé        Γöéspecified, this is a MMIO handle.         Γöé
  724.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  725.   ΓöéUSHORT usDevParmLen     ΓöéIn      ΓöéDevice parameters data block length.      Γöé
  726.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  727.   ΓöéPVOID  pDevParm         ΓöéIn      ΓöéDevice parameters data block. This data isΓöé
  728.   Γöé                        Γöé        Γöéunique to each type of device and is      Γöé
  729.   Γöé                        Γöé        Γöéretrieved from the MMPM2.INI file. (for   Γöé
  730.   Γöé                        Γöé        Γöéexample, LVD  "PORT=COM1 SPEED=9600N71"). Γöé
  731.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  732.   ΓöéUSHORT                  ΓöéInOut   ΓöéNumber of resource units this instance    Γöé
  733.   ΓöéusResourceUnitsRequired Γöé        Γöérequires. See Resource Units and Classes. Γöé
  734.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  735.   ΓöéUSHORT  usResourceClass ΓöéInOut   ΓöéResource class this instance belongs to.  Γöé
  736.   Γöé                        Γöé        ΓöéSee Resource Units and Classes.           Γöé
  737.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  738.   ΓöéUSHORT                  ΓöéInOut   ΓöéResource priority for this instance.      Γöé
  739.   ΓöéusResourcePriority      Γöé        Γöé                                          Γöé
  740.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  741.   ΓöéULONG ulParam2          ΓöéIn      ΓöéPointer to MCI_OPEN structure.            Γöé
  742.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  743.  
  744.  
  745. ΓòÉΓòÉΓòÉ 4.3.3. Subsystem Messages ΓòÉΓòÉΓòÉ
  746.  
  747. MDM provides resource management to MCDs using the following messages: 
  748.  
  749.    o  MCIDRV_SAVE 
  750.    o  MCIDRV_RESTORE 
  751.  
  752.  MCIDRV_RESTORE and MCIDRV_SAVE allow the MDM to tell the MCD when to make a 
  753.  device context active and inactive. These commands are always sent with the 
  754.  MCI_WAIT flag on. Not all MCDs need to support these messages completely, but 
  755.  they are provided. The MCIDRV_SAVE and MCIDRV_RESTORE messages are not sent by 
  756.  applications. 
  757.  
  758.  After sending an MCI_OPEN message, the MDM sends an MCIDRV_RESTORE message to 
  759.  the MCD to make the device context active. The MCD should not expect to always 
  760.  receive an MCIDRV_RESTORE message right after an MCI_OPEN. Certain conditions 
  761.  require a device context to be opened but not made active. One such condition 
  762.  is if a device context is opened as non-shareable, and then a second device 
  763.  context is opened as shareable. The second device context is opened and put in 
  764.  the inactive stack by the MDM. Therefore, MCDs should not make a device 
  765.  context active on an open, but only on an MCIDRV_RESTORE. 
  766.  
  767.  MDM sends an MCIDRV_SAVE message to the MCD to make an instance inactive. When 
  768.  the MCD receives the save message, it should query the state of the device 
  769.  (its file location, track, volume level, and so on) and save this data in the 
  770.  instance structure. The instance should also be placed in a paused state. Upon 
  771.  receiving the restore command, the driver should restore the device based on 
  772.  the state information in the instance.  If the device was playing or recording 
  773.  when it was saved, then it should be put back into that state on the restore. 
  774.  
  775.  The following commands can be sent to inactive instances: 
  776.  
  777.    o  MCI_CLOSE 
  778.    o  MCI_INFO 
  779.    o  MCI_STATUS 
  780.    o  MCI_GETDEVCAPS 
  781.  
  782.  MCDs should be able to handle these commands at any time for any device 
  783.  context. Once the first RESTORE is complete, other commands can be processed. 
  784.  
  785.  Note:  For detailed descriptions of MCIDRV_RESTORE and MCIDRV_SAVE, refer to 
  786.         "Subsystem Messages" in the OS/2 Multimedia Programming Reference. 
  787.  
  788.  
  789. ΓòÉΓòÉΓòÉ 4.3.4. Wait and Notify Flags ΓòÉΓòÉΓòÉ
  790.  
  791. MCI_WAIT specifies that the application should not send a notification message. 
  792. It also specifies that the driver should not return to the caller until the 
  793. entire command has been completed. 
  794.  
  795. MCI_NOTIFY specifies that upon completion of the command a notify message is to 
  796. be sent to the application using the mdmDriverNotify function. If the notify 
  797. flag is specified, the MCD should perform error checking and minimal processing 
  798. on the command before returning to the caller.  Error checking should ensure 
  799. that the command can begin the main processing. 
  800.  
  801. If neither MCI_WAIT or MCI_NOTIFY is specified, the processing is the same as 
  802. if MCI_NOTIFY were specified, except that notification is not provided when the 
  803. command completes. 
  804.  
  805. Error and parameter checking should minimize the possibility that an error 
  806. occurs after control is returned to the calling thread, requiring a notify 
  807. error message to be sent to the calling application.  The list of error 
  808. conditions that are checked before returning to the caller will vary from 
  809. driver to driver. 
  810.  
  811. The main processing of the command should be done using a separate thread or a 
  812. mechanism that allows control to be returned to the calling thread. If the MCD 
  813. is using the SSM subsystem, the event procedure should be used for handling 
  814. notify commands. 
  815.  
  816. If an error is returned on an mciDriverEntry call, the error should not be sent 
  817. using mdmDriverNotify. After an error is returned on mciDriverEntry, the MCD 
  818. has finished processing that command. 
  819.  
  820. On notify commands, it is the responsibility of the MCD to ensure that the data 
  821. structure associated with the command message is copied into driver memory 
  822. before returning to the caller. If this is not done, the driver might find that 
  823. the memory was changed before it could process the command. For example, the 
  824. hwndCallback, ulFrom, and ulTo fields on the MCI_PLAY message should be copied 
  825. when the MCI_NOTIFY flag is specified. 
  826.  
  827. Media control messages that can require a lot of time to complete are MCI_PLAY, 
  828. MCI_RECORD, MCI_SEEK, and MCI_STEP.  These commands are action commands. 
  829. Messages such as MCI_PAUSE, MCI_GETDEVCAPS, MCI_STATUS, and MCI_SET are 
  830. non-action commands and do not require much processing time.  The non-action 
  831. commands need not be processed on a separate thread if the notify flag is 
  832. specified.  For these commands, the call to mdmDriverNotify should be made at 
  833. the completion of the command. 
  834.  
  835. If the MCD is using the Stream Programming Interface (SPI) functions to perform 
  836. data streaming, the SPI events should be used instead of separate threads. SPI 
  837. requires an event routine to handle SPI events such as End-of-Stream, an error, 
  838. and so on.  SPI will call this event routine on one of its threads.  Therefore, 
  839. the mdmDriverNotify call could be made as part of the event routine. 
  840.  
  841. An MM_MCINOTIFY message can have the notification codes shown in the following 
  842. table associated with it. 
  843.  
  844. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  845. ΓöéNotification Code        ΓöéCondition That Caused the Notification       Γöé
  846. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  847. ΓöéMCI_NOTIFY_SUCCESSFUL    ΓöéThe command completed successfully with no   Γöé
  848. Γöé                         Γöéerrors.                                      Γöé
  849. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  850. ΓöéMCI_NOTIFY_SUPERSEDED    ΓöéA second command of the same type is receivedΓöé
  851. Γöé                         Γöéwith the notify flag set.                    Γöé
  852. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  853. ΓöéMCI_NOTIFY_ABORTED       ΓöéA second command is received that prevents   Γöé
  854. Γöé                         Γöéthe first command from completing            Γöé
  855. Γöé                         Γöésuccessfully. If the driver finds an error   Γöé
  856. Γöé                         Γöéearly in the parameter-checking or command   Γöé
  857. Γöé                         Γöéprocessing that requires an error to be      Γöé
  858. Γöé                         Γöéreturned to the caller, no notification is   Γöé
  859. Γöé                         Γöésent back to the application.                Γöé
  860. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  861. If the notification code field of MM_MCINOTIFY contains a value other than 
  862. those shown in the previous table, the value is the error code for a specific 
  863. OS/2 multimedia error condition.  Only one MM_MCINOTIFY message per command 
  864. should be sent. 
  865.  
  866.  
  867. ΓòÉΓòÉΓòÉ 4.3.5. Basic Command Messages ΓòÉΓòÉΓòÉ
  868.  
  869. Basic commands are commands all device types should understand but can modify 
  870. the parameters.  For example, when issuing a PLAY command to a Videodisc 
  871. Player, it might be desirable to indicate the speed of playback in frames per 
  872. second.  However, a device such as a CD Player might not have the capability to 
  873. play back at different speeds. 
  874.  
  875. The list of basic commands is shown in the following table. If a device does 
  876. not use a device-type command, it can return MCIERR_UNSUPPORTED_FUNCTION.  If a 
  877. device supports the command, but not all of the options, it can return the 
  878. MCIERR_UNSUPPORTED_FLAG for options that are not applicable. 
  879.  
  880. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  881. ΓöéMessage                 ΓöéDescription                             Γöé
  882. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  883. ΓöéMCI_CONNECTOR           ΓöéEnables, disables, counts the number of,Γöé
  884. Γöé                        Γöéor queries the status of connectors.    Γöé
  885. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  886. ΓöéMCI_LOAD                ΓöéLoads a new device element (file name)  Γöé
  887. Γöé                        Γöéinto an open device context.            Γöé
  888. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  889. ΓöéMCI_MASTERAUDIO         ΓöéSets the system master audio setting forΓöé
  890. Γöé                        Γöéall audio devices in the system.        Γöé
  891. Γöé                        ΓöéMCI_MASTERAUDIO is also used as a systemΓöé
  892. Γöé                        Γöécommand to query the current audio      Γöé
  893. Γöé                        Γöésettings when the driver is first       Γöé
  894. Γöé                        Γöéopened.                                 Γöé
  895. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  896. ΓöéMCI_PAUSE               ΓöéSuspends device playback.               Γöé
  897. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  898. ΓöéMCI_PLAY                ΓöéStarts playing the device.              Γöé
  899. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  900. ΓöéMCI_RECORD              ΓöéStarts recording data.                  Γöé
  901. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  902. ΓöéMCI_RESUME              ΓöéResumes playing or recording from a     Γöé
  903. Γöé                        Γöépaused state.                           Γöé
  904. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  905. ΓöéMCI_SAVE                ΓöéSaves data for the device.              Γöé
  906. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  907. ΓöéMCI_SEEK                ΓöéMoves to the specified position and     Γöé
  908. Γöé                        Γöéstops.                                  Γöé
  909. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  910. ΓöéMCI_SET                 ΓöéSets the operating state of the device. Γöé
  911. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  912. ΓöéMCI_SETCUEPOINT         ΓöéSets a cuepoint.                        Γöé
  913. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  914. ΓöéMCI_SETPOSITIONADVISE   ΓöéSets a position change notification for Γöé
  915. Γöé                        Γöéthe device.                             Γöé
  916. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  917. ΓöéMCI_STATUS              ΓöéObtains information about the status of Γöé
  918. Γöé                        Γöéa media device.                         Γöé
  919. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  920. ΓöéMCI_STOP                ΓöéStops the device.                       Γöé
  921. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  922.  
  923. The basic command messages use the ulParam1 parameter for the flags applicable 
  924. to the command message.  They also use the pParam2 parameter for a pointer to a 
  925. message-specific data structure.  Your MCD might add flags and parameters to 
  926. create extended commands.  When you extend a command message, your MCD must 
  927. still respond to the basic flags and parameters. 
  928.  
  929. The following table identifies the flags and data structures of the basic 
  930. command messages.  For a complete reference of media control interface 
  931. commands, refer to the OS/2 Multimedia Programming Reference. 
  932.  
  933. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  934. ΓöéMessage                 ΓöéParameters (ulParam1)       ΓöéData Structure (pParam2)    Γöé
  935. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  936. ΓöéMCI_CONNECTOR           ΓöéMCI_NOTIFY                  ΓöéMCI_CONNECTOR_PARMS         Γöé
  937. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  938. Γöé                        ΓöéMCI_ENABLE_CONNECTOR        Γöé                            Γöé
  939. Γöé                        ΓöéMCI_DISABLE_CONNECTOR       Γöé                            Γöé
  940. Γöé                        ΓöéMCI_QUERY_CONNECTOR_STATUS  Γöé                            Γöé
  941. Γöé                        ΓöéMCI_CONNECTOR_TYPE          Γöé                            Γöé
  942. Γöé                        ΓöéMCI_CONNECTOR_INDEX         Γöé                            Γöé
  943. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  944. ΓöéMCI_LOAD                ΓöéMCI_OPEN_ELEMENT            ΓöéMCI_LOAD_PARMS              Γöé
  945. Γöé                        ΓöéMCI_OPEN_MMIO               Γöé                            Γöé
  946. Γöé                        ΓöéMCI_NOTIFY                  Γöé                            Γöé
  947. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  948. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  949. ΓöéMCI_MASTERAUDIO         ΓöéMCI_WAIT                    ΓöéMCI_MASTERAUDIO_PARMS       Γöé
  950. Γöé                        ΓöéMCI_QUERYCURRENTSETTING     Γöé                            Γöé
  951. Γöé                        ΓöéMCI_QUERYSAVEDSETTING       Γöé                            Γöé
  952. Γöé                        ΓöéMCI_SAVESETTING             Γöé                            Γöé
  953. Γöé                        ΓöéMCI_MASTERVOL               Γöé                            Γöé
  954. Γöé                        ΓöéMCI_SPEAKERS                Γöé                            Γöé
  955. Γöé                        ΓöéMCI_HEADPHONES              Γöé                            Γöé
  956. Γöé                        ΓöéMCI_ON                      Γöé                            Γöé
  957. Γöé                        ΓöéMCI_OFF                     Γöé                            Γöé
  958. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  959. ΓöéMCI_PAUSE               ΓöéMCI_NOTIFY                  ΓöéMCI_GENERIC_PARMS           Γöé
  960. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  961. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  962. ΓöéMCI_PLAY                ΓöéMCI_NOTIFY                  ΓöéMCI_PLAY_PARMS              Γöé
  963. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  964. Γöé                        ΓöéMCI_FROM                    Γöé                            Γöé
  965. Γöé                        ΓöéMCI_TO                      Γöé                            Γöé
  966. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  967. ΓöéMCI_RECORD              ΓöéMCI_NOTIFY                  ΓöéMCI_RECORD_PARMS            Γöé
  968. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  969. Γöé                        ΓöéMCI_FROM                    Γöé                            Γöé
  970. Γöé                        ΓöéMCI_TO                      Γöé                            Γöé
  971. Γöé                        ΓöéMCI_RECORD_INSERT           Γöé                            Γöé
  972. Γöé                        ΓöéMCI_RECORD_OVERWRITE        Γöé                            Γöé
  973. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  974. ΓöéMCI_RESUME              ΓöéMCI_NOTIFY                  ΓöéMCI_GENERIC_PARMS           Γöé
  975. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  976. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  977. ΓöéMCI_SAVE                ΓöéMCI_NOTIFY                  ΓöéMCI_SAVE_PARMS              Γöé
  978. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  979. Γöé                        ΓöéMCI_SAVE_FILE               Γöé                            Γöé
  980. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  981. ΓöéMCI_SEEK                ΓöéMCI_NOTIFY                  ΓöéMCI_SEEK_PARMS              Γöé
  982. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  983. Γöé                        ΓöéMCI_TO                      Γöé                            Γöé
  984. Γöé                        ΓöéMCI_TO_START                Γöé                            Γöé
  985. Γöé                        ΓöéMCI_TO_END                  Γöé                            Γöé
  986. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  987. ΓöéMCI_SET                 ΓöéMCI_NOTIFY                  ΓöéMCI_SET_PARMS               Γöé
  988. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  989. Γöé                        ΓöéMCI_SET_AUDIO               Γöé                            Γöé
  990. Γöé                        ΓöéMCI_SET_DOOR_OPEN           Γöé                            Γöé
  991. Γöé                        ΓöéMCI_SET_DOOR_CLOSED         Γöé                            Γöé
  992. Γöé                        ΓöéMCI_SET_DOOR_LOCK           Γöé                            Γöé
  993. Γöé                        ΓöéMCI_SET_DOOR_UNLOCK         Γöé                            Γöé
  994. Γöé                        ΓöéMCI_SET_VOLUME              Γöé                            Γöé
  995. Γöé                        ΓöéMCI_OVER                    Γöé                            Γöé
  996. Γöé                        ΓöéMCI_SET_VIDEO               Γöé                            Γöé
  997. Γöé                        ΓöéMCI_SET_ON                  Γöé                            Γöé
  998. Γöé                        ΓöéMCI_SET_OFF                 Γöé                            Γöé
  999. Γöé                        ΓöéMCI_SET_SPEED_FORMAT        Γöé                            Γöé
  1000. Γöé                        ΓöéMCI_SET_TIME_FORMAT         Γöé                            Γöé
  1001. Γöé                        ΓöéMCI_SET_ITEM                Γöé                            Γöé
  1002. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1003. ΓöéMCI_SETCUEPOINT         ΓöéMCI_NOTIFY                  ΓöéMCI_CUEPOINT_PARMS          Γöé
  1004. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  1005. Γöé                        ΓöéMCI_SET_CUEPOINT_ON         Γöé                            Γöé
  1006. Γöé                        ΓöéMCI_SET_CUEPOINT_OFF        Γöé                            Γöé
  1007. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1008. ΓöéMCI_SETPOSITIONADVISE   ΓöéMCI_NOTIFY                  ΓöéMCI_POSITION_PARMS          Γöé
  1009. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  1010. Γöé                        ΓöéMCI_SET_POSITION_ADVISE_ON  Γöé                            Γöé
  1011. Γöé                        ΓöéMCI_SET_POSITION_ADVISE_OFF Γöé                            Γöé
  1012. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1013. ΓöéMCI_STATUS              ΓöéMCI_NOTIFY                  ΓöéMCI_STATUS_PARMS            Γöé
  1014. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  1015. Γöé                        ΓöéMCI_STATUS_START            Γöé                            Γöé
  1016. Γöé                        ΓöéMCI_TRACK                   Γöé                            Γöé
  1017. Γöé                        ΓöéMCI_STATUS_ITEM             Γöé                            Γöé
  1018. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1019. ΓöéMCI_STOP                ΓöéMCI_NOTIFY                  ΓöéMCI_GENERIC_PARMS           Γöé
  1020. Γöé                        ΓöéMCI_WAIT                    Γöé                            Γöé
  1021. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1022.  
  1023.  
  1024. ΓòÉΓòÉΓòÉ 4.3.6. System Command Messages ΓòÉΓòÉΓòÉ
  1025.  
  1026. System commands are interpreted directly by the Media Device Manager (MDM), and 
  1027. are not passed to the MCDs. The following table lists the system commands that 
  1028. are supported by MDM. 
  1029.  
  1030. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1031. ΓöéCommand                  ΓöéDescription                        Γöé
  1032. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1033. ΓöéMCI_ACQUIREDEVICE        ΓöéAcquires use of the physical       Γöé
  1034. Γöé                         Γöéresources for the device.          Γöé
  1035. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1036. ΓöéMCI_CONNECTION           ΓöéReturns information about the      Γöé
  1037. Γöé                         Γöédevice context connections.        Γöé
  1038. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1039. ΓöéMCI_CONNECTORINFO        ΓöéReturns information about the      Γöé
  1040. Γöé                         Γöéconnectors on a device.            Γöé
  1041. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1042. ΓöéMCI_DEFAULTCONNECTION    ΓöéMakes, breaks, or queries a defaultΓöé
  1043. Γöé                         Γöéconnection.                        Γöé
  1044. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1045. ΓöéMCI_GROUP                ΓöéProvides control over multiple     Γöé
  1046. Γöé                         Γöédevices with a single command.     Γöé
  1047. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1048. ΓöéMCI_MASTERAUDIO          ΓöéQueries the current audio settings Γöé
  1049. Γöé                         Γöéwhen the driver is first opened.   Γöé
  1050. Γöé                         ΓöéThis command is also used as a     Γöé
  1051. Γöé                         Γöébasic command to later adjust the  Γöé
  1052. Γöé                         Γöémaster audio.                      Γöé
  1053. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1054. ΓöéMCI_SYSINFO              ΓöéObtains information about devices  Γöé
  1055. Γöé                         Γöéinstalled in the system.           Γöé
  1056. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1057. ΓöéMCI_RELEASEDEVICE        ΓöéReleases exclusive use of the      Γöé
  1058. Γöé                         Γöéphysical resources for the devices.Γöé
  1059. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1060.  
  1061.  
  1062. ΓòÉΓòÉΓòÉ 4.3.7. Command Processing ΓòÉΓòÉΓòÉ
  1063.  
  1064. All MCDs have commands passed to them in the same way, regardless of whether 
  1065. they support streaming or nonstreaming devices.  Applications call either the 
  1066. mciSendCommand or mciSendString functions to pass commands to the MCD entry 
  1067. point, mciDriverEntry.  In addition, some commands are generated by the MDM 
  1068. itself.  These are the commands for saving and restoring an instance and 
  1069. synchronization messages - messages periodically generated by the master device 
  1070. for routing to the slave devices in the group. 
  1071.  
  1072. Although streaming and nonstreaming devices have commands passed to them in the 
  1073. same way, they process the commands they receive from the MDM differently. 
  1074. These differences are described in the sections that follow and are summarized 
  1075. in the following table. 
  1076.  
  1077. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1078. ΓöéWhen the MDM sends: ΓöéThe waveform audio  ΓöéThe CD audio MCD:   Γöé
  1079. Γöé                    ΓöéMCD:                Γöé                    Γöé
  1080. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1081. ΓöéMCI_SET messages    ΓöéRoutes the messages ΓöéUses IOCtls to      Γöé
  1082. Γöéthat set audio      Γöéto the amp mixer.   Γöéprocess the         Γöé
  1083. Γöéattributes          Γöé                    Γöémessages.           Γöé
  1084. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1085. ΓöéMessages that       ΓöéRoutes the messages ΓöéUses IOCtls to      Γöé
  1086. Γöécontrol playback    Γöéto the SSM.         Γöéprocess the         Γöé
  1087. Γöé(for example, SEEK, Γöé                    Γöémessages.           Γöé
  1088. ΓöéPLAY, PAUSE, STOP)  Γöé                    Γöé                    Γöé
  1089. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1090.  
  1091.  
  1092. ΓòÉΓòÉΓòÉ 4.3.8. Error Return Codes ΓòÉΓòÉΓòÉ
  1093.  
  1094. For MCDs to look consistent to applications, error codes should be consistent 
  1095. across MCDs.  Following are some guidelines for using common error codes. 
  1096.  
  1097. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1098. ΓöéUse this error message:                 ΓöéWhen this error condition     Γöé
  1099. Γöé                                        Γöéoccurs:                       Γöé
  1100. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1101. ΓöéMCIERR_OUTOFRANGE                       ΓöéThe value given is out of     Γöé
  1102. Γöé                                        Γöérange.                        Γöé
  1103. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1104. ΓöéMCIERR_UNRECOGNIZED_COMMAND             ΓöéUnknown usMessage value.      Γöé
  1105. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1106. ΓöéMCIERR_INVALID_FLAG                     ΓöéUnknown ulParam1 value.       Γöé
  1107. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1108. ΓöéMCIERR_INVALID_ITEM_FLAG                ΓöéUnknown flag in ulItem field. Γöé
  1109. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1110. ΓöéMCIERR_INVALID_TIME_FORMAT_FLAG         ΓöéUnknown flag in ulTimeFormat  Γöé
  1111. Γöé                                        Γöéfield.                        Γöé
  1112. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1113. ΓöéMCIERR_SPEED_FORMAT_FLAG                ΓöéUnknown flag in ulSpeedFormat Γöé
  1114. Γöé                                        Γöéfield.                        Γöé
  1115. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1116. ΓöéMCIERR_MISSING_PARAMETER                ΓöéInvalid or NULL pParam2 field.Γöé
  1117. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1118. ΓöéMCIERR_INVALID_BUFFER                   ΓöéInvalid address to output     Γöé
  1119. Γöé                                        Γöébuffer in pParam2.            Γöé
  1120. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1121. ΓöéMCIERR_MISSING_FLAG                     ΓöéMissing flags in ulParam1 whenΓöé
  1122. Γöé                                        Γöéone or more flags are         Γöé
  1123. Γöé                                        Γöérequired.                     Γöé
  1124. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1125. ΓöéMCIERR_UNSUPPORTED_FLAG                 ΓöéFlag in ulParam1 is valid for Γöé
  1126. Γöé                                        Γöéthe message, but driver cannotΓöé
  1127. Γöé                                        Γöéperform the task.             Γöé
  1128. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1129. ΓöéMCIERR_UNSUPPORTED_FUNCTION             ΓöéFunction in usMessage is      Γöé
  1130. Γöé                                        Γöéunderstood by the device but  Γöé
  1131. Γöé                                        Γöéis not supported by the       Γöé
  1132. Γöé                                        Γöédriver.                       Γöé
  1133. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1134. ΓöéMCIERR_FLAGS_NOT_COMPATIBLE             ΓöéMore than one mutually        Γöé
  1135. Γöé                                        Γöéexclusive flag is set.        Γöé
  1136. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1137.  
  1138. The following error conditions are always handled by MDM: 
  1139.  
  1140.    o  An invalid callback handle is specified for a message with the MCI_NOTIFY 
  1141.       flag set. 
  1142.  
  1143.    o  MCI_WAIT and MCI_NOTIFY flags are used together. 
  1144.  
  1145.    o  A command is sent to an inactive instance. 
  1146.  
  1147.  
  1148. ΓòÉΓòÉΓòÉ 4.3.9. Return Values and Return Types ΓòÉΓòÉΓòÉ
  1149.  
  1150. MCDs should attempt to use the MCIERR return codes wherever possible.  These 
  1151. return codes are provided in the C header file MEERROR.H. Error codes from SPI, 
  1152. MMIO or the operating system should be mapped into MCIERR return codes when it 
  1153. makes sense.  If the driver has unique return codes for certain conditions, it 
  1154. can use error numbers MCIERR_CUSTOM_DRIVER_BASE through MEBASE-1.  If custom 
  1155. driver return codes are used, a custom driver error table should be created. 
  1156.  
  1157. MCDs should use the following return types in the high-order word of the return 
  1158. code when the media message has a return field. 
  1159.  
  1160.  Return Type                                     Meaning 
  1161.  
  1162.  MCI_INTEGER_RETURNED                            Convert the given binary 
  1163.                                                  integer to its unsigned ASCII 
  1164.                                                  string representation. 
  1165.  
  1166.  MCI_COLONIZED2_RETURN                           Convert the binary integer to 
  1167.                                                  the following form: 
  1168.  
  1169.                                                                                                   byte0:byte2
  1170.  
  1171.  MCI_COLONIZED3_RETURN                           Convert the binary integer to 
  1172.                                                  the following form: 
  1173.  
  1174.                                                                                                   byte0:byte1:byte2
  1175.  
  1176.  MCI_COLONIZED4_RETURN                           Convert the binary integer to 
  1177.                                                  the following form: 
  1178.  
  1179.                                                                                                   byte0:byte1:byte2:byte4
  1180.  
  1181.  MCI_TRUE_FALSE_RETURN                           Convert the TRUE/FALSE value 
  1182.                                                  to the string representation. 
  1183.  
  1184.  MCI_ON_OFF_RETURN                               Convert the ON/OFF value to 
  1185.                                                  the string representation. 
  1186.  
  1187.  MCI_DEVICENAME_RETURN                           Convert the device type 
  1188.                                                  integer to its device name 
  1189.                                                  string. 
  1190.  
  1191.  MCI_TIME_FORMAT_RETURN                          Convert the time format 
  1192.                                                  integer to its appropriate 
  1193.                                                  string. 
  1194.  
  1195.  MCI_SPEED_FORMAT_RETURN                         Convert the speed format 
  1196.                                                  integer to its appropriate 
  1197.                                                  string. 
  1198.  
  1199.  MCI_MEDIA_TYPE_RETURN                           Convert the disc type integer 
  1200.                                                  for a videodisc to "CLV," 
  1201.                                                  "CAV," "OTHER". 
  1202.  
  1203.  MCI_TRACK_TYPE_RETURN                           Convert the track type integer 
  1204.                                                  to "AUDIO," "DATA," "OTHER". 
  1205.  
  1206.  MCI_CONNECTOR_TYPE_RETURN                       Convert the connector type 
  1207.                                                  integer to its appropriate 
  1208.                                                  string. 
  1209.  
  1210.  MCI_CDXA_CHANNEL_ DESTINATION_RETURN            Convert the CDXA channel 
  1211.                                                  destination type integer to 
  1212.                                                  its appropriate string. 
  1213.  
  1214.  MCI_PREROLL_TYPE_RETURN                         Convert the preroll type 
  1215.                                                  integer to its appropriate 
  1216.                                                  string. 
  1217.  
  1218.  MCI_FORMAT_TAG_RETURN                           Convert the format tag type 
  1219.                                                  integer to its appropriate 
  1220.                                                  string. 
  1221.  
  1222.  MCI_SIGNED_INTEGER_RETURN                       Convert the given binary 
  1223.                                                  integer to its signed ASCII 
  1224.                                                  string representation. 
  1225.  
  1226.  The return types described in the previous list allow the string parser to 
  1227.  convert binary return values into strings.  This conversion takes place only 
  1228.  when the application calls mciSendString and only if no error occurs on the 
  1229.  call.  For example: "capability cdaudio has video" returns FALSE in the return 
  1230.  string field of mciSendString.  The media driver for the CD audio MCD puts a 
  1231.  zero in the ulReturn field of the MCI_GETDEVCAPS_PARMS structure and 
  1232.  MCI_TRUE_FALSE_RETURN in the high-order word of the return code. 
  1233.  
  1234.  
  1235. ΓòÉΓòÉΓòÉ 4.4. Adding New Command Messages ΓòÉΓòÉΓòÉ
  1236.  
  1237. Following are four steps a media driver author needs to follow to add support 
  1238. for a device-specific message to a driver: 
  1239.  
  1240.    1. Define the new or modified media control message your driver plans to 
  1241.       support.  (See Defining New Messages.) 
  1242.  
  1243.    2. Define the new data structure and flags for this message. (See Defining 
  1244.       New Data Structures and Flags.) 
  1245.  
  1246.    3. Create a custom command table that MDM can use to parse the command 
  1247.       string in mciSendString, so it can create the appropriate data structure 
  1248.       to pass to your driver.  (See Parsing a Command List). 
  1249.  
  1250.    4. Support the new message in your MCD's entry point (mciDriverEntry). 
  1251.  
  1252.  
  1253. ΓòÉΓòÉΓòÉ 4.4.1. Defining New Messages ΓòÉΓòÉΓòÉ
  1254.  
  1255. Suppose you want to define a new reset command for an MCD supporting a 
  1256. videodisc player.  You can call this command by sending a reset program_number 
  1257. string.  The command sets all player parameters to their default settings or 
  1258. one of several predefined states indicated by the program_number. 
  1259.  
  1260. You would add the following message to the list of messages you must support in 
  1261. mciDriverEntry: 
  1262.  
  1263. #define MCI_VD_RESET MCI_USER_MESSAGES
  1264.  
  1265. MCI_USER_MESSAGES is the first integer you can use for custom messages.  Since 
  1266. the resource compiler does not accept mathematical expressions in the RCDATA 
  1267. resource type, you must indicate the specific value you want to use. 
  1268.  
  1269. Now that you have defined the message ID, you must define the data structure 
  1270. and the command table, and create the code to handle this message in 
  1271. mciDriverEntry. 
  1272.  
  1273.  
  1274. ΓòÉΓòÉΓòÉ 4.4.2. Defining New Data Structures and Flags ΓòÉΓòÉΓòÉ
  1275.  
  1276. Most new messages require additional parameters to specify their exact 
  1277. function.  The media control interface messages use pParam2 as a pointer to a 
  1278. data structure, and use ulParam1 as a bit-field for the flags associated with 
  1279. the message.  A flag will exist for each field in the data structure that 
  1280. accepts data from the calling application.  The application uses the flag to 
  1281. set the bit-field of ulParam1 to indicate a value is assigned to a particular 
  1282. field.  Flags also specify options without parameters.  Thus these flags do not 
  1283. correspond to a field in the data structure. 
  1284.  
  1285.  
  1286. ΓòÉΓòÉΓòÉ 4.4.2.1. Defining a New Data Structure ΓòÉΓòÉΓòÉ
  1287.  
  1288. The fields of the data structure for a media control interface message are 
  1289. always the size of ULONGs.  The number of fields in the structure depends on 
  1290. the particular message.  The first field must be reserved for a handle to a 
  1291. window function used with the MCI_NOTIFY flag.  The next fields in the data 
  1292. structure depend on the type of data returned for the message. 
  1293.  
  1294.    o  If no data is returned, no return fields are reserved in the data 
  1295.       structure.  Any data fields for passing information to the MCD 
  1296.       immediately follow the hwndCallback field.  For example, the 
  1297.       MCI_SAVE_PARMS structure shown in the following figure does not have a 
  1298.       return field. 
  1299.  
  1300.             typedef struct _MCI_SAVE_PARMS {
  1301.                 HWND    hwndCallback;    /* PM window handle for MCI notify message */
  1302.                 PSZ     pszFileName;     /* File name to save data to               */
  1303.              } MCI_SAVE_PARMS;
  1304.             typedef MCI_SAVE_PARMS   *PMCI_SAVE_PARMS;
  1305.  
  1306.    o  If integer data is returned, the second field of the data structure is 
  1307.       reserved for the return data.  Any data fields for passing information to 
  1308.       the MCD start in the third field.  For example, the MCI_GETDEVCAPS_PARMS 
  1309.       structure shown in the following example uses ulReturn as the integer 
  1310.       return field. 
  1311.  
  1312.             typedef struct _MCI_GETDEVCAPS_PARMS {
  1313.                 HWND    hwndCallback;    /* PM window handle for MCI notify message */
  1314.                 ULONG   ulReturn;        /* Return field                            */
  1315.                 ULONG   ulItem;          /* Item field for GETDEVCAPS item to query */
  1316.                 USHORT  usMessage;       /* Field to hold MCI message to query      */
  1317.                 USHORT  usReserved0;     /* Reserved field                          */
  1318.             } MCI_GETDEVCAPS_PARMS;
  1319.             typedef MCI_GETDEVCAPS_PARMS   * PMCI_GETDEVCAPS_PARMS;
  1320.  
  1321.    o  If string data is returned, the second and third fields of the data 
  1322.       structure are reserved for the return data.  The second ULONG is assigned 
  1323.       to a field reserved for a pointer to the null-terminated return string. 
  1324.       The third ULONG is assigned to a field reserved for the size of return 
  1325.       buffer.  The application is responsible for creating the buffer for 
  1326.       return string.  Any data fields for passing information to the MCD start 
  1327.       in the fourth field.  For example, the MCI_INFO_PARMS structure shown in 
  1328.       the following example uses pszReturn and ulRetSize for the return fields. 
  1329.  
  1330.             typedef struct _MCI_INFO_PARMS {
  1331.                 HWND      hwndCallback;  /* PM window handle for MCI notify message */
  1332.                 PSZ       pszReturn;     /* Pointer to return buffer                */
  1333.                 ULONG     ulRetSize;     /* Return buffer size                      */
  1334.             } MCI_INFO_PARMS;
  1335.             typedef MCI_INFO_PARMS   *PMCI_INFO_PARMS;
  1336.  
  1337.    o  If RECTL data is returned, the second through fifth fields of the data 
  1338.       structure are reserved for the return data.  The first ULONG position is 
  1339.       reserved for the left values of the RECTL data.  The second ULONG 
  1340.       position is reserved for the bottom values of the RECTL data.  Any data 
  1341.       fields for passing information to the device driver start in the sixth 
  1342.       ULONG position.  Rather than specifying two ULONGs for the RECTL data, 
  1343.       most data structure definitions use one RECTL data field to obtain an 
  1344.       equivalent data structure.  For example, the MCI_VID_RECT_PARMS structure 
  1345.       shown in the following example uses rc for the return field. 
  1346.  
  1347.             typedef  struct _MCI_VID_RECT_PARMS {
  1348.                 HWND    hwndCallback;    /* PM window handle for MCI notify message */
  1349.                 RECTL   rc;              /* rectangle array specifying the offset   */
  1350.                                          /* and size of a rectangle                 */
  1351.             } MCI_VID_RECT_PARMS;
  1352.  
  1353.  
  1354. ΓòÉΓòÉΓòÉ 4.4.2.2. Assigning Flag Values ΓòÉΓòÉΓòÉ
  1355.  
  1356. In addition to indicating the fields used in a data structure, flags can 
  1357. indicate an option that does not use any parameters.  For example, the MCI_WAIT 
  1358. flag does not use any parameters. 
  1359.  
  1360. When you add new flags, you must make sure that they do not conflict with the 
  1361. flags already in use.  Bits 0 through 15 of the 32-bit ULONG are reserved for 
  1362. MDM.  Bit 16 (0x00010000) is the first fit that a driver can use for its flags. 
  1363. If your command message is a new command message, you must choose bit positions 
  1364. that do not conflict with the flags already defined for that command.  Any 
  1365. unused bits in the new flag must be set to zero.  For example, if a new command 
  1366. for videodisc players uses flags 16 through 20, a custom extension to the new 
  1367. command could use flags 21 through 31. 
  1368.  
  1369. To continue the example for adding a RESET command to a videodisc driver, the 
  1370. code sample shown in the following example defines a data structure, a 
  1371. corresponding pointer for it, and the flag corresponding to the program field 
  1372. of the data structure. 
  1373.  
  1374. typedef struct {
  1375.   HWND   hwndCallback;
  1376.   ULONG  ulProgram;
  1377. } MCI_VD_RESET_PARMS;
  1378.  
  1379. typedef MCI_VD_RESET_PARMS FAR * PMCI_VD_RESET_PARMS;
  1380.  
  1381. #define MCI_VD_RESET_PROGRAM     0x00010000L
  1382.  
  1383. When the application sets the MCI_VD_RESET_PROGRAM flag in ulParam1, it 
  1384. indicates that a value is assigned in the ulProgram field. 
  1385.  
  1386. Now that you have created the message command, data structure, and flags, you 
  1387. need to create the command table that tells MDM how to translate the equivalent 
  1388. string command into the message command format.  See Parsing a Command List. 
  1389.  
  1390.  
  1391. ΓòÉΓòÉΓòÉ 4.5. Command Tables ΓòÉΓòÉΓòÉ
  1392.  
  1393. Command tables - are structures that allow the MDM string parser to interpret 
  1394. command strings for MCDs.  This provides string command interface support for 
  1395. your MCD. Represented as resources to the driver, command tables are created 
  1396. using the RCDATA type of resource.  The resource number of the RCDATA block is 
  1397. the device type number. 
  1398.  
  1399. The following figure illustrates how the Media Device Manager (MDM) uses 
  1400. commands tables.  A program or mciRxInit command uses the mciSendString 
  1401. function to pass a string command to the MDM.  In turn, MDM calls its string 
  1402. parser to interpret the string command and change it into the equivalent 
  1403. procedural command.  MDM scans the command tables from the most specific to the 
  1404. least specific.  It first scans any custom device-specific tables (if present 
  1405. in the MCD).  Next, MDM looks for the string in the device-type table and 
  1406. finally the system default table. 
  1407.  
  1408. MDM provides device-type tables to support OS/2 multimedia logical devices as 
  1409. shown in the above figure. These built-in tables will meet your MCD 
  1410. requirements unless you have to add or modify commands.  If your MCD has new 
  1411. requirements (such as a new flag or a different data structure for a command), 
  1412. you must create a custom table to define commands specific to your device. 
  1413.  
  1414. A custom table allows you to create your own versions of basic media control 
  1415. interface commands by adding new or changed command entries.  For example, the 
  1416. device-type table for digital video supports the SEEK flags shown in the 
  1417. following example. 
  1418.  
  1419. "seek",                  MCI_SEEK, 0,           MCI_COMMAND_HEAD,
  1420.    "notify",             MCI_NOTIFY,            MCI_FLAG,
  1421.    "wait",               MCI_WAIT,              MCI_FLAG,
  1422.    "to start",           MCI_TO_START,          MCI_FLAG,
  1423.    "to end",             MCI_TO_END,            MCI_FLAG,
  1424.    "to",                 MCI_TO,                MCI_INTEGER,
  1425. "",                      0L,                    MCI_END_COMMAND,
  1426.  
  1427. You, however, want your MCD to seek to the nearest position.  To accomplish 
  1428. this, you can create a custom table in your MCD to parse commands for the 
  1429. digital video player (as shown in the following example. Note that the custom 
  1430. table must include all parameters associated with the changed command (not just 
  1431. new and changed parameters). 
  1432.  
  1433. "seek",                  MCI_SEEK, 0,           MCI_COMMAND_HEAD,
  1434.    "notify",             MCI_NOTIFY,            MCI_FLAG,
  1435.    "wait",               MCI_WAIT,              MCI_FLAG,
  1436.    "to start",           MCI_TO_START,          MCI_FLAG,
  1437.    "to nearest",         MCI_TO_NEAREST,        MCI_FLAG,
  1438.    "to end",             MCI_TO_END,            MCI_FLAG,
  1439.    "to",                 MCI_TO,                MCI_INTEGER,
  1440. "",                      0L,                    MCI_END_COMMAND,
  1441.  
  1442. When writing an MCD, the DLL file names (which include the command table 
  1443. resources) must be referenced in the MMPM2.INI file.  MDM updates the INI file 
  1444. with MCD command table information you provide when installing your MCD.  See 
  1445. Installing a Media Control Driver for details. 
  1446.  
  1447. The following shows an example of how command table entries appear in the 
  1448. MMPM2.INI file.  The MCDTABLE entry includes the MDM.DLL file, which includes 
  1449. the device-type command tables and the default system table.  The VSDTABLE 
  1450. entry indicates that a custom command table resource is located in the SVMC.DLL 
  1451. file. 
  1452.  
  1453. MDM scans the command tables from the most specific to the least specific.  In 
  1454. the example below MDM first searches the custom table resources in the SVMC.DLL 
  1455. file.  MDM next searches the internal digitalvideo device-type table 
  1456. (SMVCMD.RC) and then the system default table (MDMCMD.RC) located in the 
  1457. MDM.DLL file. 
  1458.  
  1459. [ibmdigvid01]
  1460.   VERSIONNUMBER=1
  1461.   PRODUCTINFO=SOFTWARE MOTION VIDEO
  1462.   MCDDRIVER=SVMC
  1463.   VSDDRIVER=AUDIOIF
  1464.   PDDNAME=AUDIO1$
  1465.   MCDTABLE=MDM
  1466.   VSDTABLE=SVMC
  1467.   RESOURCENAME=DIGITALVIDEO
  1468.   DEVICEFLAG=1
  1469.   DEVICETYPE=12
  1470.   SHARETYPE=3
  1471.   RESOURCEUNITS=1
  1472.   RESOURCECLASSES=1,1
  1473.   VALIDCOMBINATIONS=
  1474.   EXTNAMES=3,UMB,MMM,V
  1475.   ALIASNAME=DV
  1476.  
  1477.  
  1478. ΓòÉΓòÉΓòÉ 4.5.1. Command Table Syntax ΓòÉΓòÉΓòÉ
  1479.  
  1480. A command table consists of command lists.  Each command list in the table 
  1481. defines the parsing of a particular command. For example, the following example 
  1482. shows the command lists for MCI_OPEN and MCI_INFO, which are part of the system 
  1483. default table contained in the MDMCMD.RC file. 
  1484.  
  1485. "open",                     MCI_OPEN, 0,                 MCI_COMMAND_HEAD,
  1486.    "",                      MCI_INTEGER,                 MCI_RETURN,
  1487.    "notify",                MCI_NOTIFY,                  MCI_FLAG,
  1488.    "wait",                  MCI_WAIT,                    MCI_FLAG,
  1489.    "readonly",              MCI_READONLY,                MCI_FLAG,
  1490.    "shareable",             MCI_OPEN_SHAREABLE,          MCI_FLAG,
  1491.    "type",                  0L,                          MCI_STRING,
  1492.    "",                      MCI_OPEN_ELEMENT,            MCI_STRING,
  1493.    "alias",                 MCI_OPEN_ALIAS,              MCI_STRING,
  1494. "",                         0L,                          MCI_END_COMMAND,
  1495.  
  1496. "info",                     MCI_INFO, 0,                 MCI_COMMAND_HEAD,
  1497.    "",                      MCI_STRING,                  MCI_RETURN,
  1498.    "notify",                MCI_NOTIFY,                  MCI_FLAG,
  1499.    "wait",                  MCI_WAIT,                    MCI_FLAG,
  1500.    "product",               MCI_INFO_PRODUCT,            MCI_FLAG,
  1501.    "file",                  MCI_INFO_FILE,               MCI_FLAG,
  1502. "",                         0L,                          MCI_END_COMMAND,
  1503.  
  1504. Command lists have a sequence of lines that are organized into three columns: 
  1505.  
  1506.    o  Column 1 contains the command and its flags in command string format. 
  1507.    o  Column 2 contains the command and its flags in command message format. 
  1508.    o  Column 3 contains the Line_types for each line in the command list. 
  1509.  
  1510.  
  1511. ΓòÉΓòÉΓòÉ 4.5.1.1. Line Types ΓòÉΓòÉΓòÉ
  1512.  
  1513. The MDM string parser uses the Line_type to determine how to interpret each 
  1514. line. A command list begins with the MCI_COMMAND_HEAD Line_type and ends with 
  1515. the MCI_END_COMMAND Line_type. 
  1516.  
  1517.  MCI_RETURN 
  1518.            This Line_type indicates that the command provides return 
  1519.            information. If used, MCI_RETURN must be the second entry in the 
  1520.            command list. 
  1521.  
  1522.    o  Column 1 contains "". 
  1523.    o  Column 2 contains the type of return: integer or string. 
  1524.    o  Column 3 contains MCI_RETURN. 
  1525.  
  1526.            A command returning an integer requires a ULONG for that return 
  1527.            value. A command returning a string requires two ULONGs: the first 
  1528.            ULONG is for a pointer to the return buffer, and the second ULONG is 
  1529.            for the return buffer size. 
  1530.  
  1531.            The parser sends back return information in the pszReturnString and 
  1532.            usReturnLength parameters of the mciSendString function. The above 
  1533.            example shows how both types of returns are used. 
  1534.  
  1535.            The MCI_OPEN returns a ULONG value, and MCI_INFO returns data that 
  1536.            is filled into the buffer pointed to by the pointer in the second 
  1537.            ULONG of the command structure. (Remember that the first ULONG is 
  1538.            always hwndCallback.) 
  1539.  
  1540.  MCI_RETURN_TYPE 
  1541.            This Line_type is used to convert return values into strings by the 
  1542.            string parser. 
  1543.  
  1544.                          "",              MCI_TRUE_FALSE_RETURN, 0,    MCI_RETURN_TYPE,
  1545.                             "TRUE",       1L,                          MCI_RETURN_TYPE_STRING,
  1546.                             "FALSE",      0L,                          MCI_RETURN_TYPE_STRING,
  1547.                          "",              0L,                          MCI_END_RETURN_TYPE,
  1548.  
  1549.            The flag_define field for the return line is compared against the 
  1550.            high-order word of the return code. If a match is found, then the 
  1551.            parser tries to find a match for the flag_define field and the 
  1552.            return value.  If a match is found for the return value, then the 
  1553.            keyword string is returned to the application in the pszReturnString 
  1554.            field of the mciSendString call. 
  1555.  
  1556.  MCI_FLAG 
  1557.            This Line_type is used to convert keywords to flag values for 
  1558.            ulParam1. When more than one MCI_FLAG Line_type is encountered 
  1559.            during the parsing of a command string, the ulParam1 parameter is 
  1560.            ORed with the flag_define field of the Keyword_list. 
  1561.  
  1562.  MCI_STRING 
  1563.            This Line_type is used for string values for a message. The string 
  1564.            following the MCI_STRING keyword is copied into the command 
  1565.            structure. MDM allocates memory to hold the string and put the 
  1566.            address into the command structure. 
  1567.  
  1568.  MCI_INTEGER 
  1569.            This Line_type is used for integer values for a message. The integer 
  1570.            following the MCI_INTEGER keyword is copied into the command 
  1571.            structure. The integer value is converted from a string 
  1572.            representation to a ULONG. 
  1573.  
  1574.  MCI_CONSTANT 
  1575.            This Line_type and the MCI_END_CONSTANT Line_type allow a set of 
  1576.            possible keywords to represent a flag or integer. In the following 
  1577.            example, any one of the time format values can be used as the value 
  1578.            for the time format constant. 
  1579.  
  1580.                         "",                            MCI_SET_TIME_FORMAT,     MCI_CONSTANT,
  1581.                            "time format milliseconds", MCI_FORMAT_MILLISECONDS, MCI_INTEGER,
  1582.                            "time format ms",           MCI_FORMAT_MILLISECONDS, MCI_INTEGER,
  1583.                            "time format mmtime",       MCI_FORMAT_MMTIME,       MCI_INTEGER,
  1584.                         "",                            0L,                      MCI_END_CONSTANT,
  1585.  
  1586.            The value on the MCI_CONSTANT line_type is ORed with the ulParam1 
  1587.            field.  The values on the MCI_INTEGER line_types within this 
  1588.            constant block are copied into the command structure.  The constant 
  1589.            block represents just one ULONG in the command structure. 
  1590.  
  1591.  MCI_DEFAULT_STRING 
  1592.            This Line_type and the MCI_DEFAULT_INTEGER Line_type provide the 
  1593.            means for an unknown value to be used as a string or integer. For 
  1594.            example the LOAD command (shown in the following example) uses a 
  1595.            default string for the filename string. 
  1596.  
  1597.                       "load",                          MCI_LOAD, 0,           MCI_COMMAND_HEAD,
  1598.                          "notify",                     MCI_NOTIFY,            MCI_FLAG,
  1599.                          "wait",                       MCI_WAIT,              MCI_FLAG,
  1600.                          "new",                        0L,                    MCI_FLAG,
  1601.                          "readonly",                   MCI_READONLY,          MCI_FLAG,
  1602.                          "",                           MCI_OPEN_ELEMENT,      MCI_DEFAULT_STRING,
  1603.                       "",                              0L,                    MCI_END_COMMAND,
  1604.  
  1605.  MCI_RECTL 
  1606.            This Line_type specifies that RECTL data modifies the media control 
  1607.            interface flag represented by the command list entry.  The second 
  1608.            column of this entry contains the flag to set.  The data structure 
  1609.            for the message command must reserve a ULONG to hold the integer 
  1610.            value. 
  1611.  
  1612.  MCI_OR 
  1613.            This Line_type allows you to combine different line types within the 
  1614.            same construct. The following shows an example of an MCI_OR entry 
  1615.            used in the MCI_STATUS command list in the MDMCMD.RC file. Notice 
  1616.            that the %d symbol can be used in a command list as an indicator to 
  1617.            print the decimal value. 
  1618.  
  1619.                          "",              0L,                         MCI_OR,
  1620.                          "track",         MCI_TRACK,                  MCI_INTEGER,
  1621.                          "channel",       0L,                         MCI_CONSTANT,
  1622.                             "all",        MCI_STATUS_AUDIO_ALL,       MCI_INTEGER,
  1623.                             "left",       MCI_STATUS_AUDIO_LEFT,      MCI_INTEGER,
  1624.                             "right",      MCI_STATUS_AUDIO_RIGHT,     MCI_INTEGER,
  1625.                             "%d",         0L,                         MCI_INTEGER,
  1626.                          "",              0L,                         MCI_END_CONSTANT,
  1627.                          "",              0L,                         MCI_END_OR,
  1628.  
  1629.  MCI_STRING_LIST 
  1630.            Pointer to an array of pointers to strings in the list. For example, 
  1631.            the following example code uses MCI_STRING_LIST to point to an array 
  1632.            of pointers to device identifiers. 
  1633.  
  1634.                       "group",            MCI_GROUP, 0,               MCI_COMMAND_HEAD,
  1635.                          "delete",        MCI_GROUP_DELETE,           MCI_FLAG,
  1636.                          "nopiecemeal",   MCI_NOPIECEMEAL,            MCI_FLAG,
  1637.                          "synchronize",   MCI_SYNCHRONIZE,            MCI_FLAG,
  1638.                          "wait",          MCI_WAIT,                   MCI_FLAG,
  1639.                          "notify",        MCI_NOTIFY,                 MCI_FLAG,
  1640.                          "",              0L,                         MCI_INTEGER,
  1641.                          "",              0L,                         MCI_INTEGER,
  1642.                          "master",        MCI_GROUP_MASTER,           MCI_STRING,
  1643.                          "",              0L,                         MCI_STRING,
  1644.                          "",              0L,                         MCI_INTEGER,
  1645.                          "make",          MCI_GROUP_MAKE,             MCI_STRING_LIST,
  1646.                       "",                 0L,                         MCI_END_COMMAND,
  1647.  
  1648.  
  1649. ΓòÉΓòÉΓòÉ 4.5.2. Parsing a Command List ΓòÉΓòÉΓòÉ
  1650.  
  1651. A command table consists of command lists, which define to the MDM parser how 
  1652. to parse certain commands. For example, illustrates a command list for 
  1653. MCI_SEEK: 
  1654.  
  1655. "seek",                  MCI_SEEK, 0,           MCI_COMMAND_HEAD,
  1656.    "notify",             MCI_NOTIFY,            MCI_FLAG,
  1657.    "wait",               MCI_WAIT,              MCI_FLAG,
  1658.    "to start",           MCI_TO_START,          MCI_FLAG,
  1659.    "to end",             MCI_TO_END,            MCI_FLAG,
  1660.    "to",                 MCI_TO,                MCI_INTEGER,
  1661. "",                      0L,                    MCI_END_COMMAND,
  1662.  
  1663. The SEEK command list tells the parser how to create the associated data 
  1664. structure for the pParam2 parameter of mciSendCommand to  point to, when it 
  1665. finds "seek" in the pszCommand parameter of mciSendString. 
  1666.  
  1667. Notice that each line is broken into a null-terminated string and two ULONGs. 
  1668. The ULONG following "seek" is composed of two parts; MCI_SEEK and 0. The 
  1669. command message (in this case, MCI_SEEK) is a USHORT, and therefore we need 
  1670. another USHORT as a filler. The MCI_COMMAND_HEAD Line_type tells MDM that the 
  1671. first ULONG (actually, the first USHORT) contains the usMessage parameter for 
  1672. mciDriverEntry. 
  1673.  
  1674. If the line type of a line is MCI_FLAG, then the first ULONG for that line is 
  1675. ORed together with all the other ULONGs for MCI_FLAG lines, to form the 
  1676. ulParam1 parameter. 
  1677.  
  1678. The string parser makes two passes through the command list. The first pass is 
  1679. to determine the size of the structure to allocate for the command.  The second 
  1680. pass parses the command string, fills in the command structure, and creates a 
  1681. ulParam1 flag. 
  1682.  
  1683. Each command is composed of a number of ULONGs.  All commands have a minimum of 
  1684. one ULONG for the hwndCallback field.  The parser provides this ULONG 
  1685. automatically. The remaining size of the command structure is based on the 
  1686. Line_types used for the command. 
  1687.  
  1688. If the line type of a line is MCI_INTEGER, then the text following string S, 
  1689. where S is the null-terminated string in the command line, in pszCommand is an 
  1690. integer and should be put in the corresponding ULONG in the structure of ULONGs 
  1691. that pParam2 points to. 
  1692.  
  1693. If the line type is MCI_STRING, then the text following string S in pszCommand 
  1694. is a string, and a pointer to this string will be put in the corresponding 
  1695. ULONG in the structure of ULONGs that pParam2 points to. 
  1696.  
  1697. Finally, if the line type is MCI_RETURN, then the first ULONG of that line 
  1698. specifies the value that is to be returned through the data structure pointed 
  1699. to by pParam2. 
  1700.  
  1701. The pParam2 data structure is laid out based on the command list. The first 
  1702. ULONG is always hwndCallback. The next one or two ULONGs represent MCI_RETURN: 
  1703.  
  1704.    o  If MCI_RETURN is specified, and MCI_INTEGER is the first ULONG of that 
  1705.       line, then the second ULONG of pParam2 is ulReturn. 
  1706.  
  1707.    o  If MCI_RETURN is specified and MCI_STRING is the first ULONG of that 
  1708.       line, then the second ULONG of pParam2 is ulReturn, and the third ULONG 
  1709.       is ulRetSize. The ulRetSize specifies the length of the string. 
  1710.  The other fields of pParam2 are filled in based on the MCI_INTEGER and 
  1711.  MCI_STRING appearing in the second ULONG of the command lines.  In addition, 
  1712.  MCI_CONSTANT and MCI_END_CONSTANT form a range of possible values for one of 
  1713.  the fields in the structure. This block represents a single ULONG in the 
  1714.  structure. These fields are filled in, in the order they appear in the command 
  1715.  list. For example, suppose the string parser parses the MCI_STATUS command 
  1716.  list shown in the following example code. 
  1717.  
  1718.       "status\0",            MCI_STATUS, 0,                 MCI_COMMAND_HEAD,
  1719.       "\0",                  MCI_INTEGER,                   MCI_RETURN,
  1720.       "notify\0",            MCI_NOTIFY,                    MCI_FLAG,
  1721.       "wait\0",              MCI_WAIT,                      MCI_FLAG,
  1722.       "\0",                  MCI_STATUS_ITEM,               MCI_CONSTANT,
  1723.       "mode\0",              MCI_STATUS_MODE,               MCI_INTEGER,
  1724.       "ready\0",             MCI_STATUS_READY,              MCI_INTEGER,
  1725.       "current track\0",     MCI_STATUS_CURRENT_TRACK,      MCI_INTEGER,
  1726.       "length\0",            MCI_STATUS_LENGTH,             MCI_INTEGER,
  1727.       "number of tracks\0",  MCI_STATUS_NUMBER_OF_TRACKS,   MCI_INTEGER,
  1728.       "position\0",          MCI_STATUS_POSITION,           MCI_INTEGER,
  1729.       "position in track\0", MCI_STATUS_POSITION_IN_TRACK,  MCI_INTEGER,
  1730.       "time format\0",       MCI_STATUS_TIME_FORMAT,        MCI_INTEGER,
  1731.       "speed format\0",      MCI_STATUS_SPEED_FORMAT,       MCI_INTEGER,
  1732.       "\0",                  0L,                            MCI_END_CONSTANT,
  1733.       "track\0",             MCI_TRACK,                     MCI_INTEGER,
  1734.       "\0",                  0L,                            MCI_END_COMMAND,
  1735.  
  1736.  The string parser produces the pParam2 parameter shown in the following 
  1737.  figure. 
  1738.  
  1739.          {
  1740.          HWND       hwndCallback;
  1741.          ULONG      ulReturn;
  1742.          ULONG      ulItem;
  1743.          ULONG      ulTrack;
  1744.          }
  1745.  
  1746.  Notice that the MCI_CONSTANT block is defined in order to fill in the ulItem 
  1747.  field of the status structure. If the keyword field on the MCI_CONSTANT line 
  1748.  is "\0" or NULL, then the parser is looking for any keyword defined in the 
  1749.  block, and the first ULONG of the matching keyword is put in the ulItem field. 
  1750.  If the keyword on the MCI_CONSTANT line is not "\0" then the parser looks for 
  1751.  that keyword and ORs the first ULONG of the MCI_CONSTANT line with ulParam1. 
  1752.  The parser continues to look for a keyword match in the constant block. For 
  1753.  example: 
  1754.  
  1755.   "capability",              MCI_GETDEVCAPS, 0,                   MCI_COMMAND_HEAD,
  1756.    "",                       MCI_PREROLL_TYPE_RETURN, 0,          MCI_RETURN_TYPE,
  1757.       "deterministic",       MCI_PREROLL_DETERMINISTIC,           MCI_RETURN_TYPE_STRING,
  1758.       "notified"             MCI_PREROLL_NOTIFIED,                MCI_RETURN_TYPE_STRING,
  1759.       "none",                MCI_PREROLL_NONE,                    MCI_RETURN_TYPE_STRING,
  1760.    "none",                   0L,                                  MCI_END_RETURN_TYPE,
  1761.    "",                       MCI_TRUE_FALSE_RETURN, 0,            MCI_RETURN_TYPE,
  1762.       "TRUE",                1L,                                  MCI_RETURN_TYPE_STRING,
  1763.       "FALSE",               0L,                                  MCI_RETURN_TYPE_STRING,
  1764.    "",                       0L,                                  MCI_END_RETURN_TYPE,
  1765.    "",                       MCI_DEVICENAME_RETURN, 0,            MCI_RETURN_TYPE,
  1766.       "Videotape",           MCI_DEVTYPE_VIDEOTAPE, 0,            MCI_RETURN_TYPE_STRING,
  1767.       "Videodisc",           MCI_DEVTYPE_VIDEODISC, 0,            MCI_RETURN_TYPE_STRING,
  1768.       "CDaudio",             MCI_DEVTYPE_CD_AUDIO,  0,            MCI_RETURN_TYPE_STRING,
  1769.       "DAT",                 MCI_DEVTYPE_DAT,       0,            MCI_RETURN_TYPE_STRING,
  1770.       "Audiotape",           MCI_DEVTYPE_AUDIO_TAPE,        0,    MCI_RETURN_TYPE_STRING,
  1771.       "Other",               MCI_DEVTYPE_OTHER,             0,    MCI_RETURN_TYPE_STRING,
  1772.       "Waveaudio",           MCI_DEVTYPE_WAVEFORM_AUDIO,    0,    MCI_RETURN_TYPE_STRING,
  1773.       "Sequencer",           MCI_DEVTYPE_SEQUENCER,         0,    MCI_RETURN_TYPE_STRING,
  1774.       "Ampmix",              MCI_DEVTYPE_AUDIO_AMPMIX,      0,    MCI_RETURN_TYPE_STRING,
  1775.       "Overlay",             MCI_DEVTYPE_OVERLAY,           0,    MCI_RETURN_TYPE_STRING,
  1776.       "Digitalvideo",        MCI_DEVTYPE_DIGITAL_VIDEO,     0,    MCI_RETURN_TYPE_STRING,
  1777.       "Speaker",             MCI_DEVTYPE_SPEAKER,           0,    MCI_RETURN_TYPE_STRING,
  1778.       "Headphone",           MCI_DEVTYPE_HEADPHONE,         0,    MCI_RETURN_TYPE_STRING,
  1779.       "Microphone",          MCI_DEVTYPE_MICROPHONE,        0,    MCI_RETURN_TYPE_STRING,
  1780.       "Monitor",             MCI_DEVTYPE_MONITOR,           0,    MCI_RETURN_TYPE_STRING,
  1781.       "CDXA",                MCI_DEVTYPE_CDXA,              0,    MCI_RETURN_TYPE_STRING,
  1782.    "",                       0L,                                  MCI_END_RETURN_TYPE,
  1783.    "",                       MCI_INTEGER,                         MCI_RETURN,
  1784.    "notify",                 MCI_NOTIFY,                          MCI_FLAG,
  1785.    "wait",                   MCI_WAIT,                            MCI_FLAG,
  1786.    "",                       MCI_GETDEVCAPS_ITEM,                 MCI_CONSTANT,
  1787.       "can record",          MCI_GETDEVCAPS_CAN_RECORD,           MCI_INTEGER,
  1788.       "can insert",          MCI_GETDEVCAPS_CAN_RECORD_INSERT,    MCI_INTEGER,
  1789.       "has audio",           MCI_GETDEVCAPS_HAS_AUDIO,            MCI_INTEGER,
  1790.       "has video",           MCI_GETDEVCAPS_HAS_VIDEO,            MCI_INTEGER,
  1791.       "can eject",           MCI_GETDEVCAPS_CAN_EJECT,            MCI_INTEGER,
  1792.       "can play",            MCI_GETDEVCAPS_CAN_PLAY,             MCI_INTEGER,
  1793.       "can save",            MCI_GETDEVCAPS_CAN_SAVE,             MCI_INTEGER,
  1794.       "uses files",          MCI_GETDEVCAPS_USES_FILES,           MCI_INTEGER,
  1795.       "compound device",     MCI_GETDEVCAPS_USES_FILES,           MCI_INTEGER,
  1796.       "can lockeject",       MCI_GETDEVCAPS_CAN_LOCKEJECT,        MCI_INTEGER,
  1797.       "can setvolume",       MCI_GETDEVCAPS_CAN_SETVOLUME,        MCI_INTEGER,
  1798.       "preroll type",        MCI_GETDEVCAPS_PREROLL_TYPE,         MCI_INTEGER,
  1799.       "preroll time",        MCI_GETDEVCAPS_PREROLL_TIME,         MCI_INTEGER,
  1800.       "device type",         MCI_GETDEVCAPS_DEVICE_TYPE,          MCI_INTEGER,
  1801.       "can stream",          MCI_GETDEVCAPS_CAN_STREAM,           MCI_INTEGER,
  1802.       "can process internal",MCI_GETDEVCAPS_CAN_PROCESS_INTERNAL, MCI_INTEGER,
  1803.    "",                       0L,                                  MCI_END_CONSTANT,
  1804.    "message",                MCI_GETDEVCAPS_MESSAGE,              MCI_CONSTANT,
  1805.       "acquire",             MCI_ACQUIREDEVICE, 0,                MCI_INTEGER,
  1806.       "release",             MCI_RELEASEDEVICE, 0,                MCI_INTEGER,
  1807.       "open",                MCI_OPEN, 0,                         MCI_INTEGER,
  1808.       "close",               MCI_CLOSE, 0,                        MCI_INTEGER,
  1809.       "escape",              MCI_ESCAPE, 0,                       MCI_INTEGER,
  1810.       "play",                MCI_PLAY, 0,                         MCI_INTEGER,
  1811.       "seek",                MCI_SEEK, 0,                         MCI_INTEGER,
  1812.       "stop",                MCI_STOP, 0,                         MCI_INTEGER,
  1813.       "pause",               MCI_PAUSE, 0,                        MCI_INTEGER,
  1814.       "info",                MCI_INFO, 0,                         MCI_INTEGER,
  1815.       "capability",          MCI_GETDEVCAPS, 0,                   MCI_INTEGER,
  1816.       "status",              MCI_STATUS, 0,                       MCI_INTEGER,
  1817.       "spin",                MCI_SPIN, 0,                         MCI_INTEGER,
  1818.       "set",                 MCI_SET, 0,                          MCI_INTEGER,
  1819.       "step",                MCI_STEP, 0,                         MCI_INTEGER,
  1820.       "record",              MCI_RECORD, 0,                       MCI_INTEGER,
  1821.       "sysinfo",             MCI_SYSINFO, 0,                      MCI_INTEGER,
  1822.       "save",                MCI_SAVE, 0,                         MCI_INTEGER,
  1823.       "cue",                 MCI_CUE, 0,                          MCI_INTEGER,
  1824.       "update",              MCI_UPDATE, 0,                       MCI_INTEGER,
  1825.       "setcuepoint",         MCI_SET_CUEPOINT, 0,                 MCI_INTEGER,
  1826.       "setpositionadvise",   MCI_SET_POSITION_ADVISE, 0,          MCI_INTEGER,
  1827.       "setsyncoffset",       MCI_SET_SYNC_OFFSET, 0,              MCI_INTEGER,
  1828.       "load",                MCI_LOAD, 0,                         MCI_INTEGER,
  1829.       "masteraudio",         MCI_MASTERAUDIO, 0,                  MCI_INTEGER,
  1830.       "gettoc",              MCI_GETTOC, 0,                       MCI_INTEGER,
  1831.       "connector",           MCI_CONNECTOR, 0,                    MCI_INTEGER,
  1832.       "resume",              MCI_RESUME, 0,                       MCI_INTEGER,
  1833.    "",                       0L,                                  MCI_END_CONSTANT,
  1834.   "",                        0L,                                  MCI_END_COMMAND,
  1835.  
  1836.  The pParam2 parameter would look like: 
  1837.  
  1838.          {
  1839.          ULONG      hwndCallback;
  1840.          ULONG      ulReturn;
  1841.          ULONG      ulltem;
  1842.          ULONG      ulMessage;
  1843.          }
  1844.  
  1845.  Notice the second constant block with the keyword "message".  The parser would 
  1846.  be looking for something like "message open".  This constant block would OR 
  1847.  the MCI_GETDEVCAPS_MESSAGE with the ulParam1 parameter and put the value 
  1848.  MCI_OPEN in the ulMessage field. 
  1849.  
  1850.  The multimedia string parser also supports one default INTEGER and STRING 
  1851.  value.  The constants MCI_DEFAULT_INTEGER and MCI_DEFAULT_STRING are used by 
  1852.  the string parser to locate unknown keywords.  For example, if a command 
  1853.  needed a file name as its only parameter, then the following line could be 
  1854.  used in the command table. 
  1855.  
  1856.      "\0",            MCI_FILENAME,                 MCI_DEFAULT_STRING,
  1857.  
  1858.  This item takes up a ULONG in the structure, just as in MCI_STRING. 
  1859.  
  1860.  Support for device-specific command tables is provided by the multimedia 
  1861.  installation application. When a device is installed, one of the parameters to 
  1862.  the install process is the command table (resource DLL).  The required and 
  1863.  device-type command tables are provided by the system. 
  1864.  
  1865.  
  1866. ΓòÉΓòÉΓòÉ 4.5.3. Error Tables ΓòÉΓòÉΓòÉ
  1867.  
  1868. In addition to custom command tables, MCDs can have custom error tables.  Error 
  1869. tables are represented as resources to the driver.  They are created using the 
  1870. RCDATA type of resource.  By default, custom driver error tables are associated 
  1871. with the MCDTABLE and VSDTABLE DLLs specified in the MMPM2.INI file.  The 
  1872. resource number is the device type number + MMERROR_TABLE_BASE.  For example, 
  1873. the following example shows an RCDATA value of 506.  This consists of: 
  1874.  
  1875.    o  A value of 500 from MMERROR_TABLE_BASE located in the MCIDRV.H file 
  1876.  
  1877.    o  A value of 6 from the device type you are supporting (for example, 
  1878.       MCI_DEVTYPE_OTHER located in the MCIOS2.H file). 
  1879.  
  1880.  As an alternate, you can add a #define statement in your header file to define 
  1881.  the RCDATA value.  For example: 
  1882.  
  1883.   #define MMERR_TABLE_MY_DEVICE  MMERROR_TABLE_BASE + MCI_DEVTYPE_OTHER
  1884.  
  1885.  MDM attempts to use these tables whenever mciGetErrorString is called with an 
  1886.  error generated by that driver.  If the custom error table resource does not 
  1887.  exist, then MDM uses its default error table.  The error table is a resource. 
  1888.  
  1889.  Error tables are composed of a set of ULONG strings with a special 
  1890.  end-of-table identifier as shown in the following example. 
  1891.  
  1892.   RCDATA        506
  1893.   BEGIN
  1894.  
  1895.   MCIERR_INVALID_DEVICE_NAME,        "Invalid Device Name given"
  1896.   MCIERR_SUCCESS,                    "MMPM Command completed successfully"
  1897.   MCIERR_INVALID_DEVICE_ID,          "Invalid device ID given"
  1898.   MCIERR_UNRECOGNIZED_KEYWORD,       "Unrecognized keyword"
  1899.   MCIERR_UNRECOGNIZED_COMMAND,       "Unrecognized command"
  1900.   MCIERR_HARDWARE,                   "Hardware error"
  1901.   MCIERR_OUT_OF_MEMORY,              "System out of memory"
  1902.        .
  1903.        .
  1904.        .
  1905.   MCIERR_MSG_TABLE_END               ""
  1906.   END
  1907.  
  1908.  Note:  If a device does not use a basic command, the MCD can return 
  1909.         MCIERR_UNSUPPORTED_FUNCTION.  If a device supports the command, but not 
  1910.         all of the options, it can return MCIERR_UNSUPPORTED_FLAG. 
  1911.  
  1912.  
  1913. ΓòÉΓòÉΓòÉ 4.6. Device States ΓòÉΓòÉΓòÉ
  1914.  
  1915. Media devices that transport data are considered to be in one of the following 
  1916. nine states at any given time: 
  1917.  
  1918.    o  Playing 
  1919.    o  Recording 
  1920.    o  Seeking 
  1921.    o  Stopped 
  1922.    o  Paused during a playback operation 
  1923.    o  Paused during a recording operation 
  1924.    o  Cued for a playback operation 
  1925.    o  Cued for a recording operation 
  1926.    o  Closed. 
  1927.  
  1928.  When a device is opened, the device context is assumed to be in the stopped 
  1929.  state.  The closed state can be viewed as both the initial state and the 
  1930.  termination state.  Or this state can be thought of as not a state at all, 
  1931.  because a device context does not exist before it is opened, and ceases to 
  1932.  exist when it is closed. 
  1933.  
  1934.  The following figure lists the allowable device states in the first column of 
  1935.  the table and indicates the changes in state that occur when the command 
  1936.  messages shown at the top of the table are issued. This table assumes all 
  1937.  error conditions keep the device in its current state. For example, a waveform 
  1938.  player that is opened without an element remains in the stopped state when a 
  1939.  play is issued, and the MCD receives an error code. 
  1940.  
  1941.  Note that a device is in the seek state only during the SEEK operation. Upon 
  1942.  completion of the seek, the device enters the stop state. The following figure 
  1943.  is provided as a guide to application developers and MCD writers.  There can 
  1944.  be no guarantee that every media device will conform to this table, but every 
  1945.  effort should be made to hide the complexity of the device from the 
  1946.  application. 
  1947.  
  1948.  Legend 
  1949.  
  1950.  E    Error condition. 
  1951.  -    Not applicable. 
  1952.  
  1953.  
  1954. ΓòÉΓòÉΓòÉ 4.7. Controlling a Streaming Device: Waveform Audio MCD ΓòÉΓòÉΓòÉ
  1955.  
  1956. To play back a waveform file stored on a user's hard disk, the Duet Player I 
  1957. sample program sends command messages to the Media Device Manager (MDM) by 
  1958. means of the mciSendCommand function.  The application is shielded from having 
  1959. to know specific information about the hardware.  In other words, the 
  1960. application does not need to know which audio adapter is being used to play 
  1961. back the waveform file.  The MDM sends the commands to a generic mciDriverEntry 
  1962. interface for audio devices, located in the AUDIOMCD DLL.  The 
  1963. device-independent AUDIOMCD and its device-specific counterpart AUDIOIF are two 
  1964. of the modules that comprise the waveform audio MCD as shown in the following 
  1965. figure. Also depicted are the MMIO and SSM interfaces used by the MCD. 
  1966.  
  1967.  
  1968. ΓòÉΓòÉΓòÉ 4.7.1. The Waveform Audio to Amp-Mixer Connection ΓòÉΓòÉΓòÉ
  1969.  
  1970. Because its primary purpose is to play and record waveform data, the waveform 
  1971. audio MCD routes an MCI_SET application request to set audio attributes.  The 
  1972. waveform audio MCD can route requests to the amp mixer because a default 
  1973. logical connection exists from the waveform audio MCD to the ampmixer MCD. 
  1974.  
  1975. A default connection is the name of a connected device, while a device-context 
  1976. connection is the actual handle to a particular instance of an opened device. 
  1977. The waveaudio device has a default connection to an ampmixer device.  When the 
  1978. waveaudio device is opened, it automatically opens the ampmix device creating 
  1979. an instance of each device.  Since devices may be shared in OS/2 multimedia, 
  1980. the waveaudio device can be opened again by another application and two new 
  1981. instances are created.  While the default connection is the same in both cases, 
  1982. the device context connections are different. 
  1983.  
  1984. The code fragment in the following example illustrates how the waveaudio device 
  1985. gets a default connection and opens an associated amp mixer.  The waveform 
  1986. audio MCD uses the device handle of the amp mixer to route any requests to 
  1987. change the volume. 
  1988.  
  1989. An application can retrieve the amp mixer handle by issuing the MCI_CONNECTION 
  1990. message.  This is necessary if the application needs to use any advanced audio 
  1991. shaping functions such as treble, bass, balance, and so on. 
  1992.  
  1993.   ulpInstance->usWaveDeviceID = pDrvOpenParams->usDeviceID;
  1994.  
  1995.   ulDeviceTypeID = MAKEULONG ( MCI_DEVTYPE_WAVEFORM_AUDIO,
  1996.                                pDrvOpenParams->usDeviceOrd);
  1997.   /******************************************************
  1998.   * Ensure that the INI file contains the right device id
  1999.   ******************************************************/
  2000.  
  2001.   if ( pDrvOpenParams->usDeviceType != MCI_DEVTYPE_WAVEFORM_AUDIO )
  2002.      {
  2003.      return ( MCIERR_INI_FILE );
  2004.      }
  2005.  
  2006.   usConnLength = sizeof(DEFAULTCONNECTIONS2);
  2007.  
  2008.   ulrc =  mciQueryDefaultConnections ( ulDeviceTypeID,
  2009.                                        &DefCon,
  2010.                                        &usConnLength);
  2011.   /******************************************************
  2012.   * Ensure that the INI file says that we are connected
  2013.   * to an amp mixer.  If it says that we are connected
  2014.   * to ourselves, return an error.
  2015.   ******************************************************/
  2016.   if ( ULONG_LOWD( DefCon.dwDeviceTypeID2 ) == MCI_DEVTYPE_WAVEFORM_AUDIO )
  2017.      {
  2018.      return ( MCIERR_INI_FILE );
  2019.      }
  2020.  
  2021.  
  2022. ΓòÉΓòÉΓòÉ 4.7.2. MMIO Operations ΓòÉΓòÉΓòÉ
  2023.  
  2024. The waveform audio MCD uses MMIO functions to: 
  2025.  
  2026.    o  Open the waveform data file 
  2027.  
  2028.    o  Initialize the audio device with information obtained from the file's 
  2029.       header 
  2030.  
  2031.    o  Support multiple file formats 
  2032.  
  2033.    o  Support networking functions 
  2034.  
  2035.    o  Support editing functions. 
  2036.  
  2037.  
  2038. ΓòÉΓòÉΓòÉ 4.7.2.1. Initializing the Audio Device ΓòÉΓòÉΓòÉ
  2039.  
  2040. To initialize the audio device, the waveform audio MCD needs information about 
  2041. the data element to be played.  The driver makes a call to mmioGetHeader, which 
  2042. returns information contained in the header of the waveform element (for 
  2043. example, whether the data was recorded in stereo or mono, what its sampling 
  2044. rate and bits-per-sample are, and so on.).  AUDIOMCD parses this information 
  2045. and puts it into the instance structure.  Next, the instance structure is 
  2046. passed to AUDIOIF, which uses the information to initialize the device by means 
  2047. of the IOCtl interface. 
  2048.  
  2049.   /*******************************************************
  2050.   * A streaming MCD should utilize MMIO to perform all
  2051.   * file manipulations.  If we use MMIO, then the MCD
  2052.   * will be free from file dependencies (that is, if a RIFF
  2053.   * IOProc or a VOC IOProc is loaded will be irrelevant.
  2054.   ********************************************************/
  2055.  
  2056.   ulrc = mmioGetHeader ( ulpInstance->hmmio,
  2057.                          (PVOID) &ulpInstance->mmAudioHeader ,
  2058.                          sizeof( ulpInstance->mmAudioHeader ),
  2059.                          (PLONG) &BytesRead,
  2060.                          (ULONG) NULL,
  2061.                          (ULONG) NULL);
  2062.  
  2063.   if ( ulrc == MMIO_SUCCESS )
  2064.       {
  2065.  
  2066.       /******************************************
  2067.       * Copy the data from the call into the instance
  2068.       * so that we can set the amp/mixer up with the
  2069.       * values that the file specifies.
  2070.       ******************************************/
  2071.  
  2072.       AMPMIX.sMode            = WAVEHDR.usFormatTag;
  2073.       AMPMIX.sChannels        = WAVEHDR.usChannels;
  2074.       AMPMIX.lSRate           = WAVEHDR.ulSamplesPerSec;
  2075.       AMPMIX.lBitsPerSRate    = WAVEHDR.usBitsPerSample;
  2076.       ulpInstance->ulDataSize = XWAVHDR.ulAudioLengthInBytes;
  2077.       AMPMIX.ulBlockAlignment = ( ULONG )WAVEHDR.usBlockAlign;
  2078.       ulpInstance->ulAverageBytesPerSec = WAVEHDR.usChannels *
  2079.          WAVEHDR.ulSamplesPerSec * ( WAVEHDR.usBitsPerSample / 8 );
  2080.  
  2081.       } /* SuccesFul GetHeader */
  2082.  
  2083.     else
  2084.       {
  2085.       ulrc = mmioGetLastError( ulpInstance->hmmio );
  2086.  
  2087.       }
  2088.       return (ulrc);
  2089.  
  2090. }  /* GetAudioHeader */
  2091.  
  2092. The handle hmmio that is passed to mmioGetHeader was returned by the call to 
  2093. mmioOpen to open the data element.  The buffer pointed to by mmAudioHeader is 
  2094. filled in by the MMIO Manager on return from mmioGetHeader.  It is an 
  2095. MMAUDIODATA structure. When the MMAUDIODATA structure is returned by 
  2096. mmioGetHeader, it contains all the information the waveform audio MCD needs to 
  2097. initialize the audio device.  The information includes: 
  2098.  
  2099.    o  The type of waveform data in the file (usFormatTag) 
  2100.  
  2101.    o  Whether the file was recorded in mono or stereo (usChannels) 
  2102.  
  2103.    o  The sample rate and size set when the file was recorded (usSamplesPerSec 
  2104.       and usBitsPerSample) 
  2105.  
  2106.    o  The length of the audio data (ulAudioLengthInBytes). 
  2107.  
  2108.  
  2109. ΓòÉΓòÉΓòÉ 4.7.2.2. Supporting Multiple File Formats ΓòÉΓòÉΓòÉ
  2110.  
  2111. The following example shows how the waveform audio MCD searches audio I/O 
  2112. procedures by defining MMIO_MEDIATYPE_AUDIO in the ulMedType field of the 
  2113. MMCTOCENTRY data structure.  To search and identify other types of IOProcs, you 
  2114. can include one of the following media type flags: 
  2115.  
  2116.    o  MMIO_MEDIATYPE_IMAGE 
  2117.    o  MMIO_MEDIATYPE_AUDIO 
  2118.    o  MMIO_MEDIATYPE_MIDI 
  2119.    o  MMIO_MEDIATYPE_COMPOUND 
  2120.    o  MMIO_MEDIATYPE_OTHER 
  2121.    o  MMIO_MEDIATYPE_UNKNOWN 
  2122.    o  MMIO_MEDIATYPE_DIGITALVIDEO 
  2123.    o  MMIO_MEDIATYPE_ANIMATION 
  2124.    o  MMIO_MEDIATYPE_MOVIE 
  2125.  
  2126.  Refer to the OS/2 Multimedia Programming Reference for further information. 
  2127.  
  2128.              mmioinfo.aulInfo[ 3 ] = MMIO_MEDIATYPE_AUDIO;
  2129.  
  2130.  
  2131.              /* Open the file */
  2132.  
  2133.  
  2134.              pInstance->hmmio = mmioOpen ( pFileName,
  2135.                                            &mmioinfo,
  2136.                                            ulFlags);
  2137.  
  2138.              /* Check for errors--see comments from above */
  2139.  
  2140.              if (pInstance->hmmio == (ULONG) NULL)
  2141.                {
  2142.                if ( mmioinfo.ulErrorRet == MMIOERR_MEDIA_NOT_FOUND )
  2143.                  {
  2144.                  return  ( MCIERR_INVALID_MEDIA_TYPE );
  2145.                  }
  2146.  
  2147.                return  ( mmioinfo.ulErrorRet );
  2148.                }
  2149.  
  2150.              pInstance->ulCapabilities = 0;
  2151.  
  2152.       else
  2153.           {
  2154.           /************************************************
  2155.           * Since the wave IOProc opened the file, we know
  2156.           * that it has the following capabilities.
  2157.           *************************************************/
  2158.           pInstance->ulCapabilities =  ( CAN_INSERT | CAN_DELETE | CAN_UNDOREDO +
  2159.                                          CAN_SAVE   | CAN_INSERT | CAN_RECORD  );
  2160.           }
  2161.  
  2162.     /******************************************
  2163.     * Get The Header Information
  2164.     *******************************************/
  2165.  
  2166.     if ( !(ulFlags & MMIO_CREATE) )
  2167.        {
  2168.  
  2169.         ulrc = GetAudioHeader (pInstance);
  2170.  
  2171.        } /* Not Create Flag */
  2172.  
  2173.     else
  2174.        {
  2175.        pInstance->ulDataSize = 0;
  2176.        }
  2177.  
  2178.     pInstance->fFileExists = TRUE;
  2179.  
  2180.  
  2181.     /*******************************************************************
  2182.     * You cannot do the set header immediately after file creation
  2183.     * because future sets on samples, bitpersample, channels may follow
  2184.    ********************************************************************/
  2185.  
  2186.     return (ulrc);
  2187.  
  2188.   } /* OpenFile */
  2189.  
  2190.  
  2191. ΓòÉΓòÉΓòÉ 4.7.2.3. Networking Functions ΓòÉΓòÉΓòÉ
  2192.  
  2193. Some OS/2 networks have specific IOProcs that can manage network traffic.  The 
  2194. MMPM2.INI file contains information that describes the streaming quality when 
  2195. files are played or recorded over the network. The following example shows how 
  2196. to retrieve Quality of Service (QOS) values from the INI file. 
  2197.  
  2198. If you are writing a streaming MCD, it is advantageous to use the 
  2199. MMIOM_BEGINSTREAM and MMIOM_ENDSTREAM messages to improve performance across a 
  2200. LAN. The following example uses the MMIOM_BEGINSTREAM message to inform the 
  2201. IOProcs that we want to stream across the network. 
  2202.  
  2203. /* ---------------------------------------------
  2204. * The MMPM2.INI file contains two variables that
  2205. * a streaming MCD should retrieve.  The first one
  2206. * QOS_VALUE (Quality of Service) contains settings
  2207. * which describe the quality of service that the
  2208. * network the user is streaming from will try to
  2209. * support (for example, GUARANTEED or DONTCARE).
  2210. * If this quality of service is not available, then another
  2211. * variable (QOSERRORFLAG) describes whether or not
  2212. * to notify the caller.
  2213. *--------------------------------------------------*/
  2214.  
  2215.  
  2216. ulrc = mciQuerySysValue( MSV_SYSQOSVALUE, &ulpInstance->lQosValue );
  2217.  
  2218. if ( !ulrc )
  2219.    {
  2220.    ulpInstance->lQosValue = DONTRESERVE;
  2221.    }
  2222.  
  2223. ulrc = mciQuerySysValue( MSV_SYSQOSERRORFLAG, &ulpInstance->lQOSReporting );
  2224.  
  2225. if ( !ulrc )
  2226.    {
  2227.    ulpInstance->lQOSReporting = ERROR_DEFAULT;
  2228.    }
  2229.  
  2230. The following example illustrates the EndQualityofService subroutine.  Some 
  2231. OS/2 networks have specific IOProcs which can manage network traffic.  This 
  2232. example uses the MMIOM_BEGINSTREAM and MMIOM_ENDSTREAM messages to inform these 
  2233. IOProcs that the waveaudio MCD wants to stream across the network. 
  2234.  
  2235. ULONG   EndQualityofService ( INSTANCE      *pInstance )
  2236.  
  2237. {
  2238. LONG         rc;
  2239.  
  2240.   rc = mmioSendMessage( pInstance->hmmio,
  2241.                         MMIOM_ENDSTREAM,
  2242.                         0,
  2243.                         0 );
  2244.  
  2245.   return ( rc );
  2246.  
  2247. } /* EndQualityofService */
  2248.  
  2249.  
  2250. ΓòÉΓòÉΓòÉ 4.7.2.4. Using MMIO Editing Functions ΓòÉΓòÉΓòÉ
  2251.  
  2252. This section shows the MMIO editing functions used by an MCD to implement media 
  2253. control interface editing functions. The MMIO functions and their media control 
  2254. interface equivalents are shown in the following table: 
  2255.  
  2256. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2257. ΓöéMMIO Functions                ΓöéMCI Equivalents               Γöé
  2258. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2259. ΓöéMMIOM_DELETE                  ΓöéMCI_CUT                       Γöé
  2260. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2261. ΓöéMMIOM_READ                    ΓöéMCI_COPY                      Γöé
  2262. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2263. ΓöéMMIOM_DELETE                  ΓöéMCI_DELETE                    Γöé
  2264. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2265. ΓöéMMIOM_UNDO                    ΓöéMCI_UNDO                      Γöé
  2266. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2267. ΓöéMMIOM_REDO                    ΓöéMCI_REDO                      Γöé
  2268. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2269. ΓöéMMIOM_DELETE,                 ΓöéMCI_PASTE                     Γöé
  2270. ΓöéMMIOM_BEGININSERT, and        Γöé                              Γöé
  2271. ΓöéMMIOM_ENDINSERT               Γöé                              Γöé
  2272. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2273.  
  2274. The following example shows how to use MMIO functions to paste data into a 
  2275. file. 
  2276.  
  2277. /*******************************************
  2278. * Remove the information in the file if
  2279. * from/to are specified.
  2280. ********************************************/
  2281.  
  2282. if ( ulParam1 & MCI_FROM || ulParam1 & MCI_TO )
  2283.    {
  2284.    lReturnCode = mmioSendMessage( pInstance->hmmio,
  2285.                                   MMIOM_DELETE,
  2286.                                   pEditParms->ulFrom,
  2287.                                   ulPasteLen );
  2288.  
  2289.    if ( lReturnCode != MMIO_SUCCESS )
  2290.       {
  2291.       ulrc = mmioGetLastError( pInstance->hmmio );
  2292.       PasteNotify( &FuncBlock, ulParam1, ulrc );
  2293.       return ( ulrc );
  2294.       }
  2295.    }
  2296.  
  2297.  
  2298.  
  2299. if ( !( ulParam1 & MCI_TO_BUFFER ) )
  2300.    {
  2301.    /*******************************************
  2302.    * Let the IOProc know that the information is
  2303.    * about to be inserted into the file
  2304.    ********************************************/
  2305.  
  2306.    lReturnCode = mmioSendMessage( pInstance->hmmio,
  2307.                                   MMIOM_BEGININSERT,
  2308.                                   0,
  2309.                                   0 );
  2310.  
  2311.    if ( lReturnCode != MMIO_SUCCESS )
  2312.       {
  2313.       ulrc = mmioGetLastError( pInstance->hmmio );
  2314.       PasteNotify( &FuncBlock, ulParam1, ulrc );
  2315.       return ( ulrc );
  2316.       }
  2317.  
  2318.    /*******************************************
  2319.    * Write the information that we received from
  2320.    * the clipboard
  2321.    *******************************************/
  2322.  
  2323.  
  2324.    lReturnCode = mmioWrite( pInstance->hmmio,
  2325.                             ( PSZ ) pBuffer,
  2326.                             ulBuffLen );
  2327.  
  2328.    if ( lReturnCode == MMIO_ERROR )
  2329.       {
  2330.       ulrc = mmioGetLastError( pInstance->hmmio );
  2331.       PasteNotify( &FuncBlock, ulParam1, ulrc );
  2332.       return ( ulrc );
  2333.       }
  2334.  
  2335.    /*******************************************
  2336.    * We have finished inserting the information
  2337.    * the paste is complete
  2338.    ********************************************/
  2339.  
  2340.  
  2341.   lReturnCode = mmioSendMessage( pInstance->hmmio,
  2342.                                  MMIOM_ENDINSERT,
  2343.                                  0,
  2344.                                  0 );
  2345.  
  2346.   if ( lReturnCode != MMIO_SUCCESS )
  2347.      {
  2348.      ulrc = mmioGetLastError( pInstance->hmmio );
  2349.      PasteNotify( &FuncBlock, ulParam1, ulrc );
  2350.      return ( ulrc );
  2351.      }
  2352.  
  2353.  
  2354. ΓòÉΓòÉΓòÉ 4.7.3. Sync/Stream Operations ΓòÉΓòÉΓòÉ
  2355.  
  2356. The waveform audio MCD uses SPI functions to communicate with the Sync/Stream 
  2357. Manager (SSM) to prepare for data streaming, and to stream the data from the 
  2358. source location (the buffer) to the target location (the adapter). 
  2359.  
  2360.  
  2361. ΓòÉΓòÉΓòÉ 4.7.3.1. Preparing to Stream the Waveform Data ΓòÉΓòÉΓòÉ
  2362.  
  2363. When the waveform audio MCD receives a request to open a device, it issues 
  2364. SpiGetHandler and passes the names of the source and target stream handlers to 
  2365. the Sync/Stream Manager (SSM), so that it knows which stream handlers are going 
  2366. to stream the data.  Data streaming cannot begin until the SSM has this 
  2367. information. 
  2368.  
  2369.   /*********************************************************
  2370.   * Get 'A' stream Handler Handles for Source & target operations
  2371.   * The file system stream handler is the default 'A' handler
  2372.   * but the memory stream handler will be used for playlists.
  2373.   **********************************************************/
  2374.  
  2375.  
  2376.      if (ulrc = SpiGetHandler((PSZ)DEFAULT_SOURCE_HANDLER_NAME,
  2377.                                &hidASource,
  2378.                                &hidATarget))
  2379.         {
  2380.         return ( ulrc );
  2381.         }
  2382.  
  2383.  
  2384.   /***********************************************************
  2385.   * Get 'B' stream Handler Handles for Source & target operations
  2386.   * The audio stream handler is considered the B stream handler
  2387.   * since it will usually be the target.
  2388.   *************************************************************/
  2389.  
  2390.   ulrc = SpiGetHandler( (PSZ)DEFAULT_TARGET_HANDLER_NAME,
  2391.                         &hidBSource,
  2392.                         &hidBTarget);
  2393.  
  2394.   return ( ulrc );
  2395.  
  2396. After the waveform audio MCD gets its handler IDs, it must fill in the SPCBKEY 
  2397. data structure to tell the SSM what kind of data it is going to stream. 
  2398. SPCBKEY consists of three fields; the data type and two subdata types.  For 
  2399. example, it might tell the SSM, "I'm going to stream PCM data at 8 bits, 22 
  2400. kHz." 
  2401.  
  2402. Next, the waveform audio MCD must fill in the device control block (DCB) to 
  2403. tell the SSM which device is being streamed to (as shown in the following 
  2404. example. The DCB contains two essential items of information: 
  2405.  
  2406.    o  ASCII string device name 
  2407.    o  Device handle 
  2408.  
  2409.  The ASCII string device name is obtained from the INI file and passed down by 
  2410.  MDM.  The device handle is the system file number returned by the IOCtl when 
  2411.  the open to the device was done from AUDIOIF. 
  2412.  
  2413.      SysInfo.ulItem       = MCI_SYSINFO_QUERY_NAMES;
  2414.      SysInfo.usDeviceType  = LOUSHORT(ulDeviceType);
  2415.      SysInfo.pSysInfoParm = &QueryNameParm;
  2416.  
  2417.      itoa (HIUSHORT(ulDeviceType), szIndex, 10);
  2418.  
  2419.      szIndex[1] = '\0';
  2420.  
  2421.      strncat (szAmpMix, szIndex, 2);
  2422.      strcpy (QueryNameParm.szLogicalName, szAmpMix);
  2423.  
  2424.      if (rc = mciSendCommand (0,
  2425.                               MCI_SYSINFO,
  2426.                               MCI_SYSINFO_ITEM | MCI_WAIT,
  2427.                               (PVOID) &SysInfo,
  2428.                               0))
  2429.              return (rc);
  2430.  
  2431.  
  2432.  
  2433.  
  2434.      /*******************************************
  2435.      * Get PDD associated with our AmpMixer
  2436.      * Device name is in pSysInfoParm->szPDDName
  2437.      ********************************************/
  2438.  
  2439.      SysInfo.ulItem       = MCI_SYSINFO_QUERY_DRIVER;
  2440.      SysInfo.usDeviceType  = (USHORT) ulDeviceType;
  2441.      SysInfo.pSysInfoParm = &SysInfoParm;
  2442.  
  2443.      strcpy (SysInfoParm.szInstallName, QueryNameParm.szInstallName);
  2444.  
  2445.      if (rc = mciSendCommand (0,
  2446.                               MCI_SYSINFO,
  2447.                               MCI_SYSINFO_ITEM | MCI_WAIT,
  2448.                               (PVOID) &SysInfo,
  2449.                               0))
  2450.          return (rc);
  2451.  
  2452.      strcpy (szPDDName, SysInfoParm.szPDDName);
  2453.  
  2454.      return ( MCIERR_SUCCESS );
  2455.  
  2456.   } /* GetPDDName */
  2457.  
  2458.  
  2459. ΓòÉΓòÉΓòÉ 4.7.3.2. Creating the Stream ΓòÉΓòÉΓòÉ
  2460.  
  2461. After handler IDs are obtained and the SPCBKEY and DCB information is filled 
  2462. in, the MCD makes the call to SpiCreateStream.  At this point the two handlers 
  2463. are initiated to create their stream, buffers are allocated, and the stage is 
  2464. set for streaming. 
  2465.  
  2466. The following example code illustrates how to create the stream.  The caller 
  2467. supplies the source and target stream handlers and the audio device control 
  2468. block should have been filled in previously (see MCIOPEN.C). The caller also 
  2469. supplies the EventProc(edure) where all of the stream events will be reported. 
  2470.  
  2471.   ulrc = SpiCreateStream ( hidSrc,
  2472.                            hidTgt,
  2473.                            &pInstance->StreamInfo.SpcbKey,
  2474.                            (PDCB) &pInstance->StreamInfo.AudioDCB,
  2475.                            (PDCB) &pInstance->StreamInfo.AudioDCB,
  2476.                            (PIMPL_EVCB) &pInstance->StreamInfo.Evcb,
  2477.                            (PEVFN) EventProc,
  2478.                            (ULONG) NULL,
  2479.                            hStream,
  2480.                            &pInstance->StreamInfo.hEvent);
  2481.  
  2482. When the MCD creates a stream, it must register a callback handle with SSM. 
  2483. The callback handle is an entry point or function within the MCD code that 
  2484. processes events coming back from SSM during the streaming process.  The 
  2485. callback handle is a powerful mechanism because it frees the driver to do other 
  2486. work during the streaming process.  When an event occurs, SSM detects it and 
  2487. reports it to the callback address. 
  2488.  
  2489. The waveform audio MCD sample includes the following event routines: 
  2490.  
  2491.    o  RecordEventRoutine (ADMCRECD.C) as shown in the following example. 
  2492.  
  2493.    o  PlayEventRoutine (ADMCPLAY.C) as shown in the next example. 
  2494.  
  2495.   RC APIENTRY RecordEventRoutine ( MEVCB  *pevcb)
  2496.   {
  2497.     MTIME_EVCB        *pMTimeEVCB;    // Modified EVCB
  2498.     INSTANCE          *ulpInstance;   // Instance Ptr
  2499.  
  2500.     /***********************************************************
  2501.     * EventProc receives asynchronous SSM event notifications
  2502.     * When the event is received, the event semaphore is posted
  2503.     * which will wake up the MCD thread(s) blocked on this
  2504.     * semaphore.
  2505.     * The semaphore is not posted for time events like
  2506.     * cuepoint (TIME) and media position changes since they do
  2507.     * not alter the state of the stream.
  2508.     ************************************************************/
  2509.  
  2510.  
  2511.     switch (pevcb->evcb.ulType)
  2512.     {
  2513.     case EVENT_IMPLICIT_TYPE:
  2514.  
  2515.          /* Retrieve our instance from the EVCB */
  2516.  
  2517.          ulpInstance = (INSTANCE *)pevcb->ulpInstance;
  2518.  
  2519.          switch (pevcb->evcb.ulSubType)
  2520.          {
  2521.          case EVENT_ERROR:
  2522.               ulpInstance->StreamEvent = EVENT_ERROR;
  2523.  
  2524.               /****************************************
  2525.               * Check for playlist specific error first
  2526.               *****************************************/
  2527.  
  2528.               /**************************************
  2529.               * End of PlayList event is received
  2530.               * as an implicit error event. It
  2531.               * is treated as a normal EOS
  2532.               ***************************************/
  2533.               if (ulpInstance->usPlayLstStrm == TRUE)
  2534.                   if (pevcb->evcb.ulStatus == ERROR_END_OF_PLAYLIST)
  2535.                       ulpInstance->StreamInfo.Evcb.evcb.ulStatus =
  2536.                           MMIOERR_CANNOTWRITE;
  2537.  
  2538.               DosPostEventSem (ulpInstance->hEventSem);
  2539.              break;
  2540.  
  2541.          case EVENT_STREAM_STOPPED:
  2542.               /****************************************
  2543.               * Event Stream Stopped. Release the
  2544.               * Blocked thread
  2545.               *****************************************/
  2546.               ulpInstance->StreamEvent = EVENT_STREAM_STOPPED;
  2547.               DosPostEventSem (ulpInstance->hEventSem);
  2548.              break;
  2549.  
  2550.          case EVENT_SYNC_PREROLLED:
  2551.               /******************************************
  2552.               * This event is received in response to a
  2553.               * preroll start. A Preroll start is done
  2554.               * on an MCI_CUE message.
  2555.               *******************************************/
  2556.               ulpInstance->StreamEvent = EVENT_SYNC_PREROLLED;
  2557.               DosPostEventSem (ulpInstance->hEventSem);
  2558.              break;
  2559.   .
  2560.   .
  2561.   .
  2562.  
  2563.  The MEVCB structure in the RecordEventRoutine is a modified IMPL_EVCB which 
  2564.  SSM uses to report events (see the OS/2 Multimedia Programming Reference). 
  2565.  You can add additional fields to extend the EVCB structure.  For example, 
  2566.  MEVCB shown in the following example adds an instance pointer containing local 
  2567.  instance data.  When the Sync/Stream Manager calls the waveform audio MCD, it 
  2568.  allows the MCD to have access to the local instance data, which is tied to 
  2569.  that event. 
  2570.  
  2571.  The PlayEventRoutine shown in the following example is presumed to receive all 
  2572.  types of event notifications from SSM.  The types include implicit events and 
  2573.  cue point notifications in terms of both time and data.  In response to cue 
  2574.  point notifications a MCI_CUEPOINT message is returned to MDM by way of 
  2575.  mdmDriverNotify. 
  2576.  
  2577.   RC APIENTRY PlayEventRoutine ( MEVCB     *pevcb)
  2578.   {
  2579.     MTIME_EVCB        *pMTimeEVCB;      /* Modified Time EVCB*/
  2580.     INSTANCE          * ulpInstance;    /* Current Instance*/
  2581.     HWND              hWnd;             /* Callback Handle */
  2582.     BOOL              fPlayListDone = FALSE;
  2583.  
  2584.     /***********************************************************
  2585.     * EventProc receives asynchronous SSM event notifications
  2586.     * When the event is received, the event semaphore is posted
  2587.     * which will wake up the MCD thread(s) blocked on this
  2588.     * semaphore.
  2589.     * The semaphore is not posted for time events like
  2590.     * cuepoint (TIME) and media position changes since they do
  2591.     * not alter the state of the stream.
  2592.     ************************************************************/
  2593.  
  2594.     switch (pevcb->evcb.ulType)
  2595.     {
  2596.     case EVENT_IMPLICIT_TYPE:
  2597.  
  2598.          /* Retrieve our instance from the EVCB */
  2599.  
  2600.          ulpInstance = (INSTANCE *)pevcb->ulpInstance;
  2601.  
  2602.          /* Retrieve the callback handle to post messages on */
  2603.  
  2604.          hWnd = ulpInstance->hwndCallBack;
  2605.  
  2606.          switch (pevcb->evcb.ulSubType)
  2607.          {
  2608.          case EVENT_EOS:
  2609.               ulpInstance->StreamEvent = EVENT_EOS;
  2610.               DosPostEventSem (ulpInstance->hEventSem);
  2611.              break;
  2612.  
  2613.          case EVENT_STREAM_STOPPED:
  2614.               /* Self explanatory--someone stopped the stream */
  2615.  
  2616.               ulpInstance->StreamEvent = EVENT_STREAM_STOPPED;
  2617.               DosPostEventSem (ulpInstance->hEventSem);
  2618.              break;
  2619.  
  2620.          case EVENT_SYNC_PREROLLED:
  2621.               /******************************************
  2622.               * This event is received in response to a
  2623.               * preroll start. A Preroll start is done
  2624.               * on an MCI_CUE message.
  2625.               *******************************************/
  2626.  
  2627.               ulpInstance->StreamEvent = EVENT_SYNC_PREROLLED;
  2628.               DosPostEventSem (ulpInstance->hEventSem);
  2629.              break;
  2630.  
  2631.          case EVENT_PLAYLISTMESSAGE:
  2632.  
  2633.               /******************************************
  2634.               * We can receive this event if a playlist
  2635.               * parser hits the MESSAGE COMMAND.
  2636.               * NOTE: The MCD should return this message
  2637.               * with the callback handle specified on the
  2638.               * open.  This could be the source of much
  2639.               * grief if you return on the wrong handle.
  2640.               ******************************************/
  2641.  
  2642.               mdmDriverNotify ( ulpInstance->usWaveDeviceID,
  2643.                               ulpInstance->hwndOpenCallBack,
  2644.                               MM_MCIPLAYLISTMESSAGE,
  2645.                               (USHORT) MAKEULONG(pevcb->evcb.ulStatus,
  2646.                                   ulpInstance->usWaveDeviceID),
  2647.                               (ULONG) pevcb->evcb.unused1);
  2648.              break;
  2649.  
  2650.          case EVENT_PLAYLISTCUEPOINT:
  2651.  
  2652.               /************************************************
  2653.               * We can receive this event if a playlist
  2654.               * parser hits the CUEPOINT COMMAND opcode
  2655.               * in the playlist.  This differs from a "normal"
  2656.               * cuepoint because it is detected by the source,
  2657.               * rather than the target stream handler.
  2658.               ************************************************/
  2659.  
  2660.  
  2661.               mdmDriverNotify ( ulpInstance->usWaveDeviceID,
  2662.                                 ulpInstance->hwndOpenCallBack,
  2663.                                 MM_MCICUEPOINT,
  2664.                                 (USHORT) MAKEULONG(pevcb->evcb.ulStatus,
  2665.                                     ulpInstance->usWaveDeviceID),
  2666.                                 (ULONG) pevcb->evcb.unused1);
  2667.              break;
  2668.  
  2669.  
  2670.          } /* SubType case of Implicit Events */
  2671.         break;
  2672.  
  2673.     case EVENT_CUE_TIME_PAUSE:
  2674.          {
  2675.          /***************************************************
  2676.          * This event will arrive if we played to a certain
  2677.          * position in the stream.  Let the play thread know
  2678.          * that we have reached the desired point.
  2679.          ****************************************************/
  2680.  
  2681.          pMTimeEVCB = (MTIME_EVCB *)pevcb;
  2682.          ulpInstance = (INSTANCE *)pMTimeEVCB->ulpInstance;
  2683.          ulpInstance->StreamEvent = EVENT_CUE_TIME_PAUSE;
  2684.  
  2685.          DosPostEventSem (ulpInstance->hEventSem);
  2686.          }
  2687.          break;
  2688.  
  2689.     case EVENT_CUE_TIME:
  2690.  
  2691.          break;
  2692.  
  2693.     } /* All Events case */
  2694.  
  2695.     return (MCIERR_SUCCESS);
  2696.  
  2697.   } /* PlayEventProc */
  2698.  
  2699.  Events reported by SSM can be normal occurrences, such as an end-of-stream 
  2700.  because playback is complete, or the events can be abnormal occurrences, such 
  2701.  as an error returned during the streaming process.  The driver needs to know 
  2702.  about these events. 
  2703.  
  2704.  SSM reports two types of events: implicit and explicit.  Implicit events are 
  2705.  always reported.  When one occurs, the driver must receive the notification of 
  2706.  its occurrence from SSM, however, it does not have to take any action. 
  2707.  
  2708.  An explicit event is reported to the driver only when the driver requests to 
  2709.  be notified of the event's occurrence.  For example, the driver requests 
  2710.  cuepoint notifications. 
  2711.  
  2712.  
  2713. ΓòÉΓòÉΓòÉ 4.7.3.3. Event Processing ΓòÉΓòÉΓòÉ
  2714.  
  2715. Before the stream is created, you can enable event notification for implicit 
  2716. and explicit events using the SpiEnableEvent function. The following example 
  2717. specifies the EVENT_CUE_TIME_PAUSE flag, which will cause the stream to be 
  2718. paused when the cuepoint is reached.  When the stream reaches the event during 
  2719. a play or record, the audio stream handler signals the MCD.  Note that the 
  2720. stream is only paused (not stopped). 
  2721.  
  2722. RC CreateToEvent (INSTANCE *ulpInstance, ULONG ulTo)
  2723. {
  2724. /* rename this function CreateToEvent */
  2725.  
  2726.  
  2727.   ULONG ulrc;
  2728.  
  2729.   /*********************************************************
  2730.   * Set up a cue time pause event at the place in
  2731.   * the stream where the caller wants us to play/record
  2732.   * to.  Note: this event will pause the stream and
  2733.   * will be considerably more accurate than just
  2734.   * setting a cue point, receiving the event and stopping
  2735.   * the stream (since a normal cue point will force
  2736.   * bleed over).
  2737.   *********************************************************/
  2738.  
  2739.   ulpInstance->StreamInfo.TimeEvcb.hwndCallback
  2740.        = ulpInstance->hwndCallBack;
  2741.   ulpInstance->StreamInfo.TimeEvcb.usDeviceID
  2742.        = ulpInstance->usWaveDeviceID;
  2743.   ulpInstance->StreamInfo.TimeEvcb.evcb.ulType
  2744.       = EVENT_CUE_TIME_PAUSE;
  2745.   ulpInstance->StreamInfo.TimeEvcb.evcb.ulFlags
  2746.       = EVENT_SINGLE;
  2747.   ulpInstance->StreamInfo.TimeEvcb.evcb.hstream
  2748.       = ulpInstance->StreamInfo.hStream;
  2749.   ulpInstance->StreamInfo.TimeEvcb.ulpInstance
  2750.       = (ULONG) ulpInstance;
  2751.   ulpInstance->StreamInfo.TimeEvcb.evcb.mmtimeStream = ulTo;
  2752.  
  2753.   /* Enable the cue time pause event. */
  2754.  
  2755.   ulrc = SpiEnableEvent((PEVCB) &ulpInstance->StreamInfo.TimeEvcb.evcb,
  2756.                         (PHEVENT) &ulpInstance->StreamInfo.hPlayToEvent);
  2757.  
  2758.   return ( ulrc );
  2759.  
  2760. } /* CreateToEvent */
  2761.  
  2762. If you enable event notification for a particular event, it is equally 
  2763. important to remove the event handle for the event so it is not used by 
  2764. subsequent commands.  When any given event is reported, it must be removed 
  2765. explicitly using the SpiDisableEvent function.  Once an event is removed from 
  2766. the system, the event no longer is detected or reported to the application or 
  2767. MCD. 
  2768.  
  2769.      SpiDisableEvent(ulpInstance->StreamInfo.hPlayToEvent);
  2770.  
  2771.  
  2772. ΓòÉΓòÉΓòÉ 4.7.3.4. Associating a Stream ΓòÉΓòÉΓòÉ
  2773.  
  2774. After a stream is created, and before it is possible to start the stream, it is 
  2775. necessary to make sure that a data resource (or stream object) is identified 
  2776. for use with the stream. The following example shows an example of a stream 
  2777. being associated with an MMIO file handle.  The file system stream handler 
  2778. (FSSH) will always be the stream handler that we want to associate the data 
  2779. object with, therefore, if we have created a playback stream then FSSH is the 
  2780. source, so associate with the source.  On a record stream, FSSH is the target, 
  2781. so associate with the target. 
  2782.  
  2783.   if (Operation == PLAY_STREAM)
  2784.       {
  2785.  
  2786.       ulrc = SpiAssociate ( (HSTREAM)*hStream,
  2787.                             hidSrc,
  2788.                             (PVOID) &pInstance->StreamInfo.acbmmio);
  2789.  
  2790.       }  /* Associating play stream */
  2791.  
  2792.  
  2793. ΓòÉΓòÉΓòÉ 4.7.3.5. Reassociating the Stream on MCI_LOAD ΓòÉΓòÉΓòÉ
  2794.  
  2795. Typically, a stream is destroyed, recreated, and then associated with a new 
  2796. file.  However, you can bypass these steps and reassociate a new file with an 
  2797. existing stream as long as the file is of the same data type as the stream was 
  2798. created to handle.  For example, in the case of waveaudio, if you had a 16-bit 
  2799. 11KB WAVE stream, the file you want to associate with the stream must be of the 
  2800. same data type and sub type. 
  2801.  
  2802. Note that only one data object may be associated with a stream once the stream 
  2803. is created, and it is specific to a particular stream handler (source or 
  2804. target).  Associations may be changed, but the stream cannot be active; it must 
  2805. be stopped first (discard stop, flush stop, or EOS). 
  2806.  
  2807. /*************************************************
  2808. * Reassociate The Stream Handlers with the new
  2809. * stream object if the stream has been created
  2810. * in the correct direction already.
  2811. *************************************************/
  2812. if (ulpInstance->ulCreateFlag == PREROLL_STATE)
  2813.     {
  2814.     /*********************************************
  2815.     * Fill in Associate Control Block Info for
  2816.     * file system stream handler (FSSH).  FSSH will
  2817.     * use the mmio handle we are associating to
  2818.     * stream information.
  2819.     *********************************************/
  2820.     ulpInstance->StreamInfo.acbmmio.ulObjType = ACBTYPE_MMIO;
  2821.     ulpInstance->StreamInfo.acbmmio.ulACBLen = sizeof (ACB_MMIO);
  2822.     ulpInstance->StreamInfo.acbmmio.hmmio = ulpInstance->hmmio;
  2823.  
  2824.     /***********************************************
  2825.     * Associate FileSystem as source if Playing. Note
  2826.     * the association is always done with the file
  2827.     * system stream handler since it is involved with
  2828.     * mmio operations.  If you try this with the
  2829.     * audio stream handler, you will get invalid
  2830.     * handle back.
  2831.     ***********************************************/
  2832.  
  2833.     if (AMPMIX.ulOperation == OPERATION_PLAY)
  2834.        {
  2835.        ulrc = SpiAssociate ( ulpInstance->StreamInfo.hStream,
  2836.                              ulpInstance->StreamInfo.hidASource,
  2837.                              (PVOID) &ulpInstance->StreamInfo.acbmmio );
  2838.        }
  2839.     /***********************************************
  2840.     * Associate FileSystem as target if recording
  2841.     ***********************************************/
  2842.  
  2843.     else
  2844.        {
  2845.        ulrc = SpiAssociate ( ulpInstance->StreamInfo.hStream,
  2846.                              ulpInstance->StreamInfo.hidATarget,
  2847.                              (PVOID) &ulpInstance->StreamInfo.acbmmio );
  2848.  
  2849.        } /* else we are in record mode */
  2850.  
  2851.  
  2852. ΓòÉΓòÉΓòÉ 4.7.3.6. Prerolling the Stream - Performance Considerations ΓòÉΓòÉΓòÉ
  2853.  
  2854. Prerolling a stream allows the source stream handlers to start and fill the 
  2855. buffers.  An application can then start the streams for better real-time 
  2856. response and initial synchronization of streams.  This is accomplished by the 
  2857. SpiStartStream function with the SPI_START_PREROLL flag. 
  2858.  
  2859. However, if a stream is already paused (STOP_PAUSED), the stream is already 
  2860. cued so there is no need to call SpiStartStream to refill the buffers. The 
  2861. following example illustrates how to check to see if a stream is in a paused 
  2862. state. 
  2863.  
  2864.   /************************************
  2865.   * If the stream is paused, there is no
  2866.   * sense in cueing it since the buffers
  2867.   * are full anyway
  2868.   **************************************/
  2869.  
  2870.   if ( STRMSTATE == MCI_PAUSE  ||
  2871.        STRMSTATE == STOP_PAUSED )
  2872.  
  2873.       {
  2874.       /***********************************************
  2875.       ** If the stream is going the right way
  2876.       ** then we have the ability to avoid the cue
  2877.       ** since the buffers have been filled up before
  2878.       ** we did the pause
  2879.       **********************************************/
  2880.  
  2881.       if ( AMPMIX.ulOperation == OPERATION_RECORD &&
  2882.            fCueInput )
  2883.          {
  2884.          ulpInstance->ulCreateFlag = PREROLL_STATE;
  2885.          STRMSTATE = CUERECD_STATE;
  2886.          return ( MCIERR_SUCCESS );
  2887.          }
  2888.  
  2889.       /*************************************************
  2890.       * If the current stream is cued for playback and
  2891.       * we have a cue_output request, our work is done
  2892.       **************************************************/
  2893.  
  2894.       else if ( AMPMIX.ulOperation == OPERATION_PLAY &&
  2895.                 fCueOutput )
  2896.          {
  2897.  
  2898.          ulpInstance->ulCreateFlag = PREROLL_STATE;
  2899.          STRMSTATE = CUEPLAY_STATE;
  2900.          return ( MCIERR_SUCCESS );
  2901.          }
  2902.  
  2903.       }   /* If the stream may be in cue state */
  2904.  
  2905.  
  2906. ΓòÉΓòÉΓòÉ 4.7.4. Waveform Audio MCD Modules ΓòÉΓòÉΓòÉ
  2907.  
  2908. The following figure illustrates the outline of the waveform audio media 
  2909. control driver (AUDIOMCT.DLL). 
  2910.  
  2911.  
  2912. ΓòÉΓòÉΓòÉ 4.7.4.1. Waveform Audio Media Control Driver DLL (AUDIOMCT.DLL) ΓòÉΓòÉΓòÉ
  2913.  
  2914. Following describes the files and messages that are processed in in the 
  2915. AUDIOMCT.DLL. 
  2916.  
  2917.  File             Description 
  2918.  
  2919.  ADMCOPEN.C       Processes the MCI_OPEN message.  On an MCI_OPEN, a streaming 
  2920.                   MCD should perform the following actions: 
  2921.  
  2922.                                     1. Check flags and validate pointers.
  2923.                                     2. Get default values from the INI files (if necessary).
  2924.                                     3. Process MCI_OPEN_PLAYLIST (if supported).
  2925.                                     4. Process MCI_OPEN_MMIO (if supported).
  2926.                                     5. Process MCI_OPEN_ELEMENT (if supported).
  2927.                                     6. Connect to the amp/mixer.
  2928.                                     7. Get the stream protocol key (if necessary).
  2929.  
  2930.  LOADSUBS.C       Provides various utility functions used by MCI_OPEN and 
  2931.                   MCI_LOAD including: 
  2932.  
  2933.                                     1. Creating temporary filenames (CheckForValidElement)
  2934.                                     2. Aborting in process commands (LoadAbortNotify)
  2935.                                     3. Processing the OPEN_MMIO flag (OpenHandle)
  2936.                                     4. Rational as to when to open the card in record or playback mode (OpenHandle) (ProcessElement).
  2937.                                     5. Processing temp files (ProcessElement).
  2938.                                     6. Opening a file with MMIO (ProcessElement).
  2939.                                     7. Processing the MCI_READ_ONLY flag (ProcessElement).
  2940.                                     8. Creating a temporary file ( SetupTempFiles).
  2941.                                     9. Using mmioSendMessage API to talk to an IOProc (SetupTempFiles).
  2942.                                     10.Retrieving a connection and opening the connected device.
  2943.                                     11.Stream Handler Setup (StreamSetup)
  2944.                                     12.Processing MCI_NOTIFY or MCI_WAIT and callback handles (NotifyWaitSet up).
  2945.  
  2946.  AUDIOMCD.C       Processes the MCIDRV_RESTORE message.  A streaming MCD will 
  2947.                   receive a restore message when it regains control of the 
  2948.                   device they are attached to (for example, someone quit 
  2949.                   another application causing us to gain use of the device). 
  2950.                   On a restore, the MCD should check to see if it is in a 
  2951.                   paused state.  If so, resume the stream. 
  2952.  
  2953.                   Processes the MCIDRV_SAVE message.  A streaming MCD will 
  2954.                   receive a save message when it loses control of the device it 
  2955.                   is attached to (for example, someone started another 
  2956.                   application which takes over the waveaudio device).  On a 
  2957.                   save, the MCD should check to see if the MCD is currently 
  2958.                   streaming (either record or playback).  If so, pause the 
  2959.                   stream, and set a flag stating that the MCD was saved. 
  2960.  
  2961.  ADMCLOAD.C       Processes the MCI_LOAD message.  This file illustrates the 
  2962.                   following concepts: 
  2963.  
  2964.                                     1. How to check flags on a load.
  2965.                                     2. How to stop any commands which are in process.
  2966.                                     3. Why cuepoints/positionadvises need to be turned off on a MCI_LOAD.
  2967.                                     4. Handling OPEN_MMIO on an MCI_LOAD.
  2968.                                     5. Why reassociation of a stream on MCI_LOAD is desirable and
  2969.                                       when it is appropriate.
  2970.  
  2971.  ADMCCAP.C        Processes the MCI_GETDEVCAPS message.  This file illustrates 
  2972.                   several concepts used to handle MCI_GETDEVCAPS including: 
  2973.  
  2974.                                     1. How to process the capability message commands.
  2975.                                       These are messages which this MCD supports (such as play, close etc.)
  2976.                                       Messages (or commands to the caller) such as sysinfo are
  2977.                                       not supported by this MCD.
  2978.                                     2. How to process the capability item flag.
  2979.                                       Items describe particular features (such as the ability to record)
  2980.                                       which the MCD either does or does not support.
  2981.  
  2982.  ADMCSTAT.C       Processes the MCI_STATUS message.  This file illustrates 
  2983.                   several concepts used to handle MCI_STATUS including: 
  2984.  
  2985.                                     1. When/If to report media position within a stream.
  2986.                                     2. How to determine the length of an existing file.
  2987.                                     3. How to determine the length of a file which is currently
  2988.                                       being recorded.
  2989.                                     4. Communicating with the amp/mixer to determine volume,
  2990.                                       and other amplifier specific commands.
  2991.                                     5. Reporting our current mode.
  2992.                                     6. Reporting the current time format.
  2993.  
  2994.  ADMCCUE.C        Processes the MCI_CUE message.  Applications will typically 
  2995.                   call MCI_CUE in order to reduce the time required to begin 
  2996.                   the initial record or play.  To a streaming MCD, MCI_CUE 
  2997.                   translates to an SPI_START_PREROLL.  The start preroll will 
  2998.                   fill up all of the initial streaming buffers but will not 
  2999.                   start the stream. Then, when MCI_PLAY or MCI_RECORD are 
  3000.                   called, when they do an SpiStartStream then stream can start 
  3001.                   immediately. 
  3002.  
  3003.                   On an MCI_CUE, a streaming MCD should perform the following 
  3004.                   actions: 
  3005.  
  3006.                                     1. Check flags and validate pointers.
  3007.                                     2. Check to see if the stream is already in cue state.  If it is, then
  3008.                                       just return success.
  3009.                                     3. If the caller wants to cue for output, execute the following:
  3010.                                       a. stop any in process commands.
  3011.                                       b. If the stream is going in the wrong direction (that is, record),
  3012.                                        destroy it.
  3013.                                       c. Create the stream if necessary.
  3014.                                       d. Preroll start the stream.
  3015.  
  3016.                                     4. If the caller wants to cue for input, execute the following:
  3017.                                       a. Stop any in process commands.
  3018.                                       b. If the stream is going in the wrong direction, destroy it.
  3019.                                       c. Create the stream if necessary.
  3020.                                       d. Preroll start the stream.
  3021.  
  3022.                   Processes the MCI_SET_CUEPOINT message.  On a 
  3023.                   MCI_SET_CUEPOINT, a streaming MCD should perform the 
  3024.                   following actions: 
  3025.  
  3026.                                     1. Check flags and validate pointers.
  3027.                                     2. Turn the cuepoint on or off depending on what flags are passed in.
  3028.  
  3029.  ADMCSEEK.C       Processes the MCI_SEEK message.  On a seek, a streaming MCD 
  3030.                   should perform the following actions: 
  3031.  
  3032.                                     1. Verify that the flags passed are valid.
  3033.                                     2. Verify the MCI_FROM, MCI_TO parameter if they were passed in.
  3034.                                     3. Ensure that any pointers passed are valid.
  3035.                                     4. Stop any commands which are active on another thread.
  3036.                                     5. If no stream has been created, then create one.
  3037.                                     6. If a stream had previously been created, ensure that it is in
  3038.                                       stopped state.
  3039.  
  3040.  ADMCPLAY.C       Processes the MCI_PLAY message.  On a MCI_PLAY, a streaming 
  3041.                   MCD should perform the following actions: 
  3042.  
  3043.                                     1. Always check flags and validate memory first.  This way,
  3044.                                       if the flags are invalid, the previous command will not be interrupted.
  3045.                                     2. If there is a command active on another thread (that is, a play,
  3046.                                       record or save), then either abort (record or save) or supersede
  3047.                                       (play) by stopping the stream and sending a message to the caller.
  3048.                                     3. If the stream is going the wrong way (for example,
  3049.                                       it is set up for recording) then destroy the stream.
  3050.                                     4. If no stream has been created, then create one.  If the stream handler
  3051.                                       needs to associate a data object, do it here.
  3052.                                     5. If we destroyed a recording stream before creating the play back stream,
  3053.                                       ensure that playback stream has the same position as the previous
  3054.                                       record stream.
  3055.                                     6. Enable any events (such as cuepoints or position advises).
  3056.                                     7. Start stream.
  3057.                                     8. Wait for a streaming event.
  3058.                                     9. Stop the stream if necessary.
  3059.                                     10.If MCI_NOTIFY was sent used, inform the caller of command completion.
  3060.  
  3061.  ADMCRECD.C       Processes the MCI_RECORD message.  On a MCI_RECORD, a 
  3062.                   streaming MCD should perform the following actions: 
  3063.  
  3064.                                     1. Always check flags and validate memory first.  This way, if the flags
  3065.                                       are invalid, the previous command will not be interrupted.
  3066.                                     2. If there is a command active on another thread (that is,
  3067.                                       a play, record or save), then either abort (play or save)
  3068.                                       or supersede (record) by stopping the stream and sending
  3069.                                       a message to the caller.
  3070.                                     3. If the stream is going the wrong way (for example,
  3071.                                       it is setup for playback) then destroy the stream.
  3072.                                     4. If no stream has been created, then create one.  If the stream handler
  3073.                                       needs to associate a data object, do it here.
  3074.                                     5. If we destroyed a play back stream before creating the record stream,
  3075.                                       seek to the same position in the record stream where the play back
  3076.                                       stream was.
  3077.                                     6. Enable any events (such as cuepoints or position advises).
  3078.                                     7. Start stream.
  3079.                                     8. Wait for a streaming event.
  3080.                                     9. Stop the stream if necessary.
  3081.                                     10.If MCI_NOTIFY was sent used, inform the caller of command completion.
  3082.  
  3083.  ADMCCLOS.C       Processes the MCI_CLOSE message.  On a close, a streaming MCD 
  3084.                   must perform the following actions: 
  3085.  
  3086.                                     1. Stop all commands which are active on another thread(s).
  3087.                                     2. Destroy all active streams.
  3088.                                     3. Close all open files.
  3089.                                     4. Delete any temporary files.
  3090.                                     5. Close any connected devices (such as an amp-mixer).
  3091.                                     6. If MCI_NOTIFY was used, notify the caller of completion.
  3092.  
  3093.  ADMCCONN.C       Processes the MCI_CONNECTOR message.  This source file 
  3094.                   illustrates how to enable, disable and query connectors.  It 
  3095.                   also illustrates how to pass messages on to a connected MCD. 
  3096.  
  3097.  ADMCREST.C       Processes the MCI_STOP message.  On a stop, a streaming MCD 
  3098.                   should perform the following actions: 
  3099.  
  3100.                                     1. Verify that the flags passed are valid.
  3101.                                     2. Stop any commands which are active on another thread.
  3102.                                     3. If a stream had previously been created, ensure that it is in
  3103.                                       stopped state.
  3104.                                     4. If it is a paused stream, then do a STOP_PAUSE to ensure that
  3105.                                       no data will be lost.
  3106.  
  3107.                   Processes the MCI_RESUME message.  On a MCI_RESUME, a 
  3108.                   streaming MCD should perform the following actions: 
  3109.  
  3110.                                     1. Ensure that no flags are passed in.
  3111.                                     2. If we are paused, resume the stream.
  3112.  
  3113.                   Processes the MCI_SETPOSITIONADVISE message.  To a streaming 
  3114.                   MCD, a position advise simply is a cuepoint which reoccurs 
  3115.                   every x time units.  To enable position advise, the following 
  3116.                   steps should be followed: 
  3117.  
  3118.                                     1. Check flags and validate and pointers.
  3119.                                     2. If the caller has asked for position advise to be turned on then
  3120.                                       a. If a stream has been created, then enable the recurring cuepoint
  3121.                                        event.
  3122.                                       b. Else, set a flag and enable the event later.
  3123.                                     3. If position advise is to be turned off, then disable the recurring
  3124.                                       cuepoint event.
  3125.  
  3126.                   Processes the MCI_PAUSE message.  On a MCI_PAUSE, a streaming 
  3127.                   MCD should perform the following actions: 
  3128.  
  3129.                                     1. Ensure that no flags are passed in.
  3130.                                     2. If we are currently streaming, pause the stream.
  3131.                                     3. Set flag indicating that we are in paused state.
  3132.  
  3133.  ADMCSAVE.C       Processes the MCI_SAVE message.  MCI_SAVE is not a required 
  3134.                   command, however, if a streaming MCD takes advantage of 
  3135.                   temporary files, then it should use MCI_SAVE. 
  3136.  
  3137.                                     1. Ensure that the flags are valid.
  3138.                                     2. Then ensure that all pointers point to valid memory.
  3139.                                     3. If any operations are currently active, they are then
  3140.                                       aborted.
  3141.                                     4. Finally, the save operation itself is then done.
  3142.  
  3143.  AUDIOSUB.C       Contains various utility functions including: 
  3144.  
  3145.                                     1. Correct processing of notifications.
  3146.                                     2. Handling calls the are neither MCI_WAIT or MCI_NOTIFY (PostMDMMessage).
  3147.                                     3. Using mmioGetHeader to obtain audio settings from a file (GetHeader).
  3148.                                     4. Creating a playlist stream (AssociatePlaylist).
  3149.                                     5. Installing an IOProc (InstallIOProc).
  3150.                                     6. Communicating with IOProcs with different capabilites (OpenFile).
  3151.                                     7. Processing audio files with various file formats (OpenFile).
  3152.                                     8. Time format conversion (ConvertToMM + ConvertTimeFormat).
  3153.                                     9. Creating an SPI stream (CreateNAssociateStream)
  3154.                                     10.Associating an SPI stream (CreateNAssociateStream)
  3155.                                     11.Setting an event for use in play to/record to (DoTillEvent).
  3156.  
  3157.  ADMCPST.C        Processes the MCI_PASTE message.  This file illustrates using 
  3158.                   MMIO functions and clipboard functions to: 
  3159.  
  3160.                                     1. Process the MCI_FROM_BUFFER flag or MCI_TO_BUFFER.
  3161.                                     2. Handle default positioning if no MCI_FROM/MCI_TO flags are
  3162.                                       passed
  3163.                                     3. Use MMIO to insert information into a file.
  3164.  
  3165.  ADMCCOPY.C       Processes the MCI_COPY, MCI_DELETE, MCI_CUT, MCI_UNDO and 
  3166.                   MCI_REDO messages.  It is a generic routine which handles 
  3167.                   placing information into the clipboard: 
  3168.  
  3169.                                     1. Default positioning for cut/copy/delete messages.
  3170.                                     2. Using MMIOM_DELETE to remove information from a file.
  3171.                                     3. Positioning after a cut/copy/delete
  3172.                                     4. Using MMIOM_UNDO and MMIOM_REDO messages.
  3173.  
  3174.  ADMCEDIT.C       Contains utilities used by clipboard functions (such as cut 
  3175.                   and copy).  The file illustrates: 
  3176.  
  3177.                                     1. How to Process MCI_FROM / MCI_TO for edit operations (CheckEditFlags) .
  3178.                                     2. Determine default from/to positions.
  3179.                                     3. Generic stream abort routine
  3180.                                     4. Retrieving information from the clipboard.
  3181.                                     5. Placing information into the clipboard.
  3182.                                     6. Using MMIO memory files to manipulate clipboard data.
  3183.  
  3184.  ADMCINI.C        Illustrates how to parse device specific parms from the INI 
  3185.                   file. 
  3186.  
  3187.  STRMSUBS.C       Contains streaming subroutines used by play, record and cue. 
  3188.  
  3189.                                     1. How to close mmio files, and temp files (CloseFile).
  3190.                                     2. How to stop a record/playback stream (StopStream).
  3191.                                     3. How to use a semaphore to protect in progress commands
  3192.                                       from being aborted in sensitive areas.
  3193.                                     4. Why a stream must be destroyed after an MCI_SET (DestroySetStream).
  3194.                                     5. How to handle superseding and aborting of notifies.
  3195.                                     6. How and why to set a cue time pause event for
  3196.                                       MCI_TO (ProcessFromToFlags).
  3197.                                     7. How to enable cuepoints and positionchanges (EnableEvents).
  3198.                                     8. Networking functions (BeginQualityOfService, EndQualityOfService)
  3199.  
  3200.  
  3201. ΓòÉΓòÉΓòÉ 4.8. Controlling a Nonstreaming Device: CD Audio MCD ΓòÉΓòÉΓòÉ
  3202.  
  3203. The CD audio MCD controls a nonstreaming device: the CD-ROM drive.  Because it 
  3204. is a nonstreaming device, the CD-ROM drive does not require buffered I/O for 
  3205. streaming by the sync/stream manager.  Instead, it plays audio out through its 
  3206. internal Digital-to-Analog Converter (DAC), which is the nonstreaming device 
  3207. equivalent of an audio adapter. Thus, the CD audio MCD must use the IOCtl 
  3208. interface to process its own commands to manipulate the data stream within the 
  3209. device. 
  3210.  
  3211. The modules of the CD audio MCD are shown in the following figure. 
  3212.  
  3213.  
  3214. ΓòÉΓòÉΓòÉ 4.8.1. Setting Audio Attributes ΓòÉΓòÉΓòÉ
  3215.  
  3216. Because the CD-ROM drive is a nonstreaming device, the CD audio MCD is not 
  3217. linked to the amp mixer.  This means the driver must do its own processing of 
  3218. MCI_SET commands that set audio attributes such as volume changes, using the 
  3219. IOCtl interface. 
  3220.  
  3221.  
  3222. ΓòÉΓòÉΓòÉ 4.8.2. Processing an MCI_PLAY Command ΓòÉΓòÉΓòÉ
  3223.  
  3224. The CD audio MCD receives commands by means of the mciDriverEntry point, same 
  3225. as the waveform audio MCD.  The command is passed to the vendor-specific driver 
  3226. (VSD) module. 
  3227.  
  3228. To see how the CD audio MCD processes these commands, let's trace the 
  3229. processing of an MCI_PLAY command.  To begin with, the vsdDriverEntry function 
  3230. makes a call to process_msg, passing the message and message parameters as 
  3231. shown in the following example. 
  3232.  
  3233. ULONG APIENTRY vsdDriverEntry(PVOID pInstance, USHORT usMessage,
  3234.                               ULONG *pulParam1, PVOID pParam2,
  3235.                               USHORT usUserParm)
  3236. {
  3237.    ULONG  rc, ulP1Temp = MCI_WAIT;
  3238.    USHORT try = 1;
  3239.  
  3240.    if (pulParam1 == 0L)
  3241.       pulParam1 = &ulP1Temp;
  3242.  
  3243.    /* check to see if the drive is open, unless it is an Open message */
  3244.    if (usMessage == MCI_OPEN)
  3245.       rc = CDAudOpen(*pulParam1, (MMDRV_OPEN_PARMS *)pParam2);
  3246.    else
  3247.    {
  3248.       /* if the device is closed try reopening it unless you are closing */
  3249.       if (((PINST) lpInstance)->hDrive == 0 && usMessage != MCI_CLOSE)
  3250.       {
  3251.          rc = CD01_Open((PINST) lpInstance);
  3252.          /* Clear commands not needing an open hardware device */
  3253.          if (rc == MCIERR_DEVICE_NOT_READY)
  3254.             if ((usMessage == MCI_DEVICESETTINGS) ||
  3255.                 (usMessage == MCI_GETDEVCAPS) ||
  3256.                 (usMessage == MCI_INFO) ||
  3257.                 (usMessage == MCIDRV_REGISTER_DRIVE) ||
  3258.                 (usMessage == MCI_SET_CUEPOINT) ||
  3259.                 (usMessage == MCI_SET_POSITION_ADVISE) ||
  3260.                 (usMessage == MCIDRV_CD_STATUS_CVOL) ||
  3261.                 (usMessage == MCIDRV_SYNC &&
  3262.                    !(*pulParam1 & MCIDRV_SYNC_REC_PULSE)))
  3263.                rc = MCIERR_SUCCESS;
  3264.  
  3265.       }  /* of if drive needs to be open */
  3266.       else      /* drive was opened */
  3267.          rc = MCIERR_SUCCESS;
  3268.  
  3269.       if (!rc)
  3270.          do
  3271.          {
  3272.             /* process message */
  3273.             rc = process_msg((PINST) lpInstance, usMessage,
  3274.                              pulParam1, pParam2, usUserParm);
  3275.             if (rc == MCIERR_DEVICE_NOT_READY ||       /* ERROR RECOVERY */
  3276.                 rc == MCIERR_MEDIA_CHANGED)
  3277.             {
  3278.                if (((PINST)lpInstance)->Drive == '0') /* drive is closed */
  3279.                {                               /* do not reissue commands */
  3280.                   rc = MCIERR_SUCCESS;
  3281.                   break;
  3282.                }
  3283.                else
  3284.                   if (try == 2)
  3285.                      break;                    /* quit after 2 tries. */
  3286.                   else
  3287.                   {
  3288.                      rc = CDAudErrRecov((PINST) lpInstance);
  3289.                      if (rc)               /* error is still there, exit */
  3290.                         break;
  3291.                      else
  3292.                         try++;
  3293.                   }  /* of else only tried the command once (try == 1) */
  3294.  
  3295.             }  /* of if the drive was not ready */
  3296.             else
  3297.                break;                          /* clear flag to exit */
  3298.  
  3299.          } while (try);  /* end of do loop and if no open error */
  3300.  
  3301.    } /* of else command was not MCI_OPEN */
  3302.  
  3303.    return(rc);
  3304.  
  3305. }  /* of vsdDriverEntry() */
  3306.  
  3307. The process_msg routine has a long case statement.  The case in which we are 
  3308. interested is for MCI_PLAY.  When process_msg calls CD01_Play, it passes the 
  3309. following information: 
  3310.  
  3311.    o  Instance 
  3312.    o  msgParam1 
  3313.    o  FROM value received from msgParam2 
  3314.    o  TO value received from msgParam2 
  3315.    o  MCI_PLAY command. 
  3316.  
  3317.   static ULONG process_msg(PINST pInst, USHORT usMessage,
  3318.                           ULONG *pulParam1, PVOID pParam2, USHORT usUserParm)
  3319.   {
  3320.      ULONG rc;
  3321.  
  3322.      DosRequestMutexSem(pInst->hInstSem, WAIT_FOREVER);
  3323.      if (usMessage != MCI_PLAY)
  3324.         DosReleaseMutexSem(pInst->hInstSem);       // No protection needed
  3325.  
  3326.      /* process message */
  3327.      switch(usMessage)
  3328.      {
  3329.         case MCI_CLOSE :
  3330.            rc = CDAudClose(pInst, *pulParam1);
  3331.            break;
  3332.         case MCI_CUE :                         /* Pre-roll */
  3333.            rc = CD01_Cue(pInst);
  3334.            break;
  3335.         case MCI_GETDEVCAPS :                  /* Get Device Capabilities */
  3336.            rc = CD01_GetCaps(*pulParam1, (MCI_GETDEVCAPS_PARMS *)pParam2);
  3337.            break;
  3338.         case MCI_GETTOC :                        /* Get Table of Contents */
  3339.            if (*pulParam1 & WAIT_NOTIFY_MASK)
  3340.               rc = MCIERR_INVALID_FLAG;
  3341.            else
  3342.               rc = CD01_GetTOC(pInst, (MCI_TOC_PARMS *)pParam2);
  3343.            break;
  3344.         case MCI_INFO :
  3345.            rc = CDAudInfo(pInst, *pulParam1, (MCI_INFO_PARMS *)pParam2);
  3346.            break;
  3347.         /* case MCI_OPEN :     open was already done in vsdDriverEntry() */
  3348.  
  3349.         case MCI_PAUSE :
  3350.            rc = CD01_Stop(pInst, TIMER_PLAY_SUSPEND);
  3351.            break;
  3352.         case MCI_PLAY :
  3353.            rc = CD01_Play(pInst, pulParam1,
  3354.                           ((MCI_PLAY_PARMS *)pParam2)->ulFrom,
  3355.                           ((MCI_PLAY_PARMS *)pParam2)->ulTo, usUserParm,
  3356.                           ((MCI_PLAY_PARMS *)pParam2)->hwndCallback);
  3357.            break;
  3358.         case MCIDRV_REGISTER_DISC :                  /* Register Disc */
  3359.            rc = CDAudRegDisc(pInst, REG_BOTH, (MCI_CD_REGDISC_PARMS *)
  3360.              pParam2);
  3361.            break;
  3362.         case MCIDRV_REGISTER_DRIVE :                 /* Register Drive */
  3363.            rc = CDAudRegDrive(pInst, (MCI_CD_REGDRIVE_PARMS *)pParam2);
  3364.            break;
  3365.         case MCIDRV_REGISTER_TRACKS :                /* Register Tracks */
  3366.            rc = CD01_RegTracks(pInst, (MCI_CD_REGTRACKS_PARMS *)pParam2);
  3367.            break;
  3368.         case MCIDRV_RESTORE :
  3369.            rc = CD01_Restore(pInst, (MCIDRV_CD_SAVE_PARMS *)pParam2);
  3370.            break;
  3371.         case MCI_RESUME :                            /* Unpause */
  3372.            rc = CD01_Resume(pInst);
  3373.            break;
  3374.         case MCIDRV_SAVE :
  3375.            rc = CD01_Save(pInst, (MCIDRV_CD_SAVE_PARMS *)pParam2);
  3376.            break;
  3377.         case MCI_SEEK :
  3378.            rc = CD01_Seek(pInst, ((MCI_SEEK_PARMS *)pParam2)->ulTo);
  3379.            break;
  3380.         case MCI_SET :
  3381.            rc = CDAudSet(pInst, pulParam1, (MCI_SET_PARMS *)pParam2);
  3382.            break;
  3383.         case MCI_SET_CUEPOINT :
  3384.            rc = CD01_CuePoint(pInst, *pulParam1, (MCI_CUEPOINT_PARMS *)
  3385.               pParam2);
  3386.            break;
  3387.         case MCI_SET_POSITION_ADVISE :
  3388.            rc = CD01_PosAdvise(pInst, *pulParam1, (MCI_POSITION_PARMS *)
  3389.               pParam2);
  3390.            break;
  3391.         case MCIDRV_CD_SET_VERIFY :
  3392.            rc = CDAudSetVerify(*pulParam1);
  3393.            break;
  3394.         case MCI_STATUS :
  3395.            rc = CDAudStatus(pInst, *pulParam1, (MCI_STATUS_PARMS *)pParam2);
  3396.            break;
  3397.         case MCIDRV_CD_STATUS_CVOL :
  3398.            rc = CDAudStatCVol(&((MCI_STATUS_PARMS *)pParam2)->ulReturn);
  3399.            break;
  3400.         case MCI_STOP :
  3401.            rc = CD01_Stop(pInst, TIMER_EXIT_ABORTED);
  3402.            break;
  3403.         case MCIDRV_SYNC :
  3404.            rc = CD01_Sync(pInst, *pulParam1, (MCIDRV_SYNC_PARMS *)pParam2);
  3405.            break;
  3406.  
  3407.         /* List unsupported functions */
  3408.  
  3409.         case MCI_ACQUIREDEVICE :  case MCI_CONNECTION :  case MCI_CONNECTOR :
  3410.         case MCI_CONNECTORINFO :  case MCI_DEVICESETTINGS :
  3411.         case MCI_DEFAULT_CONNECTION:                     case MCI_ESCAPE :
  3412.         case MCI_LOAD:            case MCI_MASTERAUDIO : case MCI_RECORD :
  3413.         case MCI_RELEASEDEVICE :  case MCI_SAVE :        case MCI_SPIN :
  3414.         case MCI_STEP :           case MCI_SYSINFO :     case MCI_UPDATE :
  3415.         case MCIDRV_CD_READ_LONG :
  3416.            rc = MCIERR_UNSUPPORTED_FUNCTION;
  3417.            break;
  3418.         default : rc = MCIERR_UNRECOGNIZED_COMMAND;
  3419.  
  3420.      }  /* of switch */
  3421.  
  3422.      return(rc);
  3423.  
  3424.  When CD01_Play receives a PLAY command, processing goes to the line that 
  3425.  issues the call to CallIOCtl. 
  3426.  
  3427.   ULONG CD01_Play(PINST pInst, ULONG *pulParam1, ULONG ulFrom, ULONG ulTo,
  3428.                   USHORT usUserParm, HWND hwndCallback)
  3429.   {
  3430.      ULONG rc;
  3431.      ULONG ulThreadID;
  3432.      ULONG cnt;
  3433.  
  3434.      /* Stop drive before issuing next play command */
  3435.      if ((pInst->usPlayFlag == TIMER_PLAYING) ||
  3436.          (pInst->usPlayFlag == TIMER_PLAY_SUSPEND) ||
  3437.          (pInst->usPlayFlag == TIMER_PLAY_SUSP_2))
  3438.         if (*pulParam1 & MCI_NOTIFY)
  3439.            CD01_Stop(pInst, TIMER_EXIT_SUPER);
  3440.         else
  3441.            CD01_Stop(pInst, TIMER_EXIT_ABORTED);
  3442.  
  3443.      /* prepare for play call */
  3444.      pInst->ulCurPos = ulFrom;
  3445.      pInst->ulEndPos = ulTo;
  3446.      pInst->usPlayNotify = (USHORT)(*pulParam1 & (MCI_WAIT | MCI_NOTIFY));
  3447.      if (*pulParam1 & MCI_NOTIFY)
  3448.      {
  3449.         pInst->usPlayUserParm = usUserParm;
  3450.         pInst->hwndPlayCallback = hwndCallback;
  3451.         *pulParam1 ^= MCI_NOTIFY;
  3452.      }  /* notify flag was used */
  3453.  
  3454.      if (*pulParam1 & MCI_WAIT)
  3455.         rc = CD01_Timer(pInst);      /* returns when play commands end */
  3456.      else
  3457.      {
  3458.         DosResetEventSem(pInst->hReturnSem, &cnt);  /*force a wait
  3459.         rc = DosCreateThread(&ulThreadID, (PFNTHREAD)CD01_Timer,
  3460.                              (ULONG)pInst, 0L, THREAD_STACK_SZ);
  3461.         if (rc)
  3462.         {
  3463.            rc = MCIERR_OUT_OF_MEMORY;
  3464.            DosPostEventSem(pInst->hReturnSem);
  3465.         }
  3466.         else  /* wait for new thread to process enough */
  3467.         {
  3468.            /* Let MCD know not to send notification by returning wait */
  3469.            *pulParam1 = (*pulParam1 & ~MCI_NOTIFY) | MCI_WAIT;
  3470.  
  3471.            /* wait for new thread to process enough */
  3472.            DosWaitEventSem(pInst->hReturnSem, WAIT_FOREVER);
  3473.         }
  3474.  
  3475.         DosReleaseMutexSem(pInst->hInstSem);
  3476.  
  3477.      }  /* else no wait flag was used */
  3478.  
  3479.      return(rc);
  3480.  
  3481.   }  /* of CD01_Play() */
  3482.  
  3483.   /************************************************************************/
  3484.   /*                                                                      */
  3485.   /* SUBROUTINE NAME:  CD01_PlayCont                                      */
  3486.   /*                                                                      */
  3487.   /* DESCRIPTIVE NAME:  CD Play Continue.                                 */
  3488.   /*                                                                      */
  3489.   /* FUNCTION:  Continue to play audio data to internal DAC(s) from a     */
  3490.   /*            MCIDRV_RESTORE or MCIDRV_SYNC command.                    */
  3491.   /*                                                                      */
  3492.   /* PARAMETERS:                                                          */
  3493.   /*      PINST pInst       -- Instance pointer.                          */
  3494.   /*      ULONG ulFrom      -- From address.                              */
  3495.   /*      ULONG ulTo        -- To address in MMTIME.                      */
  3496.   /*                                                                      */
  3497.   /* EXIT CODES:                                                          */
  3498.   /*      MCIERR_SUCCESS   -- action completed without error.             */
  3499.   /*      MCIERR_DEVICE_NOT_READY  -- device was not ready, no disc.      */
  3500.   /*      MCIERR_MEDIA_CHANGED     -- Disc changed.                       */
  3501.   /*                                                                      */
  3502.   /* NOTES:                                                               */
  3503.   /*                                                                      */
  3504.   /************************************************************************/
  3505.   ULONG CD01_PlayCont(PINST pInst, ULONG ulFrom, ULONG ulTo)
  3506.   {
  3507.      ULONG rc;
  3508.      BYTE param[PLAYAUD_PMAX] = {'C', 'D', '0', '1', RBMODE};
  3509.      ULONG ulDataLen = STANDRD_DMAX, ulParamLen = PLAYAUD_PMAX;
  3510.  
  3511.      /* convert starting MM Time into Redbook 2 format */
  3512.      * (ULONG *)¶m[STARTFFFLD] = REDBOOK2FROMMM(ulFrom);
  3513.  
  3514.      /* convert ending MM Time into Redbook 2 format */
  3515.      * (ULONG *)¶m[END_FF_FLD] = REDBOOK2FROMMM(ulTo);
  3516.  
  3517.      /* Stop drive before issuing next play command */
  3518.      CD01_Stop(pInst, TIMER_PLAY_SUSPEND);
  3519.  
  3520.      /* play drive */
  3521.      rc = CallIOCtl(pInst, CDAUDIO_CAT, PLAY__AUDIO,
  3522.                     param, ulParamLen, &ulParamLen,
  3523.                     NULL,  ulDataLen,  &ulDataLen);
  3524.      if (!rc)
  3525.         pInst->ulCurPos = ulFrom;
  3526.  
  3527.      /* if Timer was stopped, continue timer loop */
  3528.      if (pInst->usPlayFlag == TIMER_PLAY_SUSPEND)
  3529.         pInst->usPlayFlag = TIMER_PLAYING;
  3530.      DosPostEventSem(pInst->hTimeLoopSem);
  3531.  
  3532.      return(rc);
  3533.  
  3534.   }  /* of CD01_PlayCont() */
  3535.  
  3536.  The CallIOCtl routine issues the DosDevIOCtl request, passing the following 
  3537.  parameters: hDrive is the device handle retrieved from a DosOpen call, ulCat 
  3538.  is the IOCtl category, and ulFunction is the function number. Also required 
  3539.  are buffer pointers, buffer sizes and lengths, and pointers to the buffer 
  3540.  lengths for the parameter and the data buffers.  The Parameter buffer is used 
  3541.  for input, and the data buffer is used for output. The pointers to buffer 
  3542.  lengths enable the physical device driver to return the actual lengths of the 
  3543.  buffers. 
  3544.  
  3545.   ULONG CallIOCtl(PINST pInst,  ULONG ulCat,  ULONG ulFunction,
  3546.                   PVOID pParam, ULONG ulPLen, ULONG *pulPLen,
  3547.                   PVOID pData,  ULONG ulDLen, ULONG *pulDLen)
  3548.   {
  3549.      ULONG rc;
  3550.  
  3551.      DosRequestMutexSem(pInst->hIOSem, (ULONG)-1L);
  3552.      rc = DosDevIOCtl(pInst->hDrive, ulCat, ulFunction,
  3553.                       pParam, ulPLen, pulPLen,
  3554.                       pData,  ulDLen, pulDLen);
  3555.      DosReleaseMutexSem(pInst->hIOSem);
  3556.  
  3557.      switch(rc)
  3558.      {
  3559.         case 0L :
  3560.            rc = MCIERR_SUCCESS;
  3561.            break;
  3562.         case 0xFF03 :
  3563.            rc = MCIERR_UNSUPPORTED_FUNCTION;
  3564.            break;
  3565.         case 0xFF06 :
  3566.         case 0xFF08 :
  3567.            rc = MCIERR_OUTOFRANGE;
  3568.            break;
  3569.         case 0xFF04 :
  3570.         case 0xFF0C :
  3571.            rc = MCIERR_HARDWARE;
  3572.            break;
  3573.         case 0xFF10 :
  3574.            rc = MCIERR_MEDIA_CHANGED;
  3575.            break;
  3576.         default :
  3577.            rc = MCIERR_DEVICE_NOT_READY;
  3578.      }
  3579.  
  3580.      return(rc);
  3581.  
  3582.   }  /* of CallIOCtl() */
  3583.  
  3584.  
  3585. ΓòÉΓòÉΓòÉ 4.8.3. CD Audio MCD Modules ΓòÉΓòÉΓòÉ
  3586.  
  3587. The following figure illustrates the outline of the CD audio MCD (CDAUDIOT.DLL) 
  3588. and the vendor-specific driver (VSD) for the IBM 3510-001 CD-ROM driver 
  3589. (IBMCDRT.DLL). 
  3590.  
  3591.  
  3592. ΓòÉΓòÉΓòÉ 4.8.3.1. CD Audio Media Control Driver DLL (CDAUDIOT.DLL) ΓòÉΓòÉΓòÉ
  3593.  
  3594. The CD audio MCD, CDAUDIOT, receives commands from the MDM and processes them. 
  3595. If a command message cannot be completely processed, it is sent to the 
  3596. hardware-specific code in the VSD. 
  3597.  
  3598. Following describes the files and routines included in the CDAUDIOT.DLL. 
  3599.  
  3600.  
  3601. CDAUDIO.C File 
  3602.  
  3603. This module includes the entry point for the DLL.  Global validation and 
  3604. parameter checking is performed on requested command messages.  If the 
  3605. preliminary check finds no errors, a specific-processing function is called. 
  3606.  
  3607. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3608. ΓöéProcedure                ΓöéDescription                        Γöé
  3609. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3610. ΓöémciDriverEntry           ΓöéSpecifies the entry point to the   Γöé
  3611. Γöé                         ΓöéMCD from the MDM.                  Γöé
  3612. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3613. Γöépre_process_msg          ΓöéGets the device ready to process   Γöé
  3614. Γöé                         Γöéthe command.                       Γöé
  3615. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3616. Γöéprocess_msg              ΓöéProcesses the requested command    Γöé
  3617. Γöé                         Γöémessage.                           Γöé
  3618. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3619. Γöéverify_entry             ΓöéVerifies that entry parameters are Γöé
  3620. Γöé                         Γöévalid.                             Γöé
  3621. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3622. ΓöéQMAudio                  ΓöéQueries the master audio's current Γöé
  3623. Γöé                         Γöésettings.                          Γöé
  3624. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3625. ΓöéRegister                 ΓöéRegisters the drive.               Γöé
  3626. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3627. ΓöéReRegister               ΓöéRegisters the disc and tracks.     Γöé
  3628. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3629. ΓöéVSDReturn                ΓöéSpecifies the entry point to the   Γöé
  3630. Γöé                         ΓöéMCD from the VSD.  Processes returnΓöé
  3631. Γöé                         Γöéinformation from the VSD.          Γöé
  3632. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3633. ΓöéSetTrackInst             ΓöéSets track information in the      Γöé
  3634. Γöé                         Γöéinstance.                          Γöé
  3635. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3636. ΓöéValPointer               ΓöéValidates the address to record    Γöé
  3637. Γöé                         Γöéstructures.                        Γöé
  3638. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3639.  
  3640. CDAUDPRO.C File 
  3641.  
  3642. This module contains the hardware independent code that processes the command 
  3643. message.  Some command may be processed completely by the MCD while others 
  3644. require the VSD to access the hardware or know of information specific to the 
  3645. VSD's associated drive. 
  3646.  
  3647. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3648. ΓöéProcedure                ΓöéDescription                        Γöé
  3649. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3650. ΓöéProcClose                ΓöéProcesses the MCI_CLOSE command.   Γöé
  3651. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3652. ΓöéProcConnector            ΓöéProcesses the MCI_CONNECTOR        Γöé
  3653. Γöé                         Γöécommand.                           Γöé
  3654. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3655. ΓöéProcCue                  ΓöéProcesses the MCI_CUE command.     Γöé
  3656. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3657. ΓöéProcCuePoint             ΓöéProcesses the MCI_SET_CUEPOINT     Γöé
  3658. Γöé                         Γöécommand.                           Γöé
  3659. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3660. ΓöéProcGeneral              ΓöéProcesses pass through MCI         Γöé
  3661. Γöé                         Γöécommands.                          Γöé
  3662. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3663. ΓöéProcCaps                 ΓöéProcesses the MCI_GETDEVCAPS       Γöé
  3664. Γöé                         Γöécommand.                           Γöé
  3665. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3666. ΓöéProcInfo                 ΓöéProcesses the MCI_INFO command.    Γöé
  3667. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3668. ΓöéProcMAudio               ΓöéProcesses the MCI_MASTERAUDIO      Γöé
  3669. Γöé                         Γöécommand.                           Γöé
  3670. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3671. ΓöéProcOpen                 ΓöéProcesses the MCI_OPEN command.    Γöé
  3672. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3673. ΓöéProcPause                ΓöéProcesses the MCI_PAUSE command.   Γöé
  3674. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3675. ΓöéProcPlay                 ΓöéProcesses the MCI_PLAY command.    Γöé
  3676. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3677. ΓöéProcPosAdvise            ΓöéProcesses the                      Γöé
  3678. Γöé                         ΓöéMCI_SET_POSITION_ADVISE command.   Γöé
  3679. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3680. ΓöéProcRestore              ΓöéProcesses the MCIDRV_RESTORE       Γöé
  3681. Γöé                         Γöécommand.                           Γöé
  3682. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3683. ΓöéProcResume               ΓöéProcesses the MCI_RESUME command.  Γöé
  3684. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3685. ΓöéProcSave                 ΓöéProcesses the MCIDRV_SAVE command. Γöé
  3686. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3687. ΓöéProcSeek                 ΓöéProcesses the MCI_SEEK command.    Γöé
  3688. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3689. ΓöéProcSet                  ΓöéProcesses the MCI_SET command.     Γöé
  3690. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3691. ΓöéProcSetSync              ΓöéProcesses the MCI_SET_SYNC_OFFSET  Γöé
  3692. Γöé                         Γöécommand.                           Γöé
  3693. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3694. ΓöéProcStatus               ΓöéProcesses the MCI_STATUS command.  Γöé
  3695. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3696. ΓöéProcStop                 ΓöéProcesses the MCI_STOP command.    Γöé
  3697. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3698. ΓöéProcSync                 ΓöéProcesses the MCIDRV_SYNC command. Γöé
  3699. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3700.  
  3701. CDAUDUTL.C File 
  3702.  
  3703. This module contains the hardware independent code that supplement the process 
  3704. commands in CDAUDPRO.C.  It also contains utility functions as well. 
  3705.  
  3706. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3707. ΓöéProcedure                ΓöéDescription                        Γöé
  3708. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3709. ΓöéSetAudio                 ΓöéSets audio information from        Γöé
  3710. Γöé                         ΓöéMCI_SET.                           Γöé
  3711. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3712. ΓöéSetConnector             ΓöéEnables or disables a connection.  Γöé
  3713. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3714. ΓöéSetCuePoint              ΓöéEnables the cue point.             Γöé
  3715. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3716. ΓöéStatusMCD                ΓöéGets status from MCD information.  Γöé
  3717. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3718. ΓöéStatusMCDDef             ΓöéGets status from MCD default       Γöé
  3719. Γöé                         Γöéinformation.                       Γöé
  3720. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3721. ΓöéStatusVSD                ΓöéGets status from VSD information.  Γöé
  3722. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3723. ΓöéDisableEvents            ΓöéDisables cuepoints and position    Γöé
  3724. Γöé                         Γöéadvise.                            Γöé
  3725. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3726. ΓöéGetTimeAddr              ΓöéConverts a time format to/from     Γöé
  3727. Γöé                         ΓöéMMTIME.                            Γöé
  3728. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3729. ΓöéGetTimeAddrRC            ΓöéColinizes return code to time      Γöé
  3730. Γöé                         Γöéformat.                            Γöé
  3731. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3732. ΓöéGetTrackInfo             ΓöéGets the track information for a   Γöé
  3733. Γöé                         Γöéspecified track.                   Γöé
  3734. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3735. ΓöéValAddress               ΓöéValidates addresses to be in range.Γöé
  3736. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3737. ΓöéValState                 ΓöéValidates state of logical device. Γöé
  3738. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3739. ΓöévsdResponse              ΓöéProcesses VSD response.            Γöé
  3740. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3741.  
  3742. CDMCINIT.C File 
  3743.  
  3744. This module initializes the re-entrant DLL. 
  3745.  
  3746. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3747. ΓöéProcedure                ΓöéDescription                        Γöé
  3748. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3749. Γöé_DLL_InitTerm            ΓöéSpecifies the entry point for the  Γöé
  3750. Γöé                         ΓöéOS/2 loader.                       Γöé
  3751. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3752. ΓöéCDMCInitialization       ΓöéObtains initial heap.              Γöé
  3753. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3754. ΓöéCDMC_Exit                ΓöéCleans up instances after          Γöé
  3755. Γöé                         Γöétermination.                       Γöé
  3756. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3757.  
  3758. CDMCCOMN.C 
  3759.  
  3760. This module contains the common functions between the CD MCD and the VSD for 
  3761. the IBM CD-ROM Drive. 
  3762.  
  3763. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3764. ΓöéProcedure                ΓöéDescription                        Γöé
  3765. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3766. Γöéparse_DevParm            ΓöéParses the device-specific         Γöé
  3767. Γöé                         Γöéparameter.                         Γöé
  3768. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3769. Γöéget_token                ΓöéGets next token and null terminatesΓöé
  3770. Γöé                         Γöéit.                                Γöé
  3771. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3772.  
  3773. HHPHEAP.C File 
  3774.  
  3775. This module contains the common heap management functions. 
  3776.  
  3777. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3778. ΓöéProcedure                ΓöéDescription                        Γöé
  3779. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3780. ΓöéHhpCreateHeap            ΓöéCreates the first heap.            Γöé
  3781. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3782. ΓöéNewHeap                  ΓöéCreates a new heap (one segment).  Γöé
  3783. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3784. ΓöéHhpAllocMem              ΓöéAllocates some memory.             Γöé
  3785. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3786. ΓöéLocateFreeMem            ΓöéLocates a free block of memory.    Γöé
  3787. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3788. ΓöéHhpFreeMem               ΓöéFrees memory.                      Γöé
  3789. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3790. ΓöéCollapseFreeBlock        ΓöéRemoves fragmentation within a     Γöé
  3791. Γöé                         Γöéheap.                              Γöé
  3792. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3793. ΓöéCollapseFreeHeap         ΓöéRemoves fragmentation within heaps.Γöé
  3794. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3795. ΓöéHhpDestroyHeap           ΓöéDestroys a heap.                   Γöé
  3796. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3797. ΓöéHhpAllocBuffer           ΓöéAllocates a buffer from the system.Γöé
  3798. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3799. ΓöéHhpFreeBuffer            ΓöéFrees the allocated buffer.        Γöé
  3800. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3801. ΓöéHhpAccessBuffer          ΓöéSets up segment for access.        Γöé
  3802. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3803. ΓöéHhpAccessHeap            ΓöéAccesses a shared heap.            Γöé
  3804. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3805. ΓöéHhpReleaseHeap           ΓöéReleases a heap.                   Γöé
  3806. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3807. ΓöéAddPid                   ΓöéAdds a process ID to the PID list. Γöé
  3808. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3809. ΓöéReallocHeap              ΓöéReallocates a heap.                Γöé
  3810. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3811. ΓöéHhpGetPID                ΓöéGets the PID for the heap.         Γöé
  3812. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3813. ΓöéHhpDumpHeap              ΓöéDumps heap contents to standard    Γöé
  3814. Γöé                         Γöéout.                               Γöé
  3815. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3816.  
  3817.  
  3818. ΓòÉΓòÉΓòÉ 4.8.4. Vendor-Specific Driver for CD-ROM Drives (IBMCDRT.DLL) ΓòÉΓòÉΓòÉ
  3819.  
  3820. Following describes the files and routines included in the IBMCDRT.DLL. 
  3821.  
  3822.  
  3823. CDMCINIT.C File 
  3824.  
  3825. See table in previous section. 
  3826. CDMCCOMN.C File 
  3827.  
  3828. See table in previous section. 
  3829. HHPHEAP.C File 
  3830.  
  3831. See table in previous section. 
  3832. IBMCDROM.C 
  3833.  
  3834. This module includes the entry point for the DLL.  It contains the device 
  3835. dependent code for a specific CD-ROM drive. 
  3836.  
  3837. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3838. ΓöéProcedure                ΓöéDescription                        Γöé
  3839. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3840. ΓöévsdDriverEntry           ΓöéSpecifies the entry point to the   Γöé
  3841. Γöé                         ΓöéVSD from the MCD.                  Γöé
  3842. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3843. Γöéprocess_msg              ΓöéProcesses the requested command    Γöé
  3844. Γöé                         Γöémessage.                           Γöé
  3845. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3846. ΓöéCDAudClose               ΓöéError recovery routine.            Γöé
  3847. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3848. ΓöéCDAudErrRecov            ΓöéCloses an instance.                Γöé
  3849. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3850. ΓöéCDAudInfo                ΓöéReturns information about the      Γöé
  3851. Γöé                         Γöécomponent.                         Γöé
  3852. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3853. ΓöéCDAudOpen                ΓöéOpens an instance.                 Γöé
  3854. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3855. ΓöéCDAudRegDisc             ΓöéRegisters a disc for the logical   Γöé
  3856. Γöé                         Γöédevice.                            Γöé
  3857. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3858. ΓöéCDAudRegDrive            ΓöéRegisters a drive for the calling  Γöé
  3859. Γöé                         ΓöéMCD.                               Γöé
  3860. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3861. ΓöéCDAudSet                 ΓöéSets various attributes of the     Γöé
  3862. Γöé                         Γöédevice.                            Γöé
  3863. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3864. ΓöéCDAudSetVerify           ΓöéTests flags for the SET command.   Γöé
  3865. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3866. ΓöéCDAudStatus              ΓöéReturns the requested attribute.   Γöé
  3867. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3868. ΓöéCDAudStatCVol            ΓöéReturns mapped component volume    Γöé
  3869. Γöé                         Γöélevels.                            Γöé
  3870. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3871.  
  3872. IBMCDPRO.C File 
  3873.  
  3874. This module processes hardware requests. 
  3875.  
  3876. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3877. ΓöéProcedure                ΓöéDescription                        Γöé
  3878. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3879. ΓöéCD01_Cue                 ΓöéPrerolls a drive.                  Γöé
  3880. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3881. ΓöéCD01_CuePoint            ΓöéSets up a cue point.               Γöé
  3882. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3883. ΓöéCD01_GetCaps             ΓöéGets device capabilities.          Γöé
  3884. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3885. ΓöéCD01_GetDiscInfo         ΓöéGets status information of the     Γöé
  3886. Γöé                         Γöédisc.                              Γöé
  3887. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3888. ΓöéCD01_GetID               ΓöéGets the CD ID from the disc.      Γöé
  3889. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3890. ΓöéCD01_GetPosition         ΓöéGets the position of the head.     Γöé
  3891. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3892. ΓöéCD01_GetState            ΓöéGets the state of the device.      Γöé
  3893. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3894. ΓöéCD01_GetTOC              ΓöéReturns the table of contents      Γöé
  3895. Γöé                         Γöé(MMTOC form).                      Γöé
  3896. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3897. ΓöéCD01_GetVolume           ΓöéGets the volume settings of the    Γöé
  3898. Γöé                         Γöédrive.                             Γöé
  3899. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3900. ΓöéCD01_LockDoor            ΓöéLocks or unlocks the drive door.   Γöé
  3901. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3902. ΓöéCD01_Open                ΓöéOpens the specified device or      Γöé
  3903. Γöé                         Γöédrive.                             Γöé
  3904. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3905. ΓöéCD01_Play                ΓöéInitiates a play operation.        Γöé
  3906. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3907. ΓöéCD01_PlayCont            ΓöéContinues a play operation.        Γöé
  3908. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3909. ΓöéCD01_PosAdvise           ΓöéSets up a position advise command. Γöé
  3910. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3911. ΓöéCD01_RegTracks           ΓöéRegisters tracks on the disc.      Γöé
  3912. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3913. ΓöéCD01_Restore             ΓöéRestores the saved instance.       Γöé
  3914. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3915. ΓöéCD01_Resume              ΓöéUnpauses a CD play operation.      Γöé
  3916. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3917. ΓöéCD01_Save                ΓöéSaves the current instance.        Γöé
  3918. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3919. ΓöéCD01_Seek                ΓöéSeeks to a particular redbook      Γöé
  3920. Γöé                         Γöéaddress.                           Γöé
  3921. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3922. ΓöéCD01_SetVolume           ΓöéSets the volume of the drive.      Γöé
  3923. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3924. ΓöéCD01_Stop                ΓöéStops a CD play operation.         Γöé
  3925. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3926.  
  3927. IBMCDMSC.C File 
  3928.  
  3929. This module processes miscellaneous functions such as the timer routine for the 
  3930. play command, identify the drive, and package the IOCtl calls. 
  3931.  
  3932. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3933. ΓöéProcedure                ΓöéDescription                        Γöé
  3934. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3935. ΓöéCD01_StartPlay           ΓöéStarts the play operation.         Γöé
  3936. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3937. ΓöéCD01_Sync                ΓöéSync to MDM request.               Γöé
  3938. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3939. ΓöéCD01_Timer               ΓöéTimer routine for play operation.  Γöé
  3940. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3941. ΓöéCD01_Timernotify         ΓöéTimer routine to setup/notify      Γöé
  3942. Γöé                         Γöéevents.                            Γöé
  3943. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3944. ΓöéGetTableName             ΓöéGets the CD table full path name.  Γöé
  3945. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3946. ΓöéOpenFirstTime            ΓöéFirst time device open tests.      Γöé
  3947. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3948. ΓöéQueryTable               ΓöéQueries the CD look-up table.      Γöé
  3949. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3950. ΓöéCallIOCtl                ΓöéCalls the hardware by way of       Γöé
  3951. Γöé                         ΓöéIOCtls.                            Γöé
  3952. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3953.  
  3954.  
  3955. ΓòÉΓòÉΓòÉ 4.9. Resource Units and Classes ΓòÉΓòÉΓòÉ
  3956.  
  3957. Device contexts are managed by the MDM, using an abstract concept of resource 
  3958. units, resource classes and valid class combinations. 
  3959.  
  3960. Resource units provide a measurement for the resource manager to determine how 
  3961. many device contexts may be active at any given time. Each device specifies how 
  3962. many resource units it can process concurrently. 
  3963.  
  3964. Besides a total resource number, each resource class has a maximum number of 
  3965. resource units available to it.  This allows the MDM to determine how many 
  3966. device contexts from a particular class can be active concurrently. During the 
  3967. install procedure the maximum numbers are provided. 
  3968.  
  3969. On the MCI_OPEN of a device context the required resource units and class for 
  3970. the device context is returned in the MMDRV_OPEN_PARMS structure.  The required 
  3971. resource units and resource class of a device context can be changed by the MCD 
  3972. by calling the MDM with the MCIDRV_CHANGERESOURCE message.  For example, if a 
  3973. waveaudio device allocated 1 resource unit for a mono wave and two units for a 
  3974. stereo wave, then a load command might change the required units for that 
  3975. device context. 
  3976.  
  3977. The final piece of resource management is provided during install. This is the 
  3978. valid class combinations.  A certain device might have multiple classes, but 
  3979. not allow certain classes to have active device contexts concurrently.  The 
  3980. following example is the Pro AudioSpectrum 16** card. It has at most two 
  3981. resource units available.  It uses 2 classes, one for waveform audio  and the 
  3982. other for MIDI.  Each class can have at most one resource unit consumed by a 
  3983. active device context.  It can have any number of in-active device contexts. 
  3984. Finally both classes can have active device contexts concurrently. This says 
  3985. that this card can support one waveform audio and or one midi. 
  3986.  
  3987.  
  3988. ΓòÉΓòÉΓòÉ 4.10. Inserting Pages in the Multimedia Setup Notebook ΓòÉΓòÉΓòÉ
  3989.  
  3990. This section explains how to insert settings pages in the Multimedia Setup 
  3991. notebook-a program which provides a user interface to the properties of 
  3992. multimedia devices that are registered with the Media Device Manager (MDM). 
  3993.  
  3994. There are two approaches to insert settings pages in the Multimedia Setup 
  3995. notebook.  The following discussion focuses on the first approach, which 
  3996. illustrates how to use the MCI_DEVICESETTINGS message to insert a page for a 
  3997. particular MCD.  The second approach is discussed in Defining Changes to Other 
  3998. INI Files in Installation Requirements.  This approach addresses a registration 
  3999. mechanism for Multimedia Setup to insert settings pages based on device type 
  4000. (not MCD).  For example, pages that apply to the system or to all media control 
  4001. interface devices of a particular class. 
  4002.  
  4003. Note: 
  4004.  
  4005. The MMSYSTEM.H header file defines data structures used in inserting a page in 
  4006. the Multimedia Setup notebook for a device object. 
  4007.  
  4008. Refer to the OS/2 PM Reference for additional information on notebook control 
  4009. window processing. 
  4010.  
  4011.  You can insert a notebook page in the Multimedia Setup program if 
  4012.  device-specific properties exist for a particular device.  When the Multimedia 
  4013.  Setup program is creating a notebook window, it checks the 
  4014.  MCI_SYSINFO_DEVICESETTINGS style bit in the ulDeviceFlag field of the 
  4015.  MCI_SYSINFO_LOGDEVICE data structure.  This data structure (as shown in the 
  4016.  following example contains information about a logical device that is 
  4017.  installed in the system.  The MCI_SYSINFO_DEVICESETTINGS style bit indicates 
  4018.  that the MCD has custom device settings pages. 
  4019.  
  4020.   typedef struct _MCI_SYSINFO_LOGDEVICE {
  4021.     CHAR    szInstallName[MAX_DEVICE_NAME];      /* Device install name            */
  4022.     USHORT  usDeviceType;                        /* Device type number             */
  4023.     ULONG   ulDeviceFlag;                        /* Flag indicating whether device */
  4024.                                                  /*  device is controllable or not */
  4025.     CHAR    szVersionNumber[MAX_VERSION_NUMBER]; /* INI file version number        */
  4026.     CHAR    szProductInfo[MAX_PRODINFO];         /* Textual product description    */
  4027.     CHAR    szMCDDriver[MAX_DEVICE_NAME];        /* MCI driver DLL name            */
  4028.     CHAR    szVSDDriver[MAX_DEVICE_NAME];        /* VSD DLL name                   */
  4029.     CHAR    szPDDName[MAX_PDD_NAME];             /* Device PDD name                */
  4030.     CHAR    szMCDTable[MAX_DEVICE_NAME];         /* Device-type command table      */
  4031.     CHAR    szVSDTable[MAX_DEVICE_NAME];         /* Device-specific command table  */
  4032.     USHORT  usShareType;                         /* Device sharing mode            */
  4033.     CHAR    szResourceName[MAX_DEVICE_NAME];     /* Resource name                  */
  4034.     USHORT  usResourceUnits;                     /* Total resource units available */
  4035.                                                  /*  for this device               */
  4036.     USHORT  usResourceClasses;                   /* Number of resource classes for */
  4037.                                                  /*  this device                   */
  4038.     USHORT  ausClassArray[MAX_CLASSES];          /* Maximum number of resource     */
  4039.                                                  /*  units for each class          */
  4040.     USHORT
  4041.   ausValidClassArray[MAX_CLASSES][MAX_CLASSES];/* Valid class combination */
  4042.   } MCI_SYSINFO_LOGDEVICE;
  4043.  
  4044.  If an MCD creates one or more custom settings pages, the Multimedia Setup 
  4045.  program sends a MCI_DEVICESETTINGS message to the MCD.  This allows the MCD 
  4046.  the opportunity to insert device-specific pages in the Multimedia Setup 
  4047.  notebook for a particular device.  The MCD then passes this message to a 
  4048.  Vendor-Specific Driver (VSD) if one exists.  Some device properties might be 
  4049.  related to the type of device and some might be related to the particular 
  4050.  manufacturer's hardware. 
  4051.  
  4052.  The MCI_DEVICESETTINGS_PARMS data structure (as shown in the following 
  4053.  example) defines the information that is passed to the MCD in the 
  4054.  MCI_DEVICESETTINGS message.  The hwndNotebook field contains the window handle 
  4055.  of a CUA* notebook control window where the page should be inserted.  The 
  4056.  usDeviceType field defines the type of media device, and the pszDeviceName 
  4057.  field defines the logical device name (WAVEAUDIO01) of the device for which 
  4058.  custom settings are to be inserted. 
  4059.  
  4060.   typedef struct_MCI_DEVICESETTINGS_PARMS {
  4061.   ULONG     hwndCallback;              /* Window handle              */
  4062.   HWND      hwndNotebook;              /* Handle to notebook window  */
  4063.   USHORT    usDeviceType;              /* Device type                */
  4064.   PSZ       pszDeviceName;             /* Device name                */
  4065.    } MCI_DEVICESETTINGS_PARMS;
  4066.  
  4067.  You should also provide help for each page inserted in the notebook.  The 
  4068.  recommended way of implementing help for a Multimedia Setup settings page is 
  4069.  to handle the WM_HELP message explicitly in the dialog procedure and then send 
  4070.  the HM_DISPLAY_HELP message to a help instance that is created by the page (or 
  4071.  group of pages). 
  4072.  
  4073.  When help for a tab is requested the Multimedia Setup program sends a 
  4074.  MM_TABHELP message to the page as shown in the following example. The page 
  4075.  window procedure can then display the appropriate help panel. 
  4076.  
  4077.   MM_TABHELP
  4078.      mp1          ULONG ulPageID       /* Page identifier            */
  4079.      mp2          ULONG Reserved
  4080.      return       TRUE for handled and FALSE not handled
  4081.  
  4082.  Some pages use the device-specific parameters of the MCD to save settings 
  4083.  information.  New pages should expect that other pages are also using the 
  4084.  device-specific parameters to save their settings and therefore other keywords 
  4085.  may exist or exist in the future.  New pages should be implemented in such as 
  4086.  way as to preserve keyword values that they do not recognize. 
  4087.  
  4088.  The following example provides source code to create a modeless secondary 
  4089.  window and insert a page in a notebook.  This code can be provided as a part 
  4090.  of an external DLL or part of the MCD code itself.  The page should be 
  4091.  consistent with the existing notebook design and be inserted after the 
  4092.  standard pages in the notebook. 
  4093.  
  4094.   HWND InsertExamplePage( LPMCI_DEVICESETTINGS_PARMS pMCIDevSettings)
  4095.   {
  4096.     HWND  hwndPage;               /* Page window handle                     */
  4097.     CHAR  szTabText[CCHMAXPATH];  /* Buffer for tab string                  */
  4098.     ULONG ulPageId;               /* Page Identifier                        */
  4099.  
  4100.     /************************************************************************/
  4101.     /*  Load a modeless secondary window.                                   */
  4102.     /************************************************************************/
  4103.  
  4104.     hwndPage    = WinLoadSecondaryWindow(
  4105.                          pMCIDevSettings->hwndNotebook,
  4106.                          pMCIDevSettings->hwndNotebook,
  4107.                          ExamplePageDlgProc,
  4108.                          vhmodMRI,
  4109.                          ID_EXAMPLE,
  4110.                          (PVOID)pMCIDevSettings);
  4111.  
  4112.     if (!hwndPage) return (NULL);
  4113.  
  4114.     ulPageId = (ULONG)WinSendMsg( pMCIDevSettings->hwndNotebook,
  4115.                          BKM_INSERTPAGE,
  4116.                          (ULONG)NULL,
  4117.                          MPFROM2SHORT( BKA_AUTOPAGESIZE | BKA_MINOR, BKA_LAST ) );
  4118.  
  4119.     /************************************************************************/
  4120.     /*  Associate a secondary window with a notebook page.                  */
  4121.     /************************************************************************/
  4122.  
  4123.     WinSendMsg(pMCIDevSettings->hwndNotebook, BKM_SETPAGEWINDOWHWND,
  4124.               MPFROMP( ulPageId ), MPFROMLONG( hwndPage ) );
  4125.  
  4126.     /************************************************************************/
  4127.     /* Get tab text from DLL.                                               */
  4128.     /************************************************************************/
  4129.  
  4130.     WinLoadString(WinQueryAnchorBlock( HWND_DESKTOP ), vhmodMRI,
  4131.            (USHORT)IDB_EXAMPLE, CCHMAXPATH, szTabText );
  4132.  
  4133.     /************************************************************************/
  4134.     /* Set tab text.                                                        */
  4135.     /************************************************************************/
  4136.  
  4137.     WinSendMsg( pMCIDevSettings->hwndNotebook, BKM_SETTABTEXT,
  4138.           MPFROMP( ulPageId ), szTabText );
  4139.  
  4140.     return( hwndPage );
  4141.  
  4142.   }
  4143.  
  4144.    typedef struct {
  4145.       HWND hwndHelpInstance;
  4146.    } MMPAGEINFO;
  4147.    typedef MMPAGEINFO * PMMPAGEINFO;
  4148.  
  4149.     /************************************************************************/
  4150.     /* Modeless secondary window procedure                                  */
  4151.     /************************************************************************/
  4152.  
  4153.    MRESULT EXPENTRY ExamplePageDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  4154.  
  4155.       PMMPAGEINFO pMMPageInfo = (PMMPAGEINFO) WinQueryWindowPtr (hwnd, QWL_USER);
  4156.  
  4157.       switch (msg) {
  4158.          case WM_INITDLG:
  4159.             /*******************************************************************/
  4160.             /*  Place window initialization code here.                         */
  4161.             /*******************************************************************/
  4162.             pMMPageInfo = (PMMPAGEINFO) malloc(sizeof(MMPAGEINFO));
  4163.             WinSetWindowPtr (hwnd, QWL_USER, pMMPageInfo);
  4164.  
  4165.             /*******************************************************************/
  4166.             /*  Create a help instance.                                        */
  4167.             /*******************************************************************/
  4168.             pMMPageInfo->hwndHelpInstance = WinCreateHelpInstance(...);
  4169.             break;
  4170.  
  4171.          case WM_DESTROY:
  4172.             /*******************************************************************/
  4173.             /*  Clean up page window resources.                                */
  4174.             /*******************************************************************/
  4175.             WinDestroyHelpInstance (pMMPageInfo->hwndHelpInstance);
  4176.             free (pMMPageInfo);
  4177.             break;
  4178.          case WM_COMMAND:
  4179.             /*******************************************************************/
  4180.             /*  Process all commands.                                          */
  4181.             /*******************************************************************/
  4182.             return ((MRESULT) FALSE);
  4183.             break;
  4184.  
  4185.          case MM_TABHELP:
  4186.             /*******************************************************************/
  4187.             /*  Display help for a tab.                                        */
  4188.             /*******************************************************************/
  4189.             if (pMMPageInfo->hwndHelpInstance) {
  4190.                 WinSendMsg(
  4191.                       pMMPageInfo->hwndHelpInstance,
  4192.                       HM_DISPLAY_HELP,
  4193.                       MPFROMSHORT( WinQueryWindowUShort( hwnd, QWS_ID ) ),
  4194.                       HM_RESOURCEID );
  4195.             }
  4196.             break;
  4197.  
  4198.          case WM_CLOSE:
  4199.             return ((MRESULT) FALSE);
  4200.             break;
  4201.  
  4202.          case WM_HELP:
  4203.             if (pMMPageInfo->hwndHelpInstance) {
  4204.                 WinSendMsg(
  4205.                       pMMPageInfo->hwndHelpInstance,
  4206.                       HM_DISPLAY_HELP,
  4207.                       (MPARAM) mp1,
  4208.                       HM_RESOURCEID );
  4209.              }
  4210.              return ((MRESULT)TRUE);
  4211.              break;
  4212.  
  4213.          case WM_TRANSLATEACCEL:
  4214.             return (WinDefWindowProc (hwnd, msg, mp1, mp2));
  4215.             break;
  4216.  
  4217.        case HM_QUERY_KEYS_HELP:
  4218.             return((MRESULT) IDH_HELPFORKEYS);
  4219.             break;
  4220.  
  4221.       }
  4222.  
  4223.       return (WinDefSecondaryWindowProc(hwnd, msg, mp1, mp2)); }
  4224.  
  4225.  
  4226. ΓòÉΓòÉΓòÉ 5. Stream Handlers ΓòÉΓòÉΓòÉ
  4227.  
  4228. This section describes the Stream Programming Interface (SPI) services used by 
  4229. MCDs to implement data streaming and synchronization, as well as the interfaces 
  4230. used by stream handlers to transport data. 
  4231.  
  4232.  
  4233. ΓòÉΓòÉΓòÉ 5.1. Stream Handler Architecture ΓòÉΓòÉΓòÉ
  4234.  
  4235. Pairs of stream handlers implement the transport of data from a source to a 
  4236. target device while the Synchronization and Streaming Manager (SSM) provides 
  4237. coordination and central management of data buffers and synchronization data. 
  4238.  
  4239. A stream handler can be built as a device driver run at Ring 0, or as a 
  4240. dynamic-link library (DLL) run at Ring 3. See DLL Model: File System Stream 
  4241. Handler and Device Driver Model: Video PDD for examples of these stream handler 
  4242. types. 
  4243.  
  4244. Some streams are ideally controlled by a direct connection between the stream 
  4245. handler and a physical device driver, whereas other streams are not associated 
  4246. with a data source or target that maps physically to a specific device.  For 
  4247. example, the File System Stream Handler is a DLL because all file system I/O 
  4248. functions are available as Ring 3 OS/2 functions that service all file system 
  4249. devices. 
  4250.  
  4251. After you determine the type of stream handler you require (DLL or DD), you 
  4252. must incorporate the required functional modules in your stream handler design. 
  4253. Refer to the following figure, which represents the key modules in both DLL and 
  4254. device driver stream handler components. 
  4255.  
  4256. Although the detailed coding practices of building OS/2 DLLs and device drivers 
  4257. differ considerably, most logic for a stream handler is not affected by this 
  4258. choice. The structure of the DLL stream handler closely resembles the device 
  4259. driver stream handler, with few exceptions. 
  4260.  
  4261. The following figure illustrates the logical structure of the Sync/Stream 
  4262. Manager (SSM) and its relationship with stream handlers. The Sync/Stream 
  4263. Manager DLL exports SPI services to higher-level OS/2 multimedia components 
  4264. (such as media drivers) and exports Stream Manager Helper (SMH) messages to 
  4265. support the stream handler DLLs. Additional SMH messages are exported by the 
  4266. Sync/Stream Manager device driver to stream handler device drivers using 
  4267. standard OS/2 inter-device driver communication (IDC) interfaces (established 
  4268. using DevHelp_AttachDD). 
  4269.  
  4270. The following table illustrates the stream handlers are provided by OS/2 
  4271. multimedia. 
  4272.  
  4273. Note:  See Stream Handler Module Definitions for information describing the 
  4274.        high-level design and operation of the stream handlers provided with 
  4275.        OS/2 multimedia. 
  4276.  
  4277.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  4278.   ΓöéStream Handler ΓöéDescription                             Γöé
  4279.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4280.   ΓöéAudio          ΓöéVSD interface to a vendor-specific      Γöé
  4281.   Γöé               Γöédriver. Supports PCM, MIDI, ADPCM       Γöé
  4282.   Γöé               Γöéformats.                                Γöé
  4283.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4284.   ΓöéMIDI Mapper    ΓöéFilters data using the selected MIDI    Γöé
  4285.   Γöé               Γöémap.                                    Γöé
  4286.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4287.   ΓöéFile system    ΓöéUses file system services to read or    Γöé
  4288.   Γöé               Γöéwrite data from any associated device.  Γöé
  4289.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4290.   ΓöéMulti-track    ΓöéReads and splits interleaved data.      Γöé
  4291.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4292.   ΓöéVideo          ΓöéIn conjunction with CODECs, outputs     Γöé
  4293.   Γöé               Γöévideo data to the display.              Γöé
  4294.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4295.   ΓöéSystem Memory  ΓöéTransfers data to and from system memoryΓöé
  4296.   Γöé               Γöébuffers. See Cuepoint Event Support.    Γöé
  4297.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4298.   ΓöéCD-ROM XA      ΓöéReads CD-ROM XA data and splits audio   Γöé
  4299.   Γöé               Γöésectors from video and data sectors. SeeΓöé
  4300.   Γöé               ΓöéCD-ROM XA Stream Handler.               Γöé
  4301.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4302.   ΓöéCD-DA          ΓöéReads digital audio data directly from  Γöé
  4303.   Γöé               Γöéthe CD-ROM driver. Can be used to play  Γöé
  4304.   Γöé               Γöéback CD audio data using an audio       Γöé
  4305.   Γöé               Γöéadapter.                                Γöé
  4306.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  4307.  
  4308.  
  4309. ΓòÉΓòÉΓòÉ 5.2. Synchronization Features ΓòÉΓòÉΓòÉ
  4310.  
  4311. The ability to synchronize events is essential for multimedia applications. For 
  4312. example, you might decide to display a certain bit map (an image of fireworks 
  4313. bursting) at precisely the same time you play an audio waveform (a specific 
  4314. cymbal crash during the "Star Spangled Banner"). From a standard OS/2 
  4315. application perspective, two independent threads or a single thread might 
  4316. control these events. However, there is no way for either of these approaches 
  4317. to guarantee that both events will occur within a specified time span. The 
  4318. longer the time delay between events, the more likely a user will notice the 
  4319. loss of synchronization. 
  4320.  
  4321. The sync/stream subsystem design supports multimedia application 
  4322. synchronization requirements by ensuring that program events such as the output 
  4323. of specific data elements (digital audio, image, MIDI audio, and so on) can be 
  4324. reliably synchronized within very narrow real-time limits. The sync/stream 
  4325. subsystem also reduces the complexity of application code required to 
  4326. synchronize events. 
  4327.  
  4328. Being able to synchronize user-oriented and system-driven events is also 
  4329. important to multimedia application developers. For example, an application 
  4330. might need to adjust the tempo of a musical playback sequence while responding 
  4331. to the user's movement of the mouse or pressing arrow keys ( ) on the 
  4332. keyboard. Any perceivable delay in response might be unacceptable. Of more 
  4333. urgent importance is a pilot training program that requires the trainee to 
  4334. press a key to respond to a ground-proximity alarm. If the trainee senses a 
  4335. delay between pressing the key and the alarm sound muting, it would be 
  4336. reasonable to expect the real cockpit controls to react the same way. This 
  4337. false expectation might lead to a crash in real life. 
  4338.  
  4339. SSM synchronization functions simplify a programmer's work. For example, 
  4340. instead of establishing large and complex control structures to synchronize a 
  4341. group of streams, a programmer needs only to identify the streams as part of a 
  4342. group. 
  4343.  
  4344. The sync/stream subsystem design includes several features that provide for 
  4345. simple, effective control of real-time event synchronization: 
  4346.  
  4347.    o  Master/slave relationship 
  4348.    o  Sync pulse generation 
  4349.    o  Sync pulse processing 
  4350.    o  Sync/stream subsystem events 
  4351.    o  Null stream handler 
  4352.  
  4353.  These features exploit the multitasking capability of OS/2 to prevent specific 
  4354.  regions of code and data in physical memory from being paged to disk. This 
  4355.  ensures that the required modules can process data and requests in a real-time 
  4356.  manner, avoiding the latency that would arise should those critical regions be 
  4357.  swapped out when needed. 
  4358.  
  4359.  
  4360. ΓòÉΓòÉΓòÉ 5.2.1. Master/Slave Relationship ΓòÉΓòÉΓòÉ
  4361.  
  4362. A master/slave relationship is a specification of a chain of command for 
  4363. controlling a synchronized event. The relationship is 1:N, where one object 
  4364. (the synchronization master) controls the behavior of one or more subordinate 
  4365. objects (the slaves). The relationship is established using the SpiEnableSync 
  4366. function, where one data stream is designated the master and one or more data 
  4367. streams are designated as slaves. Real-time information, transmitted from the 
  4368. master to all slaves by the Sync/Stream Manager, gives each of the slaves the 
  4369. current time in the time base of the MMTIME standard (1/3 msec units). This 
  4370. time information (sync pulse) allows each slave stream handler to adjust the 
  4371. activity of that stream so that synchronization can be maintained. 
  4372.  
  4373. Certain rules govern master/slave synchronization relationships: 
  4374.  
  4375.    o  A data stream can be a slave in only one synchronization relationship. 
  4376.  
  4377.    o  Stream handlers must be able to enslave multiple data streams (if 
  4378.       multiple data streams are supported) according to different sync masters. 
  4379.       For example, each active stream under that handler's control might have a 
  4380.       different master. 
  4381.  
  4382.    o  A stream cannot become the master of two separate groups of slaves (any 
  4383.       additional streams become slaves in the existing master/slave group). 
  4384.  
  4385.    o  The sync group (master and all slaves) can be started, stopped, and 
  4386.       seeked as a group by using the "slaves" flag on each of the following SPI 
  4387.       functions: 
  4388.  
  4389.         -  SpiStartStream 
  4390.         -  SpiStopStream 
  4391.         -  SpiSeekStream 
  4392.  
  4393.    o  Any slave in a sync relationship may be arbitrarily started or stopped 
  4394.       without affecting the activity of the master or any other slave. The 
  4395.       master can be stopped independently of any slave streams in the same sync 
  4396.       group and the option is available for all of the slave to be stopped at 
  4397.       the same time that the master stream is stopped. 
  4398.  
  4399.    o  Group synchronized stream time will always be the master stream time. 
  4400.       This includes slave streams that have been stopped and re-started. 
  4401.  
  4402.    o  Stream seeking is done on a per stream basis. For example, a seek in a 
  4403.       master stream does not seek in any slave streams that may be in the same 
  4404.       sync group. 
  4405.  
  4406.  It is possible for a slave to fail to maintain synchronization. This 
  4407.  condition, called sync overrun, happens when a stream handler has not 
  4408.  processed the last sync pulse received from the Sync/Stream Manager and 
  4409.  another sync pulse is received. The application can optionally request (by way 
  4410.  of the SpiEnableEvent function) to be notified of any sync overruns. The 
  4411.  stream is not stopped but the application could request a stop once it 
  4412.  receives a sync overrun event. 
  4413.  
  4414.  
  4415. ΓòÉΓòÉΓòÉ 5.2.2. Sync Pulse Generation ΓòÉΓòÉΓòÉ
  4416.  
  4417. A sync pulse represents the current stream sync master clock value and its 
  4418. stream handle (HSTREAM). The clock value is expressed in MMTIME units (1/3 
  4419. milliseconds) where 0 represents the time the master stream was started from 
  4420. the beginning of its associated multimedia data object. If a seek operation is 
  4421. performed on the master, the stream must be stopped. The master stream time 
  4422. also stops when a seek takes place and is reset to the stream time of the seek 
  4423. point. When the stream is restarted, the stream time is restarted from the seek 
  4424. point. This means that stream time can be equated to position in the data as 
  4425. opposed to the amount of time the stream has been active. 
  4426.  
  4427. Sync pulses are generated on a regular basis by the master. A slave receives 
  4428. sync pulses only when the Sync/Stream Manager determines that it is out of sync 
  4429. with the master. Sync pulses are distributed by the stream manager based on the 
  4430. programmed stream sync relationship. This distribution is effective for both 
  4431. DLL and device driver slave stream handlers. 
  4432.  
  4433. Each slave stream handler must regularly update the sync pulse SYNC_EVCB with 
  4434. what it believes the stream time is. The Sync/Stream Manager checks this slave 
  4435. handler stream time against the master stream time and decides whether to send 
  4436. a sync pulse to this handler. 
  4437.  
  4438. Device driver stream handlers receive sync pulses through their sync pulse 
  4439. event control block (SYNC_EVCB). A device driver stream handler must check for 
  4440. sync pulses from the Sync/Stream Manager by polling a flag in the sync pulse 
  4441. SYNC_EVCB. The Sync/Stream Manager sets the flag to indicate a sync pulse and 
  4442. updates the current master stream time. Usually, the device driver slave 
  4443. handler polls the flag once during interrupt processing and adjusts the stream 
  4444. consumption accordingly. 
  4445.  
  4446. DLL stream handlers receive sync pulses in one of two ways. A DLL stream 
  4447. handler can register a semaphore with the Sync/Stream Manager, or it can use 
  4448. the same method the SSM uses for a device driver stream handler. 
  4449.  
  4450.  
  4451. ΓòÉΓòÉΓòÉ 5.2.3. Sync Pulse Processing ΓòÉΓòÉΓòÉ
  4452.  
  4453. Each stream handler (DLL or device driver) can provide sync pulse handling to 
  4454. support synchronization for any streams activated. Typically, the stream 
  4455. handler sync pulse handling logic is capable of correcting the active stream's 
  4456. progress in its real-time context, based on information received in sync pulse 
  4457. SYNC_EVCB created by the stream handler and accessed by the Sync/Stream 
  4458. Manager. 
  4459.  
  4460. For example, if the slave's current local time is 45000 (15.0 seconds in 
  4461. MMTIME), and the master sync pulse time is 44500 (14.83 sec), then the slave 
  4462. stream handler's sync pulse logic should adjust the pace of data streaming 
  4463. (slow down, or repeat the last 170 milliseconds worth of data). This 
  4464. time-adjusting (resync) logic is unique to the type of data the handler is 
  4465. streaming. 
  4466.  
  4467. Since there can be occurrences of heavy system load that make it impossible for 
  4468. DLL sync pulse logic to get control between two sync pulses (task dispatch 
  4469. latency can rise occasionally to delay even time-critical threads), the handler 
  4470. always takes the most current master time (last sync pulse posted). The SSM 
  4471. sets a sync pulse overrun flag if a sync pulse is not processed before the next 
  4472. sync pulse arrives. Also, the sync pulse logic and all associated control data 
  4473. objects must reside in fixed memory, so that these code and data pages are 
  4474. never paged out (at least not while the stream is active). 
  4475.  
  4476. The sync pulse logic must be high performance by nature. Complex, 
  4477. time-consuming synchronization adjusting routines with very long path lengths 
  4478. will not be able to maintain synchronization if they are dispatched 
  4479. continuously. The sync pulse logic is a second level interrupt handler, so its 
  4480. performance must be optimized. If no adjustment of the stream is necessary, the 
  4481. routine might not need to be dispatched at all, which brings us to one final 
  4482. point. 
  4483.  
  4484. The Sync/Stream Manager has sync pulse distribution logic that controls when it 
  4485. will set the slave device driver handler's sync pulse SYNCPOLLING bit flag (the 
  4486. SSM does not call the handler's IDC interface). This logic similarly controls 
  4487. when it will dispatch the DLL handler's time-critical thread (clear a semaphore 
  4488. the thread is waiting on). Typically, the DLL handler detects that a sync pulse 
  4489. has occurred by polling the SYNCPOLLING bit flag in its sync pulse SYNC_EVCB 
  4490. that it gave to the Sync/Stream Manager on return from an SHC_ENABLE_SYNC 
  4491. message. This SYNCPOLLING bit flag is set only when the difference between the 
  4492. master stream time and the slave's local time (both stored in the sync pulse 
  4493. SYNC_EVCB) exceeds a specified resync tolerance value. The Sync/Stream Manager 
  4494. determines this difference for all slaves on each sync pulse received from the 
  4495. master, and only notifies the slaves whose stream has deviated too much from 
  4496. the master stream time. Each stream handler that can receive sync pulses must 
  4497. provide its tolerance value (a minimum time difference expressed in MMTIME) in 
  4498. the stream's SPCB passed on return from the SHC_CREATE. 
  4499.  
  4500.  
  4501. ΓòÉΓòÉΓòÉ 5.2.4. Sync/Stream Subsystem Events ΓòÉΓòÉΓòÉ
  4502.  
  4503. Sync/stream subsystem events identify a specific change of state for either a 
  4504. master or slave stream handler. Some of these events do not have any effect on 
  4505. synchronization and merely indicate status of the data stream. 
  4506.  
  4507. Two classes of events are defined: implicit and explicit. Implicit events are 
  4508. those events which all stream handlers must always support (such as end of 
  4509. stream or preroll complete). Explicit events are events which are supported 
  4510. only by some handlers (such as a custom event unique to a particular type of 
  4511. data). The application automatically receives notification of implicit events; 
  4512. however, the application must enable explicit events by using the 
  4513. SpiEnableEvent function if it wants to receive notification of any other 
  4514. events. Events remain enabled until they are disabled. The SSM and stream 
  4515. handlers are the only components that generate events. 
  4516.  
  4517. The following table lists the events that are currently defined for the 
  4518. sync/stream subsystem. Stream handlers can also define new events for use as a 
  4519. communication mechanism between the stream handler and the application. Refer 
  4520. to the ulType and ulSubType fields in the EVCB data structure in the OS/2 
  4521. Multimedia Programming Reference. 
  4522.  
  4523. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  4524. ΓöéEvent                   ΓöéData      ΓöéDescription                             Γöé
  4525. Γöé                        ΓöéStructure Γöé                                        Γöé
  4526. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4527. ΓöéEVENT_CUE_DATA          ΓöéDATA_EVCB ΓöéA cuepoint in terms of some specific    Γöé
  4528. Γöé(Explicit)              Γöé          Γöépiece of data in a stream. This event   Γöé
  4529. Γöé                        Γöé          Γöécan be enabled as a single event or as aΓöé
  4530. Γöé                        Γöé          Γöérecurring event.                        Γöé
  4531. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4532. ΓöéEVENT_CUE_TIME          ΓöéTIME_EVCB ΓöéA cuepoint in terms of stream time from Γöé
  4533. Γöé(Explicit)              Γöé          Γöéthe start of the stream. This event can Γöé
  4534. Γöé                        Γöé          Γöébe enabled as a single event or as a    Γöé
  4535. Γöé                        Γöé          Γöérecurring event. Recurring events are   Γöé
  4536. Γöé                        Γöé          Γöéevents that are defined as a time       Γöé
  4537. Γöé                        Γöé          Γöéinterval. An event is generated an each Γöé
  4538. Γöé                        Γöé          Γöéoccurrence of this time interval. SingleΓöé
  4539. Γöé                        Γöé          Γöéevents remain enabled, even after they  Γöé
  4540. Γöé                        Γöé          Γöéare reported. In case the stream is     Γöé
  4541. Γöé                        Γöé          Γöéseeked backwards in time to a position  Γöé
  4542. Γöé                        Γöé          Γöébefore a cuepoint and play is resumed,  Γöé
  4543. Γöé                        Γöé          Γöéthe cuepoint will be reported again.    Γöé
  4544. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4545. ΓöéEVENT_CUE_TIME_PAUSE    ΓöéTIME_EVCB ΓöéA cuepoint in terms of stream time from Γöé
  4546. Γöé(Explicit)              Γöé          Γöéthe start of the stream. This event willΓöé
  4547. Γöé                        Γöé          Γöécause the stream to be paused when the  Γöé
  4548. Γöé                        Γöé          Γöécuepoint is reached. This event can be  Γöé
  4549. Γöé                        Γöé          Γöéenabled as a single event.              Γöé
  4550. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4551. ΓöéEVENT_DATAOVERRUN       ΓöéEVCB      ΓöéA stream handler detected a data        Γöé
  4552. Γöé(Explicit)              Γöé          Γöéoverrun. Data could be lost in a        Γöé
  4553. Γöé                        Γöé          Γöérecording situation.                    Γöé
  4554. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4555. ΓöéEVENT_DATAUNDERRUN      ΓöéEVCB      ΓöéA target stream handler detected a data Γöé
  4556. Γöé(Explicit)              Γöé          Γöéunderrun condition. There was no data   Γöé
  4557. Γöé                        Γöé          Γöéavailable to output to the output       Γöé
  4558. Γöé                        Γöé          Γöédevice. Usually in this situation, the  Γöé
  4559. Γöé                        Γöé          Γöétarget stream handler will attempt to   Γöé
  4560. Γöé                        Γöé          Γöéget another buffer and then pause it's  Γöé
  4561. Γöé                        Γöé          Γöédevice. The target stream handler will  Γöé
  4562. Γöé                        Γöé          Γöébe re-started when more data is         Γöé
  4563. Γöé                        Γöé          Γöéavailable to be output. This condition  Γöé
  4564. Γöé                        Γöé          Γöéresults in a break in the output data   Γöé
  4565. Γöé                        Γöé          Γöéstream. Interleaved data format can     Γöé
  4566. Γöé                        Γöé          Γöécause underruns to occur when the end ofΓöé
  4567. Γöé                        Γöé          Γöéthe data is reached, but the end of fileΓöé
  4568. Γöé                        Γöé          Γöéhas not been reached.                   Γöé
  4569. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4570. ΓöéEVENT_EOS (Implicit)    ΓöéIMPL_EVCB ΓöéEnd of stream event.  This event is     Γöé
  4571. Γöé                        Γöé          Γöégenerated after the target stream       Γöé
  4572. Γöé                        Γöé          Γöéhandler has consumed the last buffer in Γöé
  4573. Γöé                        Γöé          Γöéthe stream. This signals to the         Γöé
  4574. Γöé                        Γöé          Γöéapplication that the stream has         Γöé
  4575. Γöé                        Γöé          Γöécompleted processing.                   Γöé
  4576. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4577. ΓöéEVENT_ERROR (Implicit)  ΓöéIMPL_EVCB ΓöéAn error has occurred while streaming.  Γöé
  4578. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4579. ΓöéEVENT_PLAYLISTCUEPOINT  ΓöéPLAYL_EVCBΓöéA memory stream handler playlist        Γöé
  4580. Γöé(Implicit)              Γöé          Γöécuepoint event.                         Γöé
  4581. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4582. ΓöéEVENT_PLAYLISTMESSAGE   ΓöéPLAYL_EVCBΓöéA memory stream handler playlist        Γöé
  4583. Γöé(Implicit)              Γöé          Γöémessage.                                Γöé
  4584. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4585. ΓöéEVENT_QUEUE_OVERFLOW    ΓöéIMPL_EVCB ΓöéEvent queue overflow. Indicates that an Γöé
  4586. Γöé(Implicit)              Γöé          Γöéevent has been lost due to too many     Γöé
  4587. Γöé                        Γöé          Γöéevents being generated. The application Γöé
  4588. Γöé                        Γöé          Γöé(MCD) should use this event to clear anyΓöé
  4589. Γöé                        Γöé          Γöéwaiting conditions.                     Γöé
  4590. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4591. ΓöéEVENT_STREAM_STOPPED    ΓöéIMPL_EVCB ΓöéThe stream has been emptied or          Γöé
  4592. Γöé(Implicit)              Γöé          Γöédiscarded. (Refer to the SpiStopStream  Γöé
  4593. Γöé                        Γöé          Γöéfunction in the Programming Reference.) Γöé
  4594. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4595. ΓöéEVENT_SYNC_PREROLLED    ΓöéIMPL_EVCB ΓöéAll synchronized streams are prerolled. Γöé
  4596. Γöé(Implicit)              Γöé          Γöé(Refer to the SpiStartStream function inΓöé
  4597. Γöé                        Γöé          Γöéthe Programming Reference.)             Γöé
  4598. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4599. ΓöéEVENT_SYNCOVERRUN       ΓöéOVRU_EVCB ΓöéA sync overrun has been detected in the Γöé
  4600. Γöé(Explicit)              Γöé          Γöéstream.                                 Γöé
  4601. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  4602.  
  4603. The Sync/Stream Manager propagates events to the application through the media 
  4604. driver by doing a call-back to an event routine that the application registered 
  4605. with the SSM on an SpiCreateStream call. Use the event routine as if it were a 
  4606. second-level interrupt routine and do not attempt to do a lot of processing. 
  4607. The event routine is on a per-process basis; it receives only one process at a 
  4608. time. Therefore, when an event is sent to be processed, it must wait until the 
  4609. current event has completed processing. 
  4610.  
  4611. Because there is only one EVCB for implicit events, it is a good idea to copy 
  4612. any needed information from the EVCB into local variables for processing by the 
  4613. event routine. The event routine has the following interface: 
  4614.  
  4615. Event_Entry(PEVCB pEVCB, rc)
  4616.  
  4617.  
  4618. ΓòÉΓòÉΓòÉ 5.2.5. Null Stream Handler ΓòÉΓòÉΓòÉ
  4619.  
  4620. The SSM provides a null stream creation capability to enable multimedia 
  4621. applications to synchronize nonstreaming devices with streaming devices. The 
  4622. null stream is created and started for the nonstreaming device, but has no data 
  4623. flow associated with it. The Duet Player II Sample Program provides an example 
  4624. of synchronizing the CD-DA device, which is a nonstreaming device. 
  4625.  
  4626. Any application or media driver can create a null stream, or several null 
  4627. streams. Since the null stream has no default resync tolerance value, the 
  4628. creating module must establish this value by calling SpiGetProtocol followed by 
  4629. SpiInstallProtocol, modifying the resync tolerance field between these two 
  4630. calls. This establishes the frequency of event notification to the calling 
  4631. process, allowing the system to maintain sync without the burden of running the 
  4632. notification thread on every sync pulse. 
  4633.  
  4634. A given process can create multiple null streams. These streams are notified of 
  4635. sync pulses in the same way as real stream handlers; therefore, each null 
  4636. stream handler must support some capabilities a real stream handler supports. 
  4637. Each null stream thus created can have different sync pulse timing 
  4638. characteristics. Sync pulse granularity for each stream is governed by changing 
  4639. the resync tolerance value in the respective SPCBs. 
  4640.  
  4641. Null stream handlers must support the following Stream Handler Command (SHC) 
  4642. messages: 
  4643.  
  4644.    o  SHC_CREATE 
  4645.    o  SHC_DESTROY 
  4646.    o  SHC_DISABLE_EVENT 
  4647.    o  SHC_DISABLE_SYNC 
  4648.    o  SHC_ENABLE_EVENT 
  4649.    o  SHC_ENABLE_SYNC 
  4650.    o  SHC_ENUMERATE_PROTOCOLS 
  4651.    o  SHC_GET_PROTOCOL 
  4652.    o  SHC_GET_TIME 
  4653.    o  SHC_INSTALL_PROTOCOL 
  4654.    o  SHC_NEGOTIATE_RESULT 
  4655.    o  SHC_SEEK 
  4656.    o  SHC_START 
  4657.    o  SHC_STOP 
  4658.  
  4659.  
  4660. ΓòÉΓòÉΓòÉ 5.3. Stream Protocols ΓòÉΓòÉΓòÉ
  4661.  
  4662. The Stream Protocol Control Block (SPCB) defines key parameters that control 
  4663. the behavior of a data stream. The application can query, install, or deinstall 
  4664. a specific SPCB from a stream handler. SPCB information is installed in the 
  4665. SPI.INI file by means of a resource file. (See Installing a Stream Handler for 
  4666. a description of how to install stream protocol.) 
  4667.  
  4668. Each stream handler supports one or more stream protocols. Each SPCB is 
  4669. uniquely identified by the value of the stream data type (SPCB key). One field 
  4670. in the SPCB key allows the stream handler to have multiple SPCBs installed for 
  4671. the same data type. This field can be used by an application to specify which 
  4672. SPCB, for any data type, it wants to use. Each application in the system could 
  4673. define multiple SPCBs for the same data type (see the ulType field in the 
  4674. SPCBKEY data structure). The application can modify a stream protocol by 
  4675. installing a new SPCB and deinstalling the old SPCB. 
  4676.  
  4677. The parameters in the SPCB are: 
  4678.  
  4679.  Fields                   Meaning 
  4680.  
  4681.  SPCB Length              Length of SPCB structure. Provided for future 
  4682.                           expansion of the SPCB. 
  4683.  
  4684.  SPCB Key                 Data stream type and internal key. The internal key 
  4685.                           is used to differentiate between multiple SPCB's of 
  4686.                           the same data stream type. 
  4687.  
  4688.    o  Data Type - The data type of the stream (for example, waveform or MIDI). 
  4689.    o  Data Subtype - The subtype of the stream (for example, 16-bit stereo 
  4690.       PCM). 
  4691.    o  Internal Key - Used to differentiate between multiple SPCB's of the same 
  4692.       data type and subtype. 
  4693.  
  4694.  Data Flag                Attributes of the data type. (that is, specifies 
  4695.                           whether data or time cuepoints are supported by this 
  4696.                           data type). 
  4697.  
  4698.    o  SPCBDATA_CUETIME - This data type can support time cuepoint events. 
  4699.    o  SPCBDATA_CUEDATA - This data type can support data cuepoint events. 
  4700.    o  SPCBDATA_NOSEEK - Seeking cannot be done on this data type. 
  4701.  
  4702.  Number of Records        Maximum number of records per buffer. (This is only 
  4703.                           valid for split streams). 
  4704.  
  4705.  Data Block Size          Size of a block. A block is an atomic piece of data. 
  4706.                           For example, for digital audio data type PCM 16-bit 
  4707.                           stereo at a 44.1 kHz sampling rate, the block size 
  4708.                           would be 4 bytes. 
  4709.  
  4710.  Data Buffer Size         Size of buffer to be used while streaming. Maximum 
  4711.                           buffer size is 64KB. 
  4712.  
  4713.  Min Number of Buffers    Minimum number of buffers needed to maintain a 
  4714.                           constant data stream. 
  4715.  
  4716.  Max Number of Buffers    Maximum number of buffers needed (ideal number). For 
  4717.                           normal streams, this means the number of buffers that 
  4718.                           will be allocated for the stream. For user provided 
  4719.                           buffer streaming, this means the number of buffers 
  4720.                           that the Sync/Stream Manager can queue up for a 
  4721.                           consumer. This can be used by a source stream handler 
  4722.                           that gives the same set of buffers to the Sync/Stream 
  4723.                           Manager repeatedly. If the number of buffers is set 
  4724.                           to the number of buffers in the set minus one, the 
  4725.                           source stream handler will be able to detect when the 
  4726.                           target has consumed a buffer and it can be reused. 
  4727.                           Assuming that the set of buffers is an ordered set 
  4728.                           and each buffer is used in the same order each time. 
  4729.  
  4730.  Source Start Number      Number of EMPTY buffers required to start the source 
  4731.                           stream handler. The value should be at least as big 
  4732.                           as the maximum number of buffers that would be 
  4733.                           requested by the source stream handler. 
  4734.  
  4735.  Target Start Number      Number of FULL buffers required to start the target 
  4736.                           stream handler. The value should be at least as big 
  4737.                           as the maximum number of buffers that would be 
  4738.                           requested by the target stream handler. Usually, a 
  4739.                           target will require at least two buffers at the start 
  4740.                           of the stream. 
  4741.  
  4742.  Buffer Flag              Buffer attributes (that is, the user provides 
  4743.                           buffers, fixed block size, interleaved data type, and 
  4744.                           maximum buffer size). 
  4745.  
  4746.    o  SPCBBUF_USERPROVIDED - User provides buffers for streaming. The 
  4747.       Sync/Stream Manager will not allocate buffers, but attempt to lock down 
  4748.       user provided buffers or copy the data to locked buffers. Using this flag 
  4749.       will affect the performance of streaming. Only a source stream handler 
  4750.       can set this flag. This flag is mutually exclusive with the 
  4751.       SPCBBUF_INTERLEAVED flag. The SPCBBUF_FIXEDBUF cannot be used with this 
  4752.       flag set. 
  4753.    o  SPCBBUF_FIXEDBUF - The buffer size for this stream handler must be a 
  4754.       particular fixed size (for this data type). This flag cannot be used with 
  4755.       the SPCBBUF_USERPROVIDED flag. The SPCBBUF_INTERLEAVED flag (split 
  4756.       stream) implies SPCBBUF_FIXEDBUF. 
  4757.    o  SPCBBUF_NONCONTIGUOUS - Each data buffer is allocated contiguously in 
  4758.       physical memory unless both stream handlers set the non-contiguous flag 
  4759.       (SPCBBUF_NONCONTIGUOUS). This flag allows the system flexibility in 
  4760.       allocating memory. A device driver stream handler may require contiguous 
  4761.       memory, while a DLL stream handler may not. 
  4762.    o  SPCBBUF_INTERLEAVED - This stream is a split stream. It consists of one 
  4763.       input stream of interleaved data that is split into multiple streams of 
  4764.       individual data types. Only the source stream handler can set this flag. 
  4765.       This flag is mutually exclusive with the SPCBBUF_USERPROVIDED flag. The 
  4766.       SPCBBUF_FIXEDBUF cannot be used with this flag set. 
  4767.    o  SPCBBUF_MAXSIZE - The ulBufSize field contains that maximum size buffer 
  4768.       that this stream handler can handle. 
  4769.    o  SPCBBUF_16MEG - The stream buffers may be allocated above 16MB. This is 
  4770.       used by stream handlers device drivers that can support greater than 16MB 
  4771.       addresses. 
  4772.  
  4773.  Handler Flag             Stream handler flags (that is, the handler can 
  4774.                           generate and receive sync pulses, and use the 
  4775.                           Sync/Stream Manager timer as the master, 
  4776.                           non-streaming handler). 
  4777.  
  4778.    o  SPCBHAND_GENSYNC - This stream handler can generate sync pulses. 
  4779.    o  SPCBHAND_RCVSYNC - This stream handler can receive sync pulses. 
  4780.    o  SPCBHAND_NONSTREAM - This stream handler is a non-streaming handler (that 
  4781.       is, a stream handler that can participate in synchronization, but does 
  4782.       not stream). 
  4783.    o  SPCBHAND_GENTIME - This stream handler can keep track of the real stream 
  4784.       time. This handler also supports the SpiGetTime and cuepoint events. 
  4785.    o  SPCBHAND_NOPREROLL - This stream handler cannot preroll its device (that 
  4786.       is, for recording streams, the source stream handler cannot be 
  4787.       prerolled).  The Sync/Stream Manager will treat this stream as if it were 
  4788.       prerolled if asked to preroll this stream. 
  4789.    o  SPCBHAND_NOSYNC - This stream handler can be in a sync group but does not 
  4790.       receive or generate sync pulses. (It is useful to group streams together 
  4791.       so that they can be manipulated as a group). 
  4792.    o  SPCBHAND_PHYS_SEEK - This stream handler does a seek to a physical 
  4793.       device. Other stream handlers only adjust stream time on a seek request. 
  4794.       The Sync/Stream Manager will always call this stream handler first on a 
  4795.       call to the SpiSeekStream function. 
  4796.  
  4797.  Resync Tolerance         Resync tolerance value. It is used to determine 
  4798.                           whether to send a sync pulse to this specific slave 
  4799.                           stream handler, if it is a slave. 
  4800.  
  4801.  Sync Pulse Granularity   Time interval in MMTIME units between sync pulses. 
  4802.                           Used to save sync pulse generation granularity if 
  4803.                           this stream handler is a master, but cannot generate 
  4804.                           its own sync pulse. 
  4805.  
  4806.  Bytes Per Unit           Bytes per unit of time. This is used to do seeks on 
  4807.                           linear data that is not compressed or of variable 
  4808.                           length. It is also used for SHC_GETTIME queries in a 
  4809.                           stream handler. 
  4810.  
  4811.  MMTIME Per Unit          The amount of MMTIME each unit represents. This is 
  4812.                           also used for the seek and "get time" functions of a 
  4813.                           stream handler. 
  4814.  
  4815.  Refer to the OS/2 Multimedia Programming Reference for further information on 
  4816.  structure and flag definitions. 
  4817.  
  4818.  
  4819. ΓòÉΓòÉΓòÉ 5.3.1. Stream Protocol Negotiation at Stream Creation Time ΓòÉΓòÉΓòÉ
  4820.  
  4821. Following are some statements regarding stream protocol negotiation. 
  4822.  
  4823.    o  The following flags are set to On in the negotiated SPCB for the stream 
  4824.       handler that should perform the action specified by the flag. Either the 
  4825.       source or the target negotiated SPCB will contain these bit flags. 
  4826.  
  4827.            SPCBHAND_GENSYNC    SPCBHAND_RCVSYNC 
  4828.  
  4829.            SPCBHAND_GENTIME    SPCBHAND_PHYS_SEEK 
  4830.  
  4831.    o  The DATATYPE_GENERIC will match any other data type during negotiation. 
  4832.       This is useful for stream handlers like the File System Stream Handler 
  4833.       that can be a source for almost any data type. 
  4834.  
  4835.    o  If neither of the SPCB key data types are generic, then both the data 
  4836.       type and subtype fields must match or an error will occur. The internal 
  4837.       key field is not used during negotiation. The internal key of 0 is 
  4838.       returned from negotiation. 
  4839.  
  4840.    o  The block size will default to 1 byte if not specified. The source and 
  4841.       target block size must match or the negotiation will fail. 
  4842.  
  4843.    o  The Data Buffer Size must be a multiple of block size. 
  4844.  
  4845.    o  The negotiation will fail if one stream handler has a fixed buffer size 
  4846.       (SPCBBUF_FIXEDBUF) greater than the maximum buffer size (SPCBBUF_MAXSIZE) 
  4847.       of the other. 
  4848.  
  4849.    o  Both handlers must not have fixed buffer sizes (SPCBBUF_FIXEDBUF) of 
  4850.       different lengths. 
  4851.  
  4852.    o  Both handlers must not have maximum buffer sizes (SPCBBUF_MAXSIZE) of 
  4853.       different lengths. 
  4854.  
  4855.    o  Negotiation will default to a fixed buffer size (SPCBBUF_FIXEDBUF). 
  4856.       Otherwise, the buffer size is set the greater of the two SPCB buffer 
  4857.       sizes, but not greater than the maximum buffer size (SPCBBUF_MAXSIZE), if 
  4858.       one is specified. 
  4859.  
  4860.    o  If no special conditions 
  4861.       (SPCBBUF_FIXEDBUF,SPCBBUF_MAXSIZE,SPCBBUF_USERPROVIDED) were specified, 
  4862.       the largest buffer size is the one that will be used for the stream 
  4863.       creation. 
  4864.  
  4865.    o  For user-provided buffers (SPCBBUF_USERPROVIDED), the buffer size is set 
  4866.       to the maximum buffer size (SPCBBUF_MAXSIZE), or to the largest buffers 
  4867.       possible rounded to a multiple of the block size. 
  4868.  
  4869.    o  Split streams (SPCBBUF_INTERLEAVED) must have a maximum number of records 
  4870.       per buffer greater than 0. The target stream handler must set this field 
  4871.       to 0, since only the source stream handler can set this value. 
  4872.  
  4873.    o  The Minimum and Maximum number of buffers must be greater than zero. 
  4874.  
  4875.    o  The largest Minimum number of buffers value is used. 
  4876.  
  4877.    o  The largest Maximum number of buffers value is used. 
  4878.  
  4879.    o  The Sync/Stream Manager attempts to allocate the maximum number of stream 
  4880.       buffers requested. If it is unable to allocate this amount of space, but 
  4881.       is able to allocate the minimum needed, the stream is created. Otherwise, 
  4882.       the stream creation fails for lack of resources. 
  4883.  
  4884.    o  The number of EMPTY buffers required to start the source is always taken 
  4885.       from the source SPCB. 
  4886.  
  4887.    o  The number of FULL buffers required to start the target is always taken 
  4888.       from the target SPCB. 
  4889.  
  4890.    o  For SpiGetTime requests, each handler must specify whether it can receive 
  4891.       these requests and return real-time information. It can do this by 
  4892.       specifying the SPCBHAND_GENTIME flag. For negotiation, the target stream 
  4893.       handler is the default provider of this information unless only the 
  4894.       source can provide this information. 
  4895.  
  4896.    o  The Bytes Per Unit and MMTIME Per Unit are set from the stream handler 
  4897.       that handles the real-time requests per the previous statement. 
  4898.  
  4899.    o  For sync pulses, each handler must specify whether it can send or receive 
  4900.       sync pulses. It can do this by specifying the SPCBHAND_GENSYNC or 
  4901.       SPCBHAND_RCVSYNC flag. For negotiation, the target stream handler is the 
  4902.       default generator and receiver of sync pulses unless only the source can 
  4903.       generate and receive sync pulses. 
  4904.  
  4905.    o  The sync tolerance is only valid for handlers that set the 
  4906.       SPCBHAND_RCVSYNC. 
  4907.  
  4908.    o  The sync pulse granularity is only valid for handlers that set the 
  4909.       SPCBHAND_GENSYNC. 
  4910.  
  4911.    o  The SPCBHAND_PHYS_SEEK flag is used to specify if a stream handler does a 
  4912.       physical device seek when called on an SHC_SEEK call. The Sync/Stream 
  4913.       Manager uses this information to determine which stream handler should be 
  4914.       called first on an SpiSeekStream call. The handler that does a physical 
  4915.       device seek will be called first, otherwise, the stream handler that 
  4916.       specified SPCBHAND_GENTIME will be called last. 
  4917.  
  4918.    o  Any reserved fields must be set to NULL. 
  4919.  
  4920.    o  Any undefined bit in any bit flag of the stream protocol must be set to 
  4921.       0. 
  4922.  
  4923.  
  4924. ΓòÉΓòÉΓòÉ 5.4. Cuepoint Event Support ΓòÉΓòÉΓòÉ
  4925.  
  4926. In certain instances it is not appropriate for a source stream handler to 
  4927. report cuepoints to an application (or media driver), but to allow the target 
  4928. to report the cuepoint. Usually, an application awaiting a cuepoint wants to 
  4929. receive it at the time the data is being output on the target side of a stream. 
  4930. One such circumstance involves the System Memory Stream Handler. 
  4931.  
  4932. The System Memory Stream Handler has the ability to stream data from a 
  4933. playlist. A playlist is basically a little program that specifies what memory 
  4934. objects from a user application should be streamed and in what order. It 
  4935. consists of control information to enable looping, branching, and subroutines 
  4936. calls within the playlist. Another feature of a playlist is the CUEPOINT 
  4937. instruction, which allows the playlist to specify where in the data stream that 
  4938. cuepoints need to be sent to the application. Since the playlist is "played" 
  4939. within the source stream handler, it needs to notify the target stream handler 
  4940. to report the cuepoint at the appropriate time in the data stream. 
  4941.  
  4942. The Sync/Stream Manager provides the ability for a source stream handler to 
  4943. associate a cuepoint with a buffer that it passes to the target stream handler 
  4944. (through the Sync/Stream Manager). This buffer and attribute remain in the data 
  4945. stream until the target stream handler requests it. The attribute for the 
  4946. buffer is passed with the buffer to the target (refer to the SMH_NOTIFY message 
  4947. in the OS/2 Multimedia Programming Reference). The target stream handler must 
  4948. then flag the event (for example, EVENT_CUE_DATA) when it receives a buffer 
  4949. with a non-zero attribute. The value of the attribute is passed as a parameter 
  4950. to the event on the SMH_REPORTEVENT call to the Sync/Stream Manager. 
  4951.  
  4952. This feature of the Sync/Stream Manager supports the memory playlist ability to 
  4953. send a cuepoint event as close to actual time it occurs as possible. For this 
  4954. to work, it must be the target stream handler that must flag the cuepoint event 
  4955. to the application, in this case the media driver. If the System Memory Stream 
  4956. Handler is the source stream handler, it must notify the target stream handler 
  4957. to flag a cuepoint event. Refer to the OS/2 Multimedia Programming Reference 
  4958. for more information on playlists. 
  4959.  
  4960.  
  4961. ΓòÉΓòÉΓòÉ 5.5. CD-ROM XA Stream Handler ΓòÉΓòÉΓòÉ
  4962.  
  4963. The Sync/Stream Manager provides a mechanism to allow one data stream source 
  4964. and multiple targets, called split streams. For example, CD-ROM XA can 
  4965. interleave waveform audio, video, and text data within the same data buffer. 
  4966. The CD-ROM XA Stream Handler splits the data into multiple streams for CD-ROM 
  4967. XA devices. It is more efficient for the stream handler to read the combined 
  4968. data into one buffer and then insert the video data into a video stream and the 
  4969. waveform audio data into a waveform audio stream without copying the data. The 
  4970. waveform audio data stream is then consumed by a waveform audio stream handler 
  4971. and the video stream by a video stream handler. The waveform audio stream 
  4972. handler sees only the audio portions of the data stream and the video stream 
  4973. handler sees only the video portions of the stream. 
  4974.  
  4975. A data stream can be split into multiple split streams. The number is limited 
  4976. only by the resources of the system. Each separate split of the stream is a 
  4977. separate stream. The work of parsing and determining the different data is the 
  4978. job of the source stream handler, which actually fills an empty buffer from the 
  4979. Sync/Stream Manager with data from the source device. 
  4980.  
  4981. The source stream handler must determine which data goes in which stream. It 
  4982. must then return to the Sync/Stream Manager pointers to the individual records 
  4983. of the buffer. Each record is a portion of the buffer filled with data specific 
  4984. to one of the split streams. These records are returned to the Sync/Stream 
  4985. Manager indicating which stream they should go to. The Sync/Stream Manager will 
  4986. then queue these records in the respective buffer or record queue for one of 
  4987. the split streams sharing the buffer. 
  4988.  
  4989. You can set up this type of split stream as follows. Multiple streams must be 
  4990. created, each with a call to the SpiCreateStream function to the Sync/Stream 
  4991. Manager. The first of these functions is a normal stream creation call with the 
  4992. hstreamBuf parameter set to NULL. Every other subsequent SpiCreateStream call 
  4993. that needs to share the buffers of the first stream must pass that stream's 
  4994. handle in the hstreamBuf parameter. This is the mechanism used by the 
  4995. Sync/Stream Manager to allow these split streams to share the buffers of the 
  4996. first stream. 
  4997.  
  4998. The source stream handler will also receive this parameter on an SHC_CREATE 
  4999. call and need to support this kind of streaming. The SPCBBUF_INTERLEAVED flag 
  5000. in the SPCB that is set by the source stream handler to indicate whether it can 
  5001. do split streaming. If it cannot, any SpiCreateStream attempting to use its 
  5002. buffers will be rejected.  Any stream sharing buffers will be negotiated to use 
  5003. the same size buffers and number of buffers as the stream that allocated the 
  5004. buffers. 
  5005.  
  5006. The split-stream mechanism only works for one source and multiple targets. 
  5007.  
  5008.  
  5009. ΓòÉΓòÉΓòÉ 5.6. Streaming Scenarios ΓòÉΓòÉΓòÉ
  5010.  
  5011. The following programming scenarios provide sample pseudocode of data streaming 
  5012. in the OS/2 multimedia environment using the sync/stream subsystem functions. 
  5013. This pseudocode shows how to structure your application code to use the SPI 
  5014. functions. For further details about how the sync/stream subsystem interfaces 
  5015. operate, refer to detailed definitions of the functions and messages in the 
  5016. Programming Reference. 
  5017.  
  5018.  
  5019. ΓòÉΓòÉΓòÉ 5.6.1. Streaming Waveform Audio Data from the File System ΓòÉΓòÉΓòÉ
  5020.  
  5021. This scenario describes creating a waveform audio data stream and associating a 
  5022. file containing waveform audio with the source stream handler (File System 
  5023. Stream Handler DLL), where the target handler is the Audio Stream Handler, as 
  5024. shown in the following example. 
  5025.  
  5026.  /**************************************************************/
  5027.  /*                         M A I N                            */
  5028.  /**************************************************************/
  5029.  #include        <os2.h>
  5030.  #include        <stdlib.h>
  5031.  #include        <stdio.h>
  5032.  #include        <conio.h>
  5033.  #include        <string.h>
  5034.  #include        "os2me.h"
  5035.  
  5036.  main()
  5037.  {
  5038.  RC           ulRC;             /* Error return code */
  5039.  SPCBKEY      SPCBkey;          /* Data type to stream */
  5040.  IMPL_EVCB    EVCB;             /* Event control block for implicit events */
  5041.  ACB_MMIO     acb;              /* Associate control block used to assoc */
  5042.                                 /* The file to stream (play) */
  5043.  DCB_AUDIOSH  dcb;              /* Audio device driver information */
  5044.  HAND         ahand[5];         /* Enumerate handler info */
  5045.  ULONG        ulNumHand = 5;
  5046.  HID          hidSource, hidTarget, hidunused; /* Handler ID */
  5047.  HSTREAM      hstream;          /* Stream handle */
  5048.  HEVENT       hevent;           /* Event handle for implicit events */
  5049.  HMMIO        hmmioIn;          /* Handle to mmio file open */
  5050.  /* Get list of all stream handlers in system */
  5051.  if (rc = SpiEnumerateHandlers(&ahand, &ulNumHand))
  5052.     return(rc);    /* error! */
  5053.  /* Get the stream handler ID for the File System Stream Handler */
  5054.  if (rc = SpiGetHandler("FSSH",&hidSource,&hidunused))
  5055.     return(rc);    /* error! */
  5056.  /* Get the stream handler ID for the Audio Stream Handler */
  5057.  if (rc = SpiGetHandler("AUDIOSH$",&hidunused,&hidTarget))
  5058.     return(rc);    /* error! */
  5059.  /* Create a data stream from the file system to the */
  5060.  /* waveform audio ACPA device connected to speakers. */
  5061.  SPCBkey.ulDataType = DATATYPE_WAVEFORM;
  5062.  SPCBkey.ulDataSubType = WAVE_FORMAT_4S16;
  5063.  SPCBkey.ulINtKey = 0;
  5064.  strcpy(dcb.szDevName,"AUDIO1$");
  5065.  dcb.ulDCBLen = sizeof(dcb);
  5066.  dcb.hSysFileNum = (** hSysFileNum returned by audio dd on audio_init call)
  5067.  if (rc = SpiCreateStream(hidSource,
  5068.                           hidTarget,
  5069.                           &SPCBkey,
  5070.                           NULL,
  5071.                           (PDCB)&dcb,
  5072.                           (PEVCB)&EVCB,
  5073.                           EventProc,
  5074.                           0,
  5075.                           &hstream,
  5076.                           &hevent))
  5077.     return(rc);    /* error! */
  5078.  /* USE MMIO to access a waveform audio object */
  5079.  if ((hmmioIn = mmioOpen("c:\lawton\files\waveform\hendrix.jim"
  5080.                          NULL,
  5081.                          MMIO_READWRITE|
  5082.                          MMIO_DENYNONE)) == NULL)
  5083.     return(ERROR_FILE_NOT_FOUND);
  5084.  /* Fill in acb with data object info */
  5085.  acb.ulACBLen = sizeof(ACB_MMIO);
  5086.  acb.ulObjType = ACBTYPE_MMIO;
  5087.  acb.hmmio = hmmioIn;
  5088.  /* Associate the waveform data object with the source handler */
  5089.  if (rc = SpiAssociate(hstream,hidSource,&acb))
  5090.     return(rc);    /* error! */
  5091.  /* Start the streaming */
  5092.  if (rc = SpiStartStream(hstream, SPI_START_STREAM))
  5093.     return(rc);    /* error! */
  5094.  /* Do other processing */
  5095.  
  5096.  /* Create a semaphore and block this thread on the semaphore */
  5097.  /* until the streaming is complete                           */
  5098.                     .
  5099.                     .
  5100.                     .
  5101.  /* Destroy the stream  */
  5102.  if (rc = SpiDestroyStream(hstream))
  5103.     return(rc);    /* error! */
  5104.  
  5105.  /* Perform any other resource cleanup */
  5106.  
  5107.  /**************************************************************/
  5108.  /*                E v e n t   P r o c e d u r e               */
  5109.  /**************************************************************/
  5110.  RC EventProc(EVCB *pEVCB)
  5111.  {
  5112.  /* Handle events from the Sync/Stream Manager */
  5113.  switch (pEVCB->ulType) {
  5114.  
  5115.     case EVENT_IMPLICIT_TYPE:
  5116.        switch (pEVCB->ulSubType) {
  5117.           case EVENT_EOS:     /* End of Stream */
  5118.              /* Clear the semaphore so that the main */
  5119.              /* routine can continue execution.      */
  5120.              break;
  5121.           case EVENT_ERROR:   /* Error occurred */
  5122.              /* flag error condition in main line application */
  5123.              break;
  5124.           case EVENT_STREAM_STOPPED:  /* Discard/Flush Stop */
  5125.              /* Do processing while stream stopped */
  5126.              break;
  5127.           case EVENT_SYNC_PREROLLED:  /* Stream is prerolled */
  5128.              /* Now that the producers are prerolled, do a real
  5129.                 start to the stream handlers */
  5130.              break;
  5131.           default:
  5132.              /* Unknown event, do something */
  5133.           }
  5134.        break;
  5135.     default:
  5136.        /* Unknown event, do something */
  5137.     }
  5138.  }
  5139.  
  5140.  
  5141. ΓòÉΓòÉΓòÉ 5.6.2. Synchronized MIDI and Waveform Streams ΓòÉΓòÉΓòÉ
  5142.  
  5143. This scenario describes how two streams (waveform audio and MIDI) are created 
  5144. and synchronized with each other. The audio stream is the synchronization 
  5145. master stream. The source handler for the waveform stream is the File System 
  5146. Stream Handler DLL. The source handler for the MIDI stream is the File System 
  5147. Stream Handler DLL. 
  5148.  
  5149. Currently, the audio stream handler does not provide the ability to be a slave 
  5150. to a master stream. It does, however, have the ability to be the master stream 
  5151. handler. 
  5152.  
  5153.  /**************************************************************/
  5154.  /*                         M A I N                            */
  5155.  /**************************************************************/
  5156.  main()
  5157.  {
  5158.  RC           ulRC;             /* Error return code */
  5159.  
  5160.  SPCBKEY      spcbkey;          /* Data type to stream */
  5161.  IMPL_EVCB    evcb1, evcb2;     /* Event control block for implicit events */
  5162.  ACB_MMIO     acb;              /* Associate control block used to assoc */
  5163.                                 /* The file to stream (play) */
  5164.  DCB_AUDIOSH  dcb;              /* Audio device driver information */
  5165.  HAND         ahand[5];         /* Enumerate handler info */
  5166.  ULONG        ulNumHand = 5;
  5167.  HID          hidSource1, hidTarget1, hidunused;    /* Handler IDs */
  5168.  HID          hidSource2, hidTarget2
  5169.  HSTREAM      hstream1, hstream2; /* Stream handle */
  5170.  HEVENT       hevent1, hevent2; /* Event handle for implicit events */
  5171.  HMMIO        hmmio1, hmmio2;   /* Handle to mmio file open */
  5172.  SLAVE        slave[1];         /* Sync slave structure */
  5173.  
  5174.  /* Get list of all Stream handlers in system */
  5175.  if (rc = SpiEnumerateHandlers(&ahand, &ulNumHand))
  5176.     return(rc);    /* error! */
  5177.  
  5178.  /********************************************************/
  5179.  /****** CREATE WAVEFORM AUDIO STREAM  (Stream # 1) ******/
  5180.  /********************************************************/
  5181.  /* Get the stream Handler ID for the file system stream handler */
  5182.  if (rc = SpiGetHandler("FSSH",&hidSource1,&hidunused))
  5183.     return(rc);    /* error! */
  5184.  /* Get the stream handler ID for the Audio Stream Handler */
  5185.  if (rc = SpiGetHandler("AUDIOSH$",&hidunused,&hidTarget1))
  5186.     return(rc);    /* error! */
  5187.  /* Create a data stream from the file system to */
  5188.  /* the audio ACPA device connected to speakers.  */
  5189.  spcbkey.ulDataType = DATATYPE_ADPCM_AVC;
  5190.  spcbkey.ulDataSubType = ADPCM_AVC_HQ;
  5191.  spcbkey.ulINtKey = 0;
  5192.  strcpy(dcb.szDevName,"AUDIO1$");
  5193.  dcb.ulDCBLen = sizeof(dcb);
  5194.  dcb.hSysFileNum = (** hSysFileNum returned by audio dd on audio_init call)
  5195.  if (rc = SpiCreateStream(hidSource1,
  5196.                           hidTarget1,
  5197.                           &spcbkey,
  5198.                           NULL,
  5199.                           (PDCB)&dcb,
  5200.                           (PEVCB)&evcb1,
  5201.                           EventProc,
  5202.                           0,
  5203.                           &hstream1,
  5204.                           &hevent1))
  5205.     return(rc);    /* error! */
  5206.  /* USE MMIO to access a waveform audio object */
  5207.  if ((hmmio1 = mmioOpen("E:\Mygreat\waveform\file\screams.hq"
  5208.                         NULL,
  5209.                         MMIO_READWRITE|
  5210.                         MMIO_DENYNONE)) == NULL)
  5211.     return(ERROR_FILE_NOT_FOUND);
  5212.  /* Fill in acb with data object info */
  5213.  acb.ulACBLen = sizeof(ACB_MMIO);
  5214.  acb.ulObjType = ACBTYPE_MMIO;
  5215.  acb.hmmio = hmmio1;
  5216.  /* Associate the waveform data object with the source handler */
  5217.  if (rc = SpiAssociate(hstream1,hidSource1,&acb))
  5218.     return(rc);    /* error! */
  5219.  
  5220.  /**********************************************/
  5221.  /****** CREATE MIDI STREAM  (Stream # 2) ******/
  5222.  /**********************************************/
  5223.  /* Get the stream handler ID for the File System Stream Handler */
  5224.  if (rc = SpiGetHandler("FSSH",&hidSource2,&hidunused))
  5225.     return(rc);    /* error! */
  5226.  /* Get the stream handler ID for the MIDI Audio Stream Handler */
  5227.  if (rc = SpiGetHandler("AUDIOSH$",&hidunused,&hidTarget2))
  5228.     return(rc);    /* error! */
  5229.  
  5230.  /* Create a data stream from the memory to an */
  5231.  /* OEM audio device connected to speakers.     */
  5232.  spcbkey.ulDataType = DATATYPE_MIDI;
  5233.  spcbkey.ulDataSubType = SUBTYPE_NONE;
  5234.  spcbkey.ulINtKey = 0;
  5235.  strcpy(dcb.szDevName,"AUDIO99$");
  5236.  dcb.ulDCBLen = sizeof(dcb);
  5237.  dcb.hSysFileNum = (** hSysFileNum returned by audio dd on audio_init call)
  5238.  if (rc = SpiCreateStream(hidSource2,
  5239.                           hidTarget2,
  5240.                           &spcbkey,
  5241.                           NULL,
  5242.                           (PDCB)&dcb,
  5243.                           (PEVCB)&evcb2,
  5244.                           EventProc,
  5245.                           0,
  5246.                           &hstream2,
  5247.                           &hevent2))
  5248.     return(rc);    /* error! */
  5249.  
  5250.  /* USE MMIO to access a waveform audio object */
  5251.  if ((hmmio2 = mmioOpen("E:Mygreat\midi\file\screams.mid"
  5252.                         NULL,
  5253.                         MMIO_READWRITE|
  5254.                         MMIO_DENYNONE)) == NULL)
  5255.     return(ERROR_FILE_NOT_FOUND);
  5256.  /* Fill in acb with data object info */
  5257.  acb.ulACBLen = sizeof(ACB_MMIO);
  5258.  acb.ulObjType = ACBTYPE_MMIO;
  5259.  acb.hmmio = hmmio2;
  5260.  /* Associate the waveform data object with the source handler */
  5261.  if (rc = SpiAssociate(hstream2,hidSource2,&acb))
  5262.     return(rc);    /* error! */
  5263.  
  5264.  
  5265.  /**************************************************************/
  5266.  /***** SETUP THE SYNCHRONIZATION BETWEEN THE TWO STREAMS ******/
  5267.  /**************************************************************/
  5268.  slave[0].hSlaveStream = hstream2;   /* MIDI stream is slave */
  5269.  slave[0].mmtimeStart = 0;           /* Time to start slave */
  5270.  if (rc = SpiEnableSync(hstream1,          /* Audio stream is master */
  5271.                         &slave,
  5272.                         1,                 /* Number of slaves */
  5273.                         0))                /* Use spcb sync granularity */
  5274.     return(rc);    /* error! */
  5275.  /* Start streams by passing the handle to the stream sync master */
  5276.  if (rc = SpiStartStream(hstream1, SPI_START_SLAVES))
  5277.     return(rc);    /* error! */
  5278.  
  5279.  /* Do other processing */
  5280.                     .
  5281.                     .
  5282.                     .
  5283.  
  5284.  /* Create a semaphore and block this thread on the semaphore */
  5285.  /* until the streaming is complete                           */
  5286.                     .
  5287.                     .
  5288.                     .
  5289.  
  5290.  /* Destroy both streams when completed */
  5291.  if (rc = SpiDestroyStream(hstream1))
  5292.     return(rc);    /* error! */
  5293.  if (rc = SpiDestroyStream(hstream2))
  5294.     return(rc);    /* error! */
  5295.  
  5296.  /* Perform other resource cleanup */
  5297.  }
  5298.  /**************************************************************/
  5299.  /*                E v e n t   P r o c e d u r e               */
  5300.  /**************************************************************/
  5301.  RC EventProc(EVCB *pEVCB)
  5302.  {
  5303.  if (pEVCB == &EVCB1)      /* Stream #1 or Stream # 2 event ? */
  5304.     /* Process Stream #1 events */
  5305.  else
  5306.     /* Process Stream #2 events */
  5307.  /* Handle events from the Sync/Stream Manager */
  5308.  switch (pEVCB->ulType) {
  5309.     case EVENT_IMPLICIT_TYPE:
  5310.        switch (pEVCB->ulSubType) {
  5311.           case EVENT_EOS:     /* End of Stream */
  5312.              /* Clear the semaphore so that the main routine can */
  5313.              /* continue execution.                              */
  5314.              break;
  5315.           case EVENT_ERROR:   /* Error occurred */
  5316.              /* flag error condition in main line application */
  5317.              break;
  5318.           case EVENT_STREAM_STOPPED:  /* Discard/Flush Stop */
  5319.              /* Do processing while stream stopped */
  5320.              break;
  5321.           case EVENT_SYNC_PREROLLED:  /* Stream is prerolled */
  5322.              /* Now that the producers are prerolled, do a real
  5323.                 start to the stream handlers */
  5324.              break;
  5325.           default:
  5326.              /* Unknown event, do something */
  5327.           }
  5328.        break;
  5329.     default:
  5330.        /* Unknown event, do something */
  5331.     }
  5332.  }
  5333.  
  5334.  
  5335. ΓòÉΓòÉΓòÉ 5.7. DLL Model: File System Stream Handler ΓòÉΓòÉΓòÉ
  5336.  
  5337. The multimedia system provides stream handlers at both system kernel level 
  5338. (Ring 0) as OS/2 PDDs, and at application level (Ring 3) as OS/2 DLLs. The 
  5339. reason for having both types of stream handlers is that while some streams are 
  5340. ideally controlled by a direct connection between the stream handler and a 
  5341. device's PDD, other streams are not associated with a data source or target, 
  5342. which maps physically to a specific device. For example, the File System Stream 
  5343. Handler is a DLL, because all file system I/O functions are available as Ring 3 
  5344. OS/2 API, and service all file system devices. This eliminates the need to 
  5345. build a specific stream handler PDD for every device the file system can 
  5346. access. 
  5347.  
  5348.  
  5349. ΓòÉΓòÉΓòÉ 5.7.1. File System Stream Handler Modules ΓòÉΓòÉΓòÉ
  5350.  
  5351. The following figure illustrates the outline of the file system stream handler 
  5352. (FSSHT.DLL). 
  5353.  
  5354. The descriptions for the sample file system stream handler modules shown in the 
  5355. example in section File System Stream Handler Modules are contained in the 
  5356. following table. 
  5357.  
  5358. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  5359. ΓöéProcedure Name ΓöéDescription                                            Γöé
  5360. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5361. ΓöéSHINIT.C       ΓöéReceives control when FSSHT.DLL is loaded and performs Γöé
  5362. Γöé               Γöéthe following functions:                               Γöé
  5363. Γöé               ΓöéDLL_INITTERM  Initialization routine to                Γöé
  5364. Γöé               Γöé              register the stream handler              Γöé
  5365. Γöé               Γöé              with the Sync/Stream Manager             Γöé
  5366. Γöé               Γöé              (SSM), allocate heap memory,             Γöé
  5367. Γöé               Γöé              and create mutex semaphores.             Γöé
  5368. Γöé               ΓöéSHEXITLIST    Termination routine to                   Γöé
  5369. Γöé               Γöé              deregister the stream handler,           Γöé
  5370. Γöé               Γöé              destroy any active streams,              Γöé
  5371. Γöé               Γöé              reload heap memory, and close            Γöé
  5372. Γöé               Γöé              mutex semaphores.                        Γöé
  5373. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5374. ΓöéSHROUTER.C     ΓöéReceives the stream handler command (SHC) messages fromΓöé
  5375. Γöé               ΓöéSSM and routes them to the appropriate low-level       Γöé
  5376. Γöé               Γöéroutines.                                              Γöé
  5377. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5378. ΓöéFSSHASS.C      ΓöéProcesses the SHC_ASSOCIATE stream handler command     Γöé
  5379. Γöé               Γöémessage to associate an object (file handler, CD ROM   Γöé
  5380. Γöé               Γöédrive letter, and so on) with a data stream.           Γöé
  5381. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5382. ΓöéSHEPROT.C      ΓöéProcesses the SHC_ENUMERATE stream handler command     Γöé
  5383. Γöé               Γöémessage to return a list of stream protocols for a     Γöé
  5384. Γöé               Γöégiven stream.                                          Γöé
  5385. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5386. ΓöéSHGPROT.C      ΓöéProcesses the SHC_GET_PROTOCOL stream handler command  Γöé
  5387. Γöé               Γöémessage to return a stream protocol control block      Γöé
  5388. Γöé               Γöé(SPCB) for a given data type.                          Γöé
  5389. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5390. ΓöéSHIPROT.C      ΓöéProcesses the SHC_INSTALL_PROTOCOL stream handler      Γöé
  5391. Γöé               Γöécommand message to install or replace an SPCB for a    Γöé
  5392. Γöé               Γöégiven data type.                                       Γöé
  5393. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5394. ΓöéFSSHCREA.C     ΓöéProcesses the SHC_CREATE stream handler command messageΓöé
  5395. Γöé               Γöéto create a stream instance for a given data type and  Γöé
  5396. Γöé               Γöésubtype. If the create is for a source stream handler, Γöé
  5397. Γöé               Γöéa read thread in FSSHREAD.C is created. Otherwise a    Γöé
  5398. Γöé               Γöéwrite thread is created in FSSHWRIT.C for a target     Γöé
  5399. Γöé               Γöéstream handler.                                        Γöé
  5400. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5401. ΓöéSHNEGOT.C      ΓöéProcesses the SHC_NEGOTIATE_RESULTS stream handler     Γöé
  5402. Γöé               Γöécommand message to save the negotiated SPCB for a givenΓöé
  5403. Γöé               Γöéstream instance.                                       Γöé
  5404. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5405. ΓöéSHSTART.C      ΓöéProcesses the SHC_START stream handler command message Γöé
  5406. Γöé               Γöéto start the data streaming for a given stream         Γöé
  5407. Γöé               Γöéinstance. For a source stream handler, the read thread Γöé
  5408. Γöé               Γöéin FSSHREAD.C is run. For a target stream handler, the Γöé
  5409. Γöé               Γöéwrite thread in FSSHWRIT.C is run.                     Γöé
  5410. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5411. ΓöéSHSTOP.C       ΓöéProcesses the SHC_STOP stream handler command message  Γöé
  5412. Γöé               Γöéto stop the data streaming for a given stream instance.Γöé
  5413. Γöé               ΓöéFor a source stream handler, the read thread in all theΓöé
  5414. Γöé               Γöébuffers is either discarded (STOP DISCARD) or returned Γöé
  5415. Γöé               Γöéto SSM (STOP FLUSH). For a target stream handler, the  Γöé
  5416. Γöé               Γöéwrite thread in FSSHWRIT.C is blocked, with buffers    Γöé
  5417. Γöé               Γöéeither discarded or flushed.                           Γöé
  5418. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5419. ΓöéFSSHSEEK.C     ΓöéProcesses the SHC_SEEK stream handler command message  Γöé
  5420. Γöé               Γöéto seek to a specified point in the stream object. The Γöé
  5421. Γöé               Γöéseek can be from the beginning of the file, the currentΓöé
  5422. Γöé               Γöéposition, or the end o the file. The seek point can be Γöé
  5423. Γöé               Γöéspecified in bytes offset or MMTIME units. This module Γöé
  5424. Γöé               Γöéinterfaces with low-level routines in SEEKCALC.ASM to  Γöé
  5425. Γöé               Γöéperform conversion from MMTIME values to bytes, and    Γöé
  5426. Γöé               Γöéwith mmioSeek to perform the actual seek in the object.Γöé
  5427. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5428. ΓöéSEEKCALC.ASM   ΓöéPerforms the low-level conversions of MMTIME to bytes, Γöé
  5429. Γöé               Γöéand bytes to MMTIME, needed by FSSHSEEK.C.             Γöé
  5430. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5431. ΓöéSHDESTRY.C     ΓöéProcesses the SHC_DESTROY stream handler command       Γöé
  5432. Γöé               Γöémessage to remove a stream instance. Either the read   Γöé
  5433. Γöé               Γöéthread in FSSHREAD.C or the write thread in FSSHWRIT.C Γöé
  5434. Γöé               Γöéis terminated when this message is received.           Γöé
  5435. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5436. ΓöéSHMISC.C       ΓöéSupporting routines used by the other stream handler   Γöé
  5437. Γöé               Γöémodules; for example, searching the stream instance    Γöé
  5438. Γöé               Γöéchain to find a particular stream instance, finding an Γöé
  5439. Γöé               Γöéextended stream protocol control block (SPCB), and     Γöé
  5440. Γöé               Γöédeallocating a stream instance.                        Γöé
  5441. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5442. ΓöéFSSHREAD.C     ΓöéReads an object from the file system. A read thread is Γöé
  5443. Γöé               Γöécreated when the SHC_CREATE message is received in     Γöé
  5444. Γöé               ΓöéFSSHCREA.C and destroyed when the SHC_DESTROY message  Γöé
  5445. Γöé               Γöéis received in SHDESTRY.C. The read is accomplished by Γöé
  5446. Γöé               Γöéinterfacing with a mmioRead routine and low-level      Γöé
  5447. Γöé               Γöéroutines in SHIOUTIL.C to check processing flags and   Γöé
  5448. Γöé               Γöéreport events to SSM.                                  Γöé
  5449. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5450. ΓöéSHIOUTIL.C     ΓöéLow-level routines used by FSSHREAD.C and FSSHWRIT.C   Γöé
  5451. Γöé               Γöémodules. This module performs checks of processing     Γöé
  5452. Γöé               Γöéflags and also reports processing events to SSM.       Γöé
  5453. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5454. ΓöéFSSHDAT.C      ΓöéGlobal data declaration for the stream handler         Γöé
  5455. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  5456. Γöémakefile       ΓöéMakefile to build FSSHT.DLL sample file system stream  Γöé
  5457. Γöé               Γöéhandler                                                Γöé
  5458. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  5459.  
  5460.  
  5461. ΓòÉΓòÉΓòÉ 5.7.2. Entry Points Diagram ΓòÉΓòÉΓòÉ
  5462.  
  5463. The Sync/Stream Manager DLL exports SPI services to higher-level OS/2 
  5464. multimedia components (such as media drivers) and exports Stream Manager Helper 
  5465. (SMH) messages to support the stream handler DLLs. Additional SMH messages are 
  5466. exported by the SSM device driver to stream handler device drivers using 
  5467. standard OS/2 inter-device driver communication (IDC) interfaces (established 
  5468. using DevHelp_AttachDD). 
  5469.  
  5470.  
  5471. ΓòÉΓòÉΓòÉ 5.7.3. SMHEntryPoint ΓòÉΓòÉΓòÉ
  5472.  
  5473. The Stream Manager Helper (SMH) messages are exported for use by both device 
  5474. driver and DLL stream handlers through the SMHEntryPoint. The stream handlers 
  5475. use these helper routines to register with the Sync/Stream Manager, report 
  5476. events and synchronization cues, and request or return buffers. They are 
  5477. synchronous calls and are available to Ring 3 DLL stream handlers as a DLL call 
  5478. (Ring 0 stream handlers as an IDC call). 
  5479.  
  5480.  
  5481. ΓòÉΓòÉΓòÉ 5.7.4. SHCEntryPoint ΓòÉΓòÉΓòÉ
  5482.  
  5483. As illustrated in the following example, a DLL stream handler implements 
  5484. function through an additional entry point. DLL stream handlers must supply an 
  5485. interface to communicate with the Sync/Stream Manager. This interface, called 
  5486. the stream handler command (SHC) interface, exports stream handler commands 
  5487. (SHCs) for use by the Sync/Stream Manager to set up and control data streams. 
  5488. These SHCs are accessible through a single entry point, SHCEntryPoint. 
  5489.  
  5490. RC ShcRouter(pshc)
  5491. PSHC_COMMON pshcNow;
  5492.  
  5493. { /* Start of ShcRouter */
  5494.  
  5495. RC rc = NO_ERROR;                       /* local return code */
  5496.   switch (pshc->ulFunction)
  5497.   {
  5498.     case SHC_ASSOCIATE:
  5499.          {
  5500.            rc = ShcAssociate((PPARM_ASSOC)pshcNow);
  5501.            break;
  5502.          }
  5503.     case SHC_CREATE:
  5504.          {
  5505.            rc = ShcCreate((PPARM_CREATE)pshcNow);
  5506.            break;
  5507.          }
  5508.     case SHC_DESTROY:
  5509.          {
  5510.            rc = ShcDestroy((PPARM_DESTROY)pshcNow);
  5511.            break;
  5512.          }
  5513.     case SHC_SEEK:
  5514.          {
  5515.            rc = ShcSeek((PPARM_SEEK)pshcNow);
  5516.            break;
  5517.          }
  5518.     case SHC_START:
  5519.          {
  5520.            rc = ShcStart((PPARM_START)pshcNow);
  5521.            break;
  5522.          }
  5523.     case SHC_STOP:
  5524.          {
  5525.            rc = ShcStop((PPARM_STOP)pshcNow);
  5526.            break;
  5527.          }
  5528.     case SHC_GET_PROTOCOL:
  5529.          {
  5530.            rc = ShcGetProtocol((PPARM_GPROT)pshcNow);
  5531.            break;
  5532.          }
  5533.     case SHC_INSTALL_PROTOCOL:
  5534.          {
  5535.            rc = ShcInstallProtocol((PPARM_INSTPROT)pshcNow);
  5536.            break;
  5537.          }
  5538.     case SHC_ENUMERATE_PROTOCOLS:
  5539.          {
  5540.            rc = ShcEnumerateProtocols((PPARM_ENUMPROT)pshcNow);
  5541.            break;
  5542.          }
  5543.     case SHC_NEGOTIATE_RESULT:
  5544.          {
  5545.            rc = ShcNegotiateResult((PPARM_NEGOTIATE)pshcNow);
  5546.            break;
  5547.          }
  5548.     default:
  5549.          {
  5550.            rc = ERROR_INVALID_FUNCTION;
  5551.            break;
  5552.          }
  5553.   } /* endswitch */
  5554.  
  5555.   return(rc);
  5556.  
  5557. } /* End of ShcRouter */
  5558.  
  5559.  
  5560. ΓòÉΓòÉΓòÉ 5.7.5. DLL Initialization ΓòÉΓòÉΓòÉ
  5561.  
  5562. The following example illustrates a DLL stream handler's initialization 
  5563. process. During initialization, the stream handler must perform any global DLL 
  5564. initialization the first time the DLL is loaded and perform any instance 
  5565. initialization for each instance of the stream handler DLL. Each instance of 
  5566. the DLL represents a process. The stream handler must register itself with the 
  5567. Sync/Stream Manager during global initialization. The stream handler should 
  5568. also register an exit-list routine if any is required for DLL termination. 
  5569.  
  5570. ULONG _DLL_InitTerm( HMODULE hmod, ULONG fTerm)
  5571.  
  5572. { /* Start of ShInit */
  5573.  
  5574. RC rc = NO_ERROR;                       /* local return code */
  5575. PARM_REG smhRegParm;                    /* Parameters for SMH_REGISTER */
  5576. int Registered = FALSE;
  5577. int HeapAllocated_Attached = FALSE;
  5578. int GlobDataMtxCreated = FALSE;
  5579. hmod;
  5580.  
  5581.   /*
  5582.    * Checking this parameter will insure that this routine will only
  5583.    * be run on an actual initialization.  Return success from the
  5584.    * termination.
  5585.    */
  5586.  
  5587.   if (fTerm)
  5588.      {
  5589.      return (1L);
  5590.      }
  5591.  
  5592.   if (_CRT_init())
  5593.      {
  5594.      return (0L);
  5595.      }
  5596.  
  5597.   /*
  5598.    * Get the semaphore controlling the process count and update the process
  5599.    * count if successful.  Then after we have the sem, if the count is 1,
  5600.    * we are guaranteed that we must do the global initializations.
  5601.    *
  5602.    * There is a problem.  To determine if we need to create or open the
  5603.    * semaphore, we need to check the ProcessCount to see if this is the
  5604.    * first process.  But since we don't have the semaphore, we don't have
  5605.    * a guarantee the count won't change.  If we get caught in this window
  5606.    * then we will fail to get the semaphore and the rc will indicate error.
  5607.   */
  5608.  
  5609.   if (ulProcessCount == 0)
  5610.     { /* First process */
  5611.  
  5612.       if (!(rc = DosCreateMutexSem(pszProcCntMutexName,
  5613.                                    &hmtxProcCnt,
  5614.                                    0L,
  5615.                                    TRUE)))
  5616.         {
  5617.           ulProcessCount++;
  5618.         }
  5619.     } /* First process */
  5620.   else
  5621.     { /* not first process */
  5622.       /* if a process exits and decrements ProcessCount before we get  */
  5623.       /* the semaphore here, we will fail. */
  5624.       if (!(rc = DosOpenMutexSem(pszProcCntMutexName,
  5625.                                  &hmtxProcCnt)))
  5626.         {
  5627.           if (!(rc = DosRequestMutexSem(hmtxProcCnt,
  5628.                                         SEM_INDEFINITE_WAIT)))
  5629.             {
  5630.               ulProcessCount++;
  5631.             }
  5632.           else
  5633.             {
  5634.               DosCloseMutexSem(hmtxProcCnt);
  5635.             }
  5636.         }
  5637.     } /* not first process */
  5638.  
  5639.   if (!rc)
  5640.   { /* Semaphore ok, In critical section */
  5641.     /*
  5642.      * If this is the first time this init routine is called then we are
  5643.      * being brought in by the loader the first time, so we need to
  5644.      * register with the SSM.
  5645.      */
  5646.     if (ulProcessCount == 1)
  5647.       { /* First process */
  5648.         smhRegParm.ulFunction = SMH_REGISTER;
  5649.         smhRegParm.pszSHName = pszHandlerName;
  5650.         smhRegParm.phidSrc = &SrcHandlerID;
  5651.         smhRegParm.phidTgt = &TgtHandlerID;
  5652.         smhRegParm.pshcfnEntry = ( PSHCFN ) ShcRouter;
  5653.  
  5654.         smhRegParm.ulFlags = 0L;
  5655.         if (ulHandlerFlags & HANDLER_CAN_BE_SOURCE)
  5656.           {
  5657.             smhRegParm.ulFlags = REGISTER_SRC_HNDLR;
  5658.           }
  5659.         if (ulHandlerFlags & HANDLER_CAN_BE_TARGET)
  5660.           {
  5661.             smhRegParm.ulFlags |= REGISTER_TGT_HNDLR;
  5662.           }
  5663.         if (ulHandlerFlags & HANDLER_IS_NONSTREAMING)
  5664.           {
  5665.             smhRegParm.ulFlags |= REGISTER_NONSTREAMING;
  5666.           }
  5667.         rc = SMHEntryPoint((PVOID)&smhRegParm);
  5668.         /*
  5669.          * If ok then allocate our memory pool (heap), since it is under
  5670.          * semaphore control create and get the semaphore first.
  5671.          */
  5672.         if (!rc)
  5673.           { /* Register ok */
  5674.             Registered = TRUE;
  5675.             hHeap = HhpCreateHeap(HEAPSIZE,
  5676.                                   HH_SHARED);
  5677.             if (hHeap)
  5678.               { /* Heap Allocated */
  5679.                 HeapAllocated_Attached = TRUE;
  5680.                 if (!(rc = DosCreateMutexSem(NULL,
  5681.                                              &hmtxGlobalData,
  5682.                                              DC_SEM_SHARED,
  5683.                                              FALSE)))
  5684.                   {
  5685.                     GlobDataMtxCreated = TRUE;
  5686.                   }
  5687.               } /* Heap Allocated */
  5688.             else
  5689.               { /* Heap not allocated */
  5690.                 rc = ERROR_ALLOC_RESOURCES;
  5691.               } /* Heap not allocated */
  5692.           } /* Register ok */
  5693.       } /* First Process */
  5694.     else
  5695.       { /* Not first process */
  5696.         if (!(rc = DosOpenMutexSem(NULL,
  5697.                                    &hmtxGlobalData)))
  5698.           { /* Global data semaphore opened */
  5699.  
  5700.             GlobDataMtxCreated = TRUE;
  5701.  
  5702.             if (!ENTERCRIT(rc))
  5703.               { /* Global Data Sem obtained */
  5704.  
  5705.                 if (HhpAccessHeap(hHeap, HhpGetPID()))
  5706.                   { /* Error accessing heap */
  5707.                     rc = ERROR_ALLOC_RESOURCES;
  5708.                   } /* Error accessing heap */
  5709.                 else
  5710.                   { /* Heap attached */
  5711.                     HeapAllocated_Attached = TRUE;
  5712.                   } /* Heap attached */
  5713.  
  5714.                 EXITCRIT;
  5715.  
  5716.               } /* Global Data Sem obtained */
  5717.           } /* Global data semaphore opened */
  5718.       } /* Not first process */
  5719.  
  5720.     /*
  5721.      * If things are ok, Register an exit list handler and if that works
  5722.      * increment the process count.
  5723.      */
  5724.     if (!rc)
  5725.       {
  5726.         rc = DosExitList(EXTLSTADD_ORDER,
  5727.                          (PFNEXITLIST)ShExitList);
  5728.       }
  5729.  
  5730.     if (rc)
  5731.       { /* Error occurred - Clean Up */
  5732.         if (HeapAllocated_Attached)
  5733.           {
  5734.             HhpReleaseHeap(hHeap,
  5735.                            HhpGetPID());
  5736.           }
  5737.         if (GlobDataMtxCreated)
  5738.           {
  5739.             DosCloseMutexSem(hmtxGlobalData);
  5740.           }
  5741.         if (Registered)
  5742.           { /* Deregister */
  5743.             PARM_DEREG smhDeregParm;
  5744.  
  5745.             smhDeregParm.ulFunction = SMH_DEREGISTER;
  5746.             smhDeregParm.pszSHName = pszHandlerName;
  5747.             SMHEntryPoint(&smhDeregParm);
  5748.           } /* Deregister */
  5749.         ulProcessCount--;
  5750.         DosReleaseMutexSem(hmtxProcCnt);
  5751.         DosCloseMutexSem(hmtxProcCnt);
  5752.       } /* Error occurred - Clean Up */
  5753.     else
  5754.       {
  5755. #ifdef MMRAS_PTRACE
  5756.         InitPTrace()
  5757. #endif
  5758.         DosReleaseMutexSem(hmtxProcCnt);
  5759.       }
  5760.  
  5761.   } /* Semaphore ok, In critical section */
  5762.   /*
  5763.    * The return codes expected are:
  5764.    *  TRUE (any non-zero) - init routine worked
  5765.    *  FALSE (zero)        - init routine failed
  5766.    *
  5767.    * So we have to reverse the local rc before we pass it back.
  5768.    */
  5769.   return(!rc);
  5770.  
  5771. } /* End of SHInit */
  5772.  
  5773. The stream event handling logic in the DLL stream handlers is essentially the 
  5774. same as in device driver stream handlers. The only significant difference is 
  5775. that stream events are detected and reported at task time in a DLL, rather than 
  5776. at interrupt time as in the case with device drivers 
  5777.  
  5778. #include        "os2.h"
  5779. #include        "os2me.h"
  5780.  
  5781.   RC            rc;                    /* Error return code            */
  5782.   HID           hidSource;             /* Source handler ID            */
  5783.   TIME_EVCB     timeevcb;              /* Cuepoint event control block */
  5784.   HEVENT        hevent;                /* time event handle            */
  5785.   HSTREAM       hstream;               /* Stream handle                */
  5786.   HID           hid;                   /* Handler ID                   */
  5787.   PARM_EVENT    parm_event;            /* Report event parameter block */
  5788.   MMTIME        mmtimeCurrent;         /* Current stream time          */
  5789.   PSMHFN        SMHEntryPoint;         /* Pointer to SMH entry point   */
  5790.  
  5791. /*-------------------------------------------------------------------*/
  5792. /*  Report an event.                                                 */
  5793. /*-------------------------------------------------------------------*/
  5794.   parm_event.ulFunction = SMH_REPORTEVENT;     /* Set function         */
  5795.   parm_event.hid = hidSource;                  /* Source handler ID    */
  5796.   parm_event.hevent = hevent;                  /* Event handle         */
  5797.   parm_event.pevcbEvent = (PEVCB) &timeevcb;   /* Pointer to Time EVCB */
  5798.  
  5799.   timeevcb.ulType = EVENT_CUE_TIME;            /* Set event type       */
  5800.   timeevcb.hstream = hstream;                  /* Set stream handle    */
  5801.   timeevcb.hid = hid;                          /* Set handler ID       */
  5802.   timeevcb.ulStatus = 0;                       /* No status            */
  5803.   timeevcb.mmtimeStream = mmtimeCurrent;       /* Set current time     */
  5804.  
  5805.   if (rc = SMHEntryPoint (&parm_event))
  5806.      return(rc);                               /* Error! */
  5807.  
  5808.  
  5809. ΓòÉΓòÉΓòÉ 5.7.6. Synchronization ΓòÉΓòÉΓòÉ
  5810.  
  5811. DLL stream handlers can process sync pulses as either a master or slave stream. 
  5812. A master of a sync group must have the SPCBHAND_GENSYNC or the SPCBHAND_NOSYNC 
  5813. bits set in the SPCB that is returned to the SSM on the SHC_CREATE call. 
  5814. Otherwise, the stream handler cannot be a master. 
  5815.  
  5816. If you would like to create a stream handler that can generate sync pulses, you 
  5817. must either use a hardware device (such as an audio card) to generate timing 
  5818. interrupts at a fixed rate, or use the OS/2 timer services such as the OS/2 
  5819. device driver SetTimer DevHelp or the OS/2 DosAsyncTimer functions. You can 
  5820. then call GetDOSVar to query the address of the global information segment 
  5821. structure (GlobalInfoSeg). This allows you to get the real time so that you can 
  5822. detect missed timing messages. For further information, refer to the OS/2 2.0 
  5823. Technical Library Physical Device Driver Reference. 
  5824.  
  5825. Note:  We provide the architecture for synchronization. The audio stream 
  5826.        handler can be a master (generate sync pulses). The audio stream handler 
  5827.        can also be a slave, but it does not support the ability to 
  5828.        re-synchronize to a master stream. 
  5829.  
  5830.   /************************************************************************/
  5831.   /* Master                                                               */
  5832.   /* Synchronization - If we are the master stream, then report the       */
  5833.   /*                   current time to the Sync/Stream Manager so that    */
  5834.   /*                   it can be distributed to any slave streams.        */
  5835.   /*                                                                      */
  5836.   /************************* END OF SPECIFICATIONS ************************/
  5837.   PARM_EVENT  parmevent;               /* parms for SMH_NOTIFY calls    */
  5838.   SYNC_EVCB   syncevcb;                /* Cuepoint event control block  */
  5839.  
  5840.   if (psib->ulStatus & STREAM_MASTER_SYNC) {
  5841.      parm_event.ulFunction = SMH_REPORTEVENT;     /* Set function         */
  5842.      parm_event.hid = psib->HandlerID;            /* Source handler ID    */
  5843.      parm_event.hevent = hevent;                  /* Event handle         */
  5844.      parm_event.pevcbEvent = (PEVCB) &syncevcb;   /* Pointer to Sync EVCB */
  5845.      syncevcb.ulType = EVENT_CUE_TIME;            /* Set event type       */
  5846.      syncevcb.hstream = psib->hStream;            /* Set stream handle    */
  5847.      syncevcb.hid = hid;                          /* Set handler ID       */
  5848.      syncevcb.ulStatus = 0;                       /* No status            */
  5849.      syncevcb.mmtimeStream = mmtimeCurrent;       /* Set current time     */
  5850.  
  5851.      if (rc = SMHEntryPoint (&parm_event))
  5852.         return(rc);                               /* Error! */
  5853.  
  5854.      }
  5855.  
  5856.   /***********************************************************************/
  5857.   /* Slave                                                               */
  5858.   /* Synchronization - If we are the slave stream, then update the slave */
  5859.   /*                   time and determine if this slave stream is        */
  5860.   /*                   too slow or too fast with respect to the master   */
  5861.   /*                   stream.                                           */
  5862.   /*                                                                     */
  5863.   /************************ END OF SPECIFICATIONS ************************/
  5864.  
  5865.   if ((pSTREAM)->ulStateFlg & STREAM_SLAVE_SYNC) {
  5866.           (pSTREAM)->SyncEvcb.mmtimeSlave = mmtimeCurrStreamTime;
  5867.           if ((pSTREAM)->SyncEvcb.ulStatus & SYNCPOLLING) {
  5868.                if (mmtimeCurrStreamTime > (pSTREAM)->SyncEvcb.mmtimeMaster)
  5869.                        /* I need to slow my stream */
  5870.                        ;
  5871.                if (mmtimeCurrStreamTime < (pSTREAM)->SyncEvcb.mmtimeMaster)
  5872.                        /* I need to speed up my stream */
  5873.                        ;
  5874.           }
  5875.  
  5876.  
  5877. ΓòÉΓòÉΓòÉ 5.7.7. Worker Thread Creation ΓòÉΓòÉΓòÉ
  5878.  
  5879. Stream handler DLLs create worker threads for each stream created. A worker 
  5880. thread, for example, would consist of code to request a buffer from the 
  5881. Sync/Stream Manager, fill it with data from a device and return it to the 
  5882. Sync/Stream Manager. This would continue until the end of stream or until some 
  5883. other kind of stream stop. 
  5884.  
  5885. A worker thread does all the work of the stream handler itself. It is a good 
  5886. idea to create a worker thread for each stream instance. Basically, a worker 
  5887. thread either loops in the read routine or loops in the write routine. This 
  5888. depends on whether it is a source or target. If it is a source, the thread 
  5889. loops in the read routine and reads from its device using whatever commands it 
  5890. uses to interface with its device. It also interfaces with the Sync/Stream 
  5891. Manager requesting empty buffers and returning full buffers. On the other hand, 
  5892. when the DLL stream handler is the target, the thread will also be in a big 
  5893. loop, but it is performing different operations. It will be requesting full 
  5894. buffers from the Sync/Stream Manager and then consuming those buffers by 
  5895. passing them off to the device (in whatever way it communicates with its 
  5896. device). 
  5897.  
  5898. #include <os2.h>
  5899. #include <os2me.h>
  5900. #include <hhpheap.h>
  5901. #include <shi.h>
  5902.  
  5903. PSIB psib;                              /* Stream Instance Block */
  5904.  
  5905. { /* Start of FsshRead */
  5906.  
  5907. RC          rc = NO_ERROR;              /* local return code */
  5908. char        NeedBuf;                    /* local loop boolean */
  5909. LONG        NumBytesIO;                 /* Number of bytes from mmio */
  5910. PARM_NOTIFY npget, npret;               /* parms for SMH_NOTIFY calls */
  5911. SRCBUFTAB   SrcBufTab = {0};            /* Source buffer table */
  5912. ULONG       ulStopped = DO_SLEEP;       /* did we get stop disc or flush */
  5913. BOOL        bAtEOS = FALSE;             /* End of Stream indicator */
  5914. ULONG       ulPostCount;                /* Temp to hold count */
  5915.  
  5916.   /* Before we start lets do some init stuff: */
  5917.  
  5918.   npget.ulFunction = SMH_NOTIFY;
  5919.   npget.hid = psib->HandlerID;
  5920.   npget.hstream = psib->hStream;
  5921.   npget.ulGetNumEntries = 1L;
  5922.   npget.ulRetNumEntries = 0L;
  5923.   npget.pGetBufTab = &SrcBufTab;
  5924.   npget.pRetBufTab = NULL;
  5925.  
  5926.   npret.ulFunction = SMH_NOTIFY;
  5927.   npret.hid = psib->HandlerID;
  5928.   npret.hstream = psib->hStream;
  5929.   npret.ulFlags = BUF_RETURNFULL;
  5930.   npret.ulGetNumEntries = 0L;
  5931.   npret.ulRetNumEntries = 1L;
  5932.   npret.pGetBufTab = NULL;
  5933.   npret.pRetBufTab = &SrcBufTab;
  5934.  
  5935.   /* Wait until we get the ShcStart */
  5936.  
  5937.   DosWaitEventSem(psib->hevStop, SEM_INDEFINITE_WAIT);
  5938.  
  5939.   /* We will loop forever getting an empty buffer, calling the device to */
  5940.   /* fill up the buffer, sending it to the consumer.  During each        */
  5941.   /* iteration of the loop we will check the action flags for            */
  5942.   /* asynchronous requests to do things.                                 */
  5943.  
  5944.   if (psib->ulActionFlags & SIBACTFLG_KILL)
  5945.     { /* Must have been a create error */
  5946.       rc = 1L;
  5947.     } /* Must have been a create error */
  5948.  
  5949.   /*  Start the main loop */
  5950.  
  5951.   while (!rc)
  5952.     { /* while no severe error */
  5953.  
  5954.     if (psib->ulActionFlags)
  5955.       rc = CheckNSleep(psib);
  5956.  
  5957.     /*
  5958.      * Get a buffer
  5959.      */
  5960.     NeedBuf = TRUE;
  5961.     while ((NeedBuf) && (!rc))
  5962.       { /* while we don't have a buffer */
  5963.  
  5964.       /* Clear the stop sem, so if after we call ssm to get a buffer if */
  5965.       /* it returns none avail then we won't miss a SSMBuffer Start     */
  5966.       /* before we go to sleep.                                         */
  5967.         DosResetEventSem(psib->hevStop, &ulPostCount);
  5968.  
  5969.         npget.ulFlags = BUF_GETEMPTY;
  5970.         rc = SMHEntryPoint(&npget); /* get a buffer */
  5971.         if (!rc)
  5972.           {
  5973.             NeedBuf = FALSE;
  5974.          /* make sure attribute is 0 so we don't pass around a bad value */
  5975.             SrcBufTab.ulMessageParm = 0L;
  5976.           }
  5977.         else
  5978.           { /* return code from smhnotify */
  5979.             if (rc == ERROR_BUFFER_NOT_AVAILABLE)
  5980.               { /* buffer not available */
  5981.  
  5982.             /* the smhnotify resets the num entries to 0 when none avail */
  5983.                 npget.ulGetNumEntries = 1L;
  5984.  
  5985.                 ulStopped = DO_SLEEP;
  5986.                 rc = SleepNCheck(psib, &ulStopped);
  5987.  
  5988.               } /* buffer not available */
  5989.           } /* return code from smhnotify */
  5990.       } /* while we don't have a buffer */
  5991.  
  5992.     /* We have a buffer or an error */
  5993.  
  5994.     if (!rc)
  5995.       { /* have a buffer - do the read */
  5996.  
  5997.         NumBytesIO = mmioRead((HMMIO)psib->ulAssocP1,
  5998.                                 (PCHAR)SrcBufTab.pBuffer,
  5999.                                 (LONG)SrcBufTab.ulLength);
  6000.  
  6001.         if (NumBytesIO == -1L)
  6002.           { /* an error */
  6003.  
  6004.             SrcBufTab.ulLength = 0L;
  6005.             /* get the real error code */
  6006.             rc = mmioGetLastError((HMMIO)psib->ulAssocP1);
  6007.  
  6008.             rc = ShIOError(psib, npret, rc);
  6009.  
  6010.           } /* an error */
  6011.         else
  6012.           { /* We have some data */
  6013.  
  6014.             if (NumBytesIO != (LONG)SrcBufTab.ulLength)
  6015.               { /* End of stream */
  6016.                 npret.ulFlags |= BUF_EOS;
  6017.                 bAtEOS = TRUE;
  6018.                 DosResetEventSem(psib->hevStop, &ulPostCount);
  6019.                 SrcBufTab.ulLength = NumBytesIO;
  6020.               } /* End of stream */
  6021.  
  6022.             /* Send the data to the stream manager */
  6023.  
  6024.             rc = SMHEntryPoint(&npret);
  6025.             if (!rc)
  6026.               { /* data sent ok */
  6027.                 if (bAtEOS)
  6028.                   {
  6029.                     bAtEOS = FALSE;
  6030.                     ulStopped = DO_SLEEP;
  6031.                     rc = SleepNCheck(psib, &ulStopped);
  6032.                   }
  6033.               } /* data sent ok */
  6034.           } /* We have some data */
  6035.  
  6036.         /* Clear the EOS if it was set. And attribute */
  6037.         npret.ulFlags = BUF_RETURNFULL;
  6038.         SrcBufTab.ulMessageParm = 0L;
  6039.  
  6040.       } /* have a buffer - do the read */
  6041.  
  6042.     } /* while no severe error */
  6043.  
  6044.   /* We get here if an error has occurred or a kill has */
  6045.   /*  been sent.  In the case of the kill, reset the */
  6046.   /*  return code to 0 (no error) and exit the thread. */
  6047.   /*  Otherwise, report the error event and exit the */
  6048.   /*  thread. */
  6049.  
  6050.   if (psib->ulActionFlags & SIBACTFLG_KILL)
  6051.     {
  6052.       rc = 0L;
  6053.     }
  6054.   else
  6055.     {
  6056.       ReportEvent(psib,
  6057.                   rc,                   /* Return code */
  6058.                   EVENT_ERROR,          /* event type */
  6059.                   0L,                   /* user info */
  6060.                   NONRECOVERABLE_ERROR);  /* Severe Error */
  6061.     }
  6062.  
  6063.   /* Only set this flag when we no longer need access to the sib since */
  6064.   /* Destroy may get control and Free the sib. */
  6065.  
  6066.   psib->ulActionFlags |= SIBACTFLG_THREAD_DEAD;
  6067.   return;
  6068.  
  6069. } /* End of FsshRead */
  6070.  
  6071.  
  6072. ΓòÉΓòÉΓòÉ 5.8. Device Driver Model: Video PDD ΓòÉΓòÉΓòÉ
  6073.  
  6074. A device driver stream handler is used as a source handler at the Ring 0 level. 
  6075. It interfaces with the Sync/Stream Manager to get or return stream data 
  6076. buffers. The stream handler also interfaces with the hardware's physical device 
  6077. driver (PDD) to give or receive data buffer pointers. The purpose of the stream 
  6078. handler is to alleviate the media driver from the task of sending a data stream 
  6079. to the PDD. Instead, the media driver issues function calls to the SSM to 
  6080. initiate a stream. In turn, the SSM requests the stream handlers to regulate 
  6081. the proper stream flow without intervention from the application. 
  6082.  
  6083. Device driver stream handlers include two main entry points - SMHEntryPoint and 
  6084. DDCMDEntryPoint. 
  6085.  
  6086.  
  6087. ΓòÉΓòÉΓòÉ 5.8.1. SMHEntryPoint ΓòÉΓòÉΓòÉ
  6088.  
  6089. Device driver stream handlers send Stream Manager Helper (SMH) routines to the 
  6090. SSM through the SMHEntryPoint. The stream handlers use these helper routines to 
  6091. register with the Sync/Stream Manager, report events and synchronization cues, 
  6092. and to request or return buffers. This interface is created using the standard 
  6093. inter-device driver communication (IDC) approach, established by the AttachDD 
  6094. DevHelp function during initialization processing. 
  6095.  
  6096.  
  6097. ΓòÉΓòÉΓòÉ 5.8.2. DDCMDEntryPoint ΓòÉΓòÉΓòÉ
  6098.  
  6099. Device driver stream handlers communicate with the hardware PDD through the 
  6100. DDCMDEntryPoint. This is accomplished through the use of device driver commands 
  6101. (DDCMDs), which allow a stream handler to request a PDD to perform functions 
  6102. such as starting, stopping, or resuming a device. This interface uses the IDC 
  6103. mechanism provided by the ATTACHDD DevHelp function. The stream handler must 
  6104. attach to the device driver to receive the DDCMD entry point address of the 
  6105. device driver. This function is performed before issuing device driver 
  6106. commands. 
  6107.  
  6108.  
  6109. ΓòÉΓòÉΓòÉ 5.8.3. SHCEntryPoint ΓòÉΓòÉΓòÉ
  6110.  
  6111. As illustrated in the following example, a device driver stream handler 
  6112. implements function through two additional entry points:  SHCEntryPoint and 
  6113. SHDEntryPoint. 
  6114.  
  6115. Device driver stream handlers receive commands from the Sync/Stream Manager to 
  6116. initialize and perform streaming functions. These stream handler commands 
  6117. (SHCs) are accessible through a single entry point, SHCEntryPoint. The main 
  6118. routine is an IDC interface with the Sync/Stream Manager Device Driver. The SSM 
  6119. calls the device driver stream handler by issuing stream programming interface 
  6120. (SPI) functions such as SpiCreateStream, SpiStartStream, and SpiStopStream. 
  6121.  
  6122. The following example illustrates the code implementation of the SHCEntryPoint. 
  6123.  
  6124. RC  DDCMDEntryPoint(PDDCMDCOMMON pCommon); /* PDD entry point from SH */
  6125. RC  SHDEntryPoint(PSHD_COMMON pCommon);    /* SH entry point from PDD */
  6126. RC  SHCEntryPoint(PSHC_COMMON pCommon);    /* SH entry point from SSM */
  6127. RC  SMHEntryPoint(PSHC_COMMON pCommon);    /* SSM entry point from SH */
  6128.  
  6129. ULONG   (*ShcFuncs[])(PVOID pCommon) = {   /* SHC function jump table */
  6130.                 SHCAssociate,                   /* 0 */
  6131.                 SHCClose,                       /* 1 */
  6132.                 SHCCreate,                      /* 2 */
  6133.                 SHCDestroy,                     /* 3 */
  6134.                 SHCStart,                       /* 4 */
  6135.                 SHCStop,                        /* 5 */
  6136.                 SHCSeek,                        /* 6 */
  6137.                 SHCEnableEvent,                 /* 7 */
  6138.                 SHCDisableEvent,                /* 8 */
  6139.                 SHCEnableSync,                  /* 9 */
  6140.                 SHCDisableSync,                 /* 10 */
  6141.                 SHCGetTime,                     /* 11 */
  6142.                 SHCGetProtocol,                 /* 12 */
  6143.                 SHCInstallProtocol,             /* 13 */
  6144.                 SHCEnumerateProtocols,          /* 14 */
  6145.                 SHCNegotiateResult              /* 15 */
  6146.                 };
  6147. USHORT  MaxShcFuncs = sizeof(ShcFuncs)/sizeof(USHORT);
  6148.  
  6149. /**********************************************************************/
  6150.  
  6151. RC      SHCEntryPoint(pCommon)
  6152. PSHC_COMMON     pCommon;
  6153. {
  6154.       if (pCommon->ulFunction > (ULONG)MaxShcFuncs)
  6155.               return(ERROR_INVALID_FUNCTION);
  6156.                                           /* Check for valid function */
  6157.  
  6158. return(ShcFuncs[pCommon->ulFunction](pCommon));
  6159. }                                         /* Call SHC message         */
  6160.  
  6161. /**********************************************************************/
  6162.  
  6163. RC SHCStart(PPARM_START pStart)
  6164. {
  6165.    PSTREAM         pSTREAM;             /* Ptr to current stream */
  6166.    DDCMDREADWRITE  DDCMDReadWrite;
  6167.    DDCMDCONTROL    DDCMDControl;
  6168.    ulRC            rc;                  /* Return code           */
  6169.  
  6170.  
  6171.    if (rc = GetStreamEntry(&pSTREAM, pStart->hstream))
  6172.                 return(rc);
  6173.  
  6174.    EnterCritSec;                           /* Disable interrupts */
  6175.  
  6176.  
  6177.    switch (pSTREAM->ulStateFlg) {
  6178.      case STREAM_RUNNING:
  6179.          /*********************************************************/
  6180.          /* Get a full buffer for playback                        */
  6181.          /*********************************************************/
  6182.          ParmNotify.ulFunction = SMH_NOTIFY;
  6183.          ParmNotify.hid = pSTREAM->hid;
  6184.          ParmNotify.hstream = pSTREAM->hStream;
  6185.          ParmNotify.ulGetNumEntries = 1;
  6186.          ParmNotify.ulRetNumEntries = 0;
  6187.          ParmNotify.pGetBufTab = &(pSTREAM->BufTab.aBufTab[usBufTabIndex]);
  6188.          ParmNotify.pRetBufTab = NULL;
  6189.          ParmNotify.ulFlags = BUF_GETFULL;
  6190.          SMHEntryPoint(&ParmNotify);
  6191.  
  6192.          /**********************************************************/
  6193.          /* Send full buffer to device (PDD)                       */
  6194.          /**********************************************************/
  6195.  
  6196.          DDCMDReadWrite.hStream = (*ppSTREAM)->hStream;
  6197.          DDCMDReadWrite.ulFunction = DDCMD_WRITE;
  6198.          DDCMDReadWrite.pBuffer = pCurrentBufTab->pBuffer;
  6199.          DDCMDReadWrite.ulBufferSize = pCurrentBufTab->ulLength;
  6200.          rc = (*pSTREAM->pDDCMDEntryPoint)(&DDCMDReadWrite);
  6201.  
  6202.          /*********************************************************/
  6203.          /* Start the device                                      */
  6204.          /*********************************************************/
  6205.  
  6206.          DDCMDControl.ulFunction = DDCMD_CONTROL;
  6207.          DDCMDControl.hStream = pSTREAM->hStream;
  6208.          DDCMDControl.pParm = NULL;
  6209.          DDCMDControl.ulParmSize = NULL;
  6210.          DDCMDControl.ulCmd = DDCMD_START;
  6211.          rc = (*pSTREAM->pDDCMDEntryPoint)(&DDCMDControl);
  6212.          break;
  6213.  
  6214.     }
  6215.     ExitCritSec;
  6216.         return(rc);
  6217. }
  6218.  
  6219.  
  6220. ΓòÉΓòÉΓòÉ 5.8.4. SHDEntryPoint ΓòÉΓòÉΓòÉ
  6221.  
  6222. Device driver stream handlers receive commands from PDDs to report events and 
  6223. interrupts. These stream handler device (SHD) helper commands are provided 
  6224. through the SHDEntryPoint. This entry point is specifically used for the PDD to 
  6225. call back to the stream handler. For example, the PDD can send an 
  6226. SHD_REPORT_INT command to the stream handler to report status, indicate that a 
  6227. buffer is full, or specify that an additional buffer is required. 
  6228.  
  6229. The following example illustrates the code implementation of the SHDEntryPoint. 
  6230.  
  6231. ULONG   (*ShdFuncs[])(PVOID pCommon) = {  /* SHD message jump table */
  6232.                         SHDReportInt,                   /* 0 */
  6233.                         SHDReportEvent                  /* 1 */
  6234.                         };
  6235.  
  6236. USHORT  MaxShdFuncs = sizeof(ShdFuncs)/sizeof(USHORT);
  6237. /*************************************************************************/
  6238.  
  6239. RC SHDEntryPoint(pCommon)
  6240. PSHD_COMMON     pCommon;
  6241. {
  6242.       if (pCommon->ulFunction > (ULONG)MaxShdFuncs)
  6243.  
  6244.              return(ERROR_INVALID_FUNCTION); /* Check for valid function */
  6245.  
  6246.       return(ShdFuncs[pCommon->ulFunction](pCommon));
  6247. }                                            /* Call SHC message         */
  6248.  
  6249. /*************************************************************************/
  6250.  
  6251.  
  6252. ΓòÉΓòÉΓòÉ 5.8.5. Event Detection ΓòÉΓòÉΓòÉ
  6253.  
  6254. A device driver stream handler must be able to keep track of time to detect 
  6255. events. Timing is important to know when the stream starts and stops, and when 
  6256. to report certain cue time events. There are two methods you can implement to 
  6257. detect events. They are: 
  6258.  
  6259.    o  Request the PDD to monitor the time for use. 
  6260.    o  Implement an algorithm that constantly monitors real-time. 
  6261.  
  6262.  
  6263. ΓòÉΓòÉΓòÉ 5.8.5.1. PDD Monitors the Time ΓòÉΓòÉΓòÉ
  6264.  
  6265. The first and most accurate method of event detection is to retrieve the time 
  6266. from the actual physical device. Interfaces are provided through the use of 
  6267. DDCMD_STATUS, which requests the current stream time from the physical device 
  6268. driver. When an application requests an event, the stream handler issues a 
  6269. DDCMD_STATUS command to the PDD to detect the event time. (There are also 
  6270. additional DDCMD messages that allow the PDD to inform the stream handler of 
  6271. the time. Refer to the OS/2 Multimedia Programming Reference for details.) When 
  6272. the time arrives, the PDD calls back to the stream handler through the 
  6273. SHDEntryPoint using the SHD_REPORT_EVENT message. At this time, the stream 
  6274. handler looks through its table, and identifies which event has now come due. 
  6275. In turn, the stream handler reports the event through the SMHEntryPoint on the 
  6276. SMH_REPORTEVENT call to the Sync/Stream Manager. Once received, the SSM reports 
  6277. the event back to the application as shown in the following example. 
  6278.  
  6279. RC  SHDReportEvent(PSHD_REPORTEVENT pRptEvent)
  6280. {
  6281.    PSTREAM         pSTREAM;
  6282.    ulRC            rc;
  6283.  
  6284.    if (rc = GetStreamEntry(&pSTREAM, pRptEvent->hStream))
  6285.            return(rc);
  6286.  
  6287.    pSTREAM->ulStreamTime = pRptEvent->ulStreamTime;
  6288.    /* Update stream time */
  6289.  
  6290.    /*********************************************************/
  6291.    /* PDD detected an event and notified the stream handler */
  6292.    /*********************************************************/
  6293.  
  6294.    while (pEVENT != NULL) {
  6295.       if (pEVENT->hEvent == pRptEvent->hEvent) {
  6296.                    RptEvent.ulFunction = SMH_REPORTEVENT;
  6297.                    RptEvent.hid = pSTREAM->hid;
  6298.                    RptEvent.hevent = pEVENT->hEvent;
  6299.                    RptEvent.pevcbEvent = &(pEVENT->evcb);
  6300.                    /************************************/
  6301.                    /* call SSM to report event arrival */
  6302.                    /************************************/
  6303.                    VideoSH.pSMHEntryPoint(&RptEvent);     /* report it */
  6304.                    break;   /* process only one event and break out */
  6305.      }
  6306.          pEVENT = pEVENT->pNext;
  6307.  
  6308.    } /* end while */
  6309.  
  6310.    return(NO_ERROR);
  6311. }
  6312.  
  6313.  
  6314. ΓòÉΓòÉΓòÉ 5.8.5.2. Stream Handler Monitors the Time ΓòÉΓòÉΓòÉ
  6315.  
  6316. The second method of event detection is for the stream handler to monitor the 
  6317. time, independent of the PDD. This method is less accurate and not as efficient 
  6318. as requesting the PDD to monitor the time. It involves implementing an 
  6319. algorithm that constantly monitors real-time. When the stream handler detects 
  6320. the appropriate time, it reports the event to the Sync/Stream Manager as shown 
  6321. in the following example. 
  6322.  
  6323. RC  SHDReportEvent(PSHD_REPORTEVENT pRptEvent)
  6324. {
  6325.   PSTREAM         pSTREAM;
  6326.   ulRC            rc;
  6327.  
  6328.   if (rc = GetStreamEntry(&pSTREAM, pRptEvent->hStream))
  6329.           return(rc);
  6330.  
  6331.    pSTREAM->ulStreamTime = pRptEvent->ulStreamTime;
  6332.    /* Update stream time */
  6333.  
  6334.   /******************************************************************/
  6335.   /* Stream handler detected event and notified the SSM.            */
  6336.   /******************************************************************/
  6337.  
  6338.   while (pEVENT != NULL) {             /* process all possible events */
  6339.      if (pEVENT->hEvent == pRptEvent->hEvent) {
  6340.                   /*********************************************/
  6341.                   /* Poll the current time to determine if the */
  6342.                   /* event time is now.                        */
  6343.                   /*********************************************/
  6344.                   if (mmtimeCurrTime >= pTimeEvcb->mmtimeStream) {
  6345.                       pTimeEvcb->mmtimeStream = mmtimeCurrTime;
  6346.                       RptEvent.ulFunction = SMH_REPORTEVENT;
  6347.                       RptEvent.hid = pSTREAM->hid;
  6348.                       RptEvent.hevent = pEVENT->hEvent;
  6349.                       RptEvent.pevcbEvent = &(pEVENT->evcb);
  6350.                       /******************************************/
  6351.                       /* Call the Sync/Stream Manager to report */
  6352.                       /*  event arrival.                        */
  6353.                       /******************************************/
  6354.                       VideoSH.pSMHEntryPoint(&RptEvent); /* report it */
  6355.    }
  6356.      pEVENT = pEVENT->pNext;
  6357.  
  6358.   } /* end while */
  6359.  
  6360.   return(NO_ERROR);
  6361. }
  6362.  
  6363. Note that when you develop a stream handler, the stream handler should be able 
  6364. to support all time formats. 
  6365.  
  6366. Note:  Most physical device drivers use milliseconds as their reference; 
  6367.        however, cuepoints initiated by the application come in as a request to 
  6368.        the stream handler in the time format, MMTIME. Therefore, the stream 
  6369.        handler must be able to convert from MMTIME to milliseconds and vice 
  6370.        versa. 
  6371.  
  6372.  
  6373. ΓòÉΓòÉΓòÉ 5.8.6. Cuepoints ΓòÉΓòÉΓòÉ
  6374.  
  6375. Cuepoints remain active for the life of the stream - meaning that once enabled, 
  6376. they remain for the duration of the stream, whether the user decides to seek 
  6377. forwards or backwards. If the user seeks over an event, the stream handler 
  6378. should not detect that event.  If the user seeks backwards, the stream handler 
  6379. should re-enable that event. 
  6380.  
  6381.  
  6382. ΓòÉΓòÉΓòÉ 5.8.7. Error Detection ΓòÉΓòÉΓòÉ
  6383.  
  6384. Stream handlers can detect errors and report them back to the Sync/Stream 
  6385. Manager to be passed back to the media driver. Once a physical device driver 
  6386. detects an error, the PDD must report the error to the stream handler through 
  6387. the SHDEntryPoint. In turn, the stream handler takes the appropriate action. If 
  6388. the error is a hard error, the stream handler must stop the device and report 
  6389. an event to the Sync/Stream Manager. The stream handler indicates that a hard 
  6390. error took place by referencing the error code number. For normal events, such 
  6391. as underruns and overruns, the target stream handler will attempt to get 
  6392. another buffer and then pause its device. The target stream handler will be 
  6393. restarted when more data is available to be output. This condition results in a 
  6394. break in the output data stream.  Interleaved data format can cause underruns 
  6395. to occur when the end of the data is reached, but end of file has not been 
  6396. reached. 
  6397.  
  6398. The code sample in the following example illustrates the code implementation of 
  6399. a stream handler detecting an error. 
  6400.  
  6401. RptEvent.ulFunction = SMH_REPORTEVENT;
  6402. RptEvent.hid = pSTREAM->hid;
  6403. RptEvent.hevent = 0;                         /* must be 0 */
  6404. RptEvent.pevcbEvent = (PEVCB)&evcb;
  6405.  
  6406. evcb.ulType = EVENT_IMPLICIT_TYPE;              /* SPI event */
  6407. evcb.ulSubType = EVENT_ERROR;                   /* event type */
  6408. evcb.ulFlags = 0;
  6409. evcb.ulStatus = EVENT_ERROR;                    /* error code */
  6410. evcb.hstream = pSTREAM->hStream;
  6411. /***********************************/
  6412. /* call SSM to report event arrival*/
  6413. /***********************************/
  6414. VideoSH.pSMHEntryPoint(&Ramp.ptEvent);              /* report it! */
  6415.  
  6416.  
  6417. ΓòÉΓòÉΓòÉ 5.8.8. Synchronization ΓòÉΓòÉΓòÉ
  6418.  
  6419. Each stream handler may, or may not, be able to generate or receive sync 
  6420. pulses. This capability for each stream handler is defined in the SPCB for that 
  6421. stream handler. Synchronization pulses are passed as an event from the master 
  6422. stream handler. 
  6423.  
  6424. Synchronization pulses are distributed by the Sync/Stream Manager based on the 
  6425. synchronization relationship of the programmed stream. This distribution is 
  6426. effective for both DLL and device driver stream handlers. Device driver stream 
  6427. handlers receive sync pulses through their sync pulse SYNC_EVCB. Each slave 
  6428. stream handler must regularly update the sync pulse SYNC_EVCB with its 
  6429. calculated stream time. The Sync/Stream Manager checks this slave-handler 
  6430. stream time against the master stream time and decides whether to send a sync 
  6431. pulse to this handler. The device driver stream handler checks for sync pulses 
  6432. from the Sync/Stream Manager by polling a flag in the sync pulse SYNC_EVCB. The 
  6433. Sync/Stream Manager sets the flag to indicate a sync pulse and updates the 
  6434. current master stream time. Typically, the PDD slave handler polls the flag 
  6435. once during interrupt processing and adjusts the stream usage accordingly. 
  6436. Refer to the following example for an example of how device driver stream 
  6437. handlers support synchronization. 
  6438.  
  6439. /*****************************************************************/
  6440. /* If we are the master, then report the time so that the slaves */
  6441. /* can adjust their time and be in sync with the master.         */
  6442. /*****************************************************************/
  6443.  
  6444. if ((pSTREAM)->ulStateFlg & STREAM_MASTER_SYNC) {
  6445.         (pSTREAM)->SyncEvcb.mmtimeMaster = mmtimeCurrStreamTime;
  6446.         RptEvent.ulFunction = SMH_REPORTEVENT;
  6447.         RptEvent.hid = (pSTREAM)->hid;
  6448.         RptEvent.hevent = 0;          /* must be 0 for implicit events */
  6449.         RptEvent.pevcbEvent = (PEVCB)&((pSTREAM)->SyncEvcb);
  6450.         VideoSH.pSMHEntryPoint(&RptEvent); /* report master time */
  6451. }
  6452. /**************************************************************/
  6453. /* If we are the slave, then update slave time                */
  6454. /* and determine if this slave stream is too slow or too fast */
  6455. /* with respect to the master.                                */
  6456. /**************************************************************/
  6457.  
  6458. if ((pSTREAM)->ulStateFlg & STREAM_SLAVE_SYNC) {
  6459.         (pSTREAM)->SyncEvcb.mmtimeSlave = mmtimeCurrStreamTime;
  6460.         if ((pSTREAM)->SyncEvcb.ulStatus & SYNCPOLLING) {
  6461.              if (mmtimeCurrStreamTime > (pSTREAM)->SyncEvcb.mmtimeMaster)
  6462.                      /* I need to slow my stream */
  6463.                      ;
  6464.              if (mmtimeCurrStreamTime < (pSTREAM)->SyncEvcb.mmtimeMaster)
  6465.                      /* I need to speed up my stream */
  6466.                      ;
  6467.         }
  6468.  
  6469. Note:  See Synchronization Features for more information on sync pulse 
  6470.        generation and processing. 
  6471.  
  6472.  
  6473. ΓòÉΓòÉΓòÉ 5.9. Inter-device Driver Communications (IDC) ΓòÉΓòÉΓòÉ
  6474.  
  6475. The OS/2 multimedia Audio Device Driver is a standard OS/2 PDD that makes use 
  6476. of two OS/2 interfaces to define a standard for IBM audio device drivers: the 
  6477. audio IOCtl interface and the inter-device driver communication (IDC) 
  6478. interface. These interfaces provide the foundation for sharing of the audio 
  6479. device by OS/2 multimedia applications and media drivers. 
  6480.  
  6481. The audio IOCtl interface is provided as subfunctions of the OS/2 DosDevIOCtl 
  6482. function. Media drivers running at Ring 3 privilege level use the IOCtl 
  6483. interface to set up the audio device for access, to change volume controls, and 
  6484. so on. The IOCtl interface is not meant to be used to send audio data to the 
  6485. device driver. 
  6486.  
  6487. The IDC interface is provided by the OS/2 ATTACHDD DevHelp function. Stream 
  6488. handler device drivers and audio physical device drivers use the IDC interface 
  6489. to communicate with one another to coordinate their efforts to stream data to 
  6490. the audio device. 
  6491.  
  6492.  
  6493. ΓòÉΓòÉΓòÉ 5.9.1. IDC Interface ΓòÉΓòÉΓòÉ
  6494.  
  6495. Two entry points are provided for the two device drivers participating in the 
  6496. IDC interface: DDCMDEntryPoint and SHDEntryPoint. DDCMDEntryPoint allows the 
  6497. stream handler device driver to communicate to the PDD, and SHDEntryPoint 
  6498. allows the audio PDD to communicate to the stream handler. 
  6499.  
  6500. The audio PDD modules are shown in the following figure. Note that streaming 
  6501. data buffer pointers are passed by SSM to the Audio Stream Handler by means of 
  6502. SMH calls. Then the Audio Stream Handler passes pointers to the PDD using DDCMD 
  6503. messages. 
  6504.  
  6505.  
  6506. ΓòÉΓòÉΓòÉ 5.9.1.1. Communication to the PDD ΓòÉΓòÉΓòÉ
  6507.  
  6508. Seven messages are defined from the DDCMD entry point. Each message represents 
  6509. a specific request by the stream handler for the audio PDD to do perform an 
  6510. action. 
  6511.  
  6512. Read and write messages allow the stream handler to get and receive data 
  6513. directly from the PDD without any intervention required by the application. The 
  6514. application neither has to send data through an IOCtl nor allocate and lock 
  6515. memory to perform data transfers. 
  6516.  
  6517. Note:  Refer to the Device Driver Command (DDCMD) messages in the OS/2 
  6518.        Multimedia Programming Reference for further information. 
  6519.  
  6520.  
  6521. ΓòÉΓòÉΓòÉ 5.9.1.2. Communication to the Stream Handler ΓòÉΓòÉΓòÉ
  6522.  
  6523. The SHDEntryPoint contains the following two messages. These messages are 
  6524. located in the SHDD.H file of the \TOOLKIT\H subdirectory. SHDD.H contains the 
  6525. data structures, their type definitions, and #define statements for certain 
  6526. values. Note that the messages pass pointers to packets of data, to allow 
  6527. maximum flexibility for the future. 
  6528.  
  6529.  SHD_REPORT_INT 
  6530.      The PDD uses this message when it needs things at interrupt time. For 
  6531.      example, it uses this message to tell the stream handler it has used up 
  6532.      all the data and needs some more. 
  6533.  
  6534.      When the stream handler gets the call, it knows the PDD is passing back a 
  6535.      buffer that it might already have consumed. So the stream handler returns 
  6536.      on that call, giving the PDD a fresh buffer to consume. 
  6537.  
  6538.  SHD_REPORT_EVENT 
  6539.      The stream handler uses this message to keep in sync with what the PDD is 
  6540.      doing. For example, the stream handler can request the PDD to report back 
  6541.      every tenth of a second that data is played. And the stream handler has 
  6542.      all the logic to handle these events. The PDD examines the request, and 
  6543.      during its checks when it realizes a tenth of a second has been played in 
  6544.      data, the PDD calls SHD_REPORT_EVENT. The stream handler can do what it 
  6545.      wants at this point, and the PDD returns. 
  6546.  
  6547.      The PDD is the only one that really knows what is going on. In other 
  6548.      words, only the PDD knows how much data, to the millisecond, has been 
  6549.      played out to the device. The stream handler can approximate the data 
  6550.      played, using calculations based on how much data has gone by. But the 
  6551.      stream handler cannot calculate the data played to the millisecond, or 
  6552.      even to the fraction of a millisecond, the way the PDD can. 
  6553.  
  6554.  
  6555. ΓòÉΓòÉΓòÉ 5.9.2. Stream Handler Values ΓòÉΓòÉΓòÉ
  6556.  
  6557. There are certain values that the stream handler looks for. For example, when 
  6558. the stream handler requests a stop or a pause on a DDCMD_CONTROL message, the 
  6559. pointer that comes back to the stream handler is a pointer to the cumulative 
  6560. time that the PDD has recorded in real time. So whenever the stream handler 
  6561. requests the device to stop, the PDD honors that request and tells the stream 
  6562. handler the real time the PDD stopped within the stream. 
  6563.  
  6564. Another value the stream handler looks for is returned on DDCMD_STATUS. This is 
  6565. also a pointer to the cumulative time from the PDD, with respect to when that 
  6566. stream was first started at the stream handler's request. 
  6567.  
  6568.  
  6569. ΓòÉΓòÉΓòÉ 5.9.3. PDD Values ΓòÉΓòÉΓòÉ
  6570.  
  6571. The stream handler passes a pointer to the PDD on DDCMD_SETUP. This points to a 
  6572. value used by the PDD for setting the referenced time of the PDD. We do not 
  6573. always want the PDD to start its time at 0 every time the stream handler does a 
  6574. start, because the stream handler might have performed a seek in the stream. 
  6575. The PDD might have played a minute of data and then seeked backwards to maybe 
  6576. the 30-second mark in the data. If we issue a start, we do not want the PDD to 
  6577. think it is starting from zero again when it is really starting from the 
  6578. 30-second mark in that stream. 
  6579.  
  6580. DDCMD_CONTROL has an important NOTIFY subfunction, which is used for cuepoint 
  6581. or event detection. The stream handler supports events in cuepoints - an 
  6582. application request to be notified when a particular location in the file is 
  6583. reached or a specific time period has elapsed. The stream handler uses two 
  6584. methods for detecting how much time has elapsed: 
  6585.  
  6586.    1. Using DDCMD_CONTROL NOTIFY, the stream handler requests to be notified by 
  6587.       the PDD at a particular time and passes a pointer to the cue time. 
  6588.  
  6589.    2. The stream handler determines the time internally. This method is not as 
  6590.       precise as the first method, because only the PDD knows the real time. 
  6591.  
  6592.  For example, suppose the stream handler does a DDCMD_CONTROL NOTIFY at one 
  6593.  minute. If the PDD supports precise event detection, it must accept this 
  6594.  request and put it into a queue somewhere, preferably a linked list. This 
  6595.  linked list will have the time of one minute so that during the streaming 
  6596.  process, the PDD occasionally checks to see whether it is at the one minute 
  6597.  mark.  When this event occurs, the PDD calls back on an SHD_REPORT_EVENT. 
  6598.  Then, the programmer can free up that event detection linked list node. 
  6599.  
  6600.  Keep in mind that the PDD should have the capability to queue these requests 
  6601.  because there may additional requests. For example, an application might 
  6602.  request to be notified at the one-minute mark, next at a minute and a half, 
  6603.  and possibly every five minutes. 
  6604.  
  6605.  If the PDD does not support event detection, then when it gets called on a 
  6606.  DDCMD_CONTROL NOTIFY, he responds ERROR_INVALID_REQUEST.  This response tells 
  6607.  the stream handler that it must do the event detection itself. 
  6608.  
  6609.  Note:  Refer to the OS/2 Multimedia Programming Reference for the return codes 
  6610.         for the interfaces of the IDC. 
  6611.  
  6612.  
  6613. ΓòÉΓòÉΓòÉ 5.10. Performance-Tuning the Sync/Stream Manager ΓòÉΓòÉΓòÉ
  6614.  
  6615. The Sync/Stream Manager is comprised of two modules:  SSMDD.SYS and SSM.DLL. 
  6616. SSMDD.SYS is the Ring 0 device driver of the Sync/Stream Manager.  Its syntax 
  6617. is as follows: 
  6618.  
  6619. DEVICE=ΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇ SSMDD.SYS ΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöñ
  6620.         ΓööΓöÇ drive ΓöÇΓöÿ  ΓööΓöÇ path ΓöÇΓöÿ               Γö£ΓöÇ /S:sss ΓöÇΓöñ
  6621.                                               Γö£ΓöÇ /P:ppp ΓöÇΓöñ
  6622.                                               Γö£ΓöÇ /H:hhh ΓöÇΓöñ
  6623.                                               Γö£ΓöÇ /Q:qqq ΓöÇΓöñ
  6624.                                               ΓööΓöÇ /E:eee ΓöÇΓöÿ
  6625.  
  6626. Parameters: 
  6627.  
  6628.  /S:sss           Specifies the number of streams that can be created at the 
  6629.                   same time.  Values range from 1 through 64. The default value 
  6630.                   for machines with more than 8MB of memory is 12. The default 
  6631.                   value for machines with 8MB of memory or less is 6. 
  6632.  
  6633.  /P:ppp           Specifies the number of processes that can create streams at 
  6634.                   the same time.  Values range from 1 through 64. The default 
  6635.                   value for machines with more than 8MB of memory is 12. The 
  6636.                   default value for machines with 8MB of memory or less is 6. 
  6637.  
  6638.  /H:hhh           Specifies the maximum amount of heap space (KB) that will be 
  6639.                   used.  Values range from 16 through 256; the default value is 
  6640.                   64. 
  6641.  
  6642.  /Q:qqq           Specifies the size of the event queue (per process).  Values 
  6643.                   range from 2 through 1024; the default value is 64. 
  6644.  
  6645.  /E:eee           Specifies the number of events that can be enabled (per 
  6646.                   stream).  Values range from 1 through 1024. The default value 
  6647.                   for machines with more than 8MB of memory is 32. The default 
  6648.                   value for machines with 8MB of memory or less is 20. 
  6649.  
  6650.  Note:  The DEVICE=SSMDD.SYS statement must appear as the first Ring 0 stream 
  6651.         handler statement in the CONFIG.SYS file. 
  6652.  
  6653.  Sync/Stream Resource Limits 
  6654.  
  6655.    o  The maximum number of streams is 64. 
  6656.  
  6657.    o  The maximum number of streams in a sync group is 64. 
  6658.  
  6659.    o  The maximum number of processes controlling streams is 64. 
  6660.  
  6661.    o  The maximum size of Sync/Stream Manager event queue per process is 1024 
  6662.       entries. 
  6663.  
  6664.  
  6665. ΓòÉΓòÉΓòÉ 6. I/O Procedures ΓòÉΓòÉΓòÉ
  6666.  
  6667. This section illustrates how to write a custom file format I/O procedure 
  6668. (IOProc).  Source code is provided for the following I/O procedures located in 
  6669. the \TOOLKIT\SAMPLES\MM subdirectory: 
  6670.  
  6671.  Case-Converter 
  6672.            Provides a simple example of how to write a file format I/O 
  6673.            procedure (without illustrating the use of data translation).  This 
  6674.            sample performs case conversion of text. See the 
  6675.            \TOOLKIT\SAMPLES\MM\CASECONV subdirectory. 
  6676.  
  6677.  M-Motion 
  6678.            Provides an example of how to write an I/O procedure for use with 
  6679.            image file formats.  This sample enables file format transparency 
  6680.            for M-Motion still video files and illustrates the use of data 
  6681.            translation. See the \TOOLKIT\SAMPLES\MM\MMIOPROC subdirectory. 
  6682.  
  6683.  Ultimotion* 
  6684.            Provides a detailed example of what you need to consider when 
  6685.            writing I/O procedures for software motion video file formats. 
  6686.            ULIOT includes CODEC support and illustrates how to integrate common 
  6687.            and file-format-specific code to support multiple I/O procedures. 
  6688.            See the \TOOLKIT\SAMPLES\MM\ULTIMOIO subdirectory. 
  6689.  
  6690.  The following discussion focuses on the messages the M-Motion I/O procedure 
  6691.  samples support, and what minimal processing is required for the messages. 
  6692.  Information is also provided on the Ultimotion I/O procedure, which 
  6693.  illustrates how to call and initialize a CODEC procedure. 
  6694.  
  6695.  
  6696. ΓòÉΓòÉΓòÉ 6.1. I/O Procedure Architecture ΓòÉΓòÉΓòÉ
  6697.  
  6698. The MMIO subsystem of OS/2 multimedia isolates applications, media control 
  6699. drivers, and stream handlers from data-specific processing in the same way that 
  6700. the media control interface buffers applications from device-specific 
  6701. processing.  Applications send MMIO functions through the MMIO Manager, which 
  6702. uses I/O procedures (IOProcs) to manipulate specific types of multimedia data. 
  6703. The following figure illustrates the procedures available with the installation 
  6704. of OS/2 multimedia. 
  6705.  
  6706. *
  6707.  
  6708.  
  6709. ΓòÉΓòÉΓòÉ 6.1.1. Message Handling ΓòÉΓòÉΓòÉ
  6710.  
  6711. An IOProc is a message-based handler.  Applications and the MMIO subsystem 
  6712. communicate to IOProcs through the use of MMIO messages.  When MMIO receives a 
  6713. request from an application, the MMIO Manager sends a message for that 
  6714. operation to the IOProc that is responsible for that particular file format or 
  6715. storage system.  In turn, the I/O procedure performs operations based on the 
  6716. messages it receives from the MMIO Manager or an application. 
  6717.  
  6718. MMIO messages can be either pre-defined or user-defined messages: 
  6719.  
  6720.  Pre-defined Message 
  6721.            This is a system message that is sent by the MMIO Manager for its 
  6722.            associated function.  For example, an application issuing an 
  6723.            mmioOpen function causes the MMIO Manager to send an MMIOM_OPEN 
  6724.            message to an I/O procedure to open a specific file.  These messages 
  6725.            enable applications to manage media files in a format-independent 
  6726.            manner.  The MMIO Manager determines the correct I/O procedure to 
  6727.            process the message, based on an I/O procedure identifier and I/O 
  6728.            procedure type specified in the function.  See I/O Procedure 
  6729.            Identifier (FOURCC) and I/O Procedure Type. 
  6730.  
  6731.  User-defined Message 
  6732.            This is a private message sent directly to an I/O procedure from an 
  6733.            application through the use of the mmioSendMessage function.  This 
  6734.            function enables a program to call an I/O procedure directly (unlike 
  6735.            system messages, which are sent by the MMIO Manager).  MMIOOS2.H in 
  6736.            the \TOOLKIT\H subdirectory defines the identifier MMIO_USER so that 
  6737.            you can create your own messages.  The mmioSendMessage function 
  6738.            requires that your custom messages be defined at or above the 
  6739.            MMIOM_USER value defined in the MMIOOS2.H file. 
  6740.  
  6741.  
  6742. ΓòÉΓòÉΓòÉ 6.1.2. I/O Procedure Identifier (FOURCC) ΓòÉΓòÉΓòÉ
  6743.  
  6744. A FOURCC is a 32-bit quantity representing a sequence of one to four ASCII 
  6745. alphanumeric characters (padded on the right with blank characters).  Each I/O 
  6746. procedure supports a specific file format.  The file format and IOProc are 
  6747. represented by a specific FOURCC code.  This permits the FOURCC to be used as 
  6748. an ID value, rather than the National Language Support (NLS) string-name of the 
  6749. file format or a file name extension. 
  6750.  
  6751. Formats that support multiple media types require a different FOURCC for each 
  6752. variation.  This appears as a different I/O procedure for each media type. 
  6753.  
  6754. Note:  Use the mmioIdentifyFile function to identify the four-character code if 
  6755.        it is not available. 
  6756.  
  6757.  
  6758. ΓòÉΓòÉΓòÉ 6.1.3. I/O Procedure Type ΓòÉΓòÉΓòÉ
  6759.  
  6760. Certain MMIO functions operate on a specific IOProc type.  There are two types 
  6761. of I/O procedures: file format and storage system.  A file format IOProc 
  6762. operates on the contents of a file, and calls other MMIO services when 
  6763. required.  In contrast, a storage system IOProc operates on the storage 
  6764. presentation of the media object, and calls base operating system services. 
  6765.  
  6766. To indicate an I/O procedure type during initialization, set the ulIOProcType 
  6767. field in the MMFORMATINFO structure to either MMIO_IOPROC_FILEFORMAT for file 
  6768. format IOProcs or MMIO_IOPROC_STORAGESYSTEM for storage system IOProcs.  You 
  6769. should also have a resource file, which specifies the NLS name used to describe 
  6770. the I/O procedure.  You must bind the RC file to the DLL if the I/O procedure 
  6771. is to be used in multiple countries.  The IOProc needs to handle the 
  6772. GETFORMATINFO and GETFORMATNAME messages to provide the above information. 
  6773. File Format I/O Procedure 
  6774.  
  6775. A file format IOProc should support all MMIO system messages (with the 
  6776. exception of RIFF compound file messages).  It should also handle any 
  6777. user-defined messages created by the application.  For example, a file format 
  6778. IOProc needs to support the MMIOM_GETFORMATINFO message, because the MMIO 
  6779. Manager internally issues this message to an IOProc when it is being installed. 
  6780. If the MMIOM_GETFORMATINFO message is not supported, a blank MMFORMATINFO 
  6781. structure is placed on the MMIO internal IOProc table for that specific IOProc, 
  6782. except for the FOURCC. 
  6783.  
  6784. In addition, system messages should be supported by a default message handler, 
  6785. which reports back to MMIO that the message is unsupported.  This message 
  6786. handler should attempt to pass any message it cannot support to a subsequent 
  6787. child IOProc.  For example, a message is passed from a file format IOProc to a 
  6788. storage system IOProc as shown in the following example. 
  6789.  
  6790. default:
  6791.     {
  6792.      /*
  6793.       * Declare Local Variables.
  6794.       */
  6795.      PMMFILESTATUS       pVidInfo;
  6796.      LONG                lRC;
  6797.      /************************************************************
  6798.       * Check for valid MMIOINFO block.
  6799.       ************************************************************/
  6800.      if (!pmmioinfo)
  6801.          return (MMIO_ERROR);
  6802.      /************************************************************
  6803.       * Set up our working variable MMFILESTATUS.
  6804.       ************************************************************/
  6805.      pVidInfo = (PMMFILESTATUS) pmmioinfo->pExtraInfoStruct;
  6806.  
  6807.      if (pVidInfo != NULL && pVidInfo->hmmioSS)
  6808.         {
  6809.          lRC = mmioSendMessage (pVidInfo->hmmioSS,
  6810.                                 usMsg,
  6811.                                 lParam1,
  6812.                                 lParam2);
  6813.          if (!lRC)
  6814.             pmmioinfo->ulErrorRet = mmioGetLastError (pVidInfo->hmmioSS);
  6815.          return (lRC);
  6816.         }
  6817.     else
  6818.        {
  6819.         if (pmmioinfo != NULL)
  6820.            pmmioinfo->ulErrorRet = MMIOERR_UNSUPPORTED_MESSAGE;
  6821.         return (MMIOERR_UNSUPPORTED_MESSAGE);
  6822.        }
  6823.  
  6824.     }   /* end case of Default */
  6825.  
  6826. If you write a custom IOProc that supports translation, the following messages 
  6827. need to consider the translate flags: 
  6828.  
  6829.    o  MMIOM_OPEN 
  6830.    o  MMIOM_READ 
  6831.    o  MMIOM_WRITE 
  6832.    o  MMIOM_SEEK 
  6833.    o  MMIOM_CLOSE 
  6834.    o  MMIOM_GETHEADER 
  6835.    o  MMIOM_SETHEADER 
  6836.    o  MMIOM_QUERYHEADER 
  6837.  
  6838.  Storage System I/O Procedure 
  6839.  
  6840.  A storage system IOProc typically handles a subset of the system-defined 
  6841.  messages that operate on the storage system.  For example, the DOS and MEM 
  6842.  IOProcs handle the following messages: 
  6843.  
  6844.    o  MMIOM_OPEN 
  6845.    o  MMIOM_READ 
  6846.    o  MMIOM_WRITE 
  6847.    o  MMIOM_SEEK 
  6848.    o  MMIOM_CLOSE 
  6849.    o  MMIOM_GETFORMATNAME 
  6850.    o  MMIOM_GETFORMATINFO 
  6851.    o  MMIOM_IDENTIFYFILE 
  6852.  
  6853.  A message specific to the storage system IOProc, such as extended attributes 
  6854.  of a file, would pass through the default handler of the file format IOProc to 
  6855.  the storage system IOProc for processing. 
  6856.  
  6857.  Note:  The RIFF compound file (CF) IOProc installed with OS/2 multimedia only 
  6858.         supports MMIOM_IDENTIFYFILE, MMIOM_GETFORMATINFO, and 
  6859.         MMIOM_GETFORMATNAME.  The compound file (CF) IOProc does not need to 
  6860.         support additional MMIO messages because the bundle ( BND) IOProc 
  6861.         performs the direct file I/O operations.  These two IOProcs can be 
  6862.         viewed as one logical compound file IOProc. 
  6863.  
  6864.  
  6865. ΓòÉΓòÉΓòÉ 6.2. Data Translation and File Conversion ΓòÉΓòÉΓòÉ
  6866.  
  6867. MMIO provides a set of options in its API to support two modes of file access - 
  6868. translated and untranslated.  These modes enable an application to access data 
  6869. in its pure, proprietary format, or in a standard presentation format when 
  6870. performing its I/O operations.  An IOProc can be written to optionally support 
  6871. both access methods. 
  6872.  
  6873. The default mode of access, untranslated, allows the caller to perform I/O of 
  6874. file data in its native format.  All header information and any data is written 
  6875. to a file or read from a file and presented at the caller level without 
  6876. modification. 
  6877.  
  6878. The optional mode of access, translated, is the method used to mask proprietary 
  6879. data formats and allow a caller to use standardized header and data formats for 
  6880. a specific media type (for example, audio, image, or MIDI).  A set of standard 
  6881. header formats and accompanying data formats have been defined as the standard 
  6882. presentation format for these purposes.  An IOProc can be written to optionally 
  6883. support the standard format.  It performs the translation of header 
  6884. information, data information, or both from its native format to the standard 
  6885. format for that media type during read and write type operations.  The 
  6886. translation is performed for the file header and data. 
  6887.  
  6888. With full translation capability enabled in pairs of IOProcs, it is possible to 
  6889. convert files from one format to another very easily.  File conversion is 
  6890. simply a combination of loading from one file and saving to another.  For 
  6891. example, an application can read from an AVC image file with translation 
  6892. enabled, to the standard presentation format, which is the OS/2 bit map.  The 
  6893. application can then use the bit map as desired, including displaying it on the 
  6894. screen, image manipulating, and printing.  Alternatively, the bit map could be 
  6895. saved in a different file format such as M-Motion, by writing to the M-Motion 
  6896. IOProc with translation enabled.  For example: 
  6897.  
  6898. I/O procedures and applications must use the same standard presentation format 
  6899. of data defined for each media type for conversion to be enabled.  (The media 
  6900. types defined are image, audio, MIDI, digital video, and movie.)  These 
  6901. standard formats apply to media descriptive (header) information and media 
  6902. content.  The standard description structures are supersets of the headers each 
  6903. file format normally uses.  This permits all formats to place the subset of 
  6904. their information into the standard form for other applications to access. 
  6905. Similarly, each specific format can retrieve only the subset that is necessary 
  6906. for its purpose.  The standard content format is a usable data format 
  6907. representation that maintains as much quality as possible. 
  6908.  
  6909. Translation functions assist these standard forms in helping to ensure that 
  6910. data is portable between applications, IOProcs, and the operating system 
  6911. services.  The structures containing descriptive information have fields that 
  6912. can be mapped to system structures, such as the OS/2 operating system's 
  6913. BITMAPINFOHEADER.  The content format must be directly usable by the operating 
  6914. system and services, or by standard hardware devices. 
  6915.  
  6916. The descriptive header and content formats are tightly coupled.  If a file 
  6917. contains a media item, an application can query the header describing the 
  6918. media.  The IOProc returns the header, which includes the supported content 
  6919. format most closely matching the information actually in the file.  For 
  6920. example, if an image file contains 21-bit YUV data, the IOProc for that file 
  6921. informs the application that it is providing 24-bit RGB.  The IOProc is 
  6922. responsible for translating all subsequent read operations from YUV to RGB.  In 
  6923. addition, when an application is creating a new media element, it can set the 
  6924. header for a new media item.  All subsequent translated write operations, which 
  6925. are sent from the application to the IOProc, must contain data in the content 
  6926. format described by the header. 
  6927.  
  6928. Each data type uses different description structures and content formats. The 
  6929. following table gives an overview of the standard presentation formats for 
  6930. supported media types. 
  6931.  
  6932. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  6933. ΓöéMedia     ΓöéHeader    ΓöéData                                    Γöé
  6934. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  6935. ΓöéAudio     ΓöéMMAUDIO   ΓöéPCM 11.025, 22.05, 33.1 Khz             Γöé
  6936. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  6937. ΓöéImage     ΓöéMMIMAGE   ΓöéOS/2 1.3 bit map (24 bit RGB, 1, 4, 8   Γöé
  6938. Γöé          Γöé          Γöébit palette)                            Γöé
  6939. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  6940. ΓöéMIDI      ΓöéMMMIDI    ΓöéFormat 0 or 1                           Γöé
  6941. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  6942. ΓöéMOVIES    ΓöéMMMOVIE   ΓöéMulti-track video and audio             Γöé
  6943. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  6944. ΓöéVIDEO     ΓöéMMVIDEO   Γöé16, 24 bit RGB, 4, 8 bit palette        Γöé
  6945. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  6946.  
  6947. Note:  Data translation in compound multimedia files is only performed on media 
  6948.        elements in the file.  Translation is not performed on non-multimedia 
  6949.        files. 
  6950.  
  6951.  
  6952. ΓòÉΓòÉΓòÉ 6.2.1. MMFORMATINFO Data Structure ΓòÉΓòÉΓòÉ
  6953.  
  6954. Several MMIO functions use the MMFORMATINFO data structure for media 
  6955. conversions.  The mmioOpen function includes MMIO_TRANSLATEHEADER and 
  6956. MMIO_TRANSLATEDATA flags which are defined in the ulTranslate field of the 
  6957. MMIOINFO structure.  All subsequent read and write operations of multimedia 
  6958. files return data based on these flags.  Translation is currently defined only 
  6959. for image and audio.  The MMIOOS2.H header file defines the MMFORMATINFO 
  6960. structure as shown in the following example. 
  6961.  
  6962. typedef struct _MMFORMATINFO {         /* mmformatinfo                 */
  6963.                                                                        */
  6964.    ULONG    ulStructLen;               /* Length of this structure     */
  6965.    FOURCC   fccIOProc;                 /* IOProc identifier            */
  6966.    ULONG    ulIOProcType;              /* Type of IOProc               */
  6967.    ULONG    ulMediaType;               /* Media type                   */
  6968.    ULONG    ulFlags;                   /* IOProc capability flags      */
  6969.    CHAR     szDefaultFormatExt[sizeof(FOURCC) + 1];  */
  6970.                                        /* Default extension 4 + null   */
  6971.    ULONG    ulCodePage;                /* Code page                    */
  6972.    ULONG    ulLanguage;                /* Language                     */
  6973.    LONG     lNameLength;               /* Length of identifier string  */
  6974.    } MMFORMATINFO;
  6975.  
  6976.  
  6977. ΓòÉΓòÉΓòÉ 6.3. I/O Procedure Entry Point ΓòÉΓòÉΓòÉ
  6978.  
  6979. The following example illustrates the the entry point used to access the 
  6980. functionality of an I/O procedure. 
  6981.  
  6982. LONG APIENTRY IOProc_Entry ( PVOID   pmmioStr,
  6983.                              USHORT  usMessage,
  6984.                              LONG    lParam1,
  6985.                              LONG    lParam2)
  6986.  
  6987. Associated parameters include the following. 
  6988.  
  6989. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  6990. ΓöéParameter      ΓöéDescription                                  Γöé
  6991. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  6992. ΓöéPVOID pmmioStr ΓöéSpecifies a pointer to an MMIOINFO data      Γöé
  6993. Γöé               Γöéstructure that contains information about theΓöé
  6994. Γöé               Γöéopen file.                                   Γöé
  6995. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  6996. ΓöéUSHORT usMsg   ΓöéSpecifies the message that the file I/O      Γöé
  6997. Γöé               Γöéprocedure is being asked to process.         Γöé
  6998. Γöé               Γöé(User-defined messages must have messages    Γöé
  6999. Γöé               Γöédefined above MMIOM_USER.)                   Γöé
  7000. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  7001. ΓöéLONG lParam1   ΓöéSpecifies message-dependent information such Γöé
  7002. Γöé               Γöéas a file name.                              Γöé
  7003. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  7004. ΓöéLONG lParam2   ΓöéSpecifies additional message-dependent       Γöé
  7005. Γöé               Γöéinformation.  (Used with some messages as    Γöé
  7006. Γöé               Γöévalues.)                                     Γöé
  7007. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  7008.  
  7009. Note:  The return value is message-dependent.  If the I/O procedure does not 
  7010.        recognize a message passed in by usMsg, and the default message handler 
  7011.        does not recognize usMsg, then it must return 
  7012.        MMIOERR_UNSUPPORTED_MESSAGE. 
  7013.  
  7014.  
  7015. ΓòÉΓòÉΓòÉ 6.4. Supported Messages ΓòÉΓòÉΓòÉ
  7016.  
  7017. The following figure illustrates the messages supported by the M-Motion I/O 
  7018. procedure (MMOTTK.DLL).  Following the figure are descriptions and code 
  7019. examples of the messages file format I/O procedures must support. 
  7020.  
  7021.  
  7022. ΓòÉΓòÉΓòÉ 6.4.1. MMIOM_OPEN ΓòÉΓòÉΓòÉ
  7023.  
  7024. Each IOProc must be able to process the MMIOM_OPEN message, which requests that 
  7025. a file be opened.  Once the application knows which IOProc is associated with 
  7026. the selected file, it can open the file using mmioOpen.  The application 
  7027. references the appropriate IOProc using the FOURCC provided by the 
  7028. identification process. 
  7029.  
  7030. A file format IOProc must check for the following items when the MMIO Manager 
  7031. issues an MMIOM_OPEN message. 
  7032.  
  7033.    o  File format IOProcs use the fccChildIOProc field from the pmmioinfo 
  7034.       structure and perform another mmioOpen.  The MMIO_NOIDENTIFY flag must be 
  7035.       set in this case. 
  7036.  
  7037.    o  The lLogicalFilePos of the MMIOINFO structure should be set to either 0 
  7038.       or at the first byte of data following the header, if any.  This example 
  7039.       has a header and lLogicalFilePos is set using the return code from 
  7040.       mmioSeek. 
  7041.  
  7042.    o  A file format IOProc must check to see if the MMIO_TRANSLATEDATA or 
  7043.       MMIO_TRANSLATEHEADER flag is set.  If a translate flag is set, it 
  7044.       processes the data according to a set of defined interchange formats 
  7045.       (refer to the OS/2 Multimedia Programming Reference for details). If a 
  7046.       translate flag is not set, it allows the data to pass through the IOProc 
  7047.       with application-specific modifications.  Translation support is required 
  7048.       if the IOProc is to be supported under the Multimedia Data Converter 
  7049.       program. 
  7050.  
  7051.  If the OPEN was successful, the application can obtain information about the 
  7052.  media in the file using the mmioGetHeaderInfo message. 
  7053.  
  7054.  The following example illustrates how to handle the MMIOM_OPEN message for a 
  7055.  file format IOProc.  The MMIOM_OPEN message handler uses the mmioOpen function 
  7056.  to locate a media data object using an MMIO-supported storage system IOProc. 
  7057.  Upon opening the data object, an hmmio handle (H1) is returned to the file 
  7058.  format IOProc.  This handle is saved in the aulInfo[1] field of MMIOINFO for 
  7059.  the file format IOProc.  Upon the return to the mmioOpen function issued by 
  7060.  the application, you will notice that another handle (H2) was already 
  7061.  generated and returned to the application.  These handles allow access to the 
  7062.  data object.  The application will use H2, and the file format IOProc will use 
  7063.  H1 with MMIO function calls to the storage system IOProc. 
  7064.  
  7065.  The following example shows an example of how the M-Motion IOProc supports the 
  7066.  MMIOM_OPEN message. 
  7067.  
  7068.   case MMIOM_OPEN:
  7069.       {
  7070.       /************************************************************
  7071.        * Declare local variables
  7072.        ************************************************************/
  7073.       PMMFILESTATUS   pVidInfo;   /* pointer to an M-Motion file    */
  7074.                                   /* status structure that we will*/
  7075.                                   /* use for this file instance   */
  7076.       MMIMAGEHEADER   MMImgHdr;
  7077.       ULONG           ulRequiredFileLength;
  7078.       ULONG           ulActualFileLength;
  7079.       ULONG           ulWidth;
  7080.       ULONG           ulHeight;
  7081.       PBYTE           lpYUVBuf;
  7082.       ULONG           ulRowCount;
  7083.       ULONG           ulRGBBytesPerLine;
  7084.       ULONG           ulYUVBytesPerLine;
  7085.       LONG            rc;
  7086.       HMMIO           hmmioSS;
  7087.       PBYTE           lpRGBBufPtr;
  7088.       FOURCC          fccStorageSystem;   /* SS I/O Proc FOURCC       */
  7089.       MMIOINFO        mmioinfoSS;         /* I/O info block for SS ref*/
  7090.       PSZ pszFileName = (CHAR *)lParam1;  /* get the filename from    */
  7091.                                           /* parameter                */
  7092.       /************************************************************
  7093.        * Check for valid MMIOINFO block.
  7094.        ************************************************************/
  7095.       if (!pmmioinfo)
  7096.           return (MMIO_ERROR);
  7097.       /************************************************************
  7098.        * If flags show read and write then send back an error.  We
  7099.        * only support reading or writing but not both at the same
  7100.        * time on the same file.
  7101.        ************************************************************/
  7102.       if ((pmmioinfo->ulFlags & MMIO_READWRITE) &&
  7103.           ((pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA) ||
  7104.            (pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER)))
  7105.           {
  7106.           return (MMIO_ERROR);
  7107.           }
  7108.       /*********************************************************
  7109.        *   Determine the storage system/child IOProc that actually
  7110.        *   obtains the data for us.  The M-Motion data may be contained
  7111.        *   in a memory (RAM) file, as a component in a database or
  7112.        *   library (a Compound file), or as a stand-alone disk file.
  7113.        *
  7114.        *   While the application uses this M-Motion IOProc to obtain
  7115.        *   untranslated (M-Motion) or translated (bit map) data,
  7116.        *   the IOProc must obtain it's data from something that
  7117.        *   reads and writes to a storage media.  The exact storage
  7118.        *   media is immaterial - so long as the read and write
  7119.        *   operations generate data that LOOKS like it is part
  7120.        *   of a standard file.
  7121.        *********************************************************/
  7122.       if (!pmmioinfo->fccChildIOProc)
  7123.          {
  7124.          /* Need to determine SS if create from pmmioinfo and filename. */
  7125.          if (pmmioinfo->ulFlags & MMIO_CREATE)
  7126.             {
  7127.             if (mmioDetermineSSIOProc( pszFileName,
  7128.                                        pmmioinfo,
  7129.                                        &fccStorageSystem,
  7130.                                        NULL ))
  7131.                {
  7132.                fccStorageSystem = FOURCC_DOS;
  7133.                }
  7134.             }
  7135.          else
  7136.             {
  7137.             if (mmioIdentifyStorageSystem( pszFileName,
  7138.                                            pmmioinfo,
  7139.                                            &fccStorageSystem ))
  7140.                {
  7141.                return (MMIO_ERROR);
  7142.                }
  7143.  
  7144.             }
  7145.  
  7146.          if (!fccStorageSystem)
  7147.             {
  7148.             return (MMIO_ERROR);
  7149.             }
  7150.          else
  7151.             {
  7152.             pmmioinfo->fccChildIOProc = fccStorageSystem;
  7153.             }
  7154.          } /* end storage system identification block */
  7155.       /**************************************************************
  7156.        * Direct the open to the specific storage system necessary
  7157.        **************************************************************/
  7158.       memset( &mmioinfoSS, '\0', sizeof(MMIOINFO));
  7159.       memmove( &mmioinfoSS, pmmioinfo, sizeof(MMIOINFO));
  7160.       mmioinfoSS.pIOProc = NULL;
  7161.       mmioinfoSS.fccIOProc = pmmioinfo->fccChildIOProc;
  7162.       mmioinfoSS.ulFlags |= MMIO_NOIDENTIFY;
  7163.       /************************************************************
  7164.        * Try to open the file.  Add the NO IDENTIFY flag to
  7165.        *    ENSURE THAT WE DON'T LOOP RECURSIVELY!!!
  7166.        ************************************************************/
  7167.       hmmioSS = mmioOpen (pszFileName,
  7168.                           &mmioinfoSS,
  7169.                           mmioinfoSS.ulFlags);
  7170.       /************************************************************
  7171.        * Check if a DELETE was requested - mmioOpen returns a 1,
  7172.        *    so we much check this separately
  7173.        ************************************************************/
  7174.       if (pmmioinfo->ulFlags & MMIO_DELETE)
  7175.          {
  7176.          /* was the delete successful?         */
  7177.          if (!hmmioSS)
  7178.             {
  7179.             pmmioinfo->ulErrorRet = MMIOERR_DELETE_FAILED;
  7180.             return (MMIO_ERROR);
  7181.             }
  7182.          else
  7183.             {
  7184.             return (MMIO_SUCCESS);
  7185.             }
  7186.          }
  7187.       /************************************************************
  7188.        * Check the return code from the open call for an error.
  7189.        *    If not delete, then the open should have worked.
  7190.        ************************************************************/
  7191.       if (!hmmioSS)
  7192.           return (MMIO_ERROR);
  7193.       /************************************************************
  7194.        * Allocate memory for one M-Motion FileStatus structures
  7195.        ************************************************************/
  7196.       DosAllocMem ((PPVOID) &pVidInfo,
  7197.                             sizeof (MMFILESTATUS),
  7198.                             fALLOC);
  7199.       /************************************************************
  7200.        * Ensure the allocate was successful.  If not, then
  7201.        *   close the file and return open as unsucessful...
  7202.        ************************************************************/
  7203.       if (!pVidInfo)
  7204.          {
  7205.          mmioClose (hmmioSS, 0);
  7206.          return (MMIO_ERROR);
  7207.       pVidInfo->hmmioSS = hmmioSS;
  7208.       /************************************************************
  7209.        * Store pointer to our MMFILESTATUS structure in
  7210.        * pExtraInfoStruct field that is provided for our use.
  7211.        ************************************************************/
  7212.       pmmioinfo->pExtraInfoStruct = (PVOID)pVidInfo;
  7213.       /************************************************************
  7214.        * Set the fields of the FileStatus structure that the
  7215.        * IOProc is responsible for.
  7216.        ************************************************************/
  7217.       InitFileStruct (pVidInfo);
  7218.       /*********************************************************
  7219.        * If this is a read, we need to check that is a M-Motion
  7220.        *    file and perhaps get the data.
  7221.        *********************************************************/
  7222.       if (pmmioinfo->ulFlags & MMIO_READ)
  7223.          {
  7224.          /*********************************************************
  7225.           * First we must get some basic information from the file
  7226.           * Read in data to fill up the MMOTIONHEADER structure.
  7227.           *
  7228.           * If the read is unsuccessful, this is not a M-Motion file
  7229.           * and we should return a failure on the open
  7230.           *********************************************************/
  7231.          if (sizeof (MMOTIONHEADER) !=
  7232.                              mmioRead (pVidInfo->hmmioSS,
  7233.                                        (PVOID) &pVidInfo->mmotHeader,
  7234.                                        (ULONG) sizeof (MMOTIONHEADER)))
  7235.              {
  7236.              mmioClose (pVidInfo->hmmioSS, 0);
  7237.              DosFreeMem ((PVOID) pVidInfo);
  7238.              return (MMIO_ERROR);
  7239.              }
  7240.          /* Ensure this IS an M-Motion file header before we continue  */
  7241.          if (strcmp (pVidInfo->mmotHeader.mmID, "YUV12C"))
  7242.              {
  7243.              mmioClose (pVidInfo->hmmioSS, 0);
  7244.              DosFreeMem ((PVOID) pVidInfo);
  7245.              return (MMIO_ERROR);
  7246.              }
  7247.          /********************************************************
  7248.           * Set up width and height of image.
  7249.           ********************************************************/
  7250.          ulWidth  = (ULONG)pVidInfo->mmotHeader.mmXlen;
  7251.          ulHeight = (ULONG)pVidInfo->mmotHeader.mmYlen;
  7252.          /* Calculate what the length of the file SHOULD be based on the */
  7253.          /*   header contents                                            */
  7254.          ulRequiredFileLength = (((ulWidth >> 2) * 6) * ulHeight) +
  7255.                                                 sizeof (MMOTIONHEADER);
  7256.  
  7257.          /* Query what the ACTUAL length of the file is,                 */
  7258.          /*   then move back to just after the header.                   */
  7259.          ulActualFileLength = (ULONG)mmioSeek (pVidInfo->hmmioSS,
  7260.                                               0, SEEK_END);
  7261.  
  7262.          mmioSeek (pVidInfo->hmmioSS, sizeof (MMOTIONHEADER), SEEK_SET);
  7263.          /* If these don't match, then it isn't a VALID M-Motion file    */
  7264.          /*    - regardless of what the header says.                     */
  7265.          if (ulRequiredFileLength != ulActualFileLength)
  7266.              {
  7267.              mmioClose (pVidInfo->hmmioSS, 0);
  7268.              DosFreeMem ((PVOID) pVidInfo);
  7269.              return (MMIO_ERROR);
  7270.              }
  7271.  
  7272.          /************************************************************
  7273.           * If the app intends to read in translation mode, we must
  7274.           * allocate and set-up the buffer that will contain the RGB data.
  7275.           *
  7276.           * We must also read in the data to insure that the first
  7277.           * read, seek, or get-header operation will have data
  7278.           * to use.  This is ONLY NECESSARY FOR TRANSLATED MODE
  7279.           * operations, since we must process reads/writes pretending
  7280.           * the image is stored from the bottom-up.
  7281.           *
  7282.           ************************************************************
  7283.           ************************************************************
  7284.           * Fill out the MMIMAGEHEADER structure.
  7285.           ************************************************************/
  7286.          MMImgHdr.ulHeaderLength = sizeof (MMIMAGEHEADER);
  7287.          MMImgHdr.ulContentType  = MMIO_IMAGE_PHOTO;
  7288.          MMImgHdr.ulMediaType    = MMIO_MEDIATYPE_IMAGE;
  7289.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbFix =
  7290.                      sizeof (BITMAPINFOHEADER2);
  7291.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cx              = ulWidth;
  7292.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cy              = ulHeight;
  7293.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cPlanes         = 1;
  7294.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount       = 24;
  7295.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulCompression   =
  7296.              BCA_UNCOMP;
  7297.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbImage         =
  7298.              ulWidth * ulHeight * 3;
  7299.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cxResolution    = 0L;
  7300.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cyResolution    = 0L;
  7301.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrUsed        = 0L;
  7302.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrImportant   = 0L;
  7303.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usUnits         = 0L;
  7304.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usReserved      = 0L;
  7305.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usRecording     =
  7306.              BRA_BOTTOMUP;
  7307.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usRendering     =
  7308.              BRH_NOTHALFTONED;
  7309.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cSize1          = 0L;
  7310.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cSize2          = 0L;
  7311.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulColorEncoding = 0L;
  7312.          MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulIdentifier    = 0L;
  7313.          /************************************************************
  7314.           * Copy the image header into private area for later use.
  7315.           * This will be returned on a mmioGetHeader () call
  7316.           ************************************************************/
  7317.          pVidInfo->mmImgHdr = MMImgHdr;
  7318.          /********************************************************
  7319.           * YUV Bytes/Line are = 1 1/2 times the number of pels
  7320.           ********************************************************/
  7321.          ulYUVBytesPerLine = ulWidth + (ulWidth >> 1);
  7322.  
  7323.          /********************************************************
  7324.           * RGB Bytes/Line are = 2* YUV bytes/line
  7325.           ********************************************************/
  7326.          ulRGBBytesPerLine = (ulYUVBytesPerLine << 1);
  7327.  
  7328.          /********************************************************
  7329.           * Determine total bytes in image
  7330.           ********************************************************/
  7331.          pVidInfo->ulRGBTotalBytes = ulWidth * ulHeight * 3;
  7332.  
  7333.          /********************************************************
  7334.           * M-Motion images are always on 4-pel boundaries, which also
  7335.           * makes them on 4-byte/LONG boundaries, which is used for
  7336.           * bit maps.  Therefore, there are no extra pad bytes necessary.
  7337.           ********************************************************/
  7338.          pVidInfo->ulImgPaddedBytesPerLine = ulWidth * 3;
  7339.          pVidInfo->ulImgTotalBytes = pVidInfo->ulRGBTotalBytes;
  7340.          /*********************************************************
  7341.           * For translated data READ mode, we must allocate a buffer,
  7342.           * get the YUV data from the file, and load the RGB buffer.
  7343.           * Place format-specific code here to load the image into the
  7344.           * buffer.  The code below is M-Motion format specific.
  7345.           *********************************************************/
  7346.          if (pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA)
  7347.             {
  7348.             /********************************************************
  7349.              * Get space for full image buffer.
  7350.              * This will be retained until the file is closed.
  7351.              ********************************************************/
  7352.             if (DosAllocMem ((PPVOID) &(pVidInfo->lpRGBBuf),
  7353.                               pVidInfo->ulRGBTotalBytes,
  7354.                               fALLOC))
  7355.                 {
  7356.                 mmioClose (pVidInfo->hmmioSS, 0);
  7357.                 DosFreeMem ((PVOID) pVidInfo);
  7358.                 return (MMIO_ERROR);
  7359.                 }
  7360.  
  7361.             /********************************************************
  7362.              * Get temporary space for one line YUV buffer.
  7363.              ********************************************************/
  7364.             if (DosAllocMem ((PPVOID) &lpYUVBuf,
  7365.                              ulYUVBytesPerLine,
  7366.                              fALLOC))
  7367.                 {
  7368.                 mmioClose (pVidInfo->hmmioSS, 0);
  7369.                 DosFreeMem ((PVOID) pVidInfo);
  7370.                 return (MMIO_ERROR);
  7371.                 }
  7372.             /********************************************************
  7373.              * Initialize the beginning buffer position.
  7374.              ********************************************************/
  7375.             lpRGBBufPtr = pVidInfo->lpRGBBuf;
  7376.  
  7377.             /********************************************************
  7378.              * Read in YUV data one line at a time, converting
  7379.              * from YUV to RGB, then placing in the image buffer.
  7380.              ********************************************************/
  7381.             for (ulRowCount = 0;
  7382.                  ulRowCount < ulHeight;
  7383.                  ulRowCount++)
  7384.  
  7385.                 {
  7386.                 /****************************************************
  7387.                  * Read in one line.
  7388.                  ****************************************************/
  7389.                 rc = mmioRead (pVidInfo->hmmioSS,
  7390.                                (PVOID) lpYUVBuf,
  7391.                                (ULONG) ulYUVBytesPerLine);
  7392.  
  7393.                 /****************************************************
  7394.                  * Convert one line at a time.
  7395.                  ****************************************************/
  7396.                 ConvertOneLineYUVtoRGB (lpYUVBuf,
  7397.                                         lpRGBBufPtr,
  7398.                                         ulYUVBytesPerLine);
  7399.  
  7400.                 /****************************************************
  7401.                  * Make sure buffer ptr is correct for the next convert.
  7402.                  ****************************************************/
  7403.                 lpRGBBufPtr += (LONG)ulRGBBytesPerLine;
  7404.                 }   /* end of FOR loop to read YUV data */
  7405.             DosFreeMem (lpYUVBuf);
  7406.  
  7407.             /********************************************************
  7408.              * This changes from M-Motion's top-down form to OS/2
  7409.              * PM's bottom-up bit map form.
  7410.              ********************************************************/
  7411.             ImgBufferFlip (pVidInfo->lpRGBBuf,
  7412.                            pVidInfo->ulImgPaddedBytesPerLine,
  7413.                            ulHeight);
  7414.             /********************************************************
  7415.              * RGB buffer now full, set position pointers to the
  7416.              * beginning of the buffer.
  7417.              ********************************************************/
  7418.             pVidInfo->lImgBytePos =  0;
  7419.             }   /*  end IF TRANSLATED block */
  7420.          } /* end IF READ block */
  7421.       return (MMIO_SUCCESS);
  7422.       } /* end case of MMIOM_OPEN */
  7423.  
  7424.  
  7425. ΓòÉΓòÉΓòÉ 6.4.2. MMIOM_READ and MMIOM_WRITE ΓòÉΓòÉΓòÉ
  7426.  
  7427. The MMIOM_READ message requests that bytes be read from an open file; 
  7428. MMIOM_WRITE message requests that bytes be written to an open file.  These 
  7429. messages should be handled differently for each IOProc, depending on the 
  7430. requirements imposed by the file's data.  Because a file might be using 
  7431. buffered I/O, mmioRead and mmioWrite maintain the lBufOffset and the 
  7432. lDiskOffset fields.  The IOProc should not modify these fields.  If these 
  7433. fields are needed by the IOProc, the IOProc can use the aulInfo array to 
  7434. maintain.  Additionally, the pExtraInfoStruct can be used for any user-defined 
  7435. structure that the IOProc requires.  The sample IOProc stores its header in 
  7436. this field to demonstrate this capability.  If the IOProc is a file format 
  7437. IOProc, it should use mmioRead or mmioWrite calls to the storage system IOProc, 
  7438. using the internal handle generated during the open processing.  A storage 
  7439. system IOProc might simply issue calls to DosRead or DosWrite. 
  7440.  
  7441. To implement a file format IOProc for translation mode, and provide support for 
  7442. the MMIO_TRANSLATEDATA flag, additional code is required for the MMIOM_READ and 
  7443. MMIOM_WRITE message processing. During read processing, after data is read from 
  7444. the file to a private buffer in its native encoding format, the data must be 
  7445. translated from its native encoding scheme to the standard presentation format 
  7446. encoding scheme for its media type.  The translated data is then presented to 
  7447. the application in its read buffer.  Likewise, for write processing, data is 
  7448. received from the application in the standard presentation format, and must be 
  7449. translated to its native encoding scheme before being written to the file. 
  7450.  
  7451. The following example shows an example of how the M-Motion IOProc supports the 
  7452. MMIOM_READ and MMIOM_WRITE messages. 
  7453.  
  7454. case MMIOM_READ:
  7455.      {
  7456.      /************************************************************
  7457.       * Declare Local Variables
  7458.       ************************************************************/
  7459.      PMMFILESTATUS   pVidInfo;
  7460.      LONG            rc;
  7461.      LONG            lBytesToRead;
  7462.  
  7463.      /************************************************************
  7464.       * Check for valid MMIOINFO block.
  7465.       ************************************************************/
  7466.      if (!pmmioinfo)
  7467.          return (MMIO_ERROR);
  7468.  
  7469.      /************************************************************
  7470.       * Set up our working file status variable.
  7471.       ************************************************************/
  7472.      pVidInfo = (PMMFILESTATUS)pmmioinfo->pExtraInfoStruct;
  7473.  
  7474.      /************************************************************
  7475.       * Is Translate Data off?
  7476.       ************************************************************/
  7477.      if (!(pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA))
  7478.          {
  7479.          /********************************************************
  7480.           * Since no translation, provide exact number of bytes req.
  7481.           ********************************************************/
  7482.          if (!lParam1)
  7483.              return (MMIO_ERROR);
  7484.  
  7485.          rc = mmioRead (pVidInfo->hmmioSS,
  7486.                         (PVOID) lParam1,
  7487.                         (ULONG) lParam2);
  7488.  
  7489.          return (rc);
  7490.          }
  7491.  
  7492.      /************************************************************
  7493.       * Otherwise, Translate Data is on...
  7494.       ************************************************************/
  7495.  
  7496.      /************************************************************
  7497.       * Ensure we do NOT write more data out than is remaining
  7498.       *    in the buffer.  The length of read was requested in
  7499.       *    image bytes, so confirm that there are that many of
  7500.       *    virtual bytes remaining.
  7501.       ************************************************************/
  7502.      if ((ULONG)(pVidInfo->lImgBytePos + lParam2) >
  7503.           pVidInfo->ulImgTotalBytes)
  7504.         lBytesToRead =
  7505.             pVidInfo->ulImgTotalBytes - pVidInfo->lImgBytePos;
  7506.      else
  7507.         lBytesToRead = (ULONG)lParam2;
  7508.  
  7509.      /************************************************************
  7510.       * Perform this block on ALL reads.  The image data should
  7511.       * be in the RGB buffer at this point, and can be handed
  7512.       * to the application.
  7513.       *
  7514.       * Conveniently, the virtual image position is the same
  7515.       *    as the RGB buffer position, since both are 24 bit-RGB
  7516.       ************************************************************/
  7517.      memcpy ((PVOID)lParam1,
  7518.              &(pVidInfo->lpRGBBuf[pVidInfo->lImgBytePos]),
  7519.              lBytesToRead);
  7520.  
  7521.      /************************************************************
  7522.       * Move RGB buffer pointer forward by number of bytes read.
  7523.       * The Img buffer pos is identical since both are 24 bits.
  7524.       ************************************************************/
  7525.      pVidInfo->lImgBytePos += lBytesToRead;
  7526.  
  7527.      return (lBytesToRead);
  7528.      }   /* end case  of MMIOM_READ */
  7529.  
  7530.  case MMIOM_WRITE:
  7531.       {
  7532.       /************************************************************
  7533.        * Declare Local Variables.
  7534.        ************************************************************/
  7535.       PMMFILESTATUS       pVidInfo;
  7536.       USHORT              usBitCount;
  7537.       LONG                lBytesWritten;
  7538.       ULONG               ulImgBytesToWrite;
  7539.  
  7540.       /************************************************************
  7541.        * Check for valid MMIOINFO block.
  7542.        ************************************************************/
  7543.       if (!pmmioinfo)
  7544.           return (MMIO_ERROR);
  7545.  
  7546.       /************************************************************
  7547.        * Set up our working variable MMFILESTATUS.
  7548.        ************************************************************/
  7549.       pVidInfo = (PMMFILESTATUS) pmmioinfo->pExtraInfoStruct;
  7550.  
  7551.       /************************************************************
  7552.        * See if a SetHeader has been done on this file.
  7553.        ************************************************************/
  7554.       if ((!pVidInfo) || (!pVidInfo->bSetHeader))
  7555.           {
  7556.           return (MMIO_ERROR);
  7557.           }
  7558.  
  7559.       if (!(pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA))
  7560.           {
  7561.           /********************************************************
  7562.            * Translation is off, take amount of bytes sent and
  7563.            * write to the file.
  7564.            ********************************************************
  7565.            * Ensure that there is a data buffer to write from.
  7566.            ********************************************************/
  7567.           if (!lParam1)
  7568.               return (MMIO_ERROR);
  7569.  
  7570.           lBytesWritten = mmioWrite (pVidInfo->hmmioSS,
  7571.                                      (PVOID) lParam1,
  7572.                                      (ULONG) lParam2);
  7573.  
  7574.           return (lBytesWritten);
  7575.           }
  7576.  
  7577.       /************************************************************
  7578.        * Translation is on.
  7579.        ************************************************************
  7580.        * Set up local variables.
  7581.        ************************************************************/
  7582.       usBitCount =
  7583.          pVidInfo->mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
  7584.  
  7585.  
  7586.       /************************************************************
  7587.        * Ensure we do not attempt to write past the end of the
  7588.        *    buffer...
  7589.        ************************************************************/
  7590.       if ((ULONG)(pVidInfo->lImgBytePos + lParam2) >
  7591.          pVidInfo->ulImgTotalBytes)
  7592.          ulImgBytesToWrite =
  7593.              pVidInfo->ulImgTotalBytes - pVidInfo->lImgBytePos;
  7594.       else
  7595.          ulImgBytesToWrite = (ULONG)lParam2;
  7596.  
  7597.       /************************************************************
  7598.        * Write the data into the image buffer.  It will be converted to
  7599.        *   RGB, then YUV  when the file is closed.  This allows the
  7600.        *   application to seek to arbitrary  positions within the
  7601.        *   image in terms of the bits/pel, etc they are writing.
  7602.        ************************************************************/
  7603.       memcpy (&(pVidInfo->lpImgBuf[pVidInfo->lImgBytePos]),
  7604.               (PVOID)lParam1,
  7605.               ulImgBytesToWrite);
  7606.  
  7607.       /* Update current position in the image buffer */
  7608.       pVidInfo->lImgBytePos += ulImgBytesToWrite;
  7609.  
  7610.       return (ulImgBytesToWrite);
  7611.       }   /* end case of MMIOM_WRITE */
  7612.  
  7613.   /*
  7614.    * If the IOProc has a child IOProc, then pass the message
  7615.    *  on to the Child, otherwise return Unsupported Message
  7616.    */
  7617.   default:
  7618.       {
  7619.        /*
  7620.         * Declare Local Variables.
  7621.         */
  7622.        PMMFILESTATUS       pVidInfo;
  7623.        LONG                lRC;
  7624.  
  7625.        /************************************************************
  7626.         * Check for valid MMIOINFO block.
  7627.         ************************************************************/
  7628.        if (!pmmioinfo)
  7629.            return (MMIO_ERROR);
  7630.  
  7631.        /************************************************************
  7632.         * Set up our working variable MMFILESTATUS.
  7633.         ************************************************************/
  7634.        pVidInfo = (PMMFILESTATUS) pmmioinfo->pExtraInfoStruct;
  7635.  
  7636.        if (pVidInfo != NULL && pVidInfo->hmmioSS)
  7637.           {
  7638.            lRC = mmioSendMessage (pVidInfo->hmmioSS,
  7639.                                   usMsg,
  7640.                                   lParam1,
  7641.                                   lParam2);
  7642.            if (!lRC)
  7643.               pmmioinfo->ulErrorRet = mmioGetLastError (pVidInfo->hmmioSS);
  7644.            return (lRC);
  7645.           }
  7646.       else
  7647.          {
  7648.           if (pmmioinfo != NULL)
  7649.              pmmioinfo->ulErrorRet = MMIOERR_UNSUPPORTED_MESSAGE;
  7650.           return (MMIOERR_UNSUPPORTED_MESSAGE);
  7651.          }
  7652.  
  7653.       }   /* end case of Default */
  7654.  
  7655.   } /* end SWITCH statement for MMIO messages */
  7656.  
  7657. return (0);
  7658. }      /* end of window procedure */
  7659.  
  7660.  
  7661. ΓòÉΓòÉΓòÉ 6.4.3. MMIOM_SEEK ΓòÉΓòÉΓòÉ
  7662.  
  7663. This message is handled differently by each IOProc.  Because of the 
  7664. requirements of different file formats, you will need to determine if this 
  7665. message can be supported, and if so, how to implement the three different types 
  7666. of seeks.  A file format IOProc can use some type of calculation to determine 
  7667. the seek distance, and what those distance units are.  The file format IOProc 
  7668. should use mmioSeek to call the storage system IOProc.  A storage system IOProc 
  7669. can call the DOSSetFilePtr function to set the file's position.  The bounds 
  7670. checking that must occur for compound file elements is handled by the mmioSeek 
  7671. function for BND file elements.  Any other compound file IOProcs of this nature 
  7672. need to implement this checking in its own code. 
  7673.  
  7674. The following example shows an example of how the M-Motion IOProc supports the 
  7675. MMIOM_SEEK message. 
  7676.  
  7677. case MMIOM_SEEK:
  7678.      {
  7679.      /************************************************************
  7680.       * Set up locals.
  7681.       ************************************************************/
  7682.      PMMFILESTATUS   pVidInfo;
  7683.      LONG            lNewFilePosition;
  7684.      LONG            lPosDesired;
  7685.      SHORT           sSeekMode;
  7686.  
  7687.      /************************************************************
  7688.       * Check to make sure MMIOINFO block is valid.
  7689.       ************************************************************/
  7690.      if (!pmmioinfo)
  7691.          return (MMIO_ERROR);
  7692.  
  7693.      /************************************************************
  7694.       * Set up our working file status variable.
  7695.       ************************************************************/
  7696.      pVidInfo = (PMMFILESTATUS)pmmioinfo->pExtraInfoStruct;
  7697.  
  7698.      lPosDesired = lParam1;
  7699.      sSeekMode = (SHORT)lParam2;
  7700.  
  7701.      /************************************************************
  7702.       * Is Translate Data on?
  7703.       ************************************************************/
  7704.      if (pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA)
  7705.          {
  7706.          /********************************************************
  7707.           * Attempt to move the Image buffer pointer to the
  7708.           * desired location.  App sends SEEK requests in
  7709.           * positions relative to the image planes & bits/pel
  7710.           * We must also convert this to RGB positions
  7711.           ********************************************************/
  7712.          switch (sSeekMode)
  7713.              {
  7714.              case SEEK_SET:
  7715.                  {
  7716.                  lNewFilePosition = lPosDesired;
  7717.                  break;
  7718.                  }
  7719.              case SEEK_CUR:
  7720.                  {
  7721.                  lNewFilePosition = pVidInfo->lImgBytePos + lPosDesired;
  7722.                  break;
  7723.                  }
  7724.              case SEEK_END:
  7725.                  {
  7726.  
  7727.                  lNewFilePosition =
  7728.                               pVidInfo->ulImgTotalBytes += lPosDesired;
  7729.                  break;
  7730.                  }
  7731.  
  7732.              default :
  7733.                 return (MMIO_ERROR);
  7734.              }
  7735.  
  7736.          /********************************************************
  7737.           * Make sure seek did not go before start of file.
  7738.           * If so, then don't change anything, just return an error
  7739.           ********************************************************/
  7740.          if (lNewFilePosition < 0)
  7741.             {
  7742.             return (MMIO_ERROR);
  7743.             }
  7744.  
  7745.          /********************************************************
  7746.           * Make sure seek did not go past the end of file.
  7747.           ********************************************************/
  7748.          if (lNewFilePosition > (LONG)pVidInfo->ulImgTotalBytes)
  7749.              lNewFilePosition = pVidInfo->ulImgTotalBytes;
  7750.  
  7751.          pVidInfo->lImgBytePos = lNewFilePosition;
  7752.  
  7753.          return (pVidInfo->lImgBytePos);
  7754.          } /* end  IF DATA TRANSLATED */
  7755.  
  7756.      /************************************************************
  7757.       * Translate Data is OFF...
  7758.       ************************************************************
  7759.       * if this is a seek from the beginning of the file,
  7760.       *    we must account for and pass the header
  7761.       ************************************************************/
  7762.      if (lParam2==SEEK_SET)
  7763.         lPosDesired += MMOTION_HEADER_SIZE;
  7764.  
  7765.      lNewFilePosition = mmioSeek (pVidInfo->hmmioSS,
  7766.                                   lPosDesired,
  7767.                                   sSeekMode);
  7768.  
  7769.      /********************************************
  7770.       * Ensure we did not move to within the header
  7771.       ********************************************/
  7772.      if ((lNewFilePosition != MMIO_ERROR) &&
  7773.          (lNewFilePosition < MMOTION_HEADER_SIZE))
  7774.         {
  7775.         lNewFilePosition = mmioSeek (pVidInfo->hmmioSS,
  7776.                                       (LONG)MMOTION_HEADER_SIZE,
  7777.                                       SEEK_SET);
  7778.         }
  7779.  
  7780.      /************************************************************
  7781.       * Return new position.  Always remove the length of the
  7782.       *    header from the this position value
  7783.       ************************************************************/
  7784.      if (lNewFilePosition != MMIO_ERROR)
  7785.         lNewFilePosition -= MMOTION_HEADER_SIZE;
  7786.  
  7787.      return (lNewFilePosition);
  7788.      }  /* end case of MMIOM_SEEK */
  7789.  
  7790.  
  7791. ΓòÉΓòÉΓòÉ 6.4.4. MMIOM_CLOSE ΓòÉΓòÉΓòÉ
  7792.  
  7793. This message must be implemented by file format IOProcs to be able to properly 
  7794. close the file.  Note that the mmioClose function will call the mmioFlush 
  7795. function to empty the file I/O buffers (so this does not need to be performed 
  7796. by the IOProc message handler). 
  7797.  
  7798. A file format IOProc will call mmioClose with its internal HMMIO handle to 
  7799. close the file, unless it chooses to recognize the MMIO_FHOPEN flag available 
  7800. on mmioClose.  This flag allows the close processing to occur, but still allow 
  7801. the file handle to remain open.  If the file is an element of a compound file, 
  7802. it will need to possibly update the compound file header to reflect any changes 
  7803. that have been made to the file. 
  7804.  
  7805. The following example shows an example of how the M-Motion IOProc supports the 
  7806. MMIOM_CLOSE message. 
  7807.  
  7808. case MMIOM_CLOSE:
  7809.     {
  7810.     /************************************************************
  7811.      * Declare local variables.
  7812.      ************************************************************/
  7813.     PMMFILESTATUS   pVidInfo;         /* MMotionIOProc instance data */
  7814.  
  7815.     ULONG           ulHeight;         /* Image height                */
  7816.     USHORT          usBitCount;
  7817.     /* Image width, including overflow in 1bpp & 4bpp                */
  7818.     ULONG           ulImgPelWidth;
  7819.     PBYTE           lpYUVLine;        /* One line of packed YUV      */
  7820.     LONG            lYUVBytesPerLine;
  7821.  
  7822.     ULONG           ulMaxPelWidth;    /* # pels on 4-pel boundaries  */
  7823.     /* # pels on a YUV line in the output file                       */
  7824.     ULONG           ulYUVPelWidth;
  7825.     ULONG           ulRGBMaxBytesPerLine; /* #bytes on 4-pel bounds  */
  7826.     PBYTE           lpRGBLine;        /* One line of 24bit RGB       */
  7827.  
  7828.     PBYTE           lpImgBufPtr;      /* Current loc in RGB image buf*/
  7829.     LONG            lRGBBytesPerLine; /* #bytes on a line in image   */
  7830.     ULONG           ulRowCount;       /* loop counter                */
  7831.     LONG            lBytesWritten;    /* #bytes output on a write    */
  7832.     LONG            lRetCode;
  7833.     USHORT          rc;
  7834.  
  7835.     /***********************************************************
  7836.      * Check for valid MMIOINFO block.
  7837.      ***********************************************************/
  7838.     if (!pmmioinfo)
  7839.         return (MMIO_ERROR);
  7840.  
  7841.     /***********************************************************
  7842.      * Set up our working file status variable.
  7843.      ***********************************************************/
  7844.     pVidInfo = (PMMFILESTATUS)pmmioinfo->pExtraInfoStruct;
  7845.  
  7846.     /***********************************************************
  7847.      * Assume success for the moment....
  7848.      ***********************************************************/
  7849.     lRetCode = MMIO_SUCCESS;
  7850.  
  7851.     /************************************************************
  7852.      * see if we are in Write mode and have a buffer to write out.
  7853.      *    We have no image buffer in UNTRANSLATED mode.
  7854.      ************************************************************/
  7855.     if ((pmmioinfo->ulFlags & MMIO_WRITE) && (pVidInfo->lpImgBuf))
  7856.         {
  7857.         /*******************************************************
  7858.          * The buffer should be in palettized or 24-bit RGB
  7859.          * We must convert it to YUV to be written to the file.
  7860.          *******************************************************
  7861.          * The buffer should be complete.  If not, then we
  7862.          * should still close, but can flag an error to the
  7863.          * user that the data may be corrupted.  The only way
  7864.          * we can estimate if this is true is to check the final
  7865.          * position.  If not at the end...
  7866.          *******************************************************/
  7867.         if (pVidInfo->lImgBytePos !=
  7868.                                   (LONG)pVidInfo->ulImgTotalBytes)
  7869.             {
  7870.             lRetCode = MMIO_WARNING;
  7871.             }
  7872.         /*******************************************************
  7873.          * Set up width and height of image in the buffer.
  7874.          *******************************************************/
  7875.         ulHeight = pVidInfo->mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
  7876.         usBitCount =
  7877.             pVidInfo->mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
  7878.  
  7879.         /*******************************************************
  7880.          * Get the line width in YUV pels and packed bytes.
  7881.          *******************************************************/
  7882.         ulYUVPelWidth = pVidInfo->mmotHeader.mmXlen;
  7883.         lYUVBytesPerLine = (LONG)(ulYUVPelWidth * 3) >> 1;
  7884.  
  7885.         /*******************************************************
  7886.          * This changes from OS/2 PM bottom-up bitmap form
  7887.          *    to M-Motion's top-down form.  Flip all pad, boundary
  7888.          *    bytes as well
  7889.          *******************************************************/
  7890.         ImgBufferFlip ((PBYTE)pVidInfo->lpImgBuf,
  7891.                                 pVidInfo->ulImgPaddedBytesPerLine,
  7892.                                 ulHeight);
  7893.  
  7894.         /*******************************************************
  7895.          * Determine number of POSSIBLE pels on a line, tho some
  7896.          *   may be overflow in 1bpp and 4bpp modes.
  7897.          *
  7898.          * From that, we can calc the number of RGB pels we will
  7899.          *   create to represent this line.
  7900.          *******************************************************/
  7901.         ulImgPelWidth = (pVidInfo->ulImgPelBytesPerLine << 3) /
  7902.                                      usBitCount;
  7903.         lRGBBytesPerLine = ulImgPelWidth * 3;
  7904.  
  7905.         /*******************************************************
  7906.          * Ensure the width is on a 4-pel boundary, necessary for
  7907.          *     M-Motion.  We will buffer with black
  7908.          *    *** THIS IS ONLY NECESSARY FOR M-MOTION IMAGES
  7909.          *******************************************************/
  7910.         if (ulImgPelWidth % 4)
  7911.             ulMaxPelWidth = (((ulImgPelWidth >> 2) + 1) << 2);
  7912.         else
  7913.             ulMaxPelWidth = ulImgPelWidth;
  7914.  
  7915.         /* #RGB bytes/line = #pels * 3 bytes/pel */
  7916.         ulRGBMaxBytesPerLine = ulMaxPelWidth * 3;
  7917.  
  7918.  
  7919.         /*******************************************************
  7920.          * Create a buffer for one line of RGB data, accounting for
  7921.          *   the 4-pel boundary required.  Extra bytes won't be used.
  7922.          *******************************************************/
  7923.         if (DosAllocMem ((PPVOID) &lpRGBLine,
  7924.                          ulRGBMaxBytesPerLine,
  7925.                          fALLOC))
  7926.             return (MMIO_ERROR);
  7927.  
  7928.         /*******************************************************
  7929.          * Create a buffer for one line of YUV data.
  7930.          *******************************************************/
  7931.         if (DosAllocMem ((PPVOID) &lpYUVLine,
  7932.                          lYUVBytesPerLine,
  7933.                          fALLOC))
  7934.             return (MMIO_ERROR);
  7935.  
  7936.         /*******************************************************
  7937.          * Zero out RGB buffer to cover for any extra black pels
  7938.          * needed at the end.
  7939.          *******************************************************/
  7940.         memset (lpRGBLine, 0, ulRGBMaxBytesPerLine);
  7941.  
  7942.         /*******************************************************
  7943.          * Initialize start position of RGB buffer.
  7944.          *******************************************************/
  7945.         lpImgBufPtr = pVidInfo->lpImgBuf;
  7946.  
  7947.         /*******************************************************
  7948.          * Process Image Buffer - Save to file
  7949.          * Place "your" processing code here, if full image
  7950.          *      buffering is performed.
  7951.          * For M-Motion:
  7952.          *    Loop
  7953.          *       1.Convert and copy a line of 1bpp, 4bpp, 8 bpp or
  7954.          *            24bpp data into a temporary 24 bpp RGB line.
  7955.          *            This line may contain overflow garbage
  7956.          *            pels from 1bpp and 4bpp modes (where
  7957.          *            width does not fall on even byte boundaries.)
  7958.          *       2.Convert the temporary RGB line contents into a
  7959.          *           YUV line.  ONLY that data necessary converted.
  7960.          *           Overflow from bitmap data ignored.
  7961.          *       3.Write the YUV line to the file
  7962.          *******************************************************/
  7963.         for (ulRowCount = 0;
  7964.              ulRowCount < ulHeight;
  7965.              ulRowCount++)
  7966.             {
  7967.             /***************************************************
  7968.              * Convert 1 line of Image data into RGB data
  7969.              ***************************************************/
  7970.            switch (usBitCount)
  7971.                {
  7972.                case 1:
  7973.                    {
  7974.                    /* Convert 1bpp padded image buffer into 24-bit */
  7975.                    /*    RGB line buffer, w/pads                   */
  7976.                    Convert1BitTo24Bit (
  7977.                            (PBYTE)lpImgBufPtr,
  7978.                            (PRGB) lpRGBLine,
  7979.                            (PRGB) &(pVidInfo->rgbPalette),
  7980.                            pVidInfo->ulImgPelBytesPerLine);
  7981.                    break;
  7982.                    }
  7983.  
  7984.                case 4:
  7985.                    {
  7986.                    /* Convert data from app buffer into 24-bit and */
  7987.                    /*    copy into image buffer                    */
  7988.                    Convert4BitTo24Bit (
  7989.                            (PBYTE)lpImgBufPtr,
  7990.                            (PRGB) lpRGBLine,
  7991.                            (PRGB) &(pVidInfo->rgbPalette),
  7992.                            pVidInfo->ulImgPelBytesPerLine);
  7993.                    break;
  7994.                    }
  7995.  
  7996.                case 8:
  7997.                    {
  7998.                    /* Convert data from app buffer into 24-bit and */
  7999.                    /*    copy into image buffer                    */
  8000.                    Convert8BitTo24Bit (
  8001.                            (PBYTE)lpImgBufPtr,
  8002.                            (PRGB) lpRGBLine,
  8003.                            (PRGB) &(pVidInfo->rgbPalette),
  8004.                            pVidInfo->ulImgPelBytesPerLine);
  8005.                    break;
  8006.                    }
  8007.  
  8008.                case 24:
  8009.                    {
  8010.                    /* Copy raw RGB data from the image buffer into */
  8011.                    /*    the temporary                             */
  8012.                    /*   RGB line.  Only copy those pels necessary. */
  8013.                    /*    No conversion required                    */
  8014.                    memcpy ((PVOID) lpRGBLine,
  8015.                                   (PVOID) lpImgBufPtr,
  8016.                                   ulYUVPelWidth * 3);
  8017.                    break;
  8018.                    }
  8019.  
  8020.                }   /* end of Switch for Bit Conversion block */
  8021.  
  8022.             /***************************************************
  8023.              * Convert one line at a time from RGB to YUV.
  8024.              ***************************************************/
  8025.             ConvertOneLineRGBtoYUV (lpRGBLine,
  8026.                                     lpYUVLine,
  8027.                                     ulYUVPelWidth);
  8028.  
  8029.             /***************************************************
  8030.              * Write out line of YUV data to the file.
  8031.              ***************************************************/
  8032.             lBytesWritten  = mmioWrite (pVidInfo->hmmioSS,
  8033.                                         (PVOID) lpYUVLine,
  8034.                                         lYUVBytesPerLine);
  8035.  
  8036.             /* Check if error or EOF  */
  8037.             if (lBytesWritten != lYUVBytesPerLine)
  8038.                {
  8039.                lRetCode = lBytesWritten;
  8040.                break;
  8041.                }
  8042.  
  8043.             /***************************************************
  8044.              * Make sure bitmap image buffer pointer is correct
  8045.              *    for next line to be converted.  Move forward ALL
  8046.              *    the bytes in the bitmap line, including overflow
  8047.              *    and pad bytes.
  8048.              ***************************************************/
  8049.             lpImgBufPtr += pVidInfo->ulImgPaddedBytesPerLine;
  8050.             }
  8051.  
  8052.         /*******************************************************
  8053.          * Free temp buffers.
  8054.          *******************************************************/
  8055.         if (lpRGBLine)
  8056.            {
  8057.            DosFreeMem ((PVOID) lpRGBLine);
  8058.            }
  8059.  
  8060.         if (lpYUVLine)
  8061.            {
  8062.            DosFreeMem ((PVOID) lpYUVLine);
  8063.            }
  8064.         }  /* end IF WRITE & IMAGE BUFFER block */
  8065.  
  8066.     /***********************************************************
  8067.      * Free the RGB buffer, if it exists, that was created
  8068.      * for the translated READ operations.
  8069.      ***********************************************************/
  8070.     if (pVidInfo->lpRGBBuf)
  8071.        {
  8072.        DosFreeMem ((PVOID) pVidInfo->lpRGBBuf);
  8073.        }
  8074.  
  8075.     /***********************************************************
  8076.      * Free the IMG buffer, if it exists, that was created
  8077.      * for the translated  WRITE operations.
  8078.      ***********************************************************/
  8079.     if (pVidInfo->lpImgBuf)
  8080.        {
  8081.        DosFreeMem ((PVOID) pVidInfo->lpImgBuf);
  8082.        }
  8083.  
  8084.     /***********************************************************
  8085.      * Close the file with mmioClose.
  8086.      ***********************************************************/
  8087.     rc = mmioClose (pVidInfo->hmmioSS, 0);
  8088.  
  8089.     DosFreeMem ((PVOID) pVidInfo);
  8090.  
  8091.     if (rc != MMIO_SUCCESS)
  8092.        return (rc);
  8093.  
  8094.     return (lRetCode);
  8095.     }  /* end case of MMIOM_CLOSE */
  8096.  
  8097.  
  8098. ΓòÉΓòÉΓòÉ 6.4.5. MMIOM_IDENTIFYFILE ΓòÉΓòÉΓòÉ
  8099.  
  8100. The IOProc determines how to handle this message.  All IOProcs must support 
  8101. this message because mmioOpen sends MMIOM_IDENTIFYFILE when it attempts to 
  8102. automatically identify a file. 
  8103.  
  8104. For file format IOProcs, the header needs to be read and checked to see if it 
  8105. matches with what the IOProc expects.  The lParm2 field contains the handle 
  8106. used for the mmioRead function.  In the following example, the header is a 
  8107. M-Motion file that is compared with the expected string defined in the IOProc. 
  8108. If it compares correctly, the message returns TRUE; otherwise FALSE is 
  8109. returned. 
  8110.  
  8111. case MMIOM_IDENTIFYFILE:
  8112.     {
  8113.     /************************************************************
  8114.      * Declare local variables.
  8115.      ************************************************************/
  8116.     MMOTIONHEADER   mmotHeader;   /* M-Motion structure variable */
  8117.     HMMIO           hmmioTemp;    /* MMIO File Handle            */
  8118.     ULONG           ulWidth;
  8119.     ULONG           ulHeight;
  8120.     ULONG           ulRequiredFileLength;
  8121.     ULONG           ulActualFileLength;
  8122.     BOOL             fValidMMotionFile = FALSE;
  8123.  
  8124.     ULONG           ulTempFlags = MMIO_READ | MMIO_DENYWRITE |
  8125. MMIO_NOIDENTIFY;
  8126.                                    /* Flags used for temp open  */
  8127.                                    /* and close                 */
  8128.  
  8129.     /************************************************************
  8130.      * We need either a file name (lParam1) or file handle (lParam2)
  8131.      ************************************************************/
  8132.     if (!lParam1 && !lParam2)
  8133.         return (MMIO_ERROR);
  8134.  
  8135.     /* Copy the file handle, assuming one was provided... */
  8136.     hmmioTemp = (HMMIO)lParam2;
  8137.  
  8138.     /************************************************************
  8139.      * If no handle, then open the file using the string name
  8140.      ************************************************************/
  8141.     if (!hmmioTemp)
  8142.        {
  8143.        if (!(hmmioTemp = mmioOpen ((PSZ) lParam1,
  8144.                                   NULL,
  8145.                                   ulTempFlags)))
  8146.            {
  8147.            return (MMIO_ERROR);
  8148.            }
  8149.        }
  8150.  
  8151.     /************************************************************
  8152.      * Read in enough bytes to check out file.
  8153.      ************************************************************/
  8154.     if (sizeof (MMOTIONHEADER) !=
  8155.                     mmioRead (hmmioTemp,
  8156.                               (PVOID) &mmotHeader,
  8157.                               (ULONG) sizeof (MMOTIONHEADER)))
  8158.         {
  8159.         /********************************************************
  8160.          * Fail so close file and then return.
  8161.          ********************************************************/
  8162.         if (!lParam2) /* Don't close handle if provided to us  */
  8163.            mmioClose (hmmioTemp, 0);
  8164.         return (MMIO_ERROR);
  8165.         }
  8166.  
  8167.     /************************************************************
  8168.      * Close file before returning.
  8169.      ************************************************************/
  8170.     if (!lParam2) /* Don't close handle if provided to us  */
  8171.        mmioClose (hmmioTemp, 0);
  8172.  
  8173.     /************************************************************
  8174.      * Check validity of file and return result.
  8175.      ************************************************************/
  8176.     if (memcmp (mmotHeader.mmID, "YUV12C", 6) == 0)
  8177.         {
  8178.         ulWidth = mmotHeader.mmXlen;
  8179.         ulHeight = mmotHeader.mmYlen;
  8180.  
  8181.         /* Calculate what the length of the file SHOULD be based on the */
  8182.         /*   header contents                                            */
  8183.         ulRequiredFileLength = (((ulWidth >> 2) * 6) * ulHeight) +
  8184.                                                sizeof (MMOTIONHEADER);
  8185.  
  8186.         /* Query what the ACTUAL length of the file is                  */
  8187.         ulActualFileLength = (ULONG)mmioSeek (hmmioTemp, 0, SEEK_END);
  8188.  
  8189.         /* If these don't match, then it isn't a VALID M-Motion file    */
  8190.         /*     - regardless of what the header says.                    */
  8191.         if (ulRequiredFileLength == ulActualFileLength)
  8192.            fValidMMotionFile = TRUE;
  8193.         else
  8194.            fValidMMotionFile = FALSE;
  8195.         }  /* end header check block */
  8196.  
  8197.     /************************************************************
  8198.      * Close file before returning.
  8199.      ************************************************************/
  8200.     if (!lParam2)  /* Don't close handle if provided to us      */
  8201.        mmioClose (hmmioTemp, 0);
  8202.  
  8203.     if (fValidMMotionFile)
  8204.        return (MMIO_SUCCESS);
  8205.     else
  8206.        return (MMIO_ERROR);
  8207.     } /* end case of MMIOM_IDENTIFYFILE */
  8208.  
  8209.  
  8210. ΓòÉΓòÉΓòÉ 6.4.6. MMIOM_GETFORMATINFO ΓòÉΓòÉΓòÉ
  8211.  
  8212. This message requests information about the format of the IOProc.  MMIO 
  8213. provides a list of MMFORMATINFO structures containing descriptive information 
  8214. about the formats supported by currently installed IOProcs; for example, the 
  8215. format name, the FOURCC identifier, and related information.  If this message 
  8216. is not defined in the IOProc or the IOProc does not handle the request 
  8217. successfully, mmioGetFormatInfo creates a blank MMFORMATINFO structure and 
  8218. attaches it to the internal list.  It is recommended to hard-code the actual 
  8219. format information in the IOProc message handler code for the ulStructLen, 
  8220. fccIOProc, ulMediaType, and ulFlags fields.  In addition, store other 
  8221. information (ulCodePage, ulLanguage, lNameLength, and aulDefaultFormatExt if 
  8222. any) in a resource file for NLS considerations. 
  8223.  
  8224. The following example shows an example of how the M-Motion IOProc supports the 
  8225. MMIOM_GETFORMATINFO message. 
  8226.  
  8227. case MMIOM_GETFORMATINFO:
  8228.     {
  8229.     /***********************************************************
  8230.      * Declare local variables.
  8231.      ***********************************************************/
  8232.     PMMFORMATINFO       pmmformatinfo;
  8233.  
  8234.     /************************************************************
  8235.      * Set pointer to MMFORMATINFO structure.
  8236.      ************************************************************/
  8237.     pmmformatinfo = (PMMFORMATINFO) lParam1;
  8238.  
  8239.     /************************************************************
  8240.      * Fill in the values for the MMFORMATINFO structure.
  8241.      ************************************************************/
  8242.     pmmformatinfo->ulStructLen  = sizeof (MMFORMATINFO);
  8243.     pmmformatinfo->fccIOProc    = FOURCC_MMOT;
  8244.     pmmformatinfo->ulIOProcType = MMIO_IOPROC_FILEFORMAT;
  8245.     pmmformatinfo->ulMediaType  = MMIO_MEDIATYPE_IMAGE;
  8246.  
  8247.     pmmformatinfo->ulFlags      = MMIO_CANREADTRANSLATED        |
  8248.                                   MMIO_CANREADUNTRANSLATED      |
  8249.                                   MMIO_CANWRITETRANSLATED       |
  8250.                                   MMIO_CANWRITEUNTRANSLATED     |
  8251.                                   MMIO_CANREADWRITEUNTRANSLATED |
  8252.                                   MMIO_CANSEEKTRANSLATED        |
  8253.                                   MMIO_CANSEEKUNTRANSLATED;
  8254.  
  8255.     strcpy ((PSZ) pmmformatinfo->szDefaultFormatExt, pszMotionExt);
  8256.     if (GetNLSData( &pmmformatinfo->ulCodePage,
  8257.                     &pmmformatinfo->ulLanguage ))
  8258.        {
  8259.        return( -1L );
  8260.        }
  8261.  
  8262.     if (GetFormatStringLength( FOURCC_MMOT,
  8263.                                &(pmmformatinfo->lNameLength) ))
  8264.        {
  8265.        return( -1L );
  8266.        }
  8267.  
  8268.  
  8269.     /************************************************************
  8270.      * Return success back to the application.
  8271.      ************************************************************/
  8272.     return (MMIO_SUCCESS);
  8273.     } /* end case of MMIOM_GETFORMATINFO */
  8274.  
  8275.  
  8276. ΓòÉΓòÉΓòÉ 6.4.7. MMIOM_GETFORMATNAME ΓòÉΓòÉΓòÉ
  8277.  
  8278. This message requests the descriptive format name supported by the IOProc. It 
  8279. is recommended to contain the strings in resource files for NLS considerations. 
  8280.  
  8281. The following example shows an example of how the M-Motion IOProc supports the 
  8282. MMIOM_GETFORMATNAME message. 
  8283.  
  8284. case MMIOM_GETFORMATNAME:
  8285.     {
  8286.     LONG lBytesCopied;
  8287.  
  8288.     /************************************************************
  8289.      * Copy the M-Motion format string into buffer supplied by
  8290.      * lParam1.  Only put in the amount of my string up to the
  8291.      * allocated amount which is in lParam2.  Leave enough room
  8292.      * for the NULL termination.
  8293.      ************************************************************/
  8294.     lBytesCopied = GetFormatString( FOURCC_MMOT,
  8295.                                     (char *)lParam1,
  8296.                                     lParam2 );
  8297.  
  8298.     return (lBytesCopied);
  8299.     } /* end case of MMIOM_GETFORMATNAME */
  8300.  
  8301.  
  8302. ΓòÉΓòÉΓòÉ 6.4.8. MMIOM_QUERYHEADERLENGTH ΓòÉΓòÉΓòÉ
  8303.  
  8304. This message requests the IOProc to return the size of the header for the 
  8305. current file or file element opened by mmioOpen.  The mmioQueryHeaderLength 
  8306. function issues a MMIOM_QUERYHEADERLENGTH message to determine the buffer size 
  8307. that is needed by mmioGetHeader to obtain header data.  This is necessary 
  8308. because headers vary in length. 
  8309.  
  8310. To implement this message, save the current file position by using mmioSeek, 
  8311. then issue a call to mmioRead to read the size of the header into a buffer. 
  8312. The read can be done without a seek because mmioQueryHeaderLength saves the 
  8313. current file position when the call is issued.  It seeks the file to its 
  8314. beginning, then seeks it back to the saved file position after the IOProc is 
  8315. called.  The use of mmioRead is important here if the file is using buffered 
  8316. I/O so that all of MMIO's internal data fields are properly maintained 
  8317. throughout the message processing.  It will allow subsequent file reads after 
  8318. this message is called to occur at the proper place in the file. 
  8319.  
  8320. The following example shows an example of how the M-Motion IOProc supports the 
  8321. MMIOM_QUERYHEADERLENGTH message. 
  8322.  
  8323. case MMIOM_QUERYHEADERLENGTH:
  8324.     {
  8325.     /************************************************************
  8326.      * If there is no MMIOINFO block then return an error.
  8327.      ************************************************************/
  8328.     if (!pmmioinfo)
  8329.         return (0);
  8330.  
  8331.     /************************************************************
  8332.      * If header is in translated mode then return the media
  8333.      * type specific structure size.
  8334.      ************************************************************/
  8335.     if (pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER)
  8336.         return (sizeof (MMIMAGEHEADER));
  8337.  
  8338.     else
  8339.         /********************************************************
  8340.          * Header is not in translated mode so return the size
  8341.          * of the M-Motion header.
  8342.          ********************************************************/
  8343.         return (sizeof (MMOTIONHEADER));
  8344.  
  8345.     break;
  8346.     } /* end case of MMIOM_QUERYHEADERLENGTH */
  8347.  
  8348.  
  8349. ΓòÉΓòÉΓòÉ 6.4.9. MMIOM_GETHEADER ΓòÉΓòÉΓòÉ
  8350.  
  8351. This message requests the IOProc to return header-specific information about 
  8352. the current file or file element opened for reading by mmioOpen; for example, 
  8353. media type, media structure, and the size of the media structure.  When you 
  8354. call mmioRead to read in the file header, use the size of the header, which is 
  8355. passed in by the lParam2 parameter. 
  8356.  
  8357. When the translate header is TRUE, the IOProc is expected to return the 
  8358. standard presentation header structure for that media type.  The IOProc must 
  8359. transpose the file's native header data into that structure. 
  8360.  
  8361. The following example shows an example of how the M-Motion IOProc supports the 
  8362. MMIOM_GETHEADER message. 
  8363.  
  8364. case MMIOM_GETHEADER:
  8365.     {
  8366.     /************************************************************
  8367.      * Declare local variables.
  8368.      ************************************************************/
  8369.     PMMFILESTATUS       pVidInfo;
  8370.  
  8371.     /************************************************************
  8372.      * Check for valid MMIOINFO block.
  8373.      ************************************************************/
  8374.     if (!pmmioinfo)
  8375.         return (0);
  8376.  
  8377.     /************************************************************
  8378.      * Set up our working file status variable.
  8379.      ************************************************************/
  8380.     pVidInfo = (PMMFILESTATUS)pmmioinfo->pExtraInfoStruct;
  8381.  
  8382.     /**************************************************
  8383.      * Getheader only valid in READ or READ/WRITE mode.
  8384.      * There is no header to get in WRITE mode.  We
  8385.      * must also have a valid file handle to read from
  8386.      **************************************************/
  8387.     if ((pmmioinfo->ulFlags & MMIO_WRITE) ||
  8388.         (!(pVidInfo->hmmioSS)))
  8389.        return (0);
  8390.  
  8391.     /************************************************************
  8392.      * Check for Translation mode.
  8393.      ************************************************************/
  8394.     if (!(pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER))
  8395.         {
  8396.         /********************************************************
  8397.          * Translation is off.
  8398.          ********************************************************/
  8399.         if (lParam2 < sizeof (MMOTIONHEADER))
  8400.             {
  8401.             pmmioinfo->ulErrorRet = MMIOERR_INVALID_BUFFER_LENGTH;
  8402.             return (0);
  8403.             }
  8404.  
  8405.         if (!lParam1)
  8406.             {
  8407.             pmmioinfo->ulErrorRet = MMIOERR_INVALID_STRUCTURE;
  8408.             return (0);
  8409.             }
  8410.  
  8411.         /********************************************************
  8412.          * Read in first 16 bytes to fill up M-Motion header.
  8413.          ********************************************************/
  8414.         memcpy ((PVOID) lParam1,
  8415.                 (PVOID)&pVidInfo->mmotHeader,
  8416.                 sizeof (MMOTIONHEADER));
  8417.  
  8418.         /* Indicate that the header has been set, which    */
  8419.         /* is meaningless in read mode, but allows the     */
  8420.         /* application to do writes in read/write mode     */
  8421.         pVidInfo->bSetHeader = TRUE;
  8422.  
  8423.         return (sizeof (MMOTIONHEADER));
  8424.         }   /* end IF NOT TRANSLATED block */
  8425.  
  8426.     /******************
  8427.      * TRANSLATION IS ON
  8428.      ******************/
  8429.     if (lParam2 < sizeof (MMIMAGEHEADER))
  8430.         {
  8431.         pmmioinfo->ulErrorRet = MMIOERR_INVALID_BUFFER_LENGTH;
  8432.         return (0);
  8433.         }
  8434.  
  8435.     if (!lParam1)
  8436.         {
  8437.         pmmioinfo->ulErrorRet = MMIOERR_INVALID_STRUCTURE;
  8438.         return (0);
  8439.         }
  8440.  
  8441.     memcpy ((PVOID)lParam1,
  8442.             (PVOID)&pVidInfo->mmImgHdr,
  8443.             sizeof (MMIMAGEHEADER));
  8444.  
  8445.     return (sizeof (MMIMAGEHEADER));
  8446.     } /* end case of MMIOM_GETHEADER */
  8447.  
  8448.  
  8449. ΓòÉΓòÉΓòÉ 6.4.10. MMIOM_SETHEADER ΓòÉΓòÉΓòÉ
  8450.  
  8451. This message requests the IOProc to set header-specific information in a file 
  8452. opened for writing by mmioOpen.  This would include data such as resolution and 
  8453. colors for images, and duration and sample rate for audio. 
  8454.  
  8455. When the translate header is TRUE, the IOProc should expect to be passed the 
  8456. standard presentation header for that media type.  The IOProc is expected to 
  8457. transpose the data from that structure into its native header structure before 
  8458. writing the header to the file. 
  8459.  
  8460. The following example shows an example of how the M-Motion IOProc supports the 
  8461. MMIOM_SETHEADER message. 
  8462.  
  8463. case MMIOM_SETHEADER:
  8464.      {
  8465.      /************************************************************
  8466.       * Declare local variables.
  8467.       ************************************************************/
  8468.      PMMIMAGEHEADER          pMMImgHdr;
  8469.      PMMFILESTATUS           pVidInfo;
  8470.      USHORT                  usNumColors;
  8471.      ULONG                   ulImgBitsPerLine;
  8472.      ULONG                   ulImgBytesPerLine;
  8473.      ULONG                   ulBytesWritten;
  8474.      ULONG                   ulWidth;
  8475.      ULONG                   ul4PelWidth;
  8476.      ULONG                   ulHeight;
  8477.      USHORT                  usPlanes;
  8478.      USHORT                  usBitCount;
  8479.      USHORT                  usPadBytes;
  8480.  
  8481.      /************************************************************
  8482.       * Check for valid MMIOINFO block.
  8483.       ************************************************************/
  8484.      if (!pmmioinfo)
  8485.          return (MMIO_ERROR);
  8486.  
  8487.      /************************************************************
  8488.       * Set up our working variable MMFILESTATUS.
  8489.       ************************************************************/
  8490.      pVidInfo = (PMMFILESTATUS) pmmioinfo->pExtraInfoStruct;
  8491.  
  8492.      /************************************************************
  8493.       * Only allow this function if we are in WRITE mode
  8494.       * And only if we have not already set the header
  8495.       ************************************************************/
  8496.      if ((!(pmmioinfo->ulFlags & MMIO_WRITE)) ||
  8497.          (!(pVidInfo->hmmioSS)) ||
  8498.          (pVidInfo->bSetHeader))
  8499.          return (0);
  8500.  
  8501.      /********************************************************
  8502.       * Make sure lParam1 is a valid pointer
  8503.       ********************************************************/
  8504.      if (!lParam1)
  8505.          {
  8506.          pmmioinfo->ulErrorRet = MMIOERR_INVALID_STRUCTURE;
  8507.          return (0);
  8508.          }
  8509.  
  8510.      /************************************************************
  8511.       * Header is not in translated mode.
  8512.       ************************************************************/
  8513.      if (!(pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER))
  8514.          {
  8515.          /********************************************************
  8516.           * Make sure lParam2 is correct size
  8517.           ********************************************************/
  8518.          if (lParam2 != MMOTION_HEADER_SIZE)
  8519.              {
  8520.              pmmioinfo->ulErrorRet = MMIOERR_INVALID_BUFFER_LENGTH;
  8521.              return (0);
  8522.              }
  8523.  
  8524.          /********************************************************
  8525.           * Ensure that the header at least begins with "YUV12C"
  8526.           ********************************************************/
  8527.          if (strncmp ((char *)lParam1, "YUV12C", 6))
  8528.             {
  8529.             pmmioinfo->ulErrorRet = MMIOERR_INVALID_STRUCTURE;
  8530.             return (0);
  8531.             }
  8532.  
  8533.          /********************************************************
  8534.           * Take 16 byte buffer (lParam1), write to file and .
  8535.           *    copy to internal structure.
  8536.           ********************************************************/
  8537.          memcpy ((PVOID)&pVidInfo->mmotHeader,
  8538.                  (PVOID)lParam1, (ULONG) MMOTION_HEADER_SIZE);
  8539.          ulBytesWritten = mmioWrite (pVidInfo->hmmioSS,
  8540.                                      (PVOID) lParam1,
  8541.                                      (ULONG) MMOTION_HEADER_SIZE);
  8542.  
  8543.          /*********************************
  8544.           * Check for an error on the write..
  8545.           *********************************/
  8546.          if (ulBytesWritten != MMOTION_HEADER_SIZE)
  8547.              return (0);   /* 0 indicates error */
  8548.  
  8549.          /*********************************
  8550.           * Success...
  8551.           *********************************/
  8552.          pVidInfo->bSetHeader = TRUE;
  8553.          return (sizeof (MMOTIONHEADER));
  8554.          }  /* end IF NOT TRANSLATED block */
  8555.  
  8556.      /************************************************************
  8557.       * Header is translated.
  8558.       ************************************************************/
  8559.  
  8560.      /************************************************************
  8561.       * Create local pointer media specific structure.
  8562.       ************************************************************/
  8563.      pMMImgHdr = (PMMIMAGEHEADER) lParam1;
  8564.  
  8565.  
  8566.      /************************************************************
  8567.       * Check for validity of header contents supplied
  8568.       ************************************************************
  8569.       *  --  Length must be that of the standard header
  8570.       *  --  NO Compression
  8571.       *      1 plane
  8572.       *      24, 8, 4 or 1 bpp
  8573.       ************************************************************/
  8574.      usBitCount = pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.cBitCount;
  8575.      if ((pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.ulCompression !=
  8576.           BCA_UNCOMP) ||
  8577.          (pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.cPlanes != 1) ||
  8578.          (! ((usBitCount == 24) || (usBitCount == 8) ||
  8579.              (usBitCount == 4) || (usBitCount == 1)))
  8580.         )
  8581.          {
  8582.          pmmioinfo->ulErrorRet = MMIOERR_INVALID_STRUCTURE;
  8583.          return (0);
  8584.          }
  8585.  
  8586.      if (lParam2 != sizeof (MMIMAGEHEADER))
  8587.         {
  8588.         pmmioinfo->ulErrorRet = MMIOERR_INVALID_BUFFER_LENGTH;
  8589.         return (0);
  8590.         }
  8591.  
  8592.      /************************************************************
  8593.       * Complete MMOTIONHEADER.
  8594.       ************************************************************/
  8595.      memcpy ((PVOID)&pVidInfo->mmotHeader.mmID, "YUV12C", 6);
  8596.      pVidInfo->mmotHeader.mmXorg  = 0;
  8597.      pVidInfo->mmotHeader.mmYorg  = 0;
  8598.  
  8599.      /********************************************************
  8600.       * Ensure we will save stuff on 4-pel boundaries when
  8601.       * we actually convert to YUV and pack the bits.
  8602.       * We don't change what the user is actually going to
  8603.       * give us.  The user thinks he is on 1-pel boundaries,
  8604.       * and that is how we buffer the RGB data.
  8605.       ********************************************************/
  8606.      ulWidth  = pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.cx;
  8607.      ulHeight = pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.cy;
  8608.      if (ulWidth % 4)
  8609.          ul4PelWidth = (((ulWidth >> 2) + 1) << 2);
  8610.      else
  8611.          ul4PelWidth = ulWidth;
  8612.      pVidInfo->mmotHeader.mmXlen  = (USHORT) ul4PelWidth;
  8613.      pVidInfo->mmotHeader.mmYlen  = (USHORT) ulHeight;
  8614.  
  8615.      /************************************************************
  8616.       * Write the M-Motion Header.
  8617.       ************************************************************/
  8618.      ulBytesWritten = mmioWrite (pVidInfo->hmmioSS,
  8619.                                  (PVOID) &pVidInfo->mmotHeader,
  8620.                                  (ULONG) MMOTION_HEADER_SIZE);
  8621.  
  8622.      /***************************************
  8623.       * Check for an error on the write...
  8624.       ***************************************/
  8625.      if (ulBytesWritten != MMOTION_HEADER_SIZE)
  8626.          return (0);
  8627.  
  8628.      /************************************************************
  8629.       * Flag that MMIOM_SETHEADER has been done.  It can only
  8630.       * be done ONCE for a file.  All future attempts will
  8631.       * be flagged as errors.
  8632.       ************************************************************/
  8633.      pVidInfo->bSetHeader = TRUE;
  8634.  
  8635.      /************************************************************
  8636.       * Create copy of MMIMAGEHEADER for future use.
  8637.       ************************************************************/
  8638.      pVidInfo->mmImgHdr = *pMMImgHdr;
  8639.  
  8640.      /************************************************************
  8641.       * Check bitcount, set palette if less than 24.
  8642.       ************************************************************/
  8643.      if (usBitCount < 24)
  8644.         {
  8645.         /*********************************************************
  8646.          * Find out how many colors are in the palette.
  8647.          *********************************************************/
  8648.         usNumColors = (USHORT)(1 << usBitCount);
  8649.  
  8650.         /*********************************************************
  8651.          * Take the RGB2 palette and convert it to an RGB palette
  8652.          *    Place the converted palette in MMFILESTATUS struct
  8653.          *********************************************************/
  8654.         RGB2_To_RGB (pVidInfo->mmImgHdr.bmiColors,
  8655.                      (PRGB) &(pVidInfo->rgbPalette),
  8656.                      usNumColors);
  8657.         }
  8658.  
  8659.      /*********************************************************
  8660.       * We must allocate the buffer.  The app will load the
  8661.       * buffer on subsequent write calls.
  8662.       *********************************************************/
  8663.      usPlanes = pVidInfo->mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cPlanes;
  8664.  
  8665.      /********************************************************
  8666.       * Determine total Image size
  8667.       ********************************************************
  8668.       * Find bits-per-line BEFORE padding and 1bpp or 4bpp pel overflow
  8669.       ********************************************************/
  8670.      ulImgBitsPerLine = ulWidth * usPlanes * usBitCount;
  8671.      ulImgBytesPerLine = ulImgBitsPerLine >> 3;
  8672.  
  8673.      /********************************************************
  8674.       * Account for extra pels not on an even byte boundary
  8675.       *   for 1bpp and 4bpp
  8676.       ********************************************************/
  8677.      if (ulImgBitsPerLine % 8)
  8678.         ulImgBytesPerLine ++;
  8679.  
  8680.      pVidInfo->ulImgPelBytesPerLine = ulImgBytesPerLine;
  8681.  
  8682.      /********************************************************
  8683.       * Ensure the row length in bytes accounts for byte padding.
  8684.       *   All bitmap data rows are aligned on LONG/4-BYTE boundaries.
  8685.       *   The data FROM an application should always appear in this form
  8686.       ********************************************************/
  8687.      usPadBytes = (USHORT)(ulImgBytesPerLine % 4);
  8688.      if (usPadBytes)
  8689.         ulImgBytesPerLine += 4 - usPadBytes;
  8690.  
  8691.      pVidInfo->ulImgPaddedBytesPerLine  = ulImgBytesPerLine;
  8692.      pVidInfo->ulImgTotalBytes = ulImgBytesPerLine * ulHeight;
  8693.  
  8694.      /********************************************************
  8695.       * Get space for full image buffer.
  8696.       ********************************************************/
  8697.      if (DosAllocMem ((PPVOID) &(pVidInfo->lpImgBuf),
  8698.                        pVidInfo->ulImgTotalBytes,
  8699.                        fALLOC))
  8700.          return (MMIO_ERROR);
  8701.  
  8702.      /********************************************************
  8703.       * Set up initial pointer value within RGB buffer & image
  8704.       ********************************************************/
  8705.      pVidInfo->lImgBytePos = 0;
  8706.  
  8707.      return (sizeof (MMIMAGEHEADER));
  8708.      }  /* end case of MMIOM_SETHEADER */
  8709.  
  8710.  
  8711. ΓòÉΓòÉΓòÉ 6.5. CODEC Support ΓòÉΓòÉΓòÉ
  8712.  
  8713. The following sections examine the Ultimotion IOProc (ULIOT) sample (located in 
  8714. the \TOOLKIT\SAMPLES\MM\ULTIMOIO subdirectory), which includes source code to 
  8715. compress or decompress a data object.  The ULIOT I/O procedure calls the 
  8716. Ultimotion CODEC procedure to compress raw digital images into a smaller form 
  8717. so they can use less storage space.  To play motion video, the ULIOT sample can 
  8718. also call the decompressor part of the CODEC procedure to reconstruct the 
  8719. original image from the compressed data. 
  8720.  
  8721.  
  8722. ΓòÉΓòÉΓòÉ 6.5.1. Decompression ΓòÉΓòÉΓòÉ
  8723.  
  8724. The following section illustrates how to decompress an image to play motion 
  8725. video.  Follow these steps for decompression support: 
  8726.  
  8727.    1. Open the file and determine which CODEC(s) are required. 
  8728.    2. Load the CODEC DLL file. 
  8729.    3. Load and initialize the CODEC procedure. 
  8730.    4. Call the CODEC to decompress data. 
  8731.    5. Close the CODEC and release resources after use. 
  8732.  
  8733.  
  8734. ΓòÉΓòÉΓòÉ 6.5.1.1. Opening an Image Object ΓòÉΓòÉΓòÉ
  8735.  
  8736. To play back or decompress an image object, you must first open the movie file 
  8737. to find the four-character code (FOURCC) of the compression type and initiate 
  8738. the track information (as shown in the following example). The open routine 
  8739. allows for multiple compression types per stream. 
  8740.  
  8741. LONG IOProcOpen (PMMIOINFO pmmioinfo, PSZ pszFileName) {
  8742.    LONG            rc = MMIO_SUCCESS;        /* Return code.           */
  8743.    LONG            lFilePosition;            /* Logical file position. */
  8744.    MMIOINFO        Localmmioinfo;            /* For locally used.      */
  8745.    PINSTANCE       pinstance;                /* Local work structure.  */
  8746.  
  8747.    if (pmmioinfo == NULL) return MMIO_ERROR;
  8748.  
  8749.    if (CheckMem((PVOID)pmmioinfo, sizeof(MMIOINFO), PAG_WRITE))
  8750.       return MMIO_ERROR;
  8751.  
  8752.    /********************************************************************/
  8753.    /* Validate the open flags for this File Format IOProc              */
  8754.    /* (INVALID_OPEN_FLAGS should be defined in the ff.h - file format  */
  8755.    /*  specific header file.)                                          */
  8756.    /********************************************************************/
  8757.  
  8758.    if (pmmioinfo->ulFlags  & INVALID_OPEN_FLAGS) {
  8759.        pmmioinfo->ulErrorRet = MMIOERR_INVALID_ACCESS_FLAG;
  8760.        return(MMIO_ERROR);
  8761.    }
  8762.  
  8763.    ENTERCRITX;
  8764.    if ((pinstance = (PINSTANCE)HhpAllocMem(hheap,sizeof(INSTANCE)))
  8765.          == NULL) {
  8766.        EXITCRIT;
  8767.        pmmioinfo->ulErrorRet = MMIOERR_OUTOFMEMORY;
  8768.        return(MMIO_ERROR);                  /* Allocate work struct. */
  8769.    }
  8770.    EXITCRIT;
  8771.  
  8772.    pmmioinfo->pExtraInfoStruct = (PVOID) pinstance;
  8773.    pmmioinfo->fccIOProc = HEX_FOURCC_FFIO; /* Set for CODEC loading. */
  8774.    ioInstanceInit(pinstance);
  8775.  
  8776.    /* Validate read flags before doing read initialization */
  8777.  
  8778.    if (( pmmioinfo->ulFlags & MMIO_READ ) &&
  8779.                 !( pmmioinfo->ulFlags & INVALID_READ_FLAGS )) {
  8780.  
  8781.       /* IOProc identifies Storage System */
  8782.  
  8783.       memcpy (&Localmmioinfo, pmmioinfo, sizeof(MMIOINFO));
  8784.       Localmmioinfo.pIOProc = NULL;
  8785.       Localmmioinfo.fccIOProc = pmmioinfo->fccChildIOProc;
  8786.       Localmmioinfo.ulFlags |= MMIO_NOIDENTIFY; /* Eliminate callbacks */
  8787.       Localmmioinfo.ulFlags &= ~MMIO_ALLOCBUF;  /* Force non-buffered open */
  8788.  
  8789.       rc = ioIdentifyStorageSystem(&Localmmioinfo,pszFileName);
  8790.  
  8791.       if (rc != MMIO_SUCCESS) {        /* if error,                  */
  8792.          ioCleanUp(pmmioinfo);
  8793.          return(rc);
  8794.       }
  8795.  
  8796.       /******************************************************/
  8797.       /* Allocate memory for pTempBuffer which is used when */
  8798.       /* IOProcReadInterLeaved is called.                   */
  8799.       /******************************************************/
  8800.  
  8801.       if (ENTERCRIT(rc)) {
  8802.          ioCleanUp(pmmioinfo);
  8803.          return(rc);
  8804.       }
  8805.  
  8806.       if ((pinstance->pTempBuffer = HhpAllocMem(hheap, DEFAULTBUFFERSIZE))
  8807.          == NULL) {
  8808.          EXITCRIT;
  8809.          ioCleanUp(pmmioinfo);
  8810.          return(MMIOERR_OUTOFMEMORY);
  8811.       }
  8812.       EXITCRIT;
  8813.       pinstance->ulTempBufferSize = DEFAULTBUFFERSIZE;
  8814.  
  8815.       /*****************************************************/
  8816.       /* Open Movie file                                   */
  8817.       /*****************************************************/
  8818.  
  8819.       if ( pmmioinfo->fccChildIOProc != FOURCC_MEM ) {
  8820.          Localmmioinfo.cchBuffer = 0;
  8821.          Localmmioinfo.pchBuffer = NULL;
  8822.       }
  8823.       pinstance->hmmioFileHandle = mmioOpen(pszFileName,
  8824.          &Localmmioinfo,MMIO_NOIDENTIFY);
  8825.            /* Test file open error.*/
  8826.       if (pinstance->hmmioFileHandle <= (HMMIO)0L) {
  8827.          rc = Localmmioinfo.ulErrorRet;
  8828.       }
  8829.  
  8830.       /*****************************************************/
  8831.       /* Call file format specific open routine            */
  8832.       /*****************************************************/
  8833.  
  8834.       else if (!(rc = ffOpenRead(pmmioinfo, pinstance))) {
  8835.          if(!(rc = ioAddTracksToMovieHeader(pinstance))) {
  8836.  
  8837.             /*********************************************************/
  8838.             /* Set lLogicalFilePos to a position pass the header     */
  8839.             /* block to allow read occurring at the first byte of    */
  8840.             /* non-header data.                                      */
  8841.             /*********************************************************/
  8842.             lFilePosition = ffSeekToDataBegin(pmmioinfo,pinstance);
  8843.             if (lFilePosition < MMIO_SUCCESS)
  8844.                rc = MMIO_ERROR;
  8845.             else
  8846.                pinstance->lFileCurrentPosition = lFilePosition;
  8847.          }
  8848.       }
  8849.  
  8850.       if (rc) {
  8851.          ioCleanUp(pmmioinfo);
  8852.          return(rc);
  8853.       }
  8854.    }
  8855.  
  8856.    /* Validate Write flags before doing initialization */
  8857.  
  8858. #ifndef WORKSHOP
  8859.  
  8860.    if ((pmmioinfo->ulFlags & (MMIO_READWRITE | MMIO_WRITE)) &&
  8861.                 !(pmmioinfo->ulFlags & INVALID_WRITE_FLAGS)) {
  8862.  
  8863.       /* Open the movie file */
  8864.  
  8865.       memset (&Localmmioinfo, '\0', sizeof(MMIOINFO));
  8866.       Localmmioinfo.pIOProc   = NULL;
  8867.       Localmmioinfo.fccIOProc = pmmioinfo->fccChildIOProc;
  8868.  
  8869.       if (pmmioinfo->fccChildIOProc != FOURCC_MEM) {
  8870.          Localmmioinfo.cchBuffer = 0;
  8871.          Localmmioinfo.pchBuffer = NULL;
  8872.       }
  8873.  
  8874.       Localmmioinfo.ulFlags |= MMIO_NOIDENTIFY; /* Eliminate callbacks */
  8875.       Localmmioinfo.ulFlags &= ~MMIO_ALLOCBUF;  /* Force non-buffered open. */
  8876.                                                 /* MMIO may do buffering. */
  8877.  
  8878.       pinstance->hmmioFileHandle = mmioOpen(pszFileName, &Localmmioinfo,
  8879.                                          MMIO_READWRITE | MMIO_NOIDENTIFY);
  8880.  
  8881.       if (pinstance->hmmioFileHandle <= (HMMIO)0L) /* Test file open error. */
  8882.          rc = Localmmioinfo.ulErrorRet;
  8883.       else
  8884.          /* Call file format specific open routine */
  8885.          rc = ffOpenWrite(pmmioinfo, pinstance);
  8886.  
  8887.       if (rc != 0) {
  8888.          ioCleanUp(pmmioinfo);
  8889.          return(rc);
  8890.       }
  8891.    }
  8892.  
  8893. #else    /* WORKSHOP next */
  8894.  
  8895.    if ((pmmioinfo->ulFlags & (MMIO_READWRITE | MMIO_WRITE)) &&
  8896.                 !(pmmioinfo->ulFlags & INVALID_WRITE_FLAGS)) {
  8897.  
  8898.       /* Open the movie file */
  8899.  
  8900.       memset (&Localmmioinfo, '\0', sizeof(MMIOINFO));
  8901.       Localmmioinfo.pIOProc   = NULL;
  8902.       Localmmioinfo.fccIOProc = pmmioinfo->fccChildIOProc;
  8903.       Localmmioinfo.ulFlags  = pmmioinfo->ulFlags;
  8904.       Localmmioinfo.ulFlags |= MMIO_NOIDENTIFY; /* Eliminate callbacks */
  8905.       Localmmioinfo.ulFlags &= ~MMIO_ALLOCBUF;  /* Force non-buffered open. */
  8906.                                                 /* MMIO may do buffering. */
  8907.  
  8908.       if (!(pmmioinfo->ulFlags & MMIO_CREATE)) {
  8909.          rc = ioIdentifyStorageSystem(&Localmmioinfo, pszFileName);
  8910.  
  8911.          if (rc != MMIO_SUCCESS) {        /* if error */
  8912.             pmmioinfo->ulErrorRet = rc;   /* see IdentifyStorageSystem */
  8913.             ioCleanUp(pmmioinfo);
  8914.             return(MMIO_ERROR);
  8915.          }
  8916.  
  8917.          /* Allocate memory for pTempBuffer which is used when */
  8918.          /* IOProcReadInterLeaved is called. */
  8919.  
  8920.          if (ENTERCRIT(rc)) {
  8921.             ioCleanUp(pmmioinfo);
  8922.             return MMIO_ERROR;
  8923.          }
  8924.  
  8925.          pinstance->pTempBuffer = HhpAllocMem(hheap, DEFAULTBUFFERSIZE);
  8926.          if (pinstance->pTempBuffer == NULL) {
  8927.             EXITCRIT;
  8928.             pmmioinfo->ulErrorRet = MMIOERR_OUTOFMEMORY;
  8929.             ioCleanUp(pmmioinfo);
  8930.             return MMIO_ERROR;
  8931.          }
  8932.          EXITCRIT;
  8933.  
  8934.          pinstance->ulTempBufferSize = DEFAULTBUFFERSIZE;
  8935.       }
  8936.  
  8937.       pinstance->lFileCurrentPosition = 0;
  8938.  
  8939.       pinstance->hmmioFileHandle = mmioOpen(pszFileName, &Localmmioinfo,
  8940.           Localmmioinfo.ulFlags);
  8941.  
  8942.       if (pinstance->hmmioFileHandle <= (HMMIO)0L) /* Test file open error. */
  8943.          rc = Localmmioinfo.ulErrorRet;
  8944.       else {
  8945.               /* Call file format specific open routine */
  8946.          rc = ffOpenWrite(pmmioinfo, pinstance);
  8947.  
  8948.          if (rc == 0) {
  8949.             if (!(pmmioinfo->ulFlags & MMIO_CREATE)) {
  8950.                rc = ioAddTracksToMovieHeader(pinstance);
  8951.  
  8952.                if (rc == 0) {
  8953.  
  8954.                   /* Set lLogicalFilePos to a position pass the header */
  8955.                   /* block to allow read occurring at the first byte */
  8956.                   /* of non-header data. */
  8957.  
  8958.                   lFilePosition = ffSeekToDataBegin(pmmioinfo, pinstance);
  8959.                   if (lFilePosition < MMIO_SUCCESS) rc = MMIO_ERROR;
  8960.                   else pinstance->lFileCurrentPosition = lFilePosition;
  8961.                }
  8962.             }
  8963.          }
  8964.       }
  8965.  
  8966.       if (rc != 0) {
  8967.          pmmioinfo->ulErrorRet = rc;
  8968.          ioCleanUp(pmmioinfo);
  8969.          return MMIO_ERROR;
  8970.       }
  8971.    }
  8972.  
  8973.    /* Set up the pathname in the instance structure */
  8974.  
  8975.    if (strlen(pszFileName) < CCHMAXPATH) {
  8976.       strcpy((PSZ)&(pinstance->szFileName), pszFileName);
  8977.       if ((pinstance->szFileName)[1] == ':')
  8978.          pinstance->ulEditFlags |= FULLY_QUALIFIED_PATH;
  8979.    }
  8980.  
  8981. #endif
  8982.  
  8983.    return MMIO_SUCCESS;
  8984. }
  8985.  
  8986.  
  8987. ΓòÉΓòÉΓòÉ 6.5.1.2. Determining the CODEC Procedure ΓòÉΓòÉΓòÉ
  8988.  
  8989. Once the FOURCC is obtained, the appropriate CODEC procedure is determined and 
  8990. loaded. The following example illustrates the ioDetermineCodec routine, which 
  8991. determines which CODEC procedure to load.  This routine first queries the 
  8992. hardware to determine what CODEC mode the hardware requires. Next, it queries 
  8993. the MMPMMMIO.INI file to determine if there is a CODEC procedure that matches 
  8994. the FOURCC, compression type, and capability flags received from the open 
  8995. routine.  If no default CODEC is found, this routine queries the MMPMMMIO.INI 
  8996. file to find a compression type that works for this particular hardware.  If 
  8997. there is no CODEC procedure known to the INI file that will match the FOURCC, 
  8998. the code searches internal CODEC tables for the necessary CODEC to load.  The 
  8999. ULIOT sample provides an internal CODEC table located in the ULGDAT.C file 
  9000. (shown in the following example). This table is hard coded in the IOProc to 
  9001. specify what CODEC procedure to call. 
  9002.  
  9003. LONG ioDetermineCodec ( PINSTANCE pinstance,
  9004.                         ULONG ulSearchFlags,
  9005.                         PCODECINIFILEINFO pcifi )
  9006.  
  9007. {
  9008.    LONG              rc = MMIO_SUCCESS; /* Return code of IOProcs call */
  9009.    USHORT            i;                 /* Loop index                   */
  9010.    ULONG             ulFlags;
  9011.    HPS               hps;               /* Use to query color support   */
  9012.    HAB               hab;               /* anchor block                 */
  9013.    HMQ               hmq;               /* anchor block                 */
  9014.  
  9015.  
  9016.    if (pcifi->ulCapsFlags & CODEC_DECOMPRESS) {
  9017.       /* Query the display mode */
  9018.       if (ulNumColors == 0) {       /* Get this info once per process */
  9019.          hab  = WinInitialize(0);
  9020. //       hmq  = WinCreateMsgQueue( hab, 0L );
  9021.  
  9022.          hps  = WinGetPS(HWND_DESKTOP);
  9023.          DevQueryCaps ( GpiQueryDevice(hps),
  9024.                         CAPS_COLORS,
  9025.                         1L,
  9026.                         (PLONG)&ulNumColors);
  9027.  
  9028.          WinReleasePS (hps);
  9029. //       WinDestroyMsgQueue( hmq );
  9030.          WinTerminate (hab);
  9031.          }
  9032.  
  9033.       /* Set the color depth for the CODEC we want */
  9034.       if (ulNumColors == 16)
  9035.          pcifi->ulCapsFlags |= CODEC_4_BIT_COLOR;
  9036.       else if (ulNumColors > 256)
  9037.          pcifi->ulCapsFlags |= CODEC_16_BIT_COLOR;
  9038.       else  /* 256 and anything else */
  9039.          pcifi->ulCapsFlags |= CODEC_8_BIT_COLOR;
  9040.       }
  9041.  
  9042.    /********************************************************************/
  9043.    /* Search for the DEFAULT codec of this type from the MMIO INI file */
  9044.    /********************************************************************/
  9045.    pcifi->ulCapsFlags |= CODEC_DEFAULT;   /* Pick default */
  9046.    ulFlags = ulSearchFlags |
  9047.              MMIO_MATCHFOURCC |
  9048.              MMIO_MATCHCOMPRESSTYPE |
  9049.              MMIO_MATCHCAPSFLAGS |
  9050.              MMIO_MATCHFIRST |
  9051.              MMIO_FINDPROC;
  9052.  
  9053.    if (!(rc = mmioIniFileCODEC(pcifi,ulFlags))) {
  9054.       return(MMIO_SUCCESS);
  9055.       }
  9056.  
  9057.    /********************************************************************/
  9058.    /* If no default, find first one and use it from the MMIO INI file  */
  9059.    /********************************************************************/
  9060.    pcifi->ulCapsFlags &= ~CODEC_DEFAULT;
  9061.    ulFlags = ulSearchFlags |
  9062.              MMIO_MATCHFOURCC |
  9063.              MMIO_MATCHCOMPRESSTYPE |
  9064.              MMIO_MATCHCAPSFLAGS |
  9065.              MMIO_MATCHFIRST |
  9066.              MMIO_FINDPROC;
  9067.  
  9068.    /* Match the fourcc, compress type, caps flags */
  9069.    if (!(rc = mmioIniFileCODEC(pcifi,ulFlags))) {
  9070.       return(MMIO_SUCCESS);
  9071.       }
  9072.  
  9073.    /*********************************************************************/
  9074.    /* Search any internal CODEC tables for the necessary CODEC to load. */
  9075.    /* Note: This is used for debugging new CODEC's that have not been   */
  9076.    /* added to the MMPMMMIO.INI file.                                   */
  9077.    /*********************************************************************/
  9078.    for (i = 0; i < NUMBER_CODEC_TABLE; i++) {
  9079.  
  9080.       if ((acifiTable[i].ulCompressType == pcifi->ulCompressType) &&
  9081.           ((acifiTable[i].ulCapsFlags & pcifi->ulCapsFlags)
  9082.               == pcifi->ulCapsFlags)) {
  9083.  
  9084.          *pcifi = acifiTable[i];         /* Copy contents */
  9085.          return(MMIO_SUCCESS);
  9086.          }
  9087.       }
  9088.  
  9089.  
  9090.    return(MMIOERR_CODEC_NOT_SUPPORTED);
  9091. }
  9092.  
  9093. The following example illustrates how to hardcode a CODEC INI file information 
  9094. structure in an IOProc if the table is not represented in the MMPMMMIO.INI 
  9095. file. 
  9096.  
  9097. CODECINIFILEINFO acifiTable[] = {
  9098.    {
  9099.       sizeof(CODECINIFILEINFO),
  9100.       FOURCC_FFIO,
  9101.       "ULBDC4",
  9102.        /* szDCIODLLName[]-Decompression IOProc DLL name */
  9103.       "CodecEntry",
  9104.        /* szDCIOProcName[]-Decomp IOProc entry pt proc name */
  9105.       UM_VIDEO_COMPRESSION_TYPE_BH146,
  9106.        /* ulDecompressionType - ID of each decompression type */
  9107.       0L,
  9108.       MMIO_MEDIATYPE_DIGITALVIDEO,
  9109.       CODEC_DECOMPRESS+           /* ulCapsFlags - Capabilities Flag */
  9110.          CODEC_SELFHEAL+          /* ulCapsFlags - Capabilities Flag */
  9111.          CODEC_ORIGIN_UPPERLEFT+  /* ulCapsFlags - Capabilities Flag */
  9112.          CODEC_4_BIT_COLOR,       /* ulCapsFlags - Capabilities Flag */
  9113.       0,
  9114.       0,
  9115.       0,
  9116.       0,
  9117.       0,
  9118.       8,
  9119.       8,
  9120.       0,
  9121.    },
  9122.    {
  9123.       sizeof(CODECINIFILEINFO),
  9124.       FOURCC_FFIO,
  9125.       "ULBDC8",
  9126.         /* szDCIODLLName[]-Decompression IOProc DLL name */
  9127.       "CodecEntry",
  9128.         /* szDCIOProcName[]-Decomp IOProc entry pt proc name */
  9129.       UM_VIDEO_COMPRESSION_TYPE_BH146,
  9130.         /* ulDecompressionType - ID of each decompression type */
  9131.       0L,
  9132.       MMIO_MEDIATYPE_DIGITALVIDEO,
  9133.       CODEC_DECOMPRESS+              /* ulCapsFlags - Capabilities Flag */
  9134.          CODEC_SELFHEAL+             /* ulCapsFlags - Capabilities Flag */
  9135.          CODEC_ORIGIN_UPPERLEFT+     /* ulCapsFlags - Capabilities Flag */
  9136.          CODEC_MULAPERTURE+          /* ulCapsFlags - Capabilities Flag */
  9137.          CODEC_DIRECT_DISPLAY+       /* ulCapsFlags - Capabilities Flag */
  9138.          CODEC_8_BIT_COLOR,          /* ulCapsFlags - Capabilities Flag */
  9139.       0,
  9140.       0,
  9141.       0,
  9142.       0,
  9143.       0,
  9144.       8,
  9145.       8,
  9146.       0,
  9147.    },
  9148.  
  9149.    {
  9150.       sizeof(CODECINIFILEINFO),
  9151.       FOURCC_FFIO,
  9152.       "ULBDC16",
  9153.           /* szDCIODLLName[]-Decompression IOProc DLL name */
  9154.       "CodecEntry",
  9155.           /* szDCIOProcName[]-Decomp IOProc entry point proc name */
  9156.       UM_VIDEO_COMPRESSION_TYPE_BH146,
  9157.           /* ulDecompressionType - ID of each decompression type */
  9158.       0L,
  9159.       MMIO_MEDIATYPE_DIGITALVIDEO,
  9160.       CODEC_DECOMPRESS+              /* ulCapsFlags - Capabilities Flag */
  9161.          CODEC_SELFHEAL+             /* ulCapsFlags - Capabilities Flag */
  9162.          CODEC_ORIGIN_UPPERLEFT+     /* ulCapsFlags - Capabilities Flag */
  9163.          CODEC_DIRECT_DISPLAY+       /* ulCapsFlags - Capabilities Flag */
  9164.          CODEC_16_BIT_COLOR,         /* ulCapsFlags - Capabilities Flag */
  9165.       0,
  9166.       0,
  9167.       0,
  9168.       0,
  9169.       0,
  9170.       8,
  9171.       8,
  9172.       0,
  9173.    },
  9174. };
  9175.  
  9176.  
  9177. ΓòÉΓòÉΓòÉ 6.5.1.3. Loading the CODEC Procedure ΓòÉΓòÉΓòÉ
  9178.  
  9179. Once a CODEC procedure is determined, the CODEC DLL is loaded and added to the 
  9180. linked list of CODECs currently loaded for this movie instance.  The 
  9181. ioLoadCodecDLL routine shown in the following example first checks to see that 
  9182. the CODEC procedure is not already loaded in the list.  If it is not loaded in 
  9183. the list, it sends a DOSLoadModule function to load the DLL and find the entry. 
  9184. Next, it initializes the CODEC procedure in the ffOpenCodec routine shown in 
  9185. the following example. 
  9186.  
  9187. Note:  Refer to the OS/2 PM Reference for further information on the 
  9188.        DosLoadModule function. 
  9189.  
  9190.  
  9191.   PCCB ioLoadCodecDLL ( PINSTANCE pinstance,
  9192.                         PCODECINIFILEINFO pcifi,
  9193.                         PULONG phCodec )
  9194.  
  9195.   {
  9196.      LONG      rc = MMIO_SUCCESS;     /* Return code of IOProc's call. */
  9197.      SZ        szLoadError[260];            /* Error returns. */
  9198.      PCCB      pccbNew;
  9199.      PCCB      pccb;
  9200.      HMODULE   hmod = 0L;
  9201.      PMMIOPROC pmmioproc;
  9202.      ULONG     hCodec = 0L;
  9203.  
  9204.  
  9205.      /********************************************************************/
  9206.      /* Search if the CCB entry has been created for the passed in       */
  9207.      /* pszDLLName and pszProcName,if yes, then sets pccb pointer of     */
  9208.      /* ptracki to that node.(different track may share a same CCB)      */
  9209.      /********************************************************************/
  9210.      for (pccb = pinstance->pccbList; pccb; pccb = pccb->pccbNext) {
  9211.  
  9212.         if (!stricmp(pcifi->szDLLName,pccb->cifi.szDLLName)) {
  9213.            hCodec = pccb->hCodec;
  9214.  
  9215.            if (!stricmp(pcifi->szProcName,pccb->cifi.szProcName)) {
  9216.               /* Proc entry names match */
  9217.               return(pccb);
  9218.               }
  9219.            }
  9220.         } /* end loop */
  9221.  
  9222.  
  9223.      /*******************************************************************/
  9224.      /* The above searching cannot find the DCIO node; if a same        */
  9225.      /* DLLName was found, query IOProc address directly, else load     */
  9226.      /* module then query I/O address before allocates a new pccb node. */
  9227.      /*******************************************************************/
  9228.      if (DosLoadModule(szLoadError,
  9229.                        (ULONG)sizeof(szLoadError),
  9230.                        pcifi->szDLLName,
  9231.                        &hmod))   {
  9232.         /* Load Error - MMIOERR_INVALID_DLLNAME */
  9233.         return(NULL);
  9234.         }
  9235.  
  9236.      if (DosQueryProcAddr(hmod,
  9237.                           0L,
  9238.                           pcifi->szProcName,
  9239.                           (PFN *)&pmmioproc))   {
  9240.         /* Query Error - MMIOERR_INVALID_PROCEDURENAME */
  9241.         return(NULL);
  9242.         }
  9243.  
  9244.      /********************************************************************/
  9245.      /* The above loading and querying was successful; then create a new */
  9246.      /* node for the DCIO.  If HhpAllocMem fails, call DosFreeModule to  */
  9247.      /* free DCIO module before returning error.                         */
  9248.      /********************************************************************/
  9249.      if (ENTERCRIT(rc)) {
  9250.         return(NULL);
  9251.         }
  9252.  
  9253.      pccbNew = (PCCB)HhpAllocMem(hheap,(ULONG)sizeof(CCB));
  9254.  
  9255.      EXITCRIT;
  9256.  
  9257.      if(!pccbNew) {
  9258.         DosFreeModule(hmod);
  9259.         /* Allocate error - MMIOERR_OUTOFMEMORY */
  9260.         return(NULL);
  9261.         }
  9262.  
  9263.      /*********************************************************************/
  9264.      /* Assigns the Decompress IOProc information, which is in record map */
  9265.      /* table, to the new DCIO node.                                      */
  9266.      /*********************************************************************/
  9267.      pccbNew->cifi = *pcifi;
  9268.      pccbNew->hmodule = hmod;
  9269.      pccbNew->pmmioproc = pmmioproc;
  9270.      pccbNew->hCodec = 0L;
  9271.      pccbNew->ulLastSrcBuf = 0L;
  9272.      pccbNew->ulMisc1 = 0L;
  9273.      pccbNew->ulMisc2 = 0L;
  9274.  
  9275.      /******************************************************************/
  9276.      /* Adds new node to the beginning of ccb list.                    */
  9277.      /******************************************************************/
  9278.      pccbNew->pccbNext = pinstance->pccbList;
  9279.      pinstance->pccbList = pccbNew;
  9280.  
  9281.      *phCodec = hCodec;
  9282.      return(pccbNew);
  9283.   }
  9284.  
  9285.  
  9286.  
  9287.   /************************** START OF SPECIFICATIONS *****************/
  9288.   /*                                                                  */
  9289.   /* SUBROUTINE NAME:  ioLoadCodec                                    */
  9290.   /*                                                                  */
  9291.   /* DESCRIPTIVE NAME: Load a CODEC IOProc and add it the PCCB list   */
  9292.   /*                                                                  */
  9293.   /* FUNCTION: This function loads a CODEC IOProc and adds it to the  */
  9294.   /*  linked list of CODECs currently loaded for this movie instance. */
  9295.   /*                                                                  */
  9296.   /* NOTES:                                                           */
  9297.   /*                                                                  */
  9298.   /* ENTRY POINT: ioLoadCodec                                         */
  9299.   /*   LINKAGE:   CALL FAR (00:32)                                    */
  9300.   /*                                                                  */
  9301.   /* INPUT:                                                           */
  9302.   /*             PINSTANCE pinstance     - Instant structure.         */
  9303.   /*             PTRACKI ptracki         - Track specific information */
  9304.   /*             PCODECINIFILEINFO pcifi - CODEC ini file information */
  9305.   /*                                                                  */
  9306.   /* EXIT-NORMAL:                                                     */
  9307.   /*              pccb                                                */
  9308.   /*                                                                  */
  9309.   /* EXIT-ERROR:                                                      */
  9310.   /*              0L                                                  */
  9311.   /*                                                                  */
  9312.   /* SIDE EFFECTS:                                                    */
  9313.   /*                                                                  */
  9314.   /*************************** END OF SPECIFICATIONS ******************/
  9315.   PCCB ioLoadCodec ( PINSTANCE pinstance,
  9316.                      PTRACKI ptracki,
  9317.                      PCODECINIFILEINFO pcifi )
  9318.  
  9319.   {
  9320.      LONG      rc = MMIO_SUCCESS; /* Return code of IOProc's call.*/
  9321.      PCCB      pccbNew;
  9322.      ULONG     hCodec = 0L;
  9323.  
  9324.  
  9325.  
  9326.      if (pccbNew = ioLoadCodecDLL(pinstance,pcifi,&hCodec)) {
  9327.  
  9328.         /*******************************************************************/
  9329.         /* Open the Codec IOProc and save the hCodec in the pccb structure */
  9330.         /*******************************************************************/
  9331.         if (rc = ffOpenCodec(pinstance, pccbNew, hCodec, ptracki)) {
  9332.  
  9333.            pinstance->pccbList = pccbNew->pccbNext;   /* unlink from list */
  9334.            ioCloseCodec(pccbNew);
  9335.            pccbNew = NULL;  /* return error condition */
  9336.            }
  9337.         }
  9338.  
  9339.      return(pccbNew);
  9340.   }
  9341.  
  9342.  
  9343.  
  9344.   /************************** START OF SPECIFICATIONS ****************/
  9345.   /*                                                                 */
  9346.   /* SUBROUTINE NAME:  ioFindCodec                                   */
  9347.   /*                                                                 */
  9348.   /* DESCRIPTIVE NAME:                                               */
  9349.   /*                                                                 */
  9350.   /* FUNCTION: This function finds a compression/decompression       */
  9351.   /* control block for this compression type.                        */
  9352.   /*                                                                 */
  9353.   /* NOTES: None                                                     */
  9354.   /*                                                                 */
  9355.   /* ENTRY POINT: ioFindCodec                                        */
  9356.   /*   LINKAGE:   CALL FAR (00:32)                                   */
  9357.   /*                                                                 */
  9358.   /* INPUT:                                                          */
  9359.   /*           PINSTANCE   pinstance  - Movie instance structure     */
  9360.   /*           ULONG       ulCompressType - Compression type         */
  9361.   /*                                                                 */
  9362.   /*                                                                 */
  9363.   /* EXIT-NORMAL:                                                    */
  9364.   /*              pccb                                               */
  9365.   /*                                                                 */
  9366.   /* EXIT-ERROR:                                                     */
  9367.   /*              NULL - 0L                                          */
  9368.   /*                                                                 */
  9369.   /*                                                                 */
  9370.   /* SIDE EFFECTS:                                                   */
  9371.   /*                                                                 */
  9372.   /*************************** END OF SPECIFICATIONS *****************/
  9373.   PCCB ioFindCodec ( PINSTANCE pinstance,
  9374.                      ULONG ulCompressType )
  9375.  
  9376.   {
  9377.      PCCB   pccb;
  9378.  
  9379.      for (pccb = pinstance->pccbList; pccb; pccb = pccb->pccbNext) {
  9380.         if (pccb->cifi.ulCompressType == ulCompressType)
  9381.            return(pccb);
  9382.         }
  9383.      return(NULL);  /* not found */
  9384.   }
  9385.  
  9386.  The ffOpenCodec routine shown in the following example opens a CODEC instance 
  9387.  for a movie instance and creates file format specific header information 
  9388.  (including a source video header and a destination video header).  Next, it 
  9389.  calls MMIO services to open the CODEC. 
  9390.  
  9391.   LONG ffOpenCodec ( PINSTANCE pinstance,
  9392.                      PCCB pccb,
  9393.                      ULONG hCodec,
  9394.                      PTRACKI ptracki)
  9395.  
  9396.   {
  9397.      LONG              rc = MMIO_SUCCESS;/* Return code of IOProc's call. */
  9398.      PMMVIDEOHEADER     pmmVideoHdr;     /* Video header node.      */
  9399.      PCODECVIDEOHEADER  pcodecvidhdr;
  9400.  
  9401.      /****************************************************************/
  9402.      /* Fill in necessary information for DC IOProc.                 */
  9403.      /****************************************************************/
  9404.           /* Get standard track header */
  9405.      pmmVideoHdr = (PMMVIDEOHEADER)ptracki->pTrackHeader;
  9406.      pccb->codecopen.pControlHdr = NULL;
  9407.        // FOR AVI, fill in from CODEC SPECIFIC DATA SECTION OF HEADER!
  9408.      pccb->codecopen.pOtherInfo = NULL;
  9409.  
  9410.      ENTERCRITX;
  9411.      /********************************************/
  9412.      /* Create Source Video Header               */
  9413.      /********************************************/
  9414.      if (pcodecvidhdr = (PCODECVIDEOHEADER)HhpAllocMem(hheap,(ULONG)
  9415.         sizeof(CODECVIDEOHEADER))) {
  9416.         pccb->codecopen.pSrcHdr = (PVOID)pcodecvidhdr;
  9417.  
  9418.         pcodecvidhdr->ulStructLen = sizeof(CODECVIDEOHEADER);
  9419.         pcodecvidhdr->cx = pmmVideoHdr->ulWidth;
  9420.         pcodecvidhdr->cy = pmmVideoHdr->ulHeight;
  9421.         pcodecvidhdr->cPlanes = 1;                        /* Hardcoded  */
  9422.         pcodecvidhdr->cBitCount = 16;                     /* Hardcoded  */
  9423.         pcodecvidhdr->ulColorEncoding = MMIO_COMPRESSED;  /* Hardcoded  */
  9424.  
  9425.         /********************************************/
  9426.         /* Create Destination Video Header          */
  9427.         /********************************************/
  9428.         if (pcodecvidhdr = (PCODECVIDEOHEADER)HhpAllocMem(hheap,(ULONG)
  9429.            sizeof(CODECVIDEOHEADER))) {
  9430.            pccb->codecopen.pDstHdr = (PVOID)pcodecvidhdr;
  9431.  
  9432.            pcodecvidhdr->ulStructLen = sizeof(CODECVIDEOHEADER);
  9433.            pcodecvidhdr->cx = pmmVideoHdr->ulWidth;
  9434.            pcodecvidhdr->cy = pmmVideoHdr->ulHeight;
  9435.            pcodecvidhdr->cPlanes = 1;                          // Hardcoded
  9436.  
  9437.            /********************************************/
  9438.            /* Initialize the Flags and color encoding  */
  9439.            /********************************************/
  9440.            pccb->codecopen.ulFlags = pccb->cifi.ulCapsFlags &
  9441.                  (VALID_CODECOPEN_INPUTFLAGS);
  9442.  
  9443.            /* Set the color depth for the CODEC we want */
  9444.            if (ulNumColors == 16) {
  9445.               pccb->codecopen.ulFlags |= CODEC_4_BIT_COLOR;
  9446.               pcodecvidhdr->cBitCount = 16;
  9447.               pcodecvidhdr->ulColorEncoding = MMIO_PALETTIZED;
  9448.               }
  9449.            else if (ulNumColors > 256) {
  9450.               pccb->codecopen.ulFlags |= CODEC_16_BIT_COLOR;
  9451.               pcodecvidhdr->cBitCount = 256;
  9452.               pcodecvidhdr->ulColorEncoding = MMIO_RGB_5_6_5;
  9453.               }
  9454.            else { /* 256 and anything else */
  9455.               pccb->codecopen.ulFlags |= CODEC_8_BIT_COLOR;
  9456.               pcodecvidhdr->cBitCount = 8;
  9457.               pcodecvidhdr->ulColorEncoding = MMIO_PALETTIZED;
  9458.               }
  9459.  
  9460.            /*****************/
  9461.            /* Open the Codec
  9462.            /*****************/
  9463.            rc = pccb->pmmioproc(&hCodec,
  9464.                                 MMIOM_CODEC_OPEN,
  9465.                                 (LONG)&pccb->codecopen,
  9466.                                 0L);
  9467.            if (!rc) {
  9468.               pccb->hCodec = hCodec;
  9469.               }
  9470.            }
  9471.         }
  9472.  
  9473.      EXITCRIT;
  9474.      return(rc);
  9475.   }
  9476.  
  9477.  
  9478.   LONG ffAssociateCodec ( PINSTANCE pinstance,
  9479.                           PMMEXTENDINFO pmmextendinfo )
  9480.   {
  9481.      LONG  rc = MMIO_SUCCESS;
  9482.  
  9483.      return(rc);
  9484.   }
  9485.  
  9486.  
  9487. ΓòÉΓòÉΓòÉ 6.5.2. Compression ΓòÉΓòÉΓòÉ
  9488.  
  9489. The following section illustrates how to compress raw digital images into a 
  9490. smaller form so they can use less storage space.  Follow these steps for 
  9491. compression support: 
  9492.  
  9493.    1. Determine which CODEC procedure to use. 
  9494.    2. Load the CODEC DLL file. 
  9495.    3. Load and initialize the CODEC procedure. 
  9496.    4. Call the CODEC to compress the data. 
  9497.    5. Close the CODEC and release resources after use. 
  9498.  
  9499.  The IOSET.C file shown in the following example uses the MMEXTENDINFO data 
  9500.  structure to set values for the source header, destination header, and other 
  9501.  information. 
  9502.  
  9503.  Note:  You can only associate one stream or track. 
  9504.  
  9505.   /*************************START OF SPECIFICATIONS ****************/
  9506.   /* SOURCE FILE NAME:  IOSET.C                                    */
  9507.   /*                                                               */
  9508.   /* DESCRIPTIVE NAME: File Format IOProc routine for MMIOM_SET    */
  9509.   /*                                                               */
  9510.   /* COPYRIGHT:     IBM - International Business Machines          */
  9511.   /*            Copyright (c) IBM Corporation  1991, 1992, 1993    */
  9512.   /*                        All Rights Reserved                    */
  9513.   /*                                                               */
  9514.   /* STATUS: OS/2 Release 2.0                                      */
  9515.   /*                                                               */
  9516.   /* FUNCTION: This source module contains the set functions.      */
  9517.   /* NOTES:                                                        */
  9518.   /*    DEPENDENCIES: none                                         */
  9519.   /*    RESTRICTIONS: Runs in 32-bit protect mode (OS/2 2.0)       */
  9520.   /*                                                               */
  9521.   /* ENTRY POINTS:                                                 */
  9522.   /*              IOProcSet                                        */
  9523.   /*                                                               */
  9524.   /************************* END OF SPECIFICATIONS *****************/
  9525.  
  9526.   #include        <stdio.h>
  9527.   #include        <string.h>
  9528.   #include        <stdlib.h>
  9529.   #include        <memory.h>
  9530.  
  9531.   #define         INCL_DOS             /* #define  INCL_DOSPROCESS.*/
  9532.   #define         INCL_ERRORS
  9533.   #define         INCL_WIN
  9534.   #define         INCL_GPI
  9535.  
  9536.   #include        <os2.h>              /* OS/2 headers.            */
  9537.   #include        <pmbitmap.h>
  9538.  
  9539.   #define         INCL_OS2MM
  9540.   #define         INCL_MMIO_CODEC
  9541.   #define         INCL_MMIO_DOSIOPROC
  9542.  
  9543.   #include        <os2me.h>            /* Multimedia IO extensions. */
  9544.   #include        <hhpheap.h>
  9545.   #include        <ioi.h>
  9546.  
  9547.   /************************** START OF SPECIFICATIONS **********/
  9548.   /*                                                           */
  9549.   /* SUBROUTINE NAME: IOProcSet                                */
  9550.   /*                                                           */
  9551.   /* DESCRIPTIVE NAME: Set various conditions in IOProc        */
  9552.   /*                                                           */
  9553.   /* FUNCTION:                                                 */
  9554.   /*                                                           */
  9555.   /* NOTES: None                                               */
  9556.   /*                                                           */
  9557.   /* ENTRY POINT: IOProcSet                                    */
  9558.   /*   LINKAGE:   CALL FAR (00:32)                             */
  9559.   /*                                                           */
  9560.   /* INPUT:                                                    */
  9561.   /*   PMMIOINFO   pmmioinfo - ptr to instance structure       */
  9562.   /*   LONG        lParam1  - first parameter                  */
  9563.   /*   LONG        lParam2  - Second parameter                 */
  9564.   /*                                                           */
  9565.   /*                                                           */
  9566.   /* EXIT-NORMAL:                                              */
  9567.   /*              MMIO_SUCCESS                                 */
  9568.   /*                                                           */
  9569.   /* EXIT-ERROR:                                               */
  9570.   /*              MMIO_ERROR                                   */
  9571.   /*                                                           */
  9572.   /* SIDE EFFECTS:                                             */
  9573.   /*                                                           */
  9574.   /*************************** END OF SPECIFICATIONS ***********/
  9575.   LONG IOProcSet ( PMMIOINFO pmmioinfo,
  9576.                    LONG lParam1,
  9577.                    LONG lParam2 )
  9578.  
  9579.   {
  9580.      PINSTANCE       pinstance;
  9581.      LONG            rc = MMIO_SUCCESS;
  9582.      PMMEXTENDINFO   pmmextendinfo = (PMMEXTENDINFO)lParam1;
  9583.      PCCB            pccb;
  9584.      ULONG           ulCCBCount;
  9585.      PCODECASSOC     pcodecassoc;
  9586.      ULONG           ulSize;
  9587.      PVOID           PtrNextAvail;
  9588.  
  9589.      if (rc = ioGetPtrInstance(pmmioinfo,&pinstance))
  9590.         return(rc);
  9591.  
  9592.      switch(lParam2){
  9593.         /*************************/
  9594.         /* SET INFO              */
  9595.         /*************************/
  9596.         case MMIO_SET_EXTENDEDINFO:   /* Set extended information */
  9597.            if (pmmextendinfo) {     /* error check */
  9598.  
  9599.               /********************/
  9600.               /* Set active track */
  9601.               /********************/
  9602.               if (pmmextendinfo->ulFlags & MMIO_TRACK) {
  9603.  
  9604.                  if (pmmextendinfo->ulTrackID == (ULONG)MMIO_RESETTRACKS) {
  9605.                     pinstance->lCurrentTrack = pmmextendinfo->ulTrackID;
  9606.                     }
  9607.                  else {
  9608.                    if (pinstance->ulFlags & OPENED_READONLY) {
  9609.                      if (ioFindTracki(pinstance,pmmextendinfo->ulTrackID)) {
  9610.                         pinstance->lCurrentTrack = pmmextendinfo->ulTrackID;
  9611.                          }
  9612.                        else {
  9613.                           pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  9614.                           rc = MMIO_ERROR;
  9615.                           break;
  9616.                           }
  9617.                        }
  9618.  
  9619.                     else if (pinstance->ulFlags &
  9620.                             (OPENED_READWRITE | OPENED_WRITECREATE)) {
  9621.                        pinstance->lCurrentTrack = pmmextendinfo->ulTrackID;
  9622.                        }
  9623.  
  9624.                     else {
  9625.                        pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  9626.                        rc = MMIO_ERROR;
  9627.                        break;
  9628.                        }
  9629.                     } /* else */
  9630.                  }  /* MMIO_TRACK */
  9631.  
  9632.               /**********************************************************/
  9633.               /* Reset all Non-normal reading modes.  All request audio */
  9634.               /* and video frames are returned.                         */
  9635.               /**********************************************************/
  9636.               if (pmmextendinfo->ulFlags & MMIO_NORMAL_READ) {
  9637.                  pinstance->ulMode = MODE_NORMALREAD;
  9638.                  } /* MMIO_NORMAL_READ */
  9639.  
  9640.               /***********************************************************/
  9641.               /* Set IOProc into SCAN mode for the active track. Reading */
  9642.               /* will now be done, but only Key frames are returned for  */
  9643.               /* video.                                                  */
  9644.               /***********************************************************/
  9645.               else if (pmmextendinfo->ulFlags & MMIO_SCAN_READ) {
  9646.                  pinstance->ulMode = MODE_SCANREAD;
  9647.                  } /* MMIO_SCAN_READ */
  9648.  
  9649.               /***********************************************************/
  9650.               /* Set IOProc into REVERSE mode for the active track.      */
  9651.               /* Reading will now be done, but only Key frames are       */
  9652.               /* returned for video                                      */
  9653.               /***********************************************************/
  9654.               else if (pmmextendinfo->ulFlags & MMIO_REVERSE_READ) {
  9655.                  pinstance->ulMode = MODE_REVERSEREAD;
  9656.                  } /* MMIO_REVERSE_READ */
  9657.  
  9658.               /****************************************************/
  9659.               /* Associate CODEC information for recording        */
  9660.               /****************************************************/
  9661.               if (pmmextendinfo->ulFlags & MMIO_CODEC_ASSOC) {
  9662.  
  9663.                  /* Don't alow a CODEC association for read only files */
  9664.                  if (pinstance->ulFlags & OPENED_READONLY) {
  9665.                     pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  9666.                     rc = MMIO_ERROR;
  9667.                     break;
  9668.                     }
  9669.  
  9670.                  /* Can only associate 1 CODEC for record */
  9671.                  if (pmmextendinfo->ulNumCODECs == 1) {
  9672.                     if (rc = ioAssociateCodec(pmmioinfo,
  9673.                                               pinstance,
  9674.                                               pmmextendinfo->pCODECAssoc)) {
  9675.                        pmmioinfo->ulErrorRet = rc;
  9676.                        rc = MMIO_ERROR;
  9677.                        }
  9678.                     }
  9679.                  else {
  9680.                     pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  9681.                     rc = MMIO_ERROR;
  9682.                     }
  9683.                  } /* MMIO_CODEC_ASSOC */
  9684.               } /* pmmextendedinfo */
  9685.  
  9686.            else { /* error - data structure missing */
  9687.               pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  9688.               rc = MMIO_ERROR;
  9689.               }
  9690.            break;
  9691.         /********************************/
  9692.         /* QUERY BASE AND CODEC INFO    */
  9693.         /********************************/
  9694.         case MMIO_QUERY_EXTENDEDINFO_ALL:
  9695.           /* Query Also CODEC associated info */
  9696.  
  9697.          /* Create the array of codecassoc structures to return to caller */
  9698.          pcodecassoc = pmmextendinfo->pCODECAssoc;  /* Point to beginning */
  9699.          for (pccb = pinstance->pccbList; pccb; pccb = pccb->pccbNext) {
  9700.             pcodecassoc->pCodecOpen = NULL;
  9701.             pcodecassoc->pCODECIniFileInfo = NULL;
  9702.             pcodecassoc++;
  9703.             }
  9704.           PtrNextAvail = (PVOID)pcodecassoc;
  9705.  
  9706.           /* Fill in pointers to the CODECIniFileInfo structures to follow */
  9707.           ulSize = 0L;
  9708.           pcodecassoc = pmmextendinfo->pCODECAssoc;  /* Point to beginning */
  9709.           for (pccb = pinstance->pccbList; pccb; pccb = pccb->pccbNext) {
  9710.  
  9711.             /* Create and copy CODECINIFILEINFO structure */
  9712.             pcodecassoc->pCODECIniFileInfo = (PCODECINIFILEINFO)PtrNextAvail;
  9713.             memcpy(pcodecassoc->pCODECIniFileInfo,&pccb->
  9714.                cifi,sizeof(CODECINIFILEINFO));
  9715.             PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail)
  9716.                + sizeof(CODECINIFILEINFO));
  9717.  
  9718.              /* Create and copy CODECOPEN structure */
  9719.              pcodecassoc->pCodecOpen = PtrNextAvail;
  9720.              memcpy(pcodecassoc->pCodecOpen,&pccb->codecopen,
  9721.                 sizeof(CODECOPEN));
  9722.              PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail)
  9723.                 + sizeof(CODECOPEN));
  9724.  
  9725.               /* Create and copy Pointers to structures   */
  9726.               /* in the CODECOPEN structure.              */
  9727.               if (pccb->codecopen.pControlHdr) {
  9728.                  ulSize = *((PULONG)pccb->codecopen.pControlHdr);
  9729.                  ((PCODECOPEN)pcodecassoc->pCodecOpen)->pControlHdr =
  9730.                     (PVOID)PtrNextAvail;
  9731.                  memcpy(((PCODECOPEN)pcodecassoc->pCodecOpen)->pControlHdr,
  9732.                         pccb->codecopen.pControlHdr,
  9733.                         ulSize);
  9734.                  PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + ulSize);
  9735.                  }
  9736.               if (pccb->codecopen.pSrcHdr) {
  9737.                  ulSize = *((PULONG)pccb->codecopen.pSrcHdr);
  9738.                  ((PCODECOPEN)pcodecassoc->pCodecOpen)->pSrcHdr
  9739.                      = PtrNextAvail;
  9740.                  memcpy(((PCODECOPEN)pcodecassoc->pCodecOpen)->pSrcHdr,
  9741.                         pccb->codecopen.pSrcHdr,
  9742.                         ulSize);
  9743.                  PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + ulSize);
  9744.                  }
  9745.  
  9746.               if (pccb->codecopen.pDstHdr) {
  9747.                  ulSize = *((PULONG)pccb->codecopen.pDstHdr);
  9748.                  ((PCODECOPEN)pcodecassoc->pCodecOpen)->pDstHdr
  9749.                      = PtrNextAvail;
  9750.                  memcpy(((PCODECOPEN)pcodecassoc->pCodecOpen)->pDstHdr,
  9751.                         pccb->codecopen.pDstHdr,
  9752.                         ulSize);
  9753.                  PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + ulSize);
  9754.                  }
  9755.  
  9756.               if (pccb->codecopen.pOtherInfo) {
  9757.                  ulSize = *((PULONG)pccb->codecopen.pOtherInfo);
  9758.                  ((PCODECOPEN)pcodecassoc->pCodecOpen)->pOtherInfo
  9759.                       = PtrNextAvail;
  9760.                  memcpy(((PCODECOPEN)pcodecassoc->pCodecOpen)->pOtherInfo,
  9761.                         pccb->codecopen.pOtherInfo,
  9762.                         ulSize);
  9763.                  PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + ulSize);
  9764.                  }
  9765.               pcodecassoc++;
  9766.               }
  9767.  
  9768.         /*************************************************/
  9769.         /* QUERY BASE INFO  (NOTE: Fall through    */
  9770.         /* from previous case!)                          */
  9771.         /*************************************************/
  9772.         case MMIO_QUERY_EXTENDEDINFO_BASE: /* Query only MMEXTENDINFO info */
  9773.            pmmextendinfo->ulStructLen = sizeof(MMEXTENDINFO);
  9774.            pmmextendinfo->ulTrackID = (ULONG)pinstance->lCurrentTrack;
  9775.            /* pmmextendinfo->pCODECAssoc = NULL;  */
  9776.  
  9777.            /* Compute ulBufSize for complete information return */
  9778.            ulSize = 0L;
  9779.            for (pccb = pinstance->pccbList, ulCCBCount = 0; /* Count CCB's */
  9780.                 pccb;
  9781.                 ulCCBCount++, pccb = pccb->pccbNext) {
  9782.               ulSize += sizeof(CODECASSOC)+sizeof(CODECOPEN)
  9783.                   +sizeof(CODECINIFILEINFO); /* static stuff */
  9784.  
  9785.               /* Extract ulStructLen as first field of structure  */
  9786.               /* that ptr points to.                              */
  9787.               if (pccb->codecopen.pControlHdr) {
  9788.                  ulSize += *((PULONG)pccb->codecopen.pControlHdr);
  9789.                  }
  9790.               if (pccb->codecopen.pSrcHdr) {
  9791.                  ulSize += *((PULONG)pccb->codecopen.pSrcHdr);
  9792.                  }
  9793.               if (pccb->codecopen.pDstHdr) {
  9794.                  ulSize += *((PULONG)pccb->codecopen.pDstHdr);
  9795.                  }
  9796.               if (pccb->codecopen.pOtherInfo) {
  9797.                  ulSize += *((PULONG)pccb->codecopen.pOtherInfo);
  9798.                  }
  9799.               }
  9800.  
  9801.            pmmextendinfo->ulNumCODECs = ulCCBCount;
  9802.            pmmextendinfo->ulBufSize = ulSize;
  9803.            break;
  9804.  
  9805.         /*********/
  9806.         /* ERROR */
  9807.         /*********/
  9808.         default:
  9809.            pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  9810.            rc = MMIO_ERROR;
  9811.            break;
  9812.         }/* end switch */
  9813.  
  9814.      return(rc);
  9815.   }
  9816.  
  9817.  
  9818. ΓòÉΓòÉΓòÉ 6.5.2.1. Associating a CODEC with a File ΓòÉΓòÉΓòÉ
  9819.  
  9820. The following example illustrates how to associate a CODEC procedure with a 
  9821. file (track). 
  9822.  
  9823. LONG ioAssociateCodec ( PMMIOINFO pmmioinfo,
  9824.                         PINSTANCE pinstance,
  9825.                         PCODECASSOC pcodecassoc )
  9826.  
  9827. {
  9828.    LONG              rc = MMIO_SUCCESS; /* Return code of IOProc's call.*/
  9829.    PCCB              pccb;
  9830.    ULONG             hCodec;  /* Possibly returned from ioLoadCodecDLL */
  9831.  
  9832.    /* Check for NULL pointers */
  9833.    if (!pcodecassoc->pCodecOpen || !pcodecassoc->pCODECIniFileInfo) {
  9834.       return (MMIOERR_INVALID_PARAMETER);
  9835.       }
  9836.  
  9837.    /* Force the correct values into the CODECINIFILEINFO structure */
  9838.    pcodecassoc->pCODECIniFileInfo->ulStructLen = sizeof(CODECINIFILEINFO);
  9839.    pcodecassoc->pCODECIniFileInfo->fcc = pmmioinfo->fccIOProc;
  9840.    pcodecassoc->pCODECIniFileInfo->ulCapsFlags |= CODEC_COMPRESS;
  9841.  
  9842.    /* Find the codec to load */
  9843.    if (rc = ioDetermineCodec(pinstance, 0, pcodecassoc->pCODECIniFileInfo))
  9844.       {
  9845.       return(rc); /* return error */
  9846.       }
  9847.  
  9848.    else { /* load and open the compression codec */
  9849.  
  9850.       /***********************************************/
  9851.       /* Check for previously installed CODECs.      */
  9852.       /* De-install any loaded.  Load new one.       */
  9853.       /* Allows only 1 CODEC to be loaded at a time. */
  9854.       /***********************************************/
  9855.       if (pinstance->pccbList) {
  9856.          pccb = pinstance->pccbList;
  9857.          pinstance->pccbList = pccb->pccbNext;   /* unlink from list */
  9858.          ioCloseCodec(pccb);
  9859.          }
  9860.  
  9861.       /* Load the codec dll */
  9862.       if (pccb = ioLoadCodecDLL(pinstance,
  9863.                                 pcodecassoc->pCODECIniFileInfo,
  9864.                                 &hCodec)) {
  9865.  
  9866.          /* Save the codec open information in the ccb */
  9867.          ((PCODECOPEN)pcodecassoc->pCodecOpen)->ulFlags |= CODEC_COMPRESS;
  9868.          /* Force open of compressor */
  9869.  
  9870.          if (!(rc = ioInitCodecopen(pccb,(PCODECOPEN)pcodecassoc->
  9871.             pCodecOpen))) {
  9872.  
  9873.             /* Open the codec */
  9874.             if (!(rc = pccb->pmmioproc(&hCodec,
  9875.                                        MMIOM_CODEC_OPEN,
  9876.                                        (LONG)&pccb->codecopen,
  9877.                                        0L)))  {
  9878.                pccb->hCodec = hCodec;       /* save handle to codec */
  9879.                }
  9880.             }
  9881.  
  9882.          /* handle error conditions */
  9883.          if (rc) {
  9884.             pinstance->pccbList = pccb->pccbNext;   /* unlink from list */
  9885.             ioCloseCodec(pccb);
  9886.             }
  9887.          }
  9888.       else {
  9889.          rc = MMIO_ERROR;
  9890.          }
  9891.       }
  9892.    return(rc);
  9893. }
  9894.  
  9895.  
  9896. ΓòÉΓòÉΓòÉ 6.5.2.2. Allocating Memory for Compression ΓòÉΓòÉΓòÉ
  9897.  
  9898. The ioAssociateCodec routine shown in the following example calls the 
  9899. ioInitCodecopen routine to allocate memory. The next example illustrates how 
  9900. the ioInitCodecopen routine allocates memory and initializes a CODECOPEN 
  9901. structure to be saved in the CODEC control block (CCB). 
  9902.  
  9903. LONG ioInitCodecopen ( PCCB pccb,
  9904.                        PCODECOPEN pcodecopen)
  9905.  
  9906. {
  9907.    ULONG             ulSize;
  9908.  
  9909.  
  9910.    ENTERCRITX;
  9911.    pccb->codecopen.ulFlags = pcodecopen->ulFlags;
  9912.  
  9913.    /* Create and copy Pointers to structures in CODECOPEN structure */
  9914.    if (pcodecopen->pControlHdr) {
  9915.      ulSize = *((PULONG)pcodecopen->pControlHdr);
  9916.      if (!(pccb->codecopen.pControlHdr = (PVOID)HhpAllocMem(hheap,ulSize)))
  9917.         {
  9918.          return(MMIO_ERROR);
  9919.          }
  9920.       memcpy(pccb->codecopen.pControlHdr, pcodecopen->pControlHdr, ulSize);
  9921.       }
  9922.  
  9923.    if (pcodecopen->pSrcHdr) {
  9924.       ulSize = *((PULONG)pcodecopen->pSrcHdr);
  9925.       if (!(pccb->codecopen.pSrcHdr = (PVOID)HhpAllocMem(hheap,ulSize)))
  9926.          {
  9927.          return(MMIO_ERROR);
  9928.          }
  9929.       memcpy(pccb->codecopen.pSrcHdr, pcodecopen->pSrcHdr, ulSize);
  9930.       }
  9931.  
  9932.    if (pcodecopen->pDstHdr) {
  9933.       ulSize = *((PULONG)pcodecopen->pDstHdr);
  9934.       if (!(pccb->codecopen.pDstHdr = (PVOID)HhpAllocMem(hheap,ulSize)))
  9935.          {
  9936.          return(MMIO_ERROR);
  9937.          }
  9938.       memcpy(pccb->codecopen.pDstHdr, pcodecopen->pDstHdr, ulSize);
  9939.       }
  9940.  
  9941.    if (pcodecopen->pOtherInfo) {
  9942.       ulSize = *((PULONG)pcodecopen->pOtherInfo);
  9943.       if (!(pccb->codecopen.pOtherInfo = (PVOID)HhpAllocMem(hheap,ulSize)))
  9944.       {
  9945.          return(MMIO_ERROR);
  9946.          }
  9947.       memcpy(pccb->codecopen.pOtherInfo, pcodecopen->pOtherInfo, ulSize);
  9948.       }
  9949.  
  9950.    EXITCRIT;
  9951.    return(MMIO_SUCCESS);
  9952. }
  9953.  
  9954.  
  9955. ΓòÉΓòÉΓòÉ 6.5.2.3. Closing the CODEC Procedure ΓòÉΓòÉΓòÉ
  9956.  
  9957. The following example shows an example of how to close a CODEC instance.  The 
  9958. ioCloseCodec routine frees memory associated with the CODEC. 
  9959.  
  9960. LONG ioCloseCodec ( PCCB pccb )
  9961.  
  9962. {
  9963.    LONG       rc = MMIO_SUCCESS; /* Return code of IOProc's call. */
  9964.  
  9965.    ENTERCRITX;
  9966.    if (pccb->codecopen.pSrcHdr) {
  9967.       HhpFreeMem(hheap,(PVOID)pccb->codecopen.pSrcHdr);
  9968.       }
  9969.  
  9970.    if (pccb->codecopen.pDstHdr) {
  9971.       HhpFreeMem(hheap,(PVOID)pccb->codecopen.pDstHdr);
  9972.       }
  9973.  
  9974.    if (pccb->codecopen.pControlHdr) {
  9975.       HhpFreeMem(hheap,(PVOID)pccb->codecopen.pControlHdr);
  9976.       }
  9977.  
  9978.    if (pccb->codecopen.pOtherInfo) {
  9979.       HhpFreeMem(hheap,(PVOID)pccb->codecopen.pOtherInfo);
  9980.       }
  9981.  
  9982.    if (pccb->hCodec) {
  9983.       rc = pccb->pmmioproc(&pccb->hCodec,
  9984.                            MMIOM_CODEC_CLOSE,
  9985.                            0L,
  9986.                            0L);
  9987.  
  9988.       if (!rc) {
  9989.          pccb->hCodec = 0L;
  9990.          }
  9991.       }
  9992.  
  9993.    if (pccb->hmodule) {
  9994. //----DosFreeModule(pccb->hmodule);
  9995.       pccb->hmodule = 0;
  9996.       }
  9997.  
  9998.    HhpFreeMem(hheap,(PVOID)pccb);
  9999.    pccb = NULL;
  10000.    EXITCRIT;
  10001.  
  10002.    return(rc);
  10003. }
  10004.  
  10005.  
  10006. ΓòÉΓòÉΓòÉ 7. Installation Requirements ΓòÉΓòÉΓòÉ
  10007.  
  10008. This section describes how to install the following OS/2 multimedia subsystems 
  10009. using the multimedia installation program (MINSTALL): 
  10010.  
  10011.    o  Media control driver (MCD) 
  10012.    o  Stream handler 
  10013.    o  I/O procedure 
  10014.  
  10015.  You can prepare script control files and if necessary, create an installation 
  10016.  DLL file to install a subsystem.  MINSTALL updates the appropriate INI files 
  10017.  and CONFIG.SYS statements, providing a consistent installation process. 
  10018.  
  10019.  Most developers will use control files with the MINSTALL program to install a 
  10020.  subsystem.  MINSTALL is hardware independent and does not prompt the operating 
  10021.  system for hardware information.  Therefore, if information is required from 
  10022.  the operating system or specific hardware, you need to write an installation 
  10023.  DLL to use (in addition to control files).  See Writing an Installation DLL 
  10024.  for further information. 
  10025.  
  10026.  
  10027. ΓòÉΓòÉΓòÉ 7.1. Master Control File ΓòÉΓòÉΓòÉ
  10028.  
  10029. The MINSTALL program (MINSTALL.EXE) requires specific file information to 
  10030. install each subsystem.  This file information is provided by the master 
  10031. control file CONTROL.SCR.  The master control file, CONTROL.SCR, tells the 
  10032. installation program what to install, where to install it, how to display it to 
  10033. the user, and what system files need to be updated.  CONTROL.SCR uses keywords 
  10034. to specify these instructions to MINSTALL. 
  10035.  
  10036. This control file must be named CONTROL.SCR and must reside on the first media 
  10037. unit (diskette or CD) of the installation package.  During installation, if any 
  10038. errors are detected in the master control file, the errors are logged in the 
  10039. MINSTALL.LOG file.  (See Installation LOG File.) 
  10040.  
  10041. The CONTROL.SCR file consists of a header section and a subsystem definition 
  10042. section.  The header section comes first and provides general information for 
  10043. the installation procedure.  The subsystem definition section comes next and 
  10044. provides information about the subsystems in the installation package. 
  10045.  
  10046.  
  10047. ΓòÉΓòÉΓòÉ 7.1.1. CONTROL.SCR Header ΓòÉΓòÉΓòÉ
  10048.  
  10049. The header section of the CONTROL.SCR file contains the following information: 
  10050.  
  10051.    o  Name of the installation package 
  10052.    o  Code page used when creating the file 
  10053.    o  Name of the file list control file 
  10054.    o  Number of subsystems in the installation package 
  10055.    o  Number of media units required for installation 
  10056.    o  Names of the media units required for installation 
  10057.    o  Source and destination directory names (optional) 
  10058.  
  10059.  The following is an example of the CONTROL.SCR header located in the 
  10060.  \TOOLKIT\SAMPLES\MM\CF subdirectory. 
  10061.  
  10062.   /*  control.scr */
  10063.  
  10064.   package   ="IBM Multimedia Presentation Manager Toolkit/2"
  10065.   codepage  =437
  10066.   filelist  ="filelist.tlk"
  10067.   groupcount=12
  10068.   munitcount=6
  10069.  
  10070.   medianame="IBM Multimedia Presentation Manager Toolkit/2 Installation
  10071.   Diskette 1"
  10072.   medianame="IBM Multimedia Presentation Manager Toolkit/2 Installation
  10073.   Diskette 2"
  10074.   .
  10075.   .
  10076.   .
  10077.  
  10078.   sourcedir="\\"                     = 0
  10079.   sourcedir="\\lib\\"                = 1
  10080.   .
  10081.   .
  10082.   .
  10083.  
  10084.   destindir="\\mmos2\\"                                = 0
  10085.   destindir="\\mmos2\\mmtoolkt\\lib\\"                 = 1
  10086.   .
  10087.   .
  10088.   .
  10089.  
  10090.  The following table describes the keywords used in the CONTROL.SCR header. 
  10091.  
  10092.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  10093.   ΓöéKeyword        ΓöéDescription                                  Γöé
  10094.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10095.   ΓöéPACKAGE        ΓöéThis required keyword specifies the name of  Γöé
  10096.   Γöé               Γöéthe installation package in the form of a    Γöé
  10097.   Γöé               Γöéquoted string.  For example:                 Γöé
  10098.   Γöé               ΓöéPACKAGE="IBM Multimedia Presentation Manager Γöé
  10099.   Γöé               ΓöéToolkit/2"                                   Γöé
  10100.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10101.   ΓöéCODEPAGE       ΓöéThis required keyword specifies the code pageΓöé
  10102.   Γöé               Γöéthat the file was created under.  For        Γöé
  10103.   Γöé               Γöéexample:                                     Γöé
  10104.   Γöé               ΓöéCODEPAGE = 437                               Γöé
  10105.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10106.   ΓöéFILELIST       ΓöéThis required keyword specifies the name of  Γöé
  10107.   Γöé               Γöéthe file list control file. This control fileΓöé
  10108.   Γöé               Γöécontains a list of files that make up each   Γöé
  10109.   Γöé               Γöéfeature, identifies on which media units theyΓöé
  10110.   Γöé               Γöéreside in the installation package, and      Γöé
  10111.   Γöé               Γöéspecifies the destination to which they will Γöé
  10112.   Γöé               Γöébe copied.  For example:                     Γöé
  10113.   Γöé               ΓöéFILELIST = "FILELIST.TLK"                    Γöé
  10114.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10115.   ΓöéGROUPCOUNT     ΓöéThis required keyword specifies the number ofΓöé
  10116.   Γöé               Γöésubsystems in the installation package.  All Γöé
  10117.   Γöé               Γöégroups are counted, including group 0 (if    Γöé
  10118.   Γöé               Γöépresent).  For example:                      Γöé
  10119.   Γöé               ΓöéGROUPCOUNT = 10                              Γöé
  10120.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10121.   ΓöéMUNITCOUNT     ΓöéThis required keyword specifies the number ofΓöé
  10122.   Γöé               Γöémedia units (diskettes, CDs) that will be    Γöé
  10123.   Γöé               Γöéused if all subsystems are installed.  This  Γöé
  10124.   Γöé               Γöénumber must be greater than 0.  This is the  Γöé
  10125.   Γöé               Γöénumber of diskettes or CDs on which the      Γöé
  10126.   Γöé               Γöéinstallation package resides.  For example:  Γöé
  10127.   Γöé               ΓöéMUNITCOUNT = 6                               Γöé
  10128.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10129.   ΓöéMEDIANAME      ΓöéThis required keyword specifies a unique     Γöé
  10130.   Γöé               Γöémedia name, which is a character string on   Γöé
  10131.   Γöé               Γöéthe diskette or CD label.  For each media    Γöé
  10132.   Γöé               Γöéunit, this keyword must be repeated once, in Γöé
  10133.   Γöé               Γöéthe form of a quoted string.  This           Γöé
  10134.   Γöé               Γöéinformation is used during installation to   Γöé
  10135.   Γöé               Γöéprompt the user to insert a diskette or CD   Γöé
  10136.   Γöé               Γöéwhen needed.  For example:                   Γöé
  10137.   Γöé               ΓöéMEDIANAME = "IBM Multimedia Presentation     Γöé
  10138.   Γöé               ΓöéManager Toolkit/2              Installation  Γöé
  10139.   Γöé               ΓöéDiskette 1"                                  Γöé
  10140.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10141.   ΓöéSOURCEDIR      ΓöéThis optional keyword specifies the name of aΓöé
  10142.   Γöé               Γöésource directory and its associated number.  Γöé
  10143.   Γöé               ΓöéThis keyword can be repeated and is specifiedΓöé
  10144.   Γöé               Γöéby a quoted string followed by an equal sign Γöé
  10145.   Γöé               Γöé(=) and a number.  The number is used to     Γöé
  10146.   Γöé               Γöéidentify the particular directory in later   Γöé
  10147.   Γöé               Γöéscripts.  This can be NULL, in which case twoΓöé
  10148.   Γöé               Γöédefault backslash characters (\\) are used   Γöé
  10149.   Γöé               Γöéwith an encoding of 0.  The path must be     Γöé
  10150.   Γöé               Γöésurrounded by path separators.  For example: Γöé
  10151.   Γöé               ΓöéSOURCEDIR="\\LIB\\" = 1                      Γöé
  10152.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10153.   ΓöéDESTINDIR      ΓöéThis optional keyword specifies the name of aΓöé
  10154.   Γöé               Γöédestination directory and its associated     Γöé
  10155.   Γöé               Γöénumber.  This keyword can be repeated and is Γöé
  10156.   Γöé               Γöéspecified by a quoted string followed by an  Γöé
  10157.   Γöé               Γöéequal sign (=) and a number.  The number is  Γöé
  10158.   Γöé               Γöéused to identify the particular directory in Γöé
  10159.   Γöé               Γöélater scripts.  This can be NULL, in which   Γöé
  10160.   Γöé               Γöécase two default backslash characters (\\)   Γöé
  10161.   Γöé               Γöéare used with an encoding of 0.  The path    Γöé
  10162.   Γöé               Γöémust be surrounded by path separators (\\).  Γöé
  10163.   Γöé               ΓöéFor example: For example:                    Γöé
  10164.   Γöé               ΓöéDESTINDIR = "\\MMOS2\\" = 0                  Γöé
  10165.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  10166.  
  10167.  Observe the following guidelines when you create or change a CONTROL.SCR 
  10168.  header: 
  10169.  
  10170.    o  You must place the keywords MUNITCOUNT and MEDIANAME so that MUNITCOUNT 
  10171.       comes directly before MEDIANAME.  The order of the other keywords is not 
  10172.       significant. 
  10173.  
  10174.    o  Each destination directory (DESTINDIR) must have a unique number. 
  10175.  
  10176.    o  A subsystem group can be spread across several media units.  It does not 
  10177.       have to reside on one media unit. 
  10178.  
  10179.    o  You can define any directory.  MINSTALL will create any subdirectories 
  10180.       defined with the DESTINDIR keyword that do not exist. 
  10181.  
  10182.    o  If you move the installation package files to media of a different size, 
  10183.       the number of media units (MEDIACOUNT) may change. 
  10184.  
  10185.    o  You may use comments in the header section in the form of blank lines or 
  10186.       text enclosed with /* and */.  You may not use nested comments. 
  10187.  
  10188.    o  You may use blank spaces around the equal sign; blank spaces are ignored. 
  10189.  
  10190.    o  If you want to use a double quotation mark or a backslash in a string, 
  10191.       you must precede it with the escape character (\). 
  10192.  
  10193.    o  You may use the escape sequence \n (new line). 
  10194.  
  10195.  
  10196. ΓòÉΓòÉΓòÉ 7.1.2. CONTROL.SCR Subsystem Definition ΓòÉΓòÉΓòÉ
  10197.  
  10198. The subsystem definition section of the CONTROL.SCR file follows the header 
  10199. section and contains the definitions for each of the subsystems in the 
  10200. installation package.  A block of information must be included for each 
  10201. feature. 
  10202.  
  10203. Each block of information in the subsystem definition section contains the 
  10204. following information: 
  10205.  
  10206.    o  The group or feature number 
  10207.    o  The feature name 
  10208.    o  The version of the component 
  10209.    o  The size of all the files for the feature installation 
  10210.    o  The names of the control files that change the INI files and CONFIG.SYS 
  10211.       statements 
  10212.    o  The names of DLL files and entry points 
  10213.  
  10214.  The following is an example of a CONTROL.SCR subsystem definition. 
  10215.  
  10216.   ssgroup  =0
  10217.   ssname   ="Toolkit_Base"
  10218.   ssversion="0.63.0"
  10219.   sssize   =13
  10220.  
  10221.   /*           - 7  = clock    */
  10222.   ssgroup  =7
  10223.   ssname   ="Clock Utility"
  10224.   ssversion="0.63.0"
  10225.   sssize   =839
  10226.   ssinich  ="TLKCLOCK.SCR"
  10227.  
  10228.   /*           - 8  = midiconv  */
  10229.   ssgroup  =8
  10230.   ssname   ="MIDI File Format Converter"
  10231.   ssversion="0.63.0"
  10232.   sssize   =170
  10233.   ssinich  ="TLKCONV.SCR"
  10234.  
  10235.   /*           - 3  = midiio   */
  10236.   ssgroup  =3
  10237.   ssname   ="MIDI IO Procedure"
  10238.   ssversion="0.63.0"
  10239.   sssize   =475
  10240.  
  10241.   /*           - 11 = mcistrng */
  10242.   ssgroup  =11
  10243.   ssname   ="Media Control Interface String Test"
  10244.   ssversion="0.63.0"
  10245.   sssize   =194
  10246.   ssinich  ="TLKSTRN.SCR"
  10247.  
  10248.   /*           - 9  = duet1   */
  10249.   ssgroup  =9
  10250.   ssname   ="Duet Player I"
  10251.   ssversion="0.63.0"
  10252.   sssize   =4854
  10253.   ssinich  ="TLKDUT1.SCR"
  10254.  
  10255.   /*           - 10 = duet2     */
  10256.   ssgroup  =10
  10257.   ssname   ="Duet Player II"
  10258.   ssversion="0.63.0"
  10259.   sssize   =816
  10260.   ssinich  ="TLKDUT2.SCR"
  10261.  
  10262.   /*           - 12 = inc, lib, and h   */
  10263.   ssgroup  =12
  10264.   ssname   ="Header Files, Include Files and Libraries"
  10265.   ssversion="0.63.0"
  10266.   sssize   =384
  10267.   ssconfigch="TOOLKIT.CH"
  10268.  
  10269.   /*           - 13 = prog ref   */
  10270.   ssgroup   =13
  10271.   ssname   ="Program Reference"
  10272.   ssversion="0.63.0"
  10273.   sssize   =400
  10274.   ssinich  ="TLKBOOKR.SCR"
  10275.  
  10276.   /*           - 14 = workbook   */
  10277.   ssgroup  =14
  10278.   ssname   ="Workbook"
  10279.   ssversion="0.63.0"
  10280.   sssize   =150
  10281.   ssinich  ="TLKBOOKW.SCR"
  10282.  
  10283.   /*           - 2 = avcinst   */
  10284.   ssgroup  =2
  10285.   ssname   ="AVC I/O Procedure Installation Utility"
  10286.   ssversion="0.63.0"
  10287.   sssize   =102
  10288.   ssinich  ="TLKIOPU.SCR"
  10289.  
  10290.   /*           - 4 = caseconv   */
  10291.   ssgroup  =4
  10292.   ssname   ="Case Converter I/O Procedure"
  10293.   ssversion="0.63.0"
  10294.   sssize   =82
  10295.  
  10296.  The CONTROL.SCR subsystem definition consists of the keywords shown in the 
  10297.  folloiwng table. 
  10298.  
  10299.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  10300.   ΓöéKeyword             ΓöéDescription                             Γöé
  10301.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10302.   ΓöéSSGROUP             ΓöéThis required keyword specifies the     Γöé
  10303.   Γöé                    Γöégroup.  This marks the beginning of a   Γöé
  10304.   Γöé                    Γöégroup and assigns it a number. Each     Γöé
  10305.   Γöé                    Γöégroup must have a unique number from    Γöé
  10306.   Γöé                    Γöé0-49 within the package; however, the   Γöé
  10307.   Γöé                    Γöésame number can be used with different  Γöé
  10308.   Γöé                    Γöéinstallation packages.  The groups are  Γöé
  10309.   Γöé                    Γöédisplayed in the installation main      Γöé
  10310.   Γöé                    Γöéselection window in ascending order by  Γöé
  10311.   Γöé                    Γöégroup number.  For example:             Γöé
  10312.   Γöé                    ΓöéSSGROUP = 5                             Γöé
  10313.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10314.   ΓöéSSNAME              ΓöéThis required keyword specifies the     Γöé
  10315.   Γöé                    Γöégroup name, as an ASCII string.  This   Γöé
  10316.   Γöé                    Γöékeyword is case sensitive and takes the Γöé
  10317.   Γöé                    Γöéform of a quoted string.  The name may  Γöé
  10318.   Γöé                    Γöéinclude special characters and may be   Γöé
  10319.   Γöé                    Γöétranslated.  The name is displayed in   Γöé
  10320.   Γöé                    Γöéthe main installation selection window. Γöé
  10321.   Γöé                    ΓöéFor example: SSNAME = "CD Audio"        Γöé
  10322.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10323.   ΓöéSSVERSION           ΓöéThis required keyword specifies the     Γöé
  10324.   Γöé                    Γöéversion of the group in the form of a   Γöé
  10325.   Γöé                    Γöéquoted string.  This string must be in  Γöé
  10326.   Γöé                    Γöéthe format "dd.dd.dd" (where dd         Γöé
  10327.   Γöé                    Γöérepresents digits).  Any version not    Γöé
  10328.   Γöé                    Γöéspecified in this format will be        Γöé
  10329.   Γöé                    Γöéconverted to that format.  All string   Γöé
  10330.   Γöé                    Γöéitems that are not digits or periods    Γöé
  10331.   Γöé                    Γöéwill be converted to zeros. Any periods Γöé
  10332.   Γöé                    Γöéafter the second period will be         Γöé
  10333.   Γöé                    Γöéconverted to zeros.  For example:       Γöé
  10334.   Γöé                    ΓöéSSVERSION = "1.1.0"                     Γöé
  10335.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10336.   ΓöéSSSIZE              ΓöéThis required keyword specifies the     Γöé
  10337.   Γöé                    Γöétotal size of all the files in the      Γöé
  10338.   Γöé                    Γöégroup.  The size denotes the number of  Γöé
  10339.   Γöé                    Γöébytes in thousands (500 = 500KB).  This Γöé
  10340.   Γöé                    Γöénumber is used to help determine if     Γöé
  10341.   Γöé                    Γöéthere is enough disk space to support   Γöé
  10342.   Γöé                    Γöéthe installation.  If you do not know   Γöé
  10343.   Γöé                    Γöéthe correct size of a group, overstate  Γöé
  10344.   Γöé                    Γöéits size.  For example:                 Γöé
  10345.   Γöé                    ΓöéSSSIZE = 1024                           Γöé
  10346.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10347.   ΓöéSSINICH             ΓöéThis optional keyword specifies the nameΓöé
  10348.   Γöé                    Γöéof the file that contains changes to an Γöé
  10349.   Γöé                    ΓöéINI file.  If this statement is missing,Γöé
  10350.   Γöé                    Γöéthere are no changes to an INI file.    Γöé
  10351.   Γöé                    ΓöéFor example:                            Γöé
  10352.   Γöé                    ΓöéSSINICH = "ACPAINI.CH"                  Γöé
  10353.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10354.   ΓöéSSCONFIGCH          ΓöéThis optional keyword specifies the nameΓöé
  10355.   Γöé                    Γöéof the file that contains the changes toΓöé
  10356.   Γöé                    Γöéthe CONFIG.SYS file.  If this statement Γöé
  10357.   Γöé                    Γöéis missing, there are no changes to the Γöé
  10358.   Γöé                    ΓöéCONFIG.SYS file.  For example:          Γöé
  10359.   Γöé                    ΓöéSSCONFIGCH = "ACPACON.CH"               Γöé
  10360.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10361.   ΓöéSSCOREQS            ΓöéThis optional keyword specifies a list  Γöé
  10362.   Γöé                    Γöéof corequisites needed for this group toΓöé
  10363.   Γöé                    Γöérun.  It specifies what other groups theΓöé
  10364.   Γöé                    Γöécurrent group depends on.  These other  Γöé
  10365.   Γöé                    Γöégroups must be installed for the currentΓöé
  10366.   Γöé                    Γöégroup to function.  (If this statement  Γöé
  10367.   Γöé                    Γöéis missing, there are no corequisites.) Γöé
  10368.   Γöé                    ΓöéThe corequisite is identified by its    Γöé
  10369.   Γöé                    Γöégroup number. Corequisite groups should Γöé
  10370.   Γöé                    Γöépoint to each other only if they requireΓöé
  10371.   Γöé                    Γöéeach other.  It is possible to have     Γöé
  10372.   Γöé                    Γöégroup A list group B as a corequisite   Γöé
  10373.   Γöé                    Γöéand group B have no corequisites.  If   Γöé
  10374.   Γöé                    Γöéthe user selects a group with           Γöé
  10375.   Γöé                    Γöécorequisites, but does not select all   Γöé
  10376.   Γöé                    Γöéthe corequisites, the user is notified  Γöé
  10377.   Γöé                    Γöébefore the installation starts.  This   Γöé
  10378.   Γöé                    Γöéentry can be repeated as necessary.  ForΓöé
  10379.   Γöé                    Γöéexample:                                Γöé
  10380.   Γöé                    ΓöéSSCOREQS = 1                            Γöé
  10381.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10382.   ΓöéSSICON              ΓöéThis optional keyword names the icon    Γöé
  10383.   Γöé                    Γöéfile for this group that is     to be   Γöé
  10384.   Γöé                    Γöédisplayed in the installation main      Γöé
  10385.   Γöé                    Γöéselection window.  The icon file to be  Γöé
  10386.   Γöé                    Γöédisplayed in the selection window must  Γöé
  10387.   Γöé                    Γöéreside on the first installation media  Γöé
  10388.   Γöé                    Γöéunit.  If this statement is missing, a  Γöé
  10389.   Γöé                    Γöédefault icon is used.  For example:     Γöé
  10390.   Γöé                    ΓöéSSICON = "ACPA.ICO"                     Γöé
  10391.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10392.   ΓöéSSDLL               ΓöéThis optional keyword names a DLL file  Γöé
  10393.   Γöé                    Γöéthat is to be run during the            Γöé
  10394.   Γöé                    Γöéinstallation process.  The DLL          Γöé
  10395.   Γöé                    Γöéreferenced will be run after all files  Γöé
  10396.   Γöé                    Γöéare copied to the destination, but      Γöé
  10397.   Γöé                    Γöébefore any script processing is         Γöé
  10398.   Γöé                    Γöéperformed.  If this keyword is present, Γöé
  10399.   Γöé                    Γöéthe SSDLLENTRY keyword must also be     Γöé
  10400.   Γöé                    Γöépresent.  For example:                  Γöé
  10401.   Γöé                    ΓöéSSDLL="MY.DLL"                          Γöé
  10402.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10403.   ΓöéSSDLLENTRY          ΓöéThis optional keyword specifies the nameΓöé
  10404.   Γöé                    Γöéof the entry point into SSDLL in the    Γöé
  10405.   Γöé                    Γöéform of a quoted string.  If this       Γöé
  10406.   Γöé                    Γöékeyword is present, the SSDLL keyword   Γöé
  10407.   Γöé                    Γöémust also be present.  For example:     Γöé
  10408.   Γöé                    ΓöéSSDLLENTRY="MyEntry"                    Γöé
  10409.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10410.   ΓöéSSTERMDLL           ΓöéThis optional keyword names a DLL file  Γöé
  10411.   Γöé                    Γöéthat is to be run during the            Γöé
  10412.   Γöé                    Γöéinstallation process.  The DLL          Γöé
  10413.   Γöé                    Γöéreferenced will be run after all files  Γöé
  10414.   Γöé                    Γöéare copied to the destination and after Γöé
  10415.   Γöé                    Γöéall script processing is done. The      Γöé
  10416.   Γöé                    Γöépurpose of this keyword is to allow for Γöé
  10417.   Γöé                    Γöéprocessing to occur on a fully          Γöé
  10418.   Γöé                    Γöéconfigured multimedia system.  If this  Γöé
  10419.   Γöé                    Γöékeyword is present, the SSTERMDLLENTRY  Γöé
  10420.   Γöé                    Γöékeyword must also be present.  For      Γöé
  10421.   Γöé                    Γöéexample:                                Γöé
  10422.   Γöé                    ΓöéSSTERMDLL="MYTERM.DLL"                  Γöé
  10423.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10424.   ΓöéSSTERMDLLENTRY      ΓöéThis optional keyword specifies the nameΓöé
  10425.   Γöé                    Γöéof the entry point into SSTERMDLL in theΓöé
  10426.   Γöé                    Γöéform of a quoted string.  If this       Γöé
  10427.   Γöé                    Γöékeyword is present, the SSTERMDLL       Γöé
  10428.   Γöé                    Γöékeyword must also be present.  For      Γöé
  10429.   Γöé                    Γöéexample:                                Γöé
  10430.   Γöé                    ΓöéSSTERMDLLENTRY="MyTermEntry"            Γöé
  10431.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10432.   ΓöéSSDLLINPUTPARMS     ΓöéThis optional keyword specifies         Γöé
  10433.   Γöé                    Γöéinformation needed by an installation   Γöé
  10434.   Γöé                    ΓöéDLL in the form of a quoted string.     Γöé
  10435.   Γöé                    ΓöéThis information is passed as a         Γöé
  10436.   Γöé                    Γöéparameter to the installation DLL as    Γöé
  10437.   Γöé                    Γöéspecified in the SSDLL or SSTERMDLL     Γöé
  10438.   Γöé                    Γöékeywords. For example:                  Γöé
  10439.   Γöé                    ΓöéSSDLLINPUTPARMS="5, FILE.NAM, 1.1.0"    Γöé
  10440.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10441.   ΓöéSSSELECT            ΓöéThis optional keyword determines the    Γöé
  10442.   Γöé                    Γöépreselection of subsystems for          Γöé
  10443.   Γöé                    Γöéinstallation.  Five values are          Γöé
  10444.   Γöé                    Γöésupported:                              Γöé
  10445.   Γöé                    Γöé"ALWAYS" - This value specifies that theΓöé
  10446.   Γöé                    Γöégroup will always be installed.  It is  Γöé
  10447.   Γöé                    Γöéthe only valid value for group 0.       Γöé
  10448.   Γöé                    ΓöéGroups with this value will not be      Γöé
  10449.   Γöé                    Γöédisplayed in the installation main      Γöé
  10450.   Γöé                    Γöéselection window.                       Γöé
  10451.   Γöé                    Γöé"REQUIRED" - This value specifies that  Γöé
  10452.   Γöé                    Γöéthe group will be preselected for       Γöé
  10453.   Γöé                    Γöéinstallation.  If the group had been    Γöé
  10454.   Γöé                    Γöépreviously installed, it cannot be      Γöé
  10455.   Γöé                    Γöéunselected by the user if this          Γöé
  10456.   Γöé                    Γöéinstallation package is newer than the  Γöé
  10457.   Γöé                    Γöéinstalled version.  If the group had notΓöé
  10458.   Γöé                    Γöébeen previously installed, it can be    Γöé
  10459.   Γöé                    Γöéunselected by the user.                 Γöé
  10460.   Γöé                    Γöé"VERSION" - This value specifies that   Γöé
  10461.   Γöé                    Γöéthe group will be preselected only if itΓöé
  10462.   Γöé                    Γöéwas previously installed and this       Γöé
  10463.   Γöé                    Γöéinstallation package is newer than the  Γöé
  10464.   Γöé                    Γöéinstalled version.  However, it can be  Γöé
  10465.   Γöé                    Γöéunselected by the user.                 Γöé
  10466.   Γöé                    Γöé"YES" - This value specifies that the   Γöé
  10467.   Γöé                    Γöégroup will be preselected whether or notΓöé
  10468.   Γöé                    Γöéit was previously installed.  It can be Γöé
  10469.   Γöé                    Γöéunselected by the user. This is the     Γöé
  10470.   Γöé                    Γöédefault.                                Γöé
  10471.   Γöé                    Γöé"NO" - This value specifies that the    Γöé
  10472.   Γöé                    Γöégroup is never preselected but can be   Γöé
  10473.   Γöé                    Γöéselected by the user.                   Γöé
  10474.   Γöé                    Γöé"BASENEWER" - This value specifies that Γöé
  10475.   Γöé                    Γöéfiles belonging to this group will only Γöé
  10476.   Γöé                    Γöébe copied if the user's machine has no  Γöé
  10477.   Γöé                    Γöépackage installed or if the package     Γöé
  10478.   Γöé                    Γöéinstalled is older than the current     Γöé
  10479.   Γöé                    Γöépackage.                                Γöé
  10480.   Γöé                    Γöé"ONLYNEWER" - This value specifies that Γöé
  10481.   Γöé                    Γöéa user will not be able to install an   Γöé
  10482.   Γöé                    Γöéolder version of a package on top of a  Γöé
  10483.   Γöé                    Γöénewer version. Files belonging to this  Γöé
  10484.   Γöé                    Γöégroup will only be copied if the user   Γöé
  10485.   Γöé                    Γöéhas an older version (or the same       Γöé
  10486.   Γöé                    Γöéversion) installed.  If no version is   Γöé
  10487.   Γöé                    Γöéinstalled or if the version installed isΓöé
  10488.   Γöé                    Γöéhigher than the one in the package, no  Γöé
  10489.   Γöé                    Γöéfiles will be copied.                   Γöé
  10490.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  10491.  
  10492.  Observe the following guidelines when you create or change a CONTROL.SCR 
  10493.  subsystem definition: 
  10494.  
  10495.    o  The SSGROUP keyword must be the first statement in the information block. 
  10496.    o  A group may reside on different media. 
  10497.    o  Each statement in the information block must have a value. 
  10498.    o  You may use comments in an information block in the form of blank lines 
  10499.       or text enclosed with /* and */.  You may not use nested comments. 
  10500.    o  You may use blank spaces around the equal sign; blank spaces are ignored. 
  10501.    o  If you want to use a double quotation mark or a backslash in a string, 
  10502.       you must precede it with the escape character (\). 
  10503.    o  You may use the escape sequence \n (new line). 
  10504.  
  10505.  
  10506. ΓòÉΓòÉΓòÉ 7.2. File List Control File ΓòÉΓòÉΓòÉ
  10507.  
  10508. The master control file, CONTROL.SCR, specifies a FILELIST keyword which 
  10509. identifies the name of a file list control file that lists all the installable 
  10510. files in the installation package.  The file list control file also contains 
  10511. the following: 
  10512.  
  10513.    o  The name of the file 
  10514.    o  The number of the media unit where the file is stored 
  10515.    o  The destination directory where the file will be copied 
  10516.    o  The group the file is identified with 
  10517.  
  10518.  The following is an example of a file list control file. (Ellipsis points 
  10519.  indicate additional entries.)  The first nonblank, noncomment record is a 
  10520.  count of the number of files (or file name lines) in the file.  For example, 
  10521.  145. 
  10522.  
  10523.   /***********************************************************************/
  10524.   /* This file contains install information. Strings enclosed in C type  */
  10525.   /* comments like this line are comment lines. Blank lines are ignored. */
  10526.   /* Non-blank lines will be parsed and extraneous characters will       */
  10527.   /* cause errors.  First non-comment line must be the total number of   */
  10528.   /* files to be installed.                                              */
  10529.   /*                                                                     */
  10530.   /* Total number of entries is 145                                      */
  10531.   /***********************************************************************/
  10532.       145
  10533.   /***********************************************************************/
  10534.   /* All files on the install disks are listed below.  Other information */
  10535.   /* is also given, as follows:                                          */
  10536.   /*                                                                     */
  10537.   /* Disk#    - The number of the disk on which the file resides.        */
  10538.   /*            (Ignored if installing from CD-ROM). These are sorted    */
  10539.   /*            from 0 to the number of disks, ascending.                */
  10540.   /*                                                                     */
  10541.   /* Group#   - The logical group to which the file belongs. Group       */
  10542.   /*            starts at 0.                                             */
  10543.   /*                                                                     */
  10544.   /* Dest#    - The destination subdirectory into which the file will be */
  10545.   /*            copied.  Dest# starts at 0.                              */
  10546.   /*                                                                     */
  10547.   /* Source#  - The source subdirectory from which the file will be      */
  10548.   /*            copied.                                                  */
  10549.   /*                                                                     */
  10550.   /* FileName - The base filename.                                       */
  10551.   /* sourcedir="\\"                     = 0                              */
  10552.   /* sourcedir="\\lib\\"                = 1                              */
  10553.   /* sourcedir="\\h\\"                  = 2                              */
  10554.   /* sourcedir="\\clock\\"              = 7                              */
  10555.   /* sourcedir="\\duet1\\"              = 9                              */
  10556.   /* sourcedir="\\duet2\\"              = 10                             */
  10557.   /* sourcedir="\\mcistrng\\"           = 11                             */
  10558.   /* sourcedir="\\inc\\"                = 13                             */
  10559.   /* sourcedir="\\book\\"               = 16                             */
  10560.   /* sourcedir="\\cdmct\\"              = 17                             */
  10561.   /* sourcedir="\\avcinst\\"            = 18                             */
  10562.   /* sourcedir="\\caseconv\\"           = 19                             */
  10563.   /*                                                                     */
  10564.   /* destindir="\\mmos2\\"                                = 0            */
  10565.   /* destindir="\\mmos2\\mmtoolkt\\lib\\"                 = 1            */
  10566.   /* destindir="\\mmos2\\mmtoolkt\\h\\"                   = 2            */
  10567.   /* destindir="\\mmos2\\install\\"                       = 4            */
  10568.   /* destindir="\\mmos2\\mmtoolkt\\samples\\clock\\"      = 7            */
  10569.   /* destindir="\\mmos2\\mmtoolkt\\samples\\duet1\\"      = 9            */
  10570.   /* destindir="\\mmos2\\mmtoolkt\\samples\\duet2\\"      = 10           */
  10571.   /* destindir="\\mmos2\\mmtoolkt\\samples\\mcistrng\\"   = 11           */
  10572.   /* destindir="\\mmos2\\mmtoolkt\\samples\\cf\\"         = 12           */
  10573.   /* destindir="\\mmos2\\mmtoolkt\\inc\\"                 = 13           */
  10574.   /* destindir="\\mmos2\\dll\\"                           = 14           */
  10575.   /* destindir="\\mmos2\\help\\"                          = 15           */
  10576.   /* destindir="\\mmos2\\mmtoolkt\\samples\\book\\"       = 16           */
  10577.   /* destindir="\\mmos2\\mmtoolkt\\samples\\cdmct\\"      = 17           */
  10578.   /* destindir="\\mmos2\\mmtoolkt\\samples\\avcinst\\"    = 18           */
  10579.   /* destindir="\\mmos2\\mmtoolkt\\samples\\caseconv\\"   = 19           */
  10580.   /*                                                                     */
  10581.   /*        groups                                                       */
  10582.   /*            - 2  = AVC I/O Procedure Installation Utility            */
  10583.   /*            - 3  = MIDI IO Procedure                                 */
  10584.   /*            - 4  = Case Converter I/O Procedure                      */
  10585.   /*            - 7  = Clock Utility                                     */
  10586.   /*            - 9  = Duet Player I                                     */
  10587.   /*            - 10 = Duet Player II                                    */
  10588.   /*            - 11 = MCI String Test                                   */
  10589.   /*            - 12 = Header Files, Include Files and Libraries         */
  10590.   /*            - 13 = Program Reference                                 */
  10591.   /*            - 14 = Workbook                                          */
  10592.   /*                                                                     */
  10593.   /* Disk# Group# Dest# Source#  FileName                                */
  10594.   /***********************************************************************/
  10595.  
  10596.   /*           mmtoolkt\samples\cf   9   14K                             */
  10597.       0    0   12    0    "CONTROL.SCR"
  10598.       0    0   12    0    "FILELIST.TLK"
  10599.       0    0   12    0    "TLKCLOCK.SCR"
  10600.       0    0   12    0    "TLKIOPU.SCR"
  10601.       0    0   12    0    "TLKCONV.SCR"
  10602.   .
  10603.   .
  10604.   .
  10605.  
  10606.       0    0   4     0    "TLKCLOCK.SCR"
  10607.       0    0   4     0    "TLKIOPU.SCR"
  10608.       0    0   4     0    "TLKCONV.SCR"
  10609.       0    0   4     0    "TLKSTRN.SCR"
  10610.   .
  10611.   .
  10612.   .
  10613.  
  10614.       0   10   12    0    "TOOLKIT.CH"
  10615.  
  10616.   /*           mmtoolkt\inc     10   83K                                 */
  10617.       0   12   13   13    "ACB.INC"
  10618.       0   12   13   13    "AUDIO.INC"
  10619.       0   12   13   13    "DCB.INC"
  10620.   .
  10621.   .
  10622.   .
  10623.  
  10624.   /*           mmtoolkt\lib     11   50K                                 */
  10625.       0   12    1    1    "AUDCTL.LIB"
  10626.       0   12    1    1    "DSPMGRDL.LIB"
  10627.       0   12    1    1    "LVDP8000.LIB"
  10628.   .
  10629.   .
  10630.   .
  10631.  
  10632.   /*           mmtoolkt\h         22  269K                               */
  10633.       0   12    2    2    "ACB.H"
  10634.       0   12    2    2    "AUDCTL.H"
  10635.       0   12    2    2    "AUDIO.H"
  10636.   .
  10637.   .
  10638.   .
  10639.  
  10640.   /*           mmtoolkt\samples\duet2       12    390k                   */
  10641.       0   10   10   10    "duet2.c"
  10642.       0   10   10   10    "duet2.h"
  10643.       0   10   10   10    "duet2.rc"
  10644.   .
  10645.   .
  10646.   .
  10647.  
  10648.   /*           mmtoolkt\samples\avcinst   9   102K                       */
  10649.       0    2   18   18    "avcinst.dlg"
  10650.       0    2   18   18    "avcinst.def"
  10651.       0    2   18   18    "avcinst.ipf"
  10652.   .
  10653.   .
  10654.   .
  10655.  
  10656.   /*           mmtoolkt\samples\caseconv  8    72K                       */
  10657.       0    4   19   19    "convcvsr.c"
  10658.       0    4   19   19    "convproc.rc"
  10659.       0    4   19   19    "convconv.c"
  10660.   .
  10661.   .
  10662.   .
  10663.  
  10664.   /*           mmtoolkt\samples\midiconv  2    44K                       */
  10665.       1    8   15    0    "midiconv.hlp"
  10666.       1    8    0    0    "midiconv.exe"
  10667.  
  10668.   /*           mmtoolkt\samples\mcistrng  14   194K                      */
  10669.       1   11   11   11    "mcistrng.c"
  10670.       1   11   11   11    "mcistrng.h"
  10671.       1   11   11   11    "mcistrng.rc"
  10672.   .
  10673.   .
  10674.   .
  10675.  
  10676.  The following table describes the columns in the file list control file. 
  10677.  
  10678.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  10679.   ΓöéColumn         ΓöéDescription                                  Γöé
  10680.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10681.   ΓöéMedia#         ΓöéSpecifies the number of the media unit       Γöé
  10682.   Γöé               Γöé(diskette or CD) where the file is stored.   Γöé
  10683.   Γöé               ΓöéThe units are numbered starting from 0.  ThisΓöé
  10684.   Γöé               Γöénumber will be used for all installation     Γöé
  10685.   Γöé               Γöémedia except for the hard disk.  The Media#  Γöé
  10686.   Γöé               Γöécolumn must be sorted in ascending order.  A Γöé
  10687.   Γöé               Γöémedia unit does not have to be filled (there Γöé
  10688.   Γöé               Γöécan be unused space on any numbered unit).   Γöé
  10689.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10690.   ΓöéGroup or       ΓöéSpecifies the group to which the file        Γöé
  10691.   Γöésubsystem#     Γöébelongs.  The group number must be a positiveΓöé
  10692.   Γöé               Γöéinteger, with numbering starting at 0 (the   Γöé
  10693.   Γöé               Γöégroups are defined in CONTROL.SCR by the     Γöé
  10694.   Γöé               ΓöéSSGROUP keyword).  This number is used to    Γöé
  10695.   Γöé               Γöédetermine which files belong to a group      Γöé
  10696.   Γöé               Γöéselected for installation.                   Γöé
  10697.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10698.   ΓöéDestination#   ΓöéSpecifies the destination subdirectory where Γöé
  10699.   Γöé               Γöéthe file will be copied.  The encoding       Γöé
  10700.   Γöé               Γöémapping is defined in the CONTROL.SCR file byΓöé
  10701.   Γöé               Γöéthe DESTINDIR keyword.  This field must      Γöé
  10702.   Γöé               Γöéalways be a defined number (for example, 14  Γöé
  10703.   Γöé               Γöéfor the \MMOS2\DLL path).                    Γöé
  10704.   Γöé               ΓöéIf you specify a DESTINDIR statement in the  Γöé
  10705.   Γöé               Γöémaster control file, you only have to specifyΓöé
  10706.   Γöé               Γöéthe corresponding group number (for example, Γöé
  10707.   Γöé               Γöé1).                                          Γöé
  10708.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10709.   ΓöéSource#        ΓöéSpecifies the path name of the source file.  Γöé
  10710.   Γöé               ΓöéThe encoding mapping is defined in the       Γöé
  10711.   Γöé               ΓöéCONTROL.SCR file by the SOURCEDIR keyword.   Γöé
  10712.   Γöé               ΓöéThis field must always be defined with a     Γöé
  10713.   Γöé               Γöénumber (for example, 1 for the \LIB path).   Γöé
  10714.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  10715.   ΓöéFile name      ΓöéSpecifies the source file name, which must beΓöé
  10716.   Γöé               Γöéin double quotes.  For example,              Γöé
  10717.   Γöé               Γöé"MINSTALL.EXE".                              Γöé
  10718.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  10719.  
  10720.  
  10721. ΓòÉΓòÉΓòÉ 7.3. Change Control Files ΓòÉΓòÉΓòÉ
  10722.  
  10723. Change control files are script files that make changes to the CONFIG.SYS and 
  10724. INI files.  The master control file, CONTROL.SCR, identifies the change control 
  10725. files when you specify the SSCONFIGCH and SSINICH keywords. 
  10726.  
  10727.  
  10728. ΓòÉΓòÉΓòÉ 7.3.1. Supported Macros ΓòÉΓòÉΓòÉ
  10729.  
  10730. Macros can be used in the change control files. Macros can also be used in the 
  10731. master control file. When a supported macro is used, drives and paths do not 
  10732. have to be identified until the time of installation. At installation, macros 
  10733. can perform the following: 
  10734.  
  10735.    o  Replace the full destination path of the file 
  10736.    o  Replace the installation target drive letter 
  10737.    o  Replace the default destination drive and path as defined in CONTROL.SCR 
  10738.    o  Replace the startup (boot) drive letter of the operating system 
  10739.    o  Delete specified files 
  10740.  
  10741.  The following describes the supported macros. 
  10742.  
  10743.  Macro                              Description 
  10744.  
  10745.   destindir = "$(DELETE)\\path\\"
  10746.   = number
  10747.                                     The $(DELETE) macro can only be used with 
  10748.                                     the DESTINDIR keyword in the master control 
  10749.                                     file. The relative number is listed in the 
  10750.                                     file list control file.  Every file that 
  10751.                                     has this number will be deleted from the 
  10752.                                     user's machine. 
  10753.  
  10754.  $(DEST)filename                    $(DEST) is replaced with the full 
  10755.                                     destination path of the file.  For example: 
  10756.  
  10757.                                                                         $(DEST)CLOCK.EXE
  10758.  
  10759.                                     becomes 
  10760.  
  10761.                                                                         D:\MMOS2\MMTOOLKT\SAMPLES\CLOCK\CLOCK.EXE
  10762.  
  10763.  $(DRIVE)                           $(DRIVE) is replaced with the installation 
  10764.                                     target drive letter.  (Do not append a 
  10765.                                     colon.)  For example: 
  10766.  
  10767.                                                                         $(DRIVE)\MMOS2\TEST1.EXE
  10768.  
  10769.                                     becomes 
  10770.  
  10771.                                                                         D:\MMOS2\TEST1.EXE
  10772.  
  10773.  $(DIR)#                            #  is the number of the destination 
  10774.                                     directory as stated in the CONTROL.SCR 
  10775.                                     file.  The macro is replaced with the drive 
  10776.                                     and path defined in the CONTROL.SCR file 
  10777.                                     for the specified DESTINDIR definition. 
  10778.                                     For example: 
  10779.  
  10780.                                                                         $(DIR)4\MINSTALL.LOG
  10781.  
  10782.                                     becomes 
  10783.  
  10784.                                                                         D:\MMOS2\INSTALL\MINSTALL.LOG
  10785.  
  10786.  $(BOOT)                            Replaces the startup (boot) drive letter of 
  10787.                                     the operating system. (Do not append a 
  10788.                                     colon.)  For example: 
  10789.  
  10790.                                                                         $(BOOT)\OS2\NEW.SYS
  10791.  
  10792.                                     becomes 
  10793.  
  10794.                                                                         C:\OS2\NEW.SYS
  10795.  
  10796.                                     where C: is the drive on which OS/2 is 
  10797.                                     installed. 
  10798.  
  10799.  Note:  Using multiple macros is supported. 
  10800.  
  10801.  
  10802. ΓòÉΓòÉΓòÉ 7.3.2. CONFIG.SYS Change Control Files ΓòÉΓòÉΓòÉ
  10803.  
  10804. Some multimedia subsystems require unique statements in the CONFIG.SYS file. 
  10805. The CONFIG.SYS change control file creates, adds, merges, and replaces 
  10806. CONFIG.SYS statements through the use of keywords.  The master control file, 
  10807. CONTROL.SCR, specifies a SSCONFIGCH keyword for each file that contains changes 
  10808. to the CONFIG.SYS file. 
  10809.  
  10810. The following describes the keywords used in the CONFIG.SYS file. 
  10811.  
  10812.  Keyword           Description 
  10813.  
  10814.  DEVICE            Adds new device statements to the CONFIG.SYS file.  The 
  10815.                    right side of the equal sign must be a quoted string.  For 
  10816.                    example: 
  10817.  
  10818.                                       DEVICE="$(DEST)DEVICE.SYS /parameters"
  10819.  
  10820.                    A supported macro may be used.  Ordinarily, the $(DEST) 
  10821.                    macro is used. When the $(DEST) macro is used, MINSTALL 
  10822.                    searches for the file named DEVICE.SYS in the control files. 
  10823.                    If MINSTALL finds it, the $(DEST) macro is replaced with the 
  10824.                    full path of the destination of that file, and the final 
  10825.                    statement is added to the CONFIG.SYS file.  For example: 
  10826.  
  10827.                                       DEVICE=d:\SOMEDIR\DEVICE.SYS /parameters
  10828.  
  10829.  MERGE             Merges data into an existing statement in the CONFIG.SYS 
  10830.                    file.  For example: 
  10831.  
  10832.                                       MERGE "LIBPATH"=1
  10833.  
  10834.                    The number 1 relates to the CONTROL.SCR file destination 
  10835.                    subdirectory 1. After MINSTALL finds subdirectory 1, it adds 
  10836.                    this path at the end of the current LIBPATH statement. (A 
  10837.                    semicolon ends a line and is used between components.)  If 
  10838.                    there is no current LIBPATH statement in the file, a LIBPATH 
  10839.                    statement will be generated with the specified path. 
  10840.  
  10841.                    If the right side of the equal sign is not a numeric string, 
  10842.                    the line is copied as is.  For example: 
  10843.  
  10844.                                       MERGE "SOMEVAR"="WHOKNOWS"
  10845.  
  10846.                    If the SOMEVAR environment variable exists, WHOKNOWS is 
  10847.                    added at the end of the statement. If the variable does not 
  10848.                    exist, the statement: 
  10849.  
  10850.                                       SOMEVAR=WHOKNOWS
  10851.  
  10852.                    is added to the CONFIG.SYS file. 
  10853.  
  10854.                    Note:  Refer to the TOOLKIT.CH file in the 
  10855.                           \TOOLKIT\SAMPLES\MM\CF subdirectory. 
  10856.  
  10857.                    You also can insert SET following the first quotation mark 
  10858.                    character inside the first quoted string.  The word SET is 
  10859.                    ignored unless you are adding a new line to the CONFIG.SYS 
  10860.                    file.  In this case, SET is appended to the beginning of the 
  10861.                    line.  For example: 
  10862.  
  10863.                                       MERGE "SET SOMEVAR"="WHOKNOWS"
  10864.  
  10865.  REPLACE           Replaces an existing CONFIG.SYS statement. 
  10866.  
  10867.                    REPLACE can be followed by a variable name or a variable 
  10868.                    name preceded by SET inside a quoted string.  On the right 
  10869.                    side of the equal sign is either a number or a quoted 
  10870.                    string.  A supported macro may be used. For example: 
  10871.  
  10872.                                       REPLACE "SET MMBASE" = 0
  10873.  
  10874.                    If the variable MMBASE is in the CONFIG.SYS file, then the 
  10875.                    value is changed to 0.  If the variable does not exist, the 
  10876.                    following statement is added: 
  10877.  
  10878.                                       SET MMBASE=C:\MMOS2;
  10879.  
  10880.                    Note:  This statement replaces the existing statement.  Do 
  10881.                           not use this statement in conjunction with a path 
  10882.                           statement. 
  10883.  
  10884.  
  10885. ΓòÉΓòÉΓòÉ 7.3.3. INI Change Control Files ΓòÉΓòÉΓòÉ
  10886.  
  10887. You can use an INI change control file to do the following: 
  10888.  
  10889.    o  Define a program in a folder on the desktop 
  10890.    o  Define changes to the MMPM2.INI file 
  10891.    o  Define changes to other INI files 
  10892.  
  10893.  
  10894. ΓòÉΓòÉΓòÉ 7.3.3.1. Defining a Program in a Folder on the Desktop ΓòÉΓòÉΓòÉ
  10895.  
  10896. Use the WPObject structure to define a folder or a program (to be added to a 
  10897. folder).  The WPObject structure calls the OS/2 WinCreateObject function, which 
  10898. adds an icon and title to the desktop.  This structure indirectly changes the 
  10899. OS2.INI file.  Refer to the OS/2 Presentation Manager Programming Reference for 
  10900. object class definitions and supported keywords for the object class you are 
  10901. creating. 
  10902.  
  10903. Use the WPObject structure shown in the following example to define a folder. 
  10904.  
  10905. WPObject =
  10906.     (
  10907.     WPClassName   = "WPFolder"
  10908.     WPTitle       = "title"
  10909.     WPSetupString = "ICONFILE=$(DEST)icon;OBJECTID=<folderobjid>"
  10910.     WPLocation    = "<parentfolderobjid>"
  10911.     WPFlags       = wpflags
  10912.     )
  10913.  
  10914.  title                 Specifies the folder title to be displayed below the 
  10915.                        object. 
  10916.  
  10917.  icon                  Specifies the file name of the icon representing the 
  10918.                        object. 
  10919.  
  10920.  <folderobjid>         Specifies the OS/2 unique object ID that is used to find 
  10921.                        this folder. This is used by the Workplace Shell* to 
  10922.                        determine if this folder exists or not.  It is also used 
  10923.                        in the WPLocation field of other WPObject definitions. 
  10924.  
  10925.  <parentfolderobjid>   Specifies the folder object ID of the folder in which 
  10926.                        this folder is to be placed.  For example, 
  10927.                        "<WP_DESKTOP>" is the object ID for the Workplace Shell 
  10928.                        Desktop folder. 
  10929.  
  10930.  wpflags               This value specifies what action is to be taken if the 
  10931.                        object already exists. 
  10932.  
  10933.       0 - Fail if the object exists. 
  10934.  
  10935.       1 - Replace the object if it exists. 
  10936.  
  10937.       2 - Update the object if it exists (change the specified fields to the 
  10938.          given values). 
  10939.  
  10940.  In the following example, a folder called Multimedia Presentation Manager 
  10941.  Toolkit/2 will be added to the desktop. 
  10942.  
  10943.   WPObject =
  10944.       (
  10945.       WPClassName   = "WPFolder"
  10946.       WPTitle       = "Multimedia Presentation\nManager Toolkit/2"
  10947.       WPSetupString = "ICONFILE=$(DEST)MMTOOLKT.ICO;OBJECTID=<MMPMTLK>"
  10948.       WPLocation    = "<WP_DESKTOP>"
  10949.       WPFlags       = 2L
  10950.       )
  10951.  
  10952.  You can also use the WPObject structure to define a program that will be added 
  10953.  to a folder on the desktop as shown in the following figure. 
  10954.  
  10955.   WPObject =
  10956.   (
  10957.   WPClassName   = "WPProgram"
  10958.   WPTitle       = "title"
  10959.   WPSetupString = "EXENAME=path file;STARTUPDIR =dir;PROGTYPE=PM;
  10960.        ICONFILE=$(DEST)icon; [ASSOCTYPE =type;]
  10961.        [ASSOCFILTER=filter;] OBJECTID=<pgmobjid>"
  10962.   WPLocation    = "<parentfolderobjid>"
  10963.   WPFlags       = wpflags
  10964.   )
  10965.  
  10966.  title                 Specifies the title to be displayed below the object in 
  10967.                        the parent folder. 
  10968.  
  10969.  path                  Specifies a supported macro or the full path for the EXE 
  10970.                        file. 
  10971.  
  10972.  file                  Specifies the EXE file name. 
  10973.  
  10974.  dir                   Specifies the full path of the startup directory or the 
  10975.                        macro $(DIR)# (where # is a defined destination 
  10976.                        directory in CONTROL.SCR). 
  10977.  
  10978.  icon                  Specifies the file name of the icon representing the 
  10979.                        object. 
  10980.  
  10981.  type                  Specifies one or more association types such as 
  10982.                        "Waveform."  Multiple values are separated by commas. 
  10983.  
  10984.  filter                Specifies one or more association filter types such as 
  10985.                        "*.WAV." Multiple values are separated by commas. 
  10986.  
  10987.  <pgmobjid>            Specifies the OS/2 unique object ID that is used to find 
  10988.                        this program.  This is used by the installation program 
  10989.                        to determine if this program exists in the parent 
  10990.                        folder.  It is not used in the WPLocation field of any 
  10991.                        WPObject definition. 
  10992.  
  10993.  <parentfolderobjid>   Specifies the folder object ID of the folder in which 
  10994.                        this program is to be placed. 
  10995.  
  10996.  wpflags               This value specifies what action is to be taken if the 
  10997.                        object already exists. 
  10998.  
  10999.       0 - Fail if the object exists. 
  11000.  
  11001.       1 - Replace the object if it exists. 
  11002.  
  11003.       2 - Update the object if it exists (change the specified fields to the 
  11004.          given values). 
  11005.  
  11006.  JoinEA Structure 
  11007.  
  11008.  The JoinEA structure shown in the following example causes the joining of an 
  11009.  EA file to the parent file or directory.  If the file or directory is used in 
  11010.  a WPObject declaration, this structure should precede that declaration. 
  11011.  
  11012.   JoinEA =
  11013.       (
  11014.       JoinFileName   = "full path to file"
  11015.       JoinEAFileName = "full path to EA file"
  11016.       )
  11017.  
  11018.  full path to file     Specifies the full path to this file.  Supported macros 
  11019.                        may be used. 
  11020.  
  11021.  full path to EA file  Specifies the full path to the EA file.  Supported 
  11022.                        macros may be used. 
  11023.  
  11024.  JoinLongNameEA Structure 
  11025.  
  11026.  The JoinLongNameEA structure shown in the following example allows you to 
  11027.  specify a name that is greater than the standard 8-character length for a 
  11028.  directory you are going to create as a Workplace Shell object.  The 
  11029.  JoinLongNameEA statement causes an EA file of type LONGNAME to be added to the 
  11030.  directory.  The long name is then displayed whenever the directory appears as 
  11031.  a folder object.  The JoinLongNameEA statement should come before creating the 
  11032.  directory as a Workplace Shell object. 
  11033.  
  11034.   JoinLongNameEA =
  11035.       (
  11036.       JoinLongName       = "longname"
  11037.       JoinLongFileName   = "full path to directory"
  11038.       JoinEALongFileName = "full path to EA file"
  11039.       )
  11040.  
  11041.  longname              Specifies the new long name to be displayed. 
  11042.  
  11043.  full path to directory Specifies the directory to which EAs are to be 
  11044.                        attached. Supported macros may be used. 
  11045.  
  11046.  full path to EA file  Specifies the full path to the EA file.  Supported 
  11047.                        macros may be used. 
  11048.  
  11049.  Following is an example of a long name specified for an OS/2 multimedia 
  11050.  directory with the JoinLongNameEA structure.  The long name "Sound Bites" is 
  11051.  added to the directory defined as "9" in the CONTROL.SCR file.  In this case, 
  11052.  it is the "Sounds"  directory. 
  11053.  
  11054.   JoinLongNameEA =
  11055.       (
  11056.       JoinLongName       = "Sound Bites"
  11057.       JoinLongFileName   = "$(DIR)9"
  11058.       JoinEALongFileName = "$(DRIVE):\\MMOS2\\INSTALL\\sounds.eas"
  11059.       )
  11060.  
  11061.  The $(DEST) macro is not used for this structure because the file is created, 
  11062.  not copied and changed by MINSTALL.  Notice that the file is placed in the 
  11063.  \MMOS2\INSTALL subdirectory. This is the directory to which all EAs should be 
  11064.  copied. 
  11065.  
  11066.  
  11067. ΓòÉΓòÉΓòÉ 7.3.3.2. Defining Changes to the MMPM2.INI File ΓòÉΓòÉΓòÉ
  11068.  
  11069. Some multimedia subsystems require unique information in the MMPM2.INI file. 
  11070. This file is used by the media device manager (MDM) to maintain a database of 
  11071. installed multimedia components and devices. 
  11072.  
  11073. The following structures are used to make changes to the MMPM2.INI file. 
  11074. MciInstallDrv Structure 
  11075.  
  11076. The MciInstallDrv structure shown in the following example allows you to 
  11077. install MCDs on your system. 
  11078.  
  11079. MciInstallDrv =
  11080.     (
  11081.     DrvInstallName   = "internalname"
  11082.     DrvDeviceType    =  devicetypecode
  11083.     DrvDeviceFlag    =  deviceflag
  11084.     DrvVersionNumber = "verno"
  11085.     DrvProductInfo   = "name2"
  11086.     DrvMCDDriver     = "mcdname"
  11087.     DrvVSDDriver     = "vsdname"
  11088.     DrvPDDName       = "pddname"
  11089.     DrvMCDTable      = "mcdtablename"
  11090.     DrvVSDTable      = "vsdtablename"
  11091.     DrvShareType     = number1
  11092.     DrvResourceName  = "resname"
  11093.     DrvResourceUnits = number2
  11094.     DrvClassArray[num] =
  11095.            (
  11096.                 (DrvClassNumber = number3)
  11097.            )
  11098.     )
  11099.  
  11100.  internalname     Specifies the name under which the device is being installed. 
  11101.                   This must be a unique name.  Consider using a name that is a 
  11102.                   combination of a company name, device type, and device model. 
  11103.                   For example, the IBM media driver for the Sound Blaster** 
  11104.                   waveaudio device is ibmwavesb01. 
  11105.  
  11106.  devicetypecode   Specifies an encoding of the device type. These codes are 
  11107.                   defined in the MCIOS2.H file located in the \TOOLKIT\H 
  11108.                   subdirectory. 
  11109.  
  11110.  deviceflag       Specifies the LONG INT with the flags set.  This determines 
  11111.                   whether or not the device is controllable. 
  11112.  
  11113.  verno            Specifies the version number in the format "dd.dd.dd" where 
  11114.                   dd represents digits. 
  11115.  
  11116.  name2            Specifies the full name of the product and can be translated. 
  11117.  
  11118.  mcdname          Specifies the name of the DLL that contains the media control 
  11119.                   driver (MCD). This driver is loaded by the media device 
  11120.                   manager (MDM). 
  11121.  
  11122.  vsdname          Specifies the name of the DLL that contains the 
  11123.                   vendor-specific driver (VSD) used by the MCD (if any). 
  11124.  
  11125.  pddname          Specifies the name of the physical device driver used by the 
  11126.                   MCD (if any). 
  11127.  
  11128.  mcdtablename     Specifies the name of the DLL containing the MCD command 
  11129.                   table.  (OS/2 multimedia provides a standard command table.) 
  11130.  
  11131.  vsdtablename     Specifies the name of the DLL containing the VSD command 
  11132.                   table. 
  11133.  
  11134.  number1          Specifies an encoding of the valid types of sharing 
  11135.                   supported. These codes are defined in the MMDRVOS2.H file 
  11136.                   located in the \TOOLKIT\H subdirectory. 
  11137.  
  11138.  resname          Specifies a unique name for the management of the driver 
  11139.                   resources. 
  11140.  
  11141.  number2          Specifies the maximum number of resource units supported for 
  11142.                   the driver. 
  11143.  
  11144.  num              Specifies the number of resource classes defined in the next 
  11145.                   field. 
  11146.  
  11147.  number3          Specifies the maximum number of resource units used by the 
  11148.                   class. 
  11149.  
  11150.  MciInstallAlias Structure 
  11151.  
  11152.  The MciInstallAlias structure shown in the following example allows you to 
  11153.  specify an alternate name for a driver installed on your system. 
  11154.  
  11155.   MciInstallAlias =
  11156.       (
  11157.       AliasInstallName = "internalname"
  11158.       AliasString      = "aliasstring"
  11159.       )
  11160.  
  11161.  internalname     Specifies the internal name of the driver with which the 
  11162.                   alias is associated.  This name is specified in the 
  11163.                   MciInstallDrv structure. 
  11164.  
  11165.  aliasstring      Specifies an alternate name of the driver. 
  11166.  
  11167.  MciInstallConn Structure 
  11168.  
  11169.  Each implementation of a media driver defines certain paths of information 
  11170.  flow into and out of the device.  These paths are known as connectors. 
  11171.  Connectors have defined connector types, and each connector type has an 
  11172.  associated connector-type name.  The MciInstallConn structure shown in the 
  11173.  following example allows you to install the media connectors on your system. 
  11174.  
  11175.   MciInstallConn =
  11176.       (
  11177.       ConnInstallName = "internalname"
  11178.       ConnArray [num1]
  11179.            (
  11180.                 (
  11181.                 ConnType      = num2
  11182.                 ConnInstallTo = "connto"
  11183.                 ConnIndexTo   = num3
  11184.                 )
  11185.            )
  11186.       )
  11187.  
  11188.  internalname     Specifies the internal name of the driver with which the 
  11189.                   connector is associated.  This name is specified in the 
  11190.                   MciInstallDrv structure. 
  11191.  
  11192.  num1             Specifies the number of entries in the array. 
  11193.  
  11194.  num2             Specifies the connection type. Connection types are defined 
  11195.                   in the MCIOS2.H file located in the \TOOLKIT\H subdirectory. 
  11196.  
  11197.  connto           Specifies the internal name of the driver to connect to. 
  11198.  
  11199.  num3             Specifies the connector index to the other driver specified 
  11200.                   in connto. 
  11201.  
  11202.  MciInstallExt Structure 
  11203.  
  11204.  When an element name is specified as the device name on an MCI_OPEN message 
  11205.  and no device type is specified, the device type is identified by the file 
  11206.  extension.  For example, if the .WAV extension is associated with an internal 
  11207.  driver name, that driver will be used if a file ending in .WAV is opened. 
  11208.  
  11209.  The MciInstallExt structure shown below allows you to define media control 
  11210.  interface file extensions on your system. 
  11211.  
  11212.   MciInstallExt =
  11213.       (
  11214.       ExtInstallName = "internalname"
  11215.       ExtArray[num]  =
  11216.            (
  11217.            (ExtString = "string")
  11218.            )
  11219.       )
  11220.  
  11221.  internalname     Specifies the internal name of the driver with which the 
  11222.                   extension is associated.  This name is specified in the 
  11223.                   MciInstallDrv structure. 
  11224.  
  11225.  num              Specifies the number of external strings defined in the 
  11226.                   string field. 
  11227.  
  11228.  string           Specifies the valid extensions. 
  11229.  
  11230.  MciInstallParm Structure 
  11231.  
  11232.  The MciInstallParm structure shown below allows you to define device-specific 
  11233.  parameters that provide additional information about the driver to your MCD. 
  11234.  For example, this structure is used to define to the MIDI MCD which MIDI map 
  11235.  table to use for each sequencer. 
  11236.  
  11237.   MciInstallParm =
  11238.      (
  11239.      ParmInstallName = "internalname"
  11240.      ParmString      = "device specific parameters"
  11241.      )
  11242.  
  11243.  internalname                       Specifies the internal name of the driver 
  11244.                                     with which the parameters are associated. 
  11245.                                     This name is specified in the MciInstallDrv 
  11246.                                     structure. 
  11247.  
  11248.  device specific parameters         Specifies the parameters needed by the 
  11249.                                     driver. These parameters can be used to 
  11250.                                     provide additional information about the 
  11251.                                     driver. 
  11252.  
  11253.  
  11254. ΓòÉΓòÉΓòÉ 7.3.3.3. Defining Changes to Other INI Files ΓòÉΓòÉΓòÉ
  11255.  
  11256. You can create an INI change control file to make changes to any INI file that 
  11257. a driver needs.  For example, you could initialize an OS/2 profile, define MIDI 
  11258. maps, and define external pages.  You define changes to INI files using the 
  11259. ProfileData structure. 
  11260.  
  11261. The following shows an example of the ProfileData structure. 
  11262.  
  11263.    ProfileData =
  11264.       (
  11265.       ini="inifilename"
  11266.       appname="appname"
  11267.       keyname="keyname"
  11268.       dll="resourcedllname"
  11269.       id=resourceid
  11270.       )
  11271.  
  11272.  inifilename           Specifies the name of an OS/2 INI file.  For example, 
  11273.                        MIDITYPE.INI. 
  11274.  
  11275.  appname               Specifies the value of the appname parameter.  This is 
  11276.                        the appname to be used in the INI file. 
  11277.  
  11278.  keyname               Specifies the unique name (the variable name or keyname) 
  11279.                        of the item being installed 
  11280.  
  11281.  resourcedllname       Specifies the name of the DLL that contains a RCDATA 
  11282.                        resource with the ID identified in resourceid. 
  11283.  
  11284.  resourceid            Specifies the resource ID of the RCDATA resource (where 
  11285.                        the value is stored in the RC file). The resourceid is a 
  11286.                        LONG numeric value.  For example, 120L. 
  11287.  
  11288.  
  11289. ΓòÉΓòÉΓòÉ 7.4. Writing an Installation DLL ΓòÉΓòÉΓòÉ
  11290.  
  11291. You can provide one or two installation DLLs.  These DLLs can be the same DLL 
  11292. with two different entry points or two different DLLs with corresponding entry 
  11293. points. There are two ways to call an installation DLL: 
  11294.  
  11295.    o  Call the routine after all files have been copied, but before script 
  11296.       files have been processed (using the SSDLL and SSDLLENTRY keywords), or 
  11297.    o  Call the routine after all files have been copied and after script files 
  11298.       have been processed (using the SSTERMDLL and SSTERMDLLENTRY keywords). 
  11299.  
  11300.  The parameters for each entry point are as follows: 
  11301.  
  11302.  HWND (input)   Owner handle.  This handle allows the DLL to create windows for 
  11303.                 the user interface. 
  11304.  
  11305.  PSZ (input)    Source path of the installation package. 
  11306.  
  11307.  PSZ (input)    Target drive (a drive letter and colon (for example, d:). 
  11308.  
  11309.  PSZ (input)    DLL input parameters, as specified by the SSDLLINPUTPARMS 
  11310.                 keyword in CONTROL.SCR. 
  11311.  
  11312.  HWND (input)   MINSTALL object window handle that receives messages to perform 
  11313.                 media control interface and CONFIG.SYS operations. 
  11314.  
  11315.  PSZ (output)   A CHAR[256] null-terminated string that contains response-file 
  11316.                 data needed by the DLL.  The encoded string is created by the 
  11317.                 DLL as a series of ASCII characters. This information allows 
  11318.                 MINSTALL to operate in an unattended installation mode where 
  11319.                 all user responses are provided by the response-file string. 
  11320.                 The encoded information is passed to the DLL, and all user 
  11321.                 interaction is bypassed. 
  11322.  
  11323.  The following is an example prototype used to define an installation DLL. 
  11324.  
  11325.   ULONG APIENTRY StartMyInstall (HWND hwndOwnerHandle,
  11326.                                  PSZ pszSourcePath,
  11327.                                  PSZ pszTargetDrive,
  11328.                                  PSZ pszMyParms,
  11329.                                  HWND hwndMinstallHandle,
  11330.                                  PSZ pszResponseFile);
  11331.  
  11332.  MINSTALL provides numerous services to the installation DLLs due to the 
  11333.  various environments in which MINSTALL must operate. You can use MINSTALL on a 
  11334.  machine that has never had OS/2 multimedia installed on it.  You can also use 
  11335.  MINSTALL on a machine that has OS/2 multimedia installed on the hard drive. 
  11336.  OS/2 multimedia does not need to be running to use MINSTALL in this 
  11337.  environment. MINSTALL retains control of the MMPM2.INI and CONFIG.SYS files to 
  11338.  ensure no changes are made to these files while MINSTALL is running. 
  11339.  
  11340.  While MINSTALL has control of the MMPM2.INI and CONFIG.SYS files it might be 
  11341.  necessary for an installation DLL to read or write to one or both of these 
  11342.  files.  MINSTALL provides an interface to allow the installation DLLs access 
  11343.  to both the MMPM2.INI and CONFIG.SYS files.  Also, if OS/2 multimedia is 
  11344.  installed and running, some files might be open that MINSTALL attempts to 
  11345.  replace. When this occurs, MINSTALL copies the open files to a temporary 
  11346.  directory until the next system restart. 
  11347.  
  11348.  The following table lists the messages, along with the message formats and 
  11349.  descriptions, available to an installation DLL.  An installation DLL can send 
  11350.  these messages with WinSendMsg or WinPostMsg. 
  11351.  
  11352.  Message                   Description 
  11353.  
  11354.  IM_CODEC1INSTALL          Installs a CODEC using the ulCodecCompType field. 
  11355.  
  11356.  
  11357.   mp1 = 0;                               /* Not used */
  11358.   mp2 = MPFROMP(PINSTCODECINIFILEINFO);  /* Pointer to the
  11359.                                             INSTIOPROC structure */
  11360.  
  11361.  IM_CODEC2INSTALL          Installs a CODEC using the fccCodecCompType[5] 
  11362.                            field. 
  11363.  
  11364.  
  11365.   mp1 = 0;                                /* Not used */
  11366.   mp2 = MPFROMP (PINSTCODECINIFILEINFO);  /* Pointer to the
  11367.                                              INSTIOPROC structure */
  11368.  
  11369.  IM_CONFIGDELETE           Deletes a line from the CONFIG.SYS file. 
  11370.  
  11371.  
  11372.   mp1 = MPFROMP(PCONFIGDATA); /* Pointer to the CONFIGDATA structure */
  11373.   mp2 = 0;                    /* Not used */
  11374.  
  11375.  IM_CONFIGENUMERATE        Gets a line from the CONFIG.SYS file. 
  11376.  
  11377.  
  11378.   mp1 = MPFROMP(PCONFIGDATA); /* Pointer to the CONFIGDATA structure */
  11379.   mp2 = 0;                    /* Not used */
  11380.  
  11381.  IM_CONFIGMERGE            Merges data into an existing CONFIG.SYS entry. 
  11382.  
  11383.  
  11384.   mp1 = MPFROMP(PCONFIGDATA); /* Pointer to the CONFIGDATA structure */
  11385.   mp2 = 0;                    /* Not used */
  11386.  
  11387.  IM_CONFIGNEW              Adds a new line to the CONFIG.SYS file. 
  11388.  
  11389.  
  11390.   mp1 = MPFROMP(PCONFIGDATA); /* Pointer to the CONFIGDATA structure */
  11391.   mp2 = 0;                    /* Not used */
  11392.  
  11393.  IM_CONFIGQUERYCHANGED     Returns TRUE if the CONFIG.SYS file has been 
  11394.                            changed. 
  11395.  
  11396.  
  11397.   mp1 = 0;  /* Not used */
  11398.   mp2 = 0;  /* Not used */
  11399.  
  11400.  IM_CONFIGREPLACE          Replaces an existing CONFIG.SYS file. 
  11401.  
  11402.  
  11403.   mp1 = MPFROMP(PCONFIGDATA); /* Pointer to the CONFIGDATA structure */
  11404.   mp2 = 0;                    /* Not used */
  11405.  
  11406.  IM_CONFIGUPDATE           Updates an existing CONFIG.SYS entry. 
  11407.  
  11408.  
  11409.   mp1 = MPFROMP(PCONFIGDATA); /* Pointer to the CONFIGDATA structure */
  11410.   mp2 = 0;                    /* Not used */
  11411.  
  11412.  IM_CREATE_WPS_OBJECT      Installs a folder and its contents. 
  11413.  
  11414.  
  11415.   mp1 = 0;                        /* Not used */
  11416.   mp2 = MPFROMP(PINSTOBJECTDATA); /* Pointer to the
  11417.                                      INSTOBJECTDATA structure */
  11418.  
  11419.  IM_DESTROY_WPS_OBJECT     Destroys an existing folder and its contents. 
  11420.  
  11421.  
  11422.   mp1 = 0;                /* Not used */
  11423.   mp2 = MPFROMP(HOBJECT); /* This must be the exact OBJECTID
  11424.                              with which the object was created  */
  11425.  
  11426.  IM_EA_JOIN                Joins an EA file to its parent file (the file that 
  11427.                            it was previously separated from). 
  11428.  
  11429.   mp1 = 0;                    /* Not used */
  11430.   mp2 = MPFROMP(PINSTEAJOIN); /* Pointer to the INSTEAJOIN
  11431.                                  structure */
  11432.  
  11433.  IM_EA_LONG_NAME_JOIN      Creates an EA file containing a long name (greater 
  11434.                            than 8 characters but less than 256) and joins it to 
  11435.                            a file or directory. 
  11436.  
  11437.   mp1 = 0;                            /* Not used */
  11438.   mp2 = MPFROMP(PINSTEALONGNAMEJOIN); /* A pointer to the structure
  11439.                                          that contains the long name
  11440.                                          as an ASCII string, the file or
  11441.                                          directory name to which the long
  11442.                                          name is to be applied, and the
  11443.                                          new EA name */
  11444.  
  11445.  IM_LOG_ERROR              Writes a message to the MINSTALL.LOG file.  This can 
  11446.                            be an error type message or only an information type 
  11447.                            message. 
  11448.  
  11449.  
  11450.   mp1 = MPFROMP((PSZ)pszStatement); /* The text of the message to insert
  11451.                                        at the end of the MINSTALL.LOG
  11452.                                        file */
  11453.   mp2 = 0;                          /* Not used */
  11454.  
  11455.  IM_MCI_EXTENDED_SYSINFO   Maps to the mciSendCommand MCI_SYSINFO. 
  11456.  
  11457.  
  11458.   mp1 = MPFROML(LONG);  /* The MCI_SYSINFO extended function desired */
  11459.   mp2 = MPFROMP(*MCI_SYSINFO_PARMS); /* The SYSINFO
  11460.                                                         structure       */
  11461.  
  11462.  IM_MCI_SEND_COMMAND       Sends an MCI command. 
  11463.  
  11464.  
  11465.   mp1 = 0;                            /* Not used */
  11466.   mp2 = MPFROMP(PINSTMCISENDCOMMAND); /* Pointer to the INSTMCISENDCOMMAND
  11467.                                          structure */
  11468.  
  11469.  IM_MIDIMAP_INSTALL        Installs a MIDI map. 
  11470.  
  11471.  
  11472.   mp1 = 0;                            /* Not used */
  11473.   mp2 = MPFROMP(PMIDIMAPINSTALLDATA); /* Pointer to the
  11474.                                          MIDIMAPINSTALLDATA structure */
  11475.  
  11476.  IM_MMIO_INSTALL           Installs an IOProc. 
  11477.  
  11478.  
  11479.   mp1 = 0;                    /* Not used */
  11480.   mp2 = MPFROMP(PINSTIOPROC); /* Pointer to the INSTIOPROC structure */
  11481.  
  11482.  IM_QUERYPATH              Requests the current location of a copied file. 
  11483.  
  11484.  
  11485.   mp1 = PMFROMP(PSZ); /* The name of the file needed  */
  11486.   mp2 = PMFROMP(PSZ); /* The full path to the file    */
  11487.  
  11488.  IM_SPI_INSTALL            Installs stream protocol information. 
  11489.  
  11490.  
  11491.   mp1 = 0;            /* Not used */
  11492.   mp2 = MPFROMP(PSZ); /* The fully qualified path of a SPI resource DLL */
  11493.  
  11494.  The data structures used as parameters for the messages in the previous list 
  11495.  are defined in the MINSTALL.H file located in the \TOOLKIT\H subdirectory. 
  11496.  
  11497.  Follow these guidelines when writing an installation DLL: 
  11498.  
  11499.    o  Set the mouse pointer to SPTR_WAIT during any operation lasting more than 
  11500.       one second between requests for user information. 
  11501.    o  Keep the user interface as responsive as possible by using the 
  11502.       MM_DISPATCHVARS and MM_DISPATCHMESSAGES() macros before and after all I/O 
  11503.       intensive operations and and while updates are being made to INI files 
  11504.       and the CONFIG.SYS file. This is necessary because installation DLLs are 
  11505.       executed in the MINSTALL message queue thread. These macros are defined 
  11506.       in the MINSTALL.H file. 
  11507.  
  11508.  
  11509. ΓòÉΓòÉΓòÉ 7.5. Installing a Media Control Driver ΓòÉΓòÉΓòÉ
  11510.  
  11511. To install a media control driver (MCD) in the OS/2 multimedia system: 
  11512.  
  11513.    1. Create an INI change control file containing the information needed for 
  11514.       the media control driver.  This will make the necessary changes in the 
  11515.       MMPM2.INI file. 
  11516.  
  11517.       When you create a new MCD, you have to install drivers into the OS/2 
  11518.       multimedia system to use the new MCD. The following is an example of how 
  11519.       to use structures in an INI Change Control File to install a Sound 
  11520.       Blaster Waveform Audio Driver that uses a new Audio MCD named "MyNewMCD." 
  11521.       See Defining Changes to the MMPM2.INI File for a detailed description of 
  11522.       these structures. 
  11523.  
  11524.             MciInstallDrv =
  11525.                 (
  11526.                 DrvInstallName     = "MyWaveSB01"
  11527.                 DrvDeviceType      = 7
  11528.                 DrvDeviceFlag      = 01L
  11529.                 DrvVersionNumber   = "1"
  11530.                 DrvProductInfo     = "Sound Blaster Pro MCV"
  11531.                 DrvMCDDriver       = "MyNewMCD"
  11532.                 DrvVSDDriver       = "Audioif"
  11533.                 DrvPDDName         = "SBAUD1$"
  11534.                 DrvMCDTable        = "MDM"
  11535.                 DrvVSDTable        = ""
  11536.                 DrvShareType       = 3
  11537.                 DrvResourceName    = "SoundblasterW01"
  11538.                 DrvResourceUnits   = 1
  11539.                 DrvClassArray[1]  =
  11540.                      (
  11541.                           ( DrvClassNumber = 1 )
  11542.                      )
  11543.                 )
  11544.             MciInstallParm =
  11545.                 (
  11546.                 ParmInstallName   = "MyWaveSB01"
  11547.                 ParmString        = "FORMAT=1,SAMPRATE=22050,BPS=8,CHANNELS=2,
  11548.                                     DIRECTION=PLAY"
  11549.                 )
  11550.  
  11551.  
  11552.             MciInstallConn =
  11553.                 (
  11554.                 ConnInstallName="MyWaveSB01"
  11555.                 ConnArray[1]=
  11556.                      (
  11557.                         (
  11558.                         ConnType=3                   /* Wavestream connector */
  11559.                         ConnInstallTo="MyAmpMixSB01" /* Connect to ampmixer  */
  11560.                         ConnIndexTo=1                /* First connector in
  11561.                                                         ampmixer             */
  11562.                         )
  11563.                      )
  11564.                 )
  11565.  
  11566.  
  11567.             MciInstallAlias =
  11568.                 (
  11569.                 AliasInstallName="MyWaveSB01"
  11570.                 AliasString="Wave Audio"
  11571.                 )
  11572.  
  11573.  
  11574.             MciInstallExt =
  11575.                 (
  11576.                 ExtInstallName = "MyWaveSB01"
  11577.                 ExtArray[1] =
  11578.                    (
  11579.                       (ExtString = "WAV")
  11580.                    )
  11581.                 )
  11582.  
  11583.    2. Install external settings pages in the Multimedia Setup notebook 
  11584.       (optional).  See Inserting External Settings Pages. 
  11585.  
  11586.    3. Specify the name of your INI change control file in an SSINICH keyword in 
  11587.       the master control file (CONTROL.SCR).  See CONTROL.SCR Subsystem 
  11588.       Definition  for more information.  An example of a CONTROL.SCR file and a 
  11589.       description of the keywords are provided in that section.  For example: 
  11590.  
  11591.             SSINICH="MYMCD.SCR"
  11592.  
  11593.  You might want to experiment with the sample files provided in the 
  11594.  \TOOLKIT\SAMPLES\MM\CF subdirectory.  If you decide to experiment with the MCD 
  11595.  templates provided in the toolkit, you can test your changes by replacing the 
  11596.  name of the driver that comes with OS/2 multimedia with the name of your 
  11597.  driver.  For example, you can edit the MMPM2.INI file and change the 
  11598.  MCDDRIVER=AUDIOMCD statement to MCDDRIVER=AUDIOMCT. You also must copy your 
  11599.  MCD to a directory that is included in the LIBPATH statement of your 
  11600.  CONFIG.SYS file (for example, \MMOS2\DLL).  After you make these changes and 
  11601.  restart your system, OS/2 multimedia will use your MCD instead of the OS/2 
  11602.  multimedia MCD. 
  11603.  
  11604.  Note:  After you complete your MCD testing, you must change the MMPM2.INI text 
  11605.         file back to its original state.  Unpredictable results can occur when 
  11606.         OS/2 multimedia is used without its supported MCDs. 
  11607.  
  11608.  
  11609. ΓòÉΓòÉΓòÉ 7.6. Installing a Stream Handler ΓòÉΓòÉΓòÉ
  11610.  
  11611. When a stream handler is installed by MINSTALL, the following events occur: 
  11612.  
  11613.    1. A media driver issues an SpiGetHandler function. 
  11614.    2. When the handler is loaded, the Sync/Stream Manager (SSM) reads in the 
  11615.       respective stream protocol control blocks (SPCBs) from the SPI.INI file. 
  11616.    3. If the stream handler is a DLL, the SSM loads and registers the DLL with 
  11617.       the DOSLoadModule function. However, if the stream handler is a device 
  11618.       driver, the SSM does not issue a DOSLoadModule because a CONFIG.SYS 
  11619.       statement installs the device drivers during system startup. 
  11620.  
  11621.  Before the SSM can read in the respective SPCBs, the SPCBs first must be 
  11622.  installed in the SPI.INI file, which is built during the multimedia 
  11623.  installation of the base OS/2 product.  This file contains all the information 
  11624.  about stream handlers and stream classes that are currently supported by OS/2 
  11625.  multimedia. 
  11626.  
  11627.  
  11628. ΓòÉΓòÉΓòÉ 7.6.1. Creating a Resource File ΓòÉΓòÉΓòÉ
  11629.  
  11630. To install SPCB information in the SPI.INI file, you first must create a 
  11631. resource file containing all the information about the stream handlers to 
  11632. update or add to the SPI.INI profile.  The fields and the order of these fields 
  11633. should match the example shown in the example that follows. 
  11634.  
  11635. #include <os2.h>
  11636. #include <os2me.h>
  11637.  
  11638. #define  SPI_RESOURCE1                     (SPI_RESOURCE + 1)
  11639. #define  SPI_RESOURCE2                     (SPI_RESOURCE + 2)
  11640.  
  11641. #define  SPCBHAND_RCVSYNC_GENSYNC_GENTIME
  11642.                      (SPCBHAND_RCVSYNC + SPCBHAND_GENSYNC + SPCBHAND_GENTIME)
  11643.  
  11644. RCDATA   SPI_RESOURCE
  11645. BEGIN
  11646.   2                       /* number of stream handlers resources */
  11647. END
  11648.  
  11649. RCDATA   SPI_RESOURCE1
  11650.   BEGIN
  11651.      "TESTSYS\0",                        /* Class name      */
  11652.      "R3TEST\0",                         /* Handler name    */
  11653.       SH_DLL_TYPE,                       /* PDD or DLL flag */
  11654.       "R3TEST\0",                        /* PDD or DLL name */
  11655.        1,                                /* Number of SPCBs */
  11656.        SPCBSIZE,                         /* Length of SPCB  */
  11657.        DATATYPE_GENERIC,                 /* Data type       */
  11658.        SUBTYPE_NONE,                     /* Sub type        */
  11659.        0L,                            /* Internal key     */
  11660.        0L,                            /* Data flag        */
  11661.        0L,                            /* # of records     */
  11662.        1L,                            /* Block size       */
  11663.        4096L,                         /* Buffer size      */
  11664.        2L,                            /* Min # of buffers */
  11665.        4L,                            /* Max # of buffers */
  11666.        1L,                            /* # empty buffs to start src */
  11667.        2L,                            /* # full buffs to start tgt */
  11668.        SPCBBUF_NONCONTIGUOUS,         /* Buffer flag  */
  11669.        SPCBHAND_RCVSYNC,              /* Handler flag */
  11670.        0L,                            /* Sync tolerance value */
  11671.        0L,                            /* Save sync pulse generation */
  11672.        0L,                            /* Bytes/unit of time       */
  11673.            0L                         /* MMTIME each unit represents */
  11674.   END
  11675. RCDATA   SPI_RESOURCE2
  11676.   BEGIN
  11677.      "TESTSYS\0",                /* Class name      */
  11678.      "R0TEST\0",                 /* Handler name    */
  11679.       SH_PDD_TYPE,               /* PDD or DLL flag */
  11680.      "R0TEST.SYS\0",             /* PDD or DLL name */
  11681.       2,                         /* Number of SPCBs */
  11682.       SPCBSIZE,                  /* Length of SPCB  */
  11683.       DATATYPE_ADPCM_AVC,        /* Data type       */
  11684.       0L,                        /* Sub type     */
  11685.       0L,                        /* Internal key */
  11686.       SPCBDATA_CUETIME,          /* Data flag    */
  11687.       0L,                        /* # of records */
  11688.       1L,                        /* Block size   */
  11689.       4096L,                     /* Buffer size  */
  11690.       10L,                       /* Min # of buffers */
  11691.       10L,                       /* Max # of buffers */
  11692.       1L,                        /* # empty buffs to start src */
  11693.       1L,                        /* # full buffs to start tgt  */
  11694.       SPCBBUF_NONCONTIGUOUS,            /* Buffer flag  */
  11695.       SPCBHAND_RCVSYNC_GENSYNC_GENTIME, /* Handler flag */
  11696.       0L,                        /* Sync tolerance value */
  11697.       0L,                        /* Save sync pulse generation */
  11698.       0L,                        /* Bytes/unit of time */
  11699.       0L,                        /* MMTIME each unit represents */
  11700.  
  11701.       SPCBSIZE,                  /* Length of SPCB */
  11702.       DATATYPE_WAVEFORM,         /* Data type    */
  11703.       0L,                        /* Sub type     */
  11704.       0L,                        /* Internal key */
  11705.       SPCBDATA_CUETIME,          /* Data flag    */
  11706.       0L,                        /* # of records */
  11707.       1L,                        /* Block size   */
  11708.       8192L,                     /* Buffer size  */
  11709.       10L,                       /* Min # of buffers */
  11710.       10L,                       /* Max # of buffers */
  11711.       1L,                        /* # empty buffs to start src */
  11712.       1L,                        /* # full buffs to start tgt  */
  11713.       SPCBBUF_NONCONTIGUOUS,     /* Buffer flag */
  11714.       SPCBHAND_RCVSYNC_GENSYNC_GENTIME, /* Handler flag */
  11715.       0L,                        /* Sync tolerance value   */
  11716.       0L,                        /* Save sync pulse generation */
  11717.       0L,                        /* Bytes/unit of time */
  11718.       0L                         /* MMTIME each unit represents */
  11719.   END
  11720.  
  11721. Creating a Stub Routine 
  11722.  
  11723. After you create a resource file, you must create a stub routine to generate 
  11724. the DLL that contains the resource file. The following example shows an example 
  11725. of a sample stub routine (RCSTUB.C) that is used to create the DLL containing 
  11726. the resource shown in the previous example. 
  11727.  
  11728. #include <os2.h>
  11729. VOID RCSTUB()
  11730. {
  11731. }
  11732.  
  11733.  
  11734. ΓòÉΓòÉΓòÉ 7.6.2. Building the DLL Containing the Resource ΓòÉΓòÉΓòÉ
  11735.  
  11736. Next, you must build the DLL containing the resource.  A DLL is generated that 
  11737. will be used in Updating the SPI.INI File to update the SPI.INI profile. The 
  11738. DLL is built by entering the following command: 
  11739.  
  11740. NMAKE /F MAKERES.MAK
  11741.  
  11742. The following example shows a sample makefile (MAKERES.MAK), which is used to 
  11743. build the TESTRES.DLL containing the resource shown in the previous example. 
  11744. (See Creating a Resource File.) 
  11745.  
  11746. .SUFFIXES: .com .sys .exe .obj .mbj .asm .inc .def .lrf .crf .ref \
  11747.            .lst .sym .map .c .h .lib .msg .pro .txt .cod .cvk
  11748. RCDLL=testres
  11749. /*******************************/
  11750. /* Compiler and Tools location */
  11751. /*******************************/
  11752. MSRC     =..
  11753. TOOLS    =..\..\TOOLS
  11754. SHIP_LIB =..\..\SHIP_LIB
  11755. SHIP_H   =..\SHIP_H
  11756. SHIP_INC =..\SHIP_INC
  11757. COMMON   =..\COMMON
  11758. INC      =..\..\SRC\INC
  11759. H        =..\..\SRC\H
  11760. H386     =..\..\SRC\H386
  11761. LIB      =..\..\SRC\LIB
  11762. LIB386   =..\..\SRC\LIB386
  11763.  
  11764. /******************************/
  11765. /* Definitions for C Compiler */
  11766. /******************************/
  11767. CCOMP386=cl386
  11768. CFLAGS386= /c /G3 /AS /W3 /Od /DLINT_ARGS
  11769. CINC386=-I. -I$(SHIP_H) -I$(COMMON) -I$(H386) -I$(H386)\SYS -I$(H) -I$(H)\SYS
  11770.  
  11771. /******************************/
  11772. /* Definitions for linker     */
  11773. /******************************/
  11774. LINK386  =link386
  11775. LFLAGS386= $(LNK_DEBUG) /batch /map /nod /noi /packcode /packdata
  11776. LIBS386  =$(NAMELIB) os2386 libc doscalls
  11777.  
  11778. /*************************************/
  11779. /* Definitions for RESOURCE compiler */
  11780. /*************************************/
  11781. RC       = rc
  11782. RCINC    = -i $(H) -i $(SHIP_H) -i $(COMMON)
  11783.  
  11784. /**************************/
  11785. /*  Object file lists     */
  11786. /**************************/
  11787.  
  11788. RCOBJS   =$(COMMON)\rcstub.obj
  11789.  
  11790. /*************************************/
  11791. /* Inference Rules                   */
  11792. /*************************************/
  11793. .c.obj:
  11794.         $(CCOMP386) $(CFLAGS386) $(CINC386) /Fo$(<R).obj $(C_LST) $(<R).c
  11795.  
  11796. /*************************************/
  11797. /* Target Descriptions               */
  11798. /*************************************/
  11799. !include        "$(H)\common.mak"
  11800.  
  11801. all: rc
  11802.  
  11803. /*************************************/
  11804. /* SSMRES.DLL Target Descriptions    */
  11805. /*************************************/
  11806. rc: $(RCDLL).dll
  11807.  
  11808. $(RCDLL).dll:  $(RCOBJS) $(RCDLL).rc makeres.mak $(RCDLL).lrf  \
  11809.                $(RCDLL).def
  11810.         $(LINK386) $(LFLAGS386) @$(RCDLL).lrf
  11811.         $(RC) $(RCINC) $(RCDLL).rc $(RCDLL).dll
  11812. #
  11813. # Make DEF file
  11814. #
  11815. $(RCDLL).def:  makeres.mak
  11816.         @echo Creating file <<$(@B).def
  11817. LIBRARY $(RCDLL)
  11818. DESCRIPTION 'DLL file containing resources'
  11819. STUB 'OS2STUB.EXE'
  11820. DATA NONE
  11821. <<keep
  11822.  
  11823. #
  11824. # Make link response file
  11825. #
  11826. $(RCDLL).lrf: makeres.mak
  11827.         @echo Creating file <<$(@B).lrf
  11828. $(RCOBJS)
  11829. $(RCDLL).dll
  11830. $(RCDLL).map $(LFLAGS386)
  11831. os2386 libcdll
  11832. $(RCDLL).def;
  11833. <<keep
  11834.  
  11835.  
  11836. ΓòÉΓòÉΓòÉ 7.6.3. Updating the SPI.INI File ΓòÉΓòÉΓòÉ
  11837.  
  11838. The resource DLL that was built by the makefile must now be used with the 
  11839. master control file, the file list control file, and the SpiInstall structure 
  11840. to update the SPI.INI profile.  (See Master Control File and File List Control 
  11841. File for information about the master control file and the file list control 
  11842. file.)  Following are examples of the files needed to update the SPI.INI file: 
  11843.  
  11844.    o  INI change control file 
  11845.    o  CONTROL.SCR entry 
  11846.    o  FILELIST.TLK entry 
  11847.  
  11848.  These files must be placed on a diskette with the TESTRES.DLL file that was 
  11849.  created. 
  11850.  
  11851.  The following example shows how to write an INI change control file named 
  11852.  TEST.SCR to install the DLL file (TESTRES.DLL). 
  11853.  
  11854.   SpiInstall =
  11855.       (
  11856.       SpiDllName = "$(DEST)TESTRES.DLL"
  11857.       )
  11858.  
  11859.  The following example shows how to specify the TEST.SCR INI change control 
  11860.  file in the CONTROL.SCR file. 
  11861.  
  11862.   package   ="SPI.INI Update"
  11863.   codepage  =437
  11864.   filelist  ="TEST.MMI"
  11865.   groupcount=2
  11866.   munitcount=1
  11867.   medianame ="SPI.INI Update Disk 1"
  11868.   sourcedir = "\\"                  = 0
  11869.   destindir = "\\MMOS2\\DLL\\"      = 2
  11870.   destindir = "\\MMOS2\\INSTALL\\"  = 4
  11871.  
  11872.   ssgroup   =0
  11873.   ssname    ="Base"
  11874.   ssversion ="1.0.0"
  11875.   sssize    =10
  11876.  
  11877.   ssgroup   =1
  11878.   ssname    ="SPI.INI Update"
  11879.   ssversion ="1.0.0"
  11880.   sssize    =10
  11881.   ssinich   ="TEST.SCR"
  11882.  
  11883.  The following is an example of how to specify the TEST.SCR INI change control 
  11884.  file in the FILELIST.TLK file. 
  11885.  
  11886.   /* Total number of entries is 3                     */
  11887.  
  11888.        3
  11889.  
  11890.   /* Disk# Group# Dest#    Path             FileName  */
  11891.  
  11892.       0      1     2       0               "TESTRES.DLL"
  11893.       0      1     4       0               "TEST.SCR"
  11894.       0      0     4       0               "TEST.SCR"
  11895.  
  11896.  
  11897. ΓòÉΓòÉΓòÉ 7.6.4. Installing Stream Protocol ΓòÉΓòÉΓòÉ
  11898.  
  11899. A stream handler must also support SpiInstallProtocol to be able to receive the 
  11900. SPCB's.  For example, suppose an application or media driver wants to install 
  11901. another SPCB of the same data type and subtype as an SPCB that it already has 
  11902. installed.  The application or media driver will need to assign a new internal 
  11903. key value, that is used to differentiate between multiple SPCB's of the same 
  11904. data stream type.  All the default SPCBs are installed with an internal key 
  11905. value of 0.  Any additional SPCBs that overlap any of the data types that are 
  11906. already installed, need to use a different internal key value.  Therefore, the 
  11907. stream handler must have code that allows for this scenario. 
  11908.  
  11909. The sample code in the following example illustrates how to install stream 
  11910. protocol. 
  11911.  
  11912. RC ShcInstallProtocol(pipparm)
  11913. PPARM_INSTPROT pipparm;
  11914.  
  11915. { /* Start of ShcInstallProtocol */
  11916.  
  11917. RC rc = NO_ERROR;                       /* local return code */
  11918. int notfound = TRUE;
  11919. PESPCB pTempEspcb;
  11920. PESPCB pPrevEspcb;
  11921.  
  11922.  /* the ESPCB list is under semaphore control */
  11923.  
  11924.  if (!(rc = DosRequestMutexSem(hmtxGlobalData, SEM_INDEFINITE_WAIT)))
  11925.    { /* obtained semaphore */
  11926.      if (pipparm->ulFlag & SPI_DEINSTALL_PROTOCOL)
  11927.        { /* DeInstall */
  11928.  
  11929.          /* To Deinstall, Find the spcb,                  */
  11930.          /*               Take it off the espcb chain,    */
  11931.          /*               Free the espcb memory allocated */
  11932.  
  11933.          rc = ERROR_INVALID_SPCBKEY;
  11934.          pPrevEspcb = NULL;
  11935.          pTempEspcb = pESPCB_ListHead;
  11936.          while (pTempEspcb && notfound)
  11937.            { /* Loop thru espcbs */
  11938.              if ((pipparm->spcbkey.ulDataType ==
  11939.                            pTempEspcb->spcb.spcbkey.ulDataType) &&
  11940.                  (pipparm->spcbkey.ulDataSubType ==
  11941.                            pTempEspcb->spcb.spcbkey.ulDataSubType) &&
  11942.                  (pipparm->spcbkey.ulIntKey ==
  11943.                            pTempEspcb->spcb.spcbkey.ulIntKey))
  11944.                { /* found match */
  11945.                  notfound = FALSE;
  11946.                  rc = NO_ERROR;
  11947.  
  11948.                  /* Take the espcb off the chain */
  11949.  
  11950.                  if (pPrevEspcb)
  11951.                    {
  11952.                      pPrevEspcb->pnxtESPCB = pTempEspcb->pnxtESPCB;
  11953.                    }
  11954.                  else
  11955.                    {
  11956.                      pESPCB_ListHead = pTempEspcb->pnxtESPCB;
  11957.                    }
  11958.                  HhpFreeMem(hHeap, pTempEspcb);
  11959.  
  11960.                } /* found match */
  11961.              else
  11962.                { /* try the next espcb in the chain */
  11963.  
  11964.                  pPrevEspcb = pTempEspcb;
  11965.                  pTempEspcb = pTempEspcb->pnxtESPCB;
  11966.  
  11967.                } /* try the next espcb in the chain */
  11968.            } /* Loop thru espcbs */
  11969.        } /* DeInstall */
  11970.      else
  11971.        { /* Install */
  11972.  
  11973.          /* If the SPCB already exists then error */
  11974.  
  11975.          if (ShFindEspcb(pipparm->spcbkey))
  11976.            {
  11977.              rc = ERROR_INVALID_SPCBKEY;
  11978.            }
  11979.          else
  11980.            { /* OK to add spcb */
  11981.  
  11982.              /* Allocate the espcb and put it on the front of the chain */
  11983.  
  11984.              pTempEspcb = (PESPCB)HhpAllocMem(hHeap, sizeof(ESPCB));
  11985.              if (pTempEspcb)
  11986.                {
  11987.                  pTempEspcb->spcb = *(pipparm->pspcb);
  11988.                  pTempEspcb->pnxtESPCB = pESPCB_ListHead;
  11989.                  pESPCB_ListHead = pTempEspcb;
  11990.                }
  11991.              else
  11992.                }
  11993.                  rc = ERROR_ALLOC_RESOURCES;
  11994.                }
  11995.            } /* OK to add spcb */
  11996.        } /* Install */
  11997.  
  11998.      DosReleaseMutexSem(hmtxGlobalData);
  11999.  
  12000.    } /* obtained semaphore */
  12001.  
  12002.  return(rc);
  12003.  
  12004. } /* End of ShcInstallProtocol */
  12005.  
  12006. Note:  For descriptions of the parameters in the SPCB, see Stream Handlers. 
  12007.  
  12008.  
  12009. ΓòÉΓòÉΓòÉ 7.7. Installing an I/O Procedure ΓòÉΓòÉΓòÉ
  12010.  
  12011. To install an I/O procedure, an IOProc entry is added to the MMPMMMIO.INI file. 
  12012. This is accomplished by either writing an INI change control file or writing a 
  12013. program using the mmioIniFileHandler function.  The IOProc is installed in the 
  12014. IOProc table ahead of the system-provided storage system IOProcs (DOS, MEM, and 
  12015. CF). 
  12016.  
  12017. The mmioInstall structure shown in the following example allows you to install 
  12018. an IOProc in the system.  The MMPMMMIO.INI file is modified with the latest 
  12019. mmioInstall data when the MINSTALL program is executed. 
  12020.  
  12021. mmioInstall =
  12022.     (
  12023.     mmioFourCC        = "fourcc"
  12024.     mmioDllName       = "full path"
  12025.     mmioDllEntryPoint = "entry name"
  12026.     mmioFlags         = "flags"
  12027.     mmioExtendLen     = "extend length"
  12028.     mmioMediaType     = "media type"
  12029.     mmioIOProcType    = "file format"
  12030.     mmioDefExt        = "default extension"
  12031.     )
  12032.  
  12033.  fourcc              Specifies the FOURCC of the I/O procedure. 
  12034.  
  12035.  full path           Specifies the full path to the file and the file name of 
  12036.                      the IOProc DLL.  (You can use supported macros described 
  12037.                      in Supported Macros.) 
  12038.  
  12039.  entry name          Specifies the entry point of the IOProc DLL. 
  12040.  
  12041.  flags               Specifies any additional MMIO flags.  Set to 0L for this 
  12042.                      release. 
  12043.  
  12044.  extend length       Specifies the extended length of 16 for this release. 
  12045.  
  12046.  media type          Specifies the media type of this file. 
  12047.  
  12048.  file format         Specifies the type of IOProc, either a file format or 
  12049.                      storage system IOProc. 
  12050.  
  12051.  default extension   Specifies the default file extension. 
  12052.  
  12053.  For example, to install the AVC audio I/O procedure, create an INI change 
  12054.  control specifying the mmioInstall structure. 
  12055.  
  12056.   mmioInstall =
  12057.      (
  12058.      mmioFourCC        = "AVCA"
  12059.      mmioDllName       = "$(DEST)AVCAPROC.DLL"
  12060.      mmioDllEntryPoint = "AVCAIOProc"
  12061.      mmioFlags         = 0L
  12062.      mmioExtendLen     = 16L
  12063.      mmioMediaType     = 2L
  12064.      mmioIOProcType    = 2L
  12065.      mmioDefExt        = ""
  12066.      )
  12067.  
  12068.  Specify the name of your INI change control file using the SSINICH keyword in 
  12069.  the master control file (CONTROL.SCR). See CONTROL.SCR Subsystem Definition 
  12070.  for an example of a CONTROL.SCR file and a description of the keywords.  For 
  12071.  example: 
  12072.  
  12073.   SSINICH="BASE1.SCR"
  12074.  
  12075.  BASE1.SCR, located in the \MMOS2\INSTALL subdirectory, contains mmioInstall 
  12076.  structure examples.  You can also install an IOProc in your system by 
  12077.  identifying the IOProc in the initialization file (MMPMMMIO.INI) using the 
  12078.  mmioIniFileHandler function. 
  12079.  
  12080.  The following shows an example of how an application uses the 
  12081.  mmioIniFileHandler function to install the OS/2 1.3 PM bit map image IOProc. 
  12082.  
  12083.   #define FOURCC_OS13   mmioFOURCC( 'O', 'S', '1', '3' )
  12084.  
  12085.   #pragma linkage( mmioIniFileHandler, system )
  12086.  
  12087.   void main ()
  12088.   {
  12089.    ULONG   rc;
  12090.    MMINIFILEINFO  mminifileinfo;
  12091.    mminifileinfo.fccIOProc = FOURCC_OS13;
  12092.    strcpy (mminifileinfo.szDLLName, "OS13PROC");
  12093.    strcpy (mminifileinfo.szProcName, "OS13BITMAPIOPROC");
  12094.    mminifileinfo.ulExtendLen = 16L;
  12095.    mminifileinfo.ulFlags = 0L;
  12096.    mminifileinfo.ulMediaType = MMIO_MEDIA_IMAGE;
  12097.    mminifileinfo.ulIOProcType = MMIO_IOPROC_FILEFORMAT;
  12098.    strcpy (mminifileinfo.szDefExt, "");
  12099.  
  12100.    printf ("Installing OS/2 PM Bitmap (V1.3) IOProc\n");
  12101.  
  12102.    rc = mmioIniFileHandler (&mminifileinfo, MMIO_INSTALLPROC);
  12103.    switch (rc)
  12104.    {
  12105.      case MMIO_SUCCESS:
  12106.       printf ("Installing Complete\n");
  12107.       break;
  12108.      case MMIOERR_INVALID_PARAMETER:
  12109.       printf ("Error in this install program\n");
  12110.       break;
  12111.      case MMIOERR_INTERNAL_SYSTEM:
  12112.       printf ("OS/2 MPM System Error\n");
  12113.       break;
  12114.      case MMIOERR_NO_CORE:
  12115.       printf ("Memory unavailable for this IOProc\n");
  12116.       break;
  12117.      case MMIOERR_INI_OPEN:
  12118.       printf ("Unable to access the OS/2 MMPMMMIO.INI file\n");
  12119.       break;
  12120.      case MMIOERR_INVALID_FILENAME:
  12121.       printf ("Cannot find the file : OS13PROC.DLL\n");
  12122.       break;
  12123.      default:
  12124.       printf ("Unknown error attempting to install OS/2 Bitmap V(1.3)\n");
  12125.       break;
  12126.    }
  12127.   }
  12128.  
  12129.  The advantage of installing I/O procedures in the MMPMMMIO.INI file is to 
  12130.  achieve application transparency; I/O procedures become built-in as soon as 
  12131.  you restart your OS/2 multimedia application.  Note that the IOProc must 
  12132.  reside in a DLL file, although more than one IOProc can reside in the DLL if 
  12133.  necessary. 
  12134.  
  12135.  
  12136. ΓòÉΓòÉΓòÉ 7.8. Inserting External Settings Pages ΓòÉΓòÉΓòÉ
  12137.  
  12138. The following approach shows you how to insert settings pages in the Multimedia 
  12139. Setup notebook, where the code for the settings pages exists outside the 
  12140. Multimedia Setup program itself.  This is applicable in situations where you 
  12141. want to insert an external settings page for configuration items that are not 
  12142. strictly related to a particular MCD.  For example, pages that apply to the 
  12143. system or to all media control interface devices of a particular class. 
  12144.  
  12145. Note:  To insert a settings page for a particular MCD, see Inserting Pages in 
  12146.        the Multimedia Setup Notebook. 
  12147.  
  12148.  MDM uses the MMPM2.INI file to maintain a data base of installed multimedia 
  12149.  components and devices.  MMPM2.INI is initialized by the MINSTALL program. 
  12150.  Additional sections in the MMPM2.INI file are initialized based on information 
  12151.  contained in the keywords in an installation control file, or as requested by 
  12152.  an application calling MDM to make the change. 
  12153.  
  12154.  You can write an INI change control file containing the ProfileData structure 
  12155.  to define external pages by following these steps: 
  12156.  
  12157.    1. Write a function to create the settings page. The function should be of 
  12158.       the prototype shown in the following example. 
  12159.  
  12160.               HWND InsertExamplePage(PMCI_DEVICESETTINGS_PARMS pMCIDevSettings)
  12161.  
  12162.               {
  12163.                 HWND  hwndPage;               /* Page window handle    */
  12164.                 CHAR  szTabText[CCHMAXPATH];  /* Buffer for tab string */
  12165.                 ULONG ulPageId;               /* Page Identifier       */
  12166.  
  12167.             /*******************************************************************/
  12168.             /*   Load a modeless secondary window                              */
  12169.             /*******************************************************************/
  12170.                 hwndPage    = WinLoadSecondaryWindow(
  12171.                                      pMCIDevSettings->hwndNotebook,
  12172.                                      pMCIDevSettings->hwndNotebook,
  12173.                                      ExamplePageDlgProc,
  12174.                                      vhmodMRI,
  12175.                                      ID_EXAMPLE,
  12176.                                      (PVOID)pMCIDevSettings);
  12177.  
  12178.                 if (!hwndPage) return (NULL);
  12179.  
  12180.                 ulPageId = (ULONG)WinSendMsg( pMCIDevSettings->hwndNotebook,
  12181.                                      BKM_INSERTPAGE,
  12182.                                      (ULONG)NULL,
  12183.                                      MPFROM2SHORT( BKA_AUTOPAGESIZE |
  12184.                                      BKA_MINOR, BKA_LAST ) );
  12185.             /*******************************************************************/
  12186.             /*  Associate a secondary window with a notebook page.             */
  12187.             /*******************************************************************/
  12188.  
  12189.                 WinSendMsg(pMCIDevSettings->hwndNotebook, BKM_SETPAGEWINDOWHWND,
  12190.                           MPFROMP( ulPageId ), MPFROMLONG( hwndPage ) );
  12191.  
  12192.             /*******************************************************************/
  12193.             /*  Get Tab Text from DLL                                          */
  12194.             /*******************************************************************/
  12195.  
  12196.                 WinLoadString(WinQueryAnchorBlock( HWND_DESKTOP ), vhmodMRI,
  12197.                        (USHORT)IDB_EXAMPLE, CCHMAXPATH, szTabText );
  12198.  
  12199.             /*******************************************************************/
  12200.             /*  Set Tab Text                                                   */
  12201.             /*******************************************************************/
  12202.  
  12203.                 WinSendMsg( pMCIDevSettings->hwndNotebook, BKM_SETTABTEXT,
  12204.                       MPFROMP( ulPageId ), szTabText );
  12205.  
  12206.                 return( hwndPage );
  12207.  
  12208.              }
  12209.  
  12210.              typedef struct {
  12211.                 HWND hwndHelpInstance;
  12212.              } MMPAGEINFO;
  12213.              typedef MMPAGEINFO * PMMPAGEINFO;
  12214.  
  12215.             /*******************************************************************/
  12216.             /*  Modeless secondary window procedure                            */
  12217.             /*******************************************************************/
  12218.  
  12219.              MRESULT EXPENTRY ExamplePageDlgProc (HWND hwnd, USHORT msg,
  12220.                                                   MPARAM mp1, MPARAM mp2)
  12221.  
  12222.              PMMPAGEINFO pMMPageInfo = (PMMPAGEINFO)
  12223.                                         WinQueryWindowPtr (hwnd, QWL_USER);
  12224.  
  12225.                switch (msg) {
  12226.                   case WM_INITDLG:
  12227.                      /* Initialize The Page */
  12228.                      pMMPageInfo = (PMMPAGEINFO) malloc(sizeof(MMPAGEINFO));
  12229.                      WinSetWindowPtr (hwnd, QWL_USER, pMMPageInfo);
  12230.  
  12231.                      /* Create a Help Instance */
  12232.                      pMMPageInfo->hwndHelpInstance = WinCreateHelpInstance(...);
  12233.                      break;
  12234.  
  12235.                   case WM_DESTROY:
  12236.                      /* Clean up page window resources */
  12237.                       WinDestroyHelpInstance (pMMPageInfo->hwndHelpInstance);
  12238.                       free (pMMPageInfo);
  12239.                       break;
  12240.  
  12241.                   case WM_COMMAND:
  12242.                       /* Process All Commands */
  12243.                       return ((MRESULT) FALSE);
  12244.                       break;
  12245.  
  12246.                   case MM_TABHELP:
  12247.                       /* Display help for a tab */
  12248.                       if (pMMPageInfo->hwndHelpInstance) {
  12249.                           WinSendMsg(
  12250.                               pMMPageInfo->hwndHelpInstance,
  12251.                               HM_DISPLAY_HELP,
  12252.                               MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
  12253.                               HM_RESOURCEID );
  12254.                        }
  12255.                        break;
  12256.  
  12257.                   case WM_CLOSE:
  12258.                       return ((MRESULT) FALSE);
  12259.                       break;
  12260.  
  12261.                   case WM_HELP:
  12262.                       if (pMMPageInfo->hwndHelpInstance) {
  12263.                           WinSendMsg(
  12264.                                pMMPageInfo->hwndHelpInstance,
  12265.                                HM_DISPLAY_HELP,
  12266.                                (MPARAM) mp1,
  12267.                                HM_RESOURCEID );
  12268.                        }
  12269.                        return ((MRESULT)TRUE);
  12270.                        break;
  12271.  
  12272.                   case WM_TRANSLATEACCEL:
  12273.                         return (WinDefWindowProc (hwnd, msg, mp1, mp2));
  12274.                         break;
  12275.  
  12276.                   case HM_QUERY_KEYS_HELP:
  12277.                         return((MRESULT) IDH_HELPFORKEYS);
  12278.                         break;
  12279.  
  12280.                   }
  12281.  
  12282.                   return (WinDefSecondaryWindowProc(hwnd, msg, mp1, mp2));
  12283.                }
  12284.  
  12285.    2. Create an INI change control file containing the ProfileData structure as 
  12286.       shown in the following example. 
  12287.  
  12288.                ProfileData =
  12289.                   (
  12290.                   ini="$(DIR)0\\MMPM.INI"            /* Name of the INI file    */
  12291.                   appname="STPM_SettingsPage:7"      /* External settings pages */
  12292.                   keyname="UniqueName"               /* Name of the page        */
  12293.                   dll="RESDLLNAME"                   /* Resource DLL name       */
  12294.                   id=33L                             /* Resource ID             */
  12295.                   )
  12296.       The external settings pages are stored with the appname of 
  12297.       STPM_SettingsPage:#, where # is the string equivalent of 
  12298.       MCI_DEVICETYPE_xxx values.  The # value of 0 indicates that the settings 
  12299.       page is a system-oriented settings page.  The keyname value for an 
  12300.       external settings page can be any unique name that identifies the page. 
  12301.       The dll value specifies the name of the DLL that contains a RCDATA 
  12302.       resource with the value specified in the id field.  The id field is the 
  12303.       resource ID of the RCDATA resource.  The value is a LONG numeric value; 
  12304.       for example, 33L. 
  12305.  
  12306.       In addition to the INI change control file, you must load a resource DLL 
  12307.       during installation. The value of the data item is a string that contains 
  12308.       the module name and the entry point of the DLL that inserts a settings 
  12309.       page.  The value string in the example shown in the following example is 
  12310.       "MakePage,InsertExamplePage". 
  12311.  
  12312.                RCDATA  33
  12313.                BEGIN
  12314.                  "MakePage,InsertExamplePage"
  12315.                END
  12316.  
  12317.       This script format loads a block of data from a RCDATA resource stored in 
  12318.       a DLL, and writes it to a standard OS/2 INI file using the OS/2 
  12319.       PrfWriteProfileData function.  The ProfileData structure is discussed in 
  12320.       more detail in Defining Changes to Other INI Files. 
  12321.  
  12322.       Note:  Entry points that are registered in this way will apply to all 
  12323.              devices of the declared media control interface device type. 
  12324.              Therefore, if a settings page is intended to apply to a particular 
  12325.              device, then the function should verify that it is dealing with 
  12326.              the appropriate device. 
  12327.  
  12328.    3. Specify the name of the INI change control file created in step 2 in 
  12329.       CONTROL.SCR. 
  12330.  
  12331.    4. If you are writing an installation DLL, an external settings page can be 
  12332.       installed by calling the OS/2 PrfWriteProfileData function directly as 
  12333.       shown in the following example. 
  12334.  
  12335.             hini = PrfOpenProfile("c:\mmos2\mmpm.ini");
  12336.             PrfWriteProfileData (hini,
  12337.                                  "STPM_SettingsPage:7",         /* Appname      */
  12338.                                  "UniqueName",                  /* Keyname      */
  12339.                                  "MakePage, InsertExamplePage", /* Value        */
  12340.                                  "strlen("MakePage, InsertExamplePage")+1);
  12341.                                                                 /* Value length */
  12342.             PrfCloseProfile(hini);
  12343.  
  12344.  Refer to the OS/2 Presentation Manager Programming Reference for more 
  12345.  information on the PrfWriteProfileData function. 
  12346.  
  12347.  
  12348. ΓòÉΓòÉΓòÉ 7.9. Installation LOG File ΓòÉΓòÉΓòÉ
  12349.  
  12350. During installation, MINSTALL writes an installation log file called 
  12351. MINSTALL.LOG.  The LOG file records installation information and can be used to 
  12352. identify problems that occur during the installation procedure. 
  12353.  
  12354. When you start the installation procedure, the LOG file defaults to the root 
  12355. directory of the startup (boot) disk.  When the user selects the Install push 
  12356. button in the installation main selection window, the LOG file is moved to the 
  12357. destination directory.  The LOG file can be printed using the PRINT command or 
  12358. viewed using the TYPE command.  To view the LOG file on the screen, at an OS/2 
  12359. command prompt, type: 
  12360.  
  12361. TYPE d:\MMOS2\INSTALL\MINSTALL.LOG
  12362.  
  12363. where d is the destination drive selected for the installation. 
  12364.  
  12365. If a problem occurs during installation, MINSTALL might display a screen with 
  12366. information about the problem.  If you cannot solve the problem using the 
  12367. information on the screen, you can view the LOG file to determine how to handle 
  12368. the problem.  The problem will not necessarily be the last entry in the LOG 
  12369. file. 
  12370.  
  12371. If you determine that you need to call IBM for support, print the LOG file 
  12372. before you call.  The IBM support personnel will need the LOG information to 
  12373. resolve your installation problem. 
  12374.  
  12375. If the installation is successful, a Congratulations screen appears. 
  12376.  
  12377. Note:  You might receive a message that the installation was successful, but 
  12378.        when you view the LOG file you notice that the file reported some 
  12379.        errors.  This means that the errors were resolved during the 
  12380.        installation procedure and the errors reported in the LOG file can be 
  12381.        ignored. 
  12382.  
  12383.  The following example shows a sample of a MINSTALL.LOG file for a successful 
  12384.  installation. 
  12385.  
  12386.   Begin parsing master file - Z:\RT\CONTROL.SCR.
  12387.   Z:\RT\CONTROL.SCR parsed successfully.
  12388.   Begin parsing file list - Z:\RT\MASTERH3.RT
  12389.   Z:\RT\MASTERH3.RT parsed successfully.
  12390.   The following file was copied successfully: D:\MMOS2\README
  12391.   The following file was copied successfully: D:\MMOS2\MINSTALL.EXE
  12392.   .
  12393.   .
  12394.   .
  12395.   The following file was copied successfully: D:\MMOS2\INSTALL\WAVEFILE.EAS
  12396.   Loaded DLL D:\MMOS2\DLL\MMSND.DLL and calling entry point InstallMMSound.
  12397.   Returned from DLL D:\MMOS2\DLL\MMSND.DLL.
  12398.   Loaded DLL D:\MMOS2\DLL\QRYUM.DLL and calling entry point LocateUM.
  12399.   An extended Sysinfo failed call with dwItem=1024.
  12400.   An extended Sysinfo failed call with dwItem=4096.
  12401.   Completed updating MMPM2.INI with Digital Video Player devices.
  12402.   Returned from DLL D:\MMOS2\DLL\QRYUM.DLL.
  12403.   Loaded DLL D:\MMOS2\DLL\QRYCD.DLL and calling entry point LocateCD.
  12404.   An extended Sysinfo failed call with dwItem=4.
  12405.   .
  12406.   .
  12407.   .
  12408.   An extended Sysinfo failed call with dwItem=4.
  12409.   Returned from DLL D:\MMOS2\DLL\QRYCD.DLL.
  12410.   Loaded DLL D:\MMOS2\DLL\QRYAD.DLL and calling entry point LocateMAUDIO.
  12411.   Completed updating CONFIG.SYS with M-Audio devices
  12412.   An extended Sysinfo failed call with dwItem=1024.
  12413.   An extended Sysinfo failed call with dwItem=1024.
  12414.   Completed updating MMPM2.INI with M-Audio devices
  12415.   Returned from DLL D:\MMOS2\DLL\QRYAD.DLL.
  12416.   Starting to parse the file 'D:\MMOS2\INSTALL\BASE.SCR'.
  12417.   Successfully parsed the file 'D:\MMOS2\INSTALL\BASE.SCR'.
  12418.   Starting to parse the file 'D:\MMOS2\INSTALL\SMVINI.SCR'.
  12419.   Successfully parsed the file 'D:\MMOS2\INSTALL\SMVINI.SCR'.
  12420.   Starting to parse the file 'D:\MMOS2\INSTALL\BASECONF.CH'.
  12421.   Successfully parsed the file 'D:\MMOS2\INSTALL\BASECONF.CH'.
  12422.   Starting to parse the file 'D:\MMOS2\INSTALL\SMVCONF.CH'.
  12423.   Successfully parsed the file 'D:\MMOS2\INSTALL\SMVCONF.CH'.
  12424.   Loaded DLL D:\MMOS2\DLL\ITERM.DLL and calling entry point ITermEntry.
  12425.   Returned from DLL D:\MMOS2\DLL\ITERM.DLL.
  12426.   Loaded DLL D:\MMOS2\DLL\WEPMPINT.DLL and calling entry point WepmPlusAdd.
  12427.   Returned from DLL D:\MMOS2\DLL\WEPMPINT.DLL.
  12428.  
  12429.  
  12430. ΓòÉΓòÉΓòÉ 8. Stream Handler Module Definitions ΓòÉΓòÉΓòÉ
  12431.  
  12432. The following information describes the high-level design and operation of the 
  12433. stream handlers provided with the OS/2 multimedia system.  The handlers 
  12434. described include: 
  12435.  
  12436.    o  Audio Stream Handler DLL and "Stub" Device Driver 
  12437.    o  MIDI Mapper Stream Handler DLL 
  12438.    o  File System Stream Handler DLL 
  12439.    o  Memory Stream Handler DLL 
  12440.    o  CD-DA Stream Handler DLL 
  12441.    o  CD-ROM XA Stream Handler DLL 
  12442.  
  12443.  
  12444. ΓòÉΓòÉΓòÉ 8.1. Audio Stream Handler ΓòÉΓòÉΓòÉ
  12445.  
  12446. The Audio Stream Handler is used to control streaming of audio data.  In some 
  12447. cases, the Audio Stream Handler acts as a consumer of audio data, and in other 
  12448. cases it acts as a producer.  The audio data in each of these cases is always 
  12449. digital.  It is sometimes compressed and sometimes uncompressed.  Each of these 
  12450. cases is discussed in detail below.  In addition to these discussions, 
  12451. information is included concerning interaction between this module and the 
  12452. Sync/Stream Manager. 
  12453.  
  12454. This module is implemented as a DLL running at Ring 3 as well as a stub device 
  12455. driver module (PDD) running at Ring 0 (system kernel privilege level). 
  12456.  
  12457. The Audio Stream Handler running at Ring 3 can call Ring 3 DLL audio CODECs to 
  12458. assist in compressing and decompressing audio data.  The Ring 3 Audio Stream 
  12459. Handler communicates with audio device drivers through the DDCMD interfaces in 
  12460. the VSD.  (Refer to the OS/2 Multimedia Programming Reference for the VSD DDCMD 
  12461. interface definitions.) 
  12462.  
  12463. Existing audio device drivers use standard audio-device-driver interface 
  12464. (DDCMDs) to communicate with the Ring 0 stub device driver module. 
  12465.  
  12466. External Interface Description 
  12467.  
  12468. The description for the Ring 3 Audio Stream Handler external interface follows: 
  12469.  
  12470.  File Name           AUDIOSH.DLL 
  12471.  
  12472.  Handler Name        AUDIOSH$ 
  12473.  
  12474.  Handler Class       AUDIOSH 
  12475.  
  12476.  DD/DLL              DLL 
  12477.  
  12478.  Source              This stream handler can be a source when recording audio 
  12479.                      data from an audio device.  When using this component to 
  12480.                      record digitized audio, it is known as an audio Source 
  12481.                      Stream Handler.  Audio signals are brought into the system 
  12482.                      and digitized by an audio hardware device.  The resultant 
  12483.                      data is then passed to the consumer stream handler by way 
  12484.                      of a set of stream buffers. 
  12485.  
  12486.                      The output of this stream handler can be in several 
  12487.                      different forms such as uncompressed 16-bit PCM, and 
  12488.                      several styles of compressed ADPCM. 
  12489.  
  12490.  Target              This stream handler can be a target when playing audio 
  12491.                      data from a source.  When using this stream handler to 
  12492.                      play back recorded audio samples, it is acting as an audio 
  12493.                      target stream handler.  Digitized audio data will be 
  12494.                      streamed from the source stream handler (for example, the 
  12495.                      File System Stream Handler) through the Sync/Stream 
  12496.                      Manager.  This data is transferred through a number of 
  12497.                      stream buffers, which are allocated and managed through 
  12498.                      the Sync/Stream Manager. 
  12499.  
  12500.                      The exact number and size of these stream buffers will 
  12501.                      depend on the type of data being streamed.  The 
  12502.                      information needed to determine the size and number of 
  12503.                      stream buffers is contained in the stream protocol control 
  12504.                      block (SPCB) for a particular type of stream. 
  12505.  
  12506.                      This stream handler supports audio data in several 
  12507.                      different formats (stream types) such as 16-bit PCM, AVC's 
  12508.                      8-bit ADPCM, CD-ROM XA's 8-bit ADPCM, and so forth. 
  12509.  
  12510.                      In addition to handling the playback of audio data, this 
  12511.                      stream handler generates sync pulses based on the playback 
  12512.                      of an audio stream. Therefore, this stream handler can be 
  12513.                      a master or a slave in a sync relationship. The 
  12514.                      application can set up a sync relationship between two 
  12515.                      streams and define the sync pulse granularity. Sync pulses 
  12516.                      would then be generated by the Audio Stream Handler, 
  12517.                      possibly on a recurring interval, based on the sync 
  12518.                      granularity defined in the SPCB for the data type. 
  12519.  
  12520.  Device Control Blocks 
  12521.  
  12522.  The Ring 3 Audio Stream Handler supports two device control blocks (DCBs). 
  12523.  The DCB is used to associate an audio device driver with this stream handler 
  12524.  for this stream instance.  The DCB is passed as a parameter on a call to 
  12525.  SpiCreateStream. 
  12526.  
  12527.    /**********************************************
  12528.     *
  12529.     * DCB_AUDIOSH - Device Control Block for the
  12530.     *               Audio Stream Handler.
  12531.     *               (*** PACKED STRUCTURE ***)
  12532.     **********************************************/
  12533.    typedef struct _dcb_audiosh { /* dcb_audiosh  -  Device Control Block */
  12534.       ULONG   ulDCBLen;                  /* Length of structure          */
  12535.       SZ      szDevName[MAX_SPI_NAME];   /* Device driver name           */
  12536.       ULONG   ulSysFileNum;              /* File handle number - From an */
  12537.                                          /* audio_init call              */
  12538.       } DCB_AUDIOSH;
  12539.    typedef struct _dcb_audiosh FAR  *PDCB_AUDIOSH;
  12540.  
  12541.  The Ring 3 Audio Stream Handler also supports the VSD device control block 
  12542.  (VSD_DCB) which identifies the VSD DLL to be used by the Ring 3 Audio Stream 
  12543.  Handler.  The VSD_DCB is passed as a parameter on a call to SpiCreateStream. 
  12544.  
  12545.  
  12546.   /***************************************************************************
  12547.    *
  12548.    * VSD_DCB - VSD Device Control Block
  12549.    *
  12550.    *         This structure will allow stream handlers to use the VSD DLL
  12551.    *         by using by the additional fields in the structure.
  12552.    *
  12553.    *               (*** PACKED STRUCTURE ***)
  12554.    ***************************************************************************/
  12555.   typedef struct _VSD_DCB { /* vsd_dcb - VSD Device Control Block            */
  12556.  
  12557.      ULONG   ulDCBLen;                /* Length of structure                 */
  12558.      SZ      szDevName[MAX_SPI_NAME]; /* Device driver name        */
  12559.      ULONG   ulSysFileNum;            /* File handle number                  */
  12560.      ULONG   hvsd;                    /* Handle to VSD instance              */
  12561.      PFN     pfnvsdEntryPoint;        /* Address of VSD entry point          */
  12562.      ULONG   ulReserved1;             /* Reserved for system                 */
  12563.      ULONG   ulReserved2;             /* Reserved for system                 */
  12564.  
  12565.      } VSD_DCB;
  12566.  
  12567.   typedef VSD_DCB FAR *PVSD_DCB;
  12568.  
  12569.  Associate Control Blocks 
  12570.  
  12571.  The Audio Stream Handler does not support an associate control block. 
  12572.  
  12573.  Implicit Events (EVENT_IMPLICIT_TYPE) Supported 
  12574.  
  12575.  The following implicit (EVENT_IMPLICIT_TYPE) events for the Audio Stream 
  12576.  Handler are supported: 
  12577.  
  12578.    o  EVENT_ERROR 
  12579.  
  12580.       The ulStatus field will contain the error code.  The possible error codes 
  12581.       that can be generated and returned by this stream handler are: 
  12582.  
  12583.         -  ERROR_INVALID_BUFFER_RETURNED 
  12584.         -  ERROR_DEVICE_OVERRUN 
  12585.         -  ERROR_STREAM_STOP_PENDING 
  12586.  
  12587.    o  EVENT_PLAYLISTCUEPOINT 
  12588.  
  12589.       This will be generated only when this stream handler is a target and it 
  12590.       finds a cuepoint indicator in the buffer table from the Sync/Stream 
  12591.       Manager. The event will be reported after the data has been written to 
  12592.       the file system using MMIO.  The ulMessageParm field of the PLAYL_EVCB 
  12593.       will be filled in with the message supplied in the playlist instruction. 
  12594.       The mmtimeStream field will not be filled in. 
  12595.  
  12596.  Explicit Events Supported 
  12597.  
  12598.  The following explicit events for the Audio Stream Handler are supported: 
  12599.  
  12600.    o  EVENT_CUE_TIME 
  12601.    o  EVENT_CUE_TIME_PAUSE 
  12602.    o  EVENT_DATAUNDERRUN 
  12603.  
  12604.  Explicit Events Not Supported 
  12605.  
  12606.  The following explicit events for the Audio Stream Handler are not supported: 
  12607.  
  12608.    o  EVENT_CUE_DATA 
  12609.    o  EVENT_DATAOVERRUN (Not Supported) 
  12610.  
  12611.  Stream Handler Commands Supported 
  12612.  
  12613.  The following stream handler commands (SHC) are supported. Refer to the OS/2 
  12614.  Multimedia Programming Reference for a description of these SHC commands and 
  12615.  the error return codes. 
  12616.  
  12617.    o  SHC_ASSOCIATE 
  12618.  
  12619.       Possible Return Codes: 
  12620.  
  12621.         -  NO_ERROR 
  12622.         -  ERROR_INVALID_FUNCTION 
  12623.         -  ERROR_INVALID_REQUEST 
  12624.  
  12625.    o  SHC_CLOSE 
  12626.  
  12627.       Possible Return Codes: 
  12628.  
  12629.         -  NO_ERROR 
  12630.         -  ERROR_INVALID_FUNCTION 
  12631.  
  12632.    o  SHC_CREATE 
  12633.  
  12634.       Possible Return Codes: 
  12635.  
  12636.         -  NO_ERROR 
  12637.         -  ERROR_INVALID_FUNCTION 
  12638.         -  ERROR_STREAM_CREATION 
  12639.         -  ERROR_INVALID_STREAM 
  12640.         -  ERROR_DEVICE_NOT_FOUND 
  12641.         -  ERROR_INVALID_BLOCK 
  12642.         -  ERROR_INVALID_SPCBKEY 
  12643.  
  12644.    o  SHC_DESTROY 
  12645.  
  12646.       Possible Return Codes: 
  12647.  
  12648.         -  NO_ERROR 
  12649.         -  ERROR_INVALID_FUNCTION 
  12650.         -  ERROR_INVALID_STREAM 
  12651.  
  12652.    o  SHC_DISABLE_EVENT 
  12653.  
  12654.       Possible Return Codes: 
  12655.  
  12656.         -  NO_ERROR 
  12657.         -  ERROR_INVALID_FUNCTION 
  12658.         -  ERROR_INVALID_EVENT 
  12659.  
  12660.    o  SHC_DISABLE_SYNC 
  12661.  
  12662.       Possible Return Codes: 
  12663.  
  12664.         -  NO_ERROR 
  12665.         -  ERROR_INVALID_FUNCTION 
  12666.  
  12667.    o  SHC_ENABLE_EVENT 
  12668.  
  12669.       Possible Return Codes: 
  12670.  
  12671.         -  NO_ERROR 
  12672.         -  ERROR_INVALID_FUNCTION 
  12673.         -  ERROR_TOO_MANY_EVENTS 
  12674.         -  ERROR_INVALID_EVENT 
  12675.  
  12676.    o  SHC_ENABLE_SYNC 
  12677.  
  12678.       Possible Return Codes: 
  12679.  
  12680.         -  NO_ERROR 
  12681.         -  ERROR_INVALID_FUNCTION 
  12682.         -  ERROR_INVALID_FLAG 
  12683.         -  ERROR_INVALID_STREAM 
  12684.         -  ERROR_STREAM_NOTMASTER 
  12685.         -  ERROR_INVALID_NUMSLAVES 
  12686.  
  12687.    o  SHC_ENUMERATE_PROTOCOLS 
  12688.  
  12689.       Possible Return Codes: 
  12690.  
  12691.         -  NO_ERROR 
  12692.         -  ERROR_INVALID_FUNCTION 
  12693.         -  ERROR_INSUFF_BUFFER 
  12694.  
  12695.    o  SHC_GET_PROTOCOL 
  12696.  
  12697.       Possible Return Codes: 
  12698.  
  12699.         -  NO_ERROR 
  12700.         -  ERROR_INVALID_FUNCTION 
  12701.         -  ERROR_INVALID_SPCBKEY 
  12702.  
  12703.    o  SHC_GET_TIME 
  12704.  
  12705.       Possible Return Codes: 
  12706.  
  12707.         -  NO_ERROR 
  12708.         -  ERROR_INVALID_FUNCTION 
  12709.         -  ERROR_INVALID_STREAM 
  12710.  
  12711.    o  SHC_INSTALL_PROTOCOL 
  12712.  
  12713.       Possible Return Codes: 
  12714.  
  12715.         -  NO_ERROR 
  12716.         -  ERROR_INVALID_FUNCTION 
  12717.         -  ERROR_INVALID_SPCBKEY 
  12718.         -  ERROR_ALLOC_RESOURCES 
  12719.  
  12720.    o  SHC_NEGOTIATE_RESULT 
  12721.  
  12722.       Possible Return Codes: 
  12723.  
  12724.         -  NO_ERROR 
  12725.         -  ERROR_INVALID_FUNCTION 
  12726.  
  12727.    o  SHC_SEEK 
  12728.  
  12729.       Possible Return Codes: 
  12730.  
  12731.         -  NO_ERROR 
  12732.         -  ERROR_INVALID_FUNCTION 
  12733.         -  ERROR_STREAM_NOT_SEEKABLE 
  12734.         -  ERROR_DATA_ITEM_NOT_SEEKABLE 
  12735.  
  12736.    o  SHC_START 
  12737.  
  12738.       Possible Return Codes: 
  12739.  
  12740.         -  NO_ERROR 
  12741.         -  ERROR_INVALID_FUNCTION 
  12742.         -  ERROR_INVALID_STREAM 
  12743.  
  12744.    o  SHC_STOP 
  12745.  
  12746.       Possible Return Codes: 
  12747.  
  12748.         -  NO_ERROR 
  12749.         -  ERROR_INVALID_FUNCTION 
  12750.         -  ERROR_INVALID_STREAM 
  12751.  
  12752.  Base Stream Protocol Control Blocks Supported 
  12753.  
  12754.  The Audio Stream Handler supports the following SPCBs: 
  12755.  
  12756.    o  DATATYPE_WAVEFORM 
  12757.  
  12758.       Subtypes: 
  12759.  
  12760.         -  WAVE_FORMAT_1M08 
  12761.         -  WAVE_FORMAT_1S08 
  12762.         -  WAVE_FORMAT_1M16 
  12763.         -  WAVE_FORMAT_1S16 
  12764.         -  WAVE_FORMAT_2M08 
  12765.         -  WAVE_FORMAT_2S08 
  12766.         -  WAVE_FORMAT_2M16 
  12767.         -  WAVE_FORMAT_2S16 
  12768.         -  WAVE_FORMAT_4M08 
  12769.         -  WAVE_FORMAT_4S08 
  12770.         -  WAVE_FORMAT_4M16 
  12771.         -  WAVE_FORMAT_4S16 
  12772.         -  WAVE_FORMAT_8M08 
  12773.         -  WAVE_FORMAT_8S08 
  12774.         -  WAVE_FORMAT_8M16 
  12775.         -  WAVE_FORMAT_8S16 
  12776.  
  12777.    o  DATATYPE_ALAW 
  12778.  
  12779.       Subtypes: 
  12780.  
  12781.         -  ALAW_8B8KM 
  12782.         -  ALAW_8B11KM 
  12783.         -  ALAW_8B22KM 
  12784.         -  ALAW_8B44KM 
  12785.         -  ALAW_8B8KS 
  12786.         -  ALAW_8B11KS 
  12787.         -  ALAW_8B22KS 
  12788.         -  ALAW_8B44KS 
  12789.  
  12790.    o  DATATYPE_MULAW 
  12791.  
  12792.       Subtypes: 
  12793.  
  12794.         -  MULAW_8B8KM 
  12795.         -  MULAW_8B11KM 
  12796.         -  MULAW_8B22KM 
  12797.         -  MULAW_8B44KM 
  12798.         -  MULAW_8B8KS 
  12799.         -  MULAW_8B11KS 
  12800.         -  MULAW_8B22KS 
  12801.         -  MULAW_8B44KS 
  12802.  
  12803.    o  DATATYPE_ADPCM_AVC 
  12804.  
  12805.       Subtypes: 
  12806.  
  12807.         -  ADPCM_AVC_VOICE 
  12808.         -  ADPCM_AVC_MUSIC 
  12809.         -  ADPCM_AVC_STEREO 
  12810.         -  ADPCM_AVC_HQ 
  12811.  
  12812.    o  DATATYPE_MIDI 
  12813.  
  12814.       Subtypes: 
  12815.  
  12816.         -  SUBTYPE_NONE 
  12817.  
  12818.    o  DATATYPE_SPV2 
  12819.  
  12820.       Subtypes: 
  12821.  
  12822.         -  SPV2_BPCM 
  12823.         -  SPV2_PCM 
  12824.         -  SPV2_NONE 
  12825.  
  12826.  Stream Handler Limits 
  12827.  
  12828.  The Audio Stream Handler is limited by system memory. 
  12829.  
  12830.  
  12831. ΓòÉΓòÉΓòÉ 8.2. MIDI Mapper Stream Handler ΓòÉΓòÉΓòÉ
  12832.  
  12833. The MIDI Mapper Stream Handler is used to map MIDI data. This stream handler 
  12834. does not interface with an audio device driver directly but is basically a 
  12835. "filter" stream handler that filters the MIDI data.  The Audio Stream Handler 
  12836. is used to interface to the audio device drivers. 
  12837.  
  12838. This module is implemented as an OS/2 DLL running at ring 3. 
  12839.  
  12840. Flushing a Filter Stream Group 
  12841.  
  12842. A filter stream group requires some extra steps to properly erase its contents. 
  12843. Stop flushes must be sent separately to each stream.  An example stream group 
  12844. of one master stream connected through a filter handler to a slave stream would 
  12845. need a stop flush sent first to the master stream.  When the master stop event 
  12846. is received, the second stop flush must then be sent to the slave stream. 
  12847. Refer to the SHC_STOP command message in the OS/2 Multimedia Programming 
  12848. Reference. 
  12849.  
  12850. Application and Media Driver Capabilities 
  12851.  
  12852. For optimum performance, each application and media driver should have the 
  12853. following capabilities: 
  12854.  
  12855.  SEEK                       Seeks the source stream and then the target 
  12856.                             streams.  (The stream time will not be correct if 
  12857.                             you use another other method.) 
  12858.  
  12859.  STOP DISCARD               Stops the target streams and waits for all stop 
  12860.                             events.  Next, it stops the source stream and waits 
  12861.                             for the event.  If a stream is at EOS, an error 
  12862.                             stream that is already stopped will be returned. 
  12863.                             Failure to wait for events on the source stream 
  12864.                             will deadlock. 
  12865.  
  12866.  STOP FLUSH                 Stops the source stream and waits for the stop 
  12867.                             event.  Next, it stops the target streams and waits 
  12868.                             for the stop events.  Failure to wait for events on 
  12869.                             the source stream will cause deadlock. 
  12870.  
  12871.  STOP PAUSE                 Always pauses all streams at the same time. 
  12872.                             Pausing one stream while leaving another running 
  12873.                             can cause deadlock. 
  12874.  
  12875.  START                      Starts the source stream and then starts the target 
  12876.                             streams.  Small MIDI files will produce a quick EOS 
  12877.                             on the source stream.  Do not attempt to START or 
  12878.                             START PREROLL a target stream without first 
  12879.                             starting the source stream.  An attempt to do this 
  12880.                             will deadlock. 
  12881.  
  12882.  START PREROLL              Starts (nonpreroll) the source stream and then 
  12883.                             starts preroll target streams.  If you attempt to 
  12884.                             START PREROLL all streams, you will deadlock. 
  12885.  
  12886.  DESTROY                    Destroys all streams at the same time.  Do not try 
  12887.                             to destroy one stream and then continue to use 
  12888.                             another stream. 
  12889.  
  12890.  CREATE and ASSOCIATE       All streams must be created and associated before 
  12891.                             any streams can accept commands.  Do not attempt to 
  12892.                             add another stream later on. 
  12893.  
  12894.  External Interface Description 
  12895.  
  12896.  The description for the MIDI Mapper Stream Handler external interface follows: 
  12897.  
  12898.  File Name               MISH.DLL 
  12899.  
  12900.  Handler Name            MISH 
  12901.  
  12902.  Handler Class           MIDISYS 
  12903.  
  12904.  PDD/DLL                 DLL 
  12905.  
  12906.  Source and Target       This stream handler is a filter.  Therefore, it is 
  12907.                          both a source and a target stream handler at the same 
  12908.                          time.  It consumes MIDI data from the source stream 
  12909.                          and produces mapped MIDI data that goes into the 
  12910.                          target stream or streams. The MIDI Mapper Stream 
  12911.                          Handler can have one source stream (the master 
  12912.                          stream). 
  12913.  
  12914.                          This stream handler does not generate or receive sync 
  12915.                          pulses, but it can be included in a sync group. In 
  12916.                          fact, MIDI mapping is done by grouping the input 
  12917.                          stream (master stream) with the output streams (slave 
  12918.                          streams) to create a sync group. A stream will be 
  12919.                          created for each output port. The MIDI sync group can 
  12920.                          be started, stopped, and seeked as a group by using 
  12921.                          the "slaves" flag with each of these calls. 
  12922.  
  12923.  Device Control Blocks 
  12924.  
  12925.  The MIDI Mapper Stream Handler does not support a device control block. 
  12926.  
  12927.  Associate Control Blocks 
  12928.  
  12929.  The MIDI Mapper Stream Handler supports the following associate control blocks 
  12930.  shown in the following figure. 
  12931.  
  12932.     /******************************************************
  12933.     * MISH - MIDI stream handler port-stream table ACB
  12934.     ******************************************************/
  12935.     #define ACBTYPE_MISH       0x0005L   /* MIDI port-stream table        */
  12936.     typedef struct _acb_MISH     /* acbmish - MIDI Assoc. Control Block   */
  12937.        {
  12938.        ULONG     ulACBLen;               /* Length of structure           */
  12939.        ULONG     ulObjType;              /* ACB_MISH                      */
  12940.        HSTREAM   hstreamDefault;         /* Default hstream to use when   */
  12941.                                          /*  mapper is turned off.        */
  12942.        ULONG     ulReserved1;
  12943.        ULONG     ulReserved2;
  12944.        ULONG     ulNumInStreams;
  12945.        HSTREAM   hstreamInMAX[_PORTS];   /* Array of Input streams        */
  12946.        ULONG     ulNumOutStreams;
  12947.        HSTREAM   hstreamOut[MAX_PORTS];  /* Array of Output streams       */
  12948.                                          /* The index into the array is   */
  12949.                                          /*  the source channel for that  */
  12950.                                          /*  stream.                      */
  12951.        } ACB_MISH;
  12952.  
  12953.  
  12954.    /******************************************************
  12955.     * MISH - MIDI stream handler SET ACB
  12956.     ******************************************************/
  12957.     #define ACBTYPE_SET       0x0006L    /* MIDI set function             */
  12958.     typedef struct _acb_set      /* acbset - Set Assoc. Control Block     */
  12959.        {
  12960.        ULONG     ulACBLen;               /* Length of structure           */
  12961.        ULONG     ulObjType;              /* ACB_SET                       */
  12962.        ULONG     ulFlag;                 /* Set flag                      */
  12963.        ULONG     ulTempo;                /* Not used.                     */
  12964.        } ACB_SET;
  12965.  
  12966.     /* ulFlag defines:   */
  12967.     #define MIDI_MAP_ON        0x0000L   /* turn mapping function on      */
  12968.     #define MIDI_MAP_OFF       0x0001L   /* turn mapping function off     */
  12969.  
  12970.  Implicit Events (EVENT_IMPLICIT_TYPE) Supported 
  12971.  
  12972.  The following implicit (EVENT_IMPLICIT_TYPE) events for the MIDI Mapper Stream 
  12973.  Handler are supported: 
  12974.  
  12975.    o  EVENT_ERROR 
  12976.  
  12977.       The ulStatus field will contain the error code.  The possible error codes 
  12978.       that can be generated and returned by this stream handler are: 
  12979.  
  12980.         -  ERROR_INVALID_BUFFER_RETURNED 
  12981.         -  ERROR_DEVICE_OVERRUN 
  12982.         -  ERROR_STREAM_STOP_PENDING 
  12983.  
  12984.  Explicit Events Supported 
  12985.  
  12986.  No explicit events are supported for the MIDI Mapper Stream Handler. 
  12987.  
  12988.  Stream Handler Commands Supported 
  12989.  
  12990.  The following stream handler commands (SHC) are supported.  Refer to the OS/2 
  12991.  Multimedia Programming Reference for a description of these SHC commands and 
  12992.  the error return codes. 
  12993.  
  12994.    o  SHC_ASSOCIATE 
  12995.  
  12996.       Possible Return Codes: 
  12997.  
  12998.         -  NO_ERROR 
  12999.         -  ERROR_INVALID_FUNCTION 
  13000.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13001.         -  ERROR_INVALID_OBJTYPE (only ACBTYPE_MMIO is supported) 
  13002.         -  ERROR_INVALID_BUFFER_SIZE (ulAcbLen is smaller than needed) 
  13003.         -  ERROR_STREAM_NOT_STOP (stream must be stopped to associate) 
  13004.  
  13005.    o  SHC_CLOSE 
  13006.  
  13007.       Possible Return Codes: 
  13008.  
  13009.         -  NO_ERROR 
  13010.         -  ERROR_INVALID_FUNCTION 
  13011.  
  13012.    o  SHC_CREATE 
  13013.  
  13014.       Possible Return Codes: 
  13015.  
  13016.         -  NO_ERROR 
  13017.         -  ERROR_INVALID_FUNCTION 
  13018.         -  ERROR_STREAM_CREATION 
  13019.         -  ERROR_INVALID_STREAM 
  13020.         -  ERROR_DEVICE_NOT_FOUND 
  13021.         -  ERROR_INVALID_BLOCK 
  13022.         -  ERROR_INVALID_SPCBKEY 
  13023.         -  ERROR_ALLOC_RESOURCES 
  13024.  
  13025.    o  SHC_DESTROY 
  13026.  
  13027.       Possible Return Codes: 
  13028.  
  13029.         -  NO_ERROR 
  13030.         -  ERROR_INVALID_FUNCTION 
  13031.         -  ERROR_INVALID_STREAM 
  13032.  
  13033.          Possible Return Codes: 
  13034.  
  13035.         -  NO_ERROR 
  13036.         -  ERROR_INVALID_FUNCTION 
  13037.  
  13038.    o  SHC_ENUMERATE_PROTOCOLS 
  13039.  
  13040.       Possible Return Codes: 
  13041.  
  13042.         -  NO_ERROR 
  13043.         -  ERROR_INVALID_FUNCTION 
  13044.         -  ERROR_INSUFF_BUFFER 
  13045.  
  13046.    o  SHC_GET_PROTOCOL 
  13047.  
  13048.       Possible Return Codes: 
  13049.  
  13050.         -  NO_ERROR 
  13051.         -  ERROR_INVALID_FUNCTION 
  13052.         -  ERROR_INVALID_SPCBKEY 
  13053.  
  13054.    o  SHC_INSTALL_PROTOCOL 
  13055.  
  13056.       Possible Return Codes: 
  13057.  
  13058.         -  NO_ERROR 
  13059.         -  ERROR_INVALID_FUNCTION 
  13060.         -  ERROR_INVALID_SPCBKEY 
  13061.         -  ERROR_ALLOC_RESOURCES 
  13062.  
  13063.    o  SHC_NEGOTIATE_RESULT 
  13064.  
  13065.       Possible Return Codes: 
  13066.  
  13067.         -  NO_ERROR 
  13068.         -  ERROR_INVALID_FUNCTION 
  13069.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13070.  
  13071.    o  SHC_SEEK 
  13072.  
  13073.       Possible Return Codes: 
  13074.  
  13075.         -  NO_ERROR 
  13076.         -  ERROR_INVALID_FUNCTION 
  13077.         -  ERROR_STREAM_NOT_SEEKABLE 
  13078.         -  ERROR_DATA_ITEM_NOT_SEEKABLE 
  13079.         -  ERROR_INVALID_STREAM (invalid hstream or hstream and hid passed) 
  13080.         -  ERROR_NOT_SEEKABLE_BY_TIME 
  13081.         -  ERROR_STREAM_NOT_STOP 
  13082.  
  13083.    o  SHC_START 
  13084.  
  13085.       Possible Return Codes: 
  13086.  
  13087.         -  NO_ERROR 
  13088.         -  ERROR_INVALID_FUNCTION 
  13089.         -  ERROR_INVALID_STREAM (invalid hstream or hstream and hid passed) 
  13090.         -  ERROR_DATA_ITEM_NOT_SPECIFIED (stream must be associated) 
  13091.  
  13092.    o  SHC_STOP 
  13093.  
  13094.       Possible Return Codes: 
  13095.  
  13096.         -  NO_ERROR 
  13097.         -  ERROR_INVALID_FUNCTION 
  13098.         -  ERROR_INVALID_STREAM (invalid hstream or hstream and hid passed) 
  13099.         -  ERROR_STREAM_NOT_STARTED 
  13100.  
  13101.  Base Stream Protocol Control Blocks Supported 
  13102.  
  13103.  The MIDI Mapper Stream Handler supports the following stream protocol control 
  13104.  blocks (SPCBs). 
  13105.  
  13106.    o  DATATYPE_MIDI 
  13107.  
  13108.  Stream Handler Limits 
  13109.  
  13110.  Limited by system memory. 
  13111.  
  13112.  
  13113. ΓòÉΓòÉΓòÉ 8.3. File System Stream Handler ΓòÉΓòÉΓòÉ
  13114.  
  13115. The File System Stream Handler DLL transports data to or from file system 
  13116. devices (local or remote) on behalf of a real-time application.  This handler 
  13117. is unique in that it utilizes the MMIO subsystem to interface to a very wide 
  13118. variety of devices, such as hard disk drives, diskette drives, CD-ROM drives, 
  13119. WORM drives, and so forth.  These devices can be physically installed in the 
  13120. local system hardware, or they can be accessed across a LAN on a server 
  13121. machine. 
  13122.  
  13123. In a playback scenario (for example, waveform audio from a RIFF file), the File 
  13124. System Stream Handler uses MMIO to perform I/O on specified data files, and 
  13125. then performs stream processing to maintain a continuously available supply 
  13126. which is then streamed to a target stream handler; for example, the Waveform 
  13127. Audio Stream Handler.  This handler does not operate fully in a real-time mode, 
  13128. but it must support continuous data streaming.  It also does not support 
  13129. synchronization mastering, because the file system devices are not real-time 
  13130. devices. 
  13131.  
  13132. External Interface Description 
  13133.  
  13134. The description for the File System Stream Handler external interface follows: 
  13135.  
  13136.  File Name           FSSH.DLL 
  13137.  
  13138.  Handler Name        FSSH 
  13139.  
  13140.  Handler Class       FILESYS 
  13141.  
  13142.  PDD/DLL             DLL 
  13143.  
  13144.  Source              This stream handler can be the source in a stream. 
  13145.  
  13146.  Target              This stream handler can be the target in a stream. 
  13147.  
  13148.  Device Control Blocks 
  13149.  
  13150.  None. 
  13151.  
  13152.  Associate Control Blocks 
  13153.  
  13154.  This handler supports type ACBTYPE_MMIO associate control blocks. 
  13155.  
  13156.    /******************************************************
  13157.     * FSSH - File System Stream Handler MMIO Object ACB
  13158.     ******************************************************/
  13159.     #define ACBTYPE_MMIO      0x0001L       /* MMIO object             */
  13160.  
  13161.     typedef struct _acb_mmio                /* acbmmio  - MMIO ACB     */
  13162.        {
  13163.        ULONG   ulACBLen;                    /* Length of structure     */
  13164.        ULONG   ulObjType;                   /* ACB_MMIO                */
  13165.        HMMIO   hmmio;                       /* Handle of MMIO object   */
  13166.        } ACB_MMIO;
  13167.  
  13168.  Implicit (EVENT_IMPLICIT_TYPE) Events Supported 
  13169.  
  13170.  The following implicit (EVENT_IMPLICIT_TYPE) events for the File System Stream 
  13171.  Handler are supported: 
  13172.  
  13173.    o  EVENT_ERROR 
  13174.  
  13175.       The error type will be set in the ulFlag field of the event control 
  13176.       block.  The three types of errors that will be reported are: 
  13177.  
  13178.         -  Temporary Error - TEMPORARY_ERROR 0x0000L 
  13179.  
  13180.            An error occurred during streaming but the stream handler, the SSM, 
  13181.            or both the stream handler and the SSM were able to continue 
  13182.            streaming. 
  13183.  
  13184.         -  Recoverable Error - RECOVERABLE_ERROR 0x0001L 
  13185.  
  13186.            An error occurred that required the stream to be stopped.  The 
  13187.            application can restart the stream if appropriate. 
  13188.  
  13189.         -  NonRecoverable Error - NONRECOVERABLE_ERROR 0x0002L 
  13190.  
  13191.            A severe error occurred causing the stream handler to stop this 
  13192.            stream.  The stream cannot be restarted.  The application must issue 
  13193.            a call to SpiDestroyStream. 
  13194.  
  13195.          The ulStatus field will contain the error code.  No error codes are 
  13196.          generated and returned by this stream handler. 
  13197.  
  13198.          Also, errors from the following APIs can be returned: 
  13199.  
  13200.         -  DosGetInfoBlocks 
  13201.         -  SMHEntryPoint SMH_NOTIFY 
  13202.         -  mmioRead (If source, extended error code obtained by 
  13203.            mmioGetLastError) 
  13204.         -  mmioWrite (If target, extended error code obtained by 
  13205.            mmioGetLastError) 
  13206.  
  13207.    o  EVENT_PLAYLISTCUEPOINT 
  13208.  
  13209.       This will be generated only when this stream handler is a target and it 
  13210.       finds a cuepoint indicator in the buffer table from the Sync/Stream 
  13211.       Manager.  The event will be reported after the data has been written to 
  13212.       the file system using MMIO.  The ulMessageParm field of the PLAYL_EVCB 
  13213.       will be filled in with the message supplied in the playlist instruction. 
  13214.       The mmtimeStream field will not be filled in. 
  13215.  
  13216.  Explicit Events Supported 
  13217.  
  13218.  No explicit events are supported for the File System Stream Handler. 
  13219.  
  13220.  Stream Handler Commands Supported 
  13221.  
  13222.  The following stream handler commands (SHCs) are supported. Refer to the OS/2 
  13223.  Multimedia Programming Reference for a description of these SHC commands and 
  13224.  the error return codes. 
  13225.  
  13226.    o  SHC_ASSOCIATE 
  13227.  
  13228.       Note:  A stream requires a file to be opened and associated to the stream 
  13229.              before a stream can be started.  Reassociating a new object 
  13230.              without stopping the stream is not supported. 
  13231.  
  13232.       Possible return codes: 
  13233.  
  13234.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13235.         -  ERROR_INVALID_OBJTYPE (only ACBTYPE_MMIO is supported) 
  13236.         -  ERROR_INVALID_BUFFER_SIZE (ulAcbLen is smaller than needed) 
  13237.         -  ERROR_STREAM_NOT_STOP (stream must be stopped to associate) 
  13238.  
  13239.          Return codes from the following APIs are also returned: 
  13240.  
  13241.         -  DosRequestMutexSem 
  13242.  
  13243.    o  SHC_CREATE 
  13244.  
  13245.       Note:  If the spcbkey passed does not match any of the installed 
  13246.              protocols, the last installed stream protocol control block with 
  13247.              DATATYPE_GENERIC will be used. 
  13248.  
  13249.       Possible return codes: 
  13250.  
  13251.         -  ERROR_INVALID_SPCBKEY 
  13252.         -  ERROR_ALLOC_RESOURCES 
  13253.  
  13254.          Return codes from the following APIs are also returned: 
  13255.  
  13256.         -  DosRequestMutexSem 
  13257.         -  DosCreateThread 
  13258.  
  13259.    o  SHC_DESTROY 
  13260.  
  13261.       Possible return codes: 
  13262.  
  13263.         -  ERROR_INVALID_STREAM (invalid hstream or both hstream and hid 
  13264.            passed) 
  13265.  
  13266.          Return codes from the following APIs are also returned: 
  13267.  
  13268.         -  DosRequestMutexSem 
  13269.  
  13270.    o  SHC_START 
  13271.  
  13272.       Possible return codes: 
  13273.  
  13274.         -  ERROR_INVALID_STREAM (invalid hstream or both hstream and hid 
  13275.            passed) 
  13276.         -  ERROR_DATA_ITEM_NOT_SPECIFIED (stream must be associated before it 
  13277.            is started). 
  13278.  
  13279.          Return codes from the following APIs are also returned: 
  13280.  
  13281.         -  DosRequestMutexSem 
  13282.  
  13283.    o  SHC_STOP 
  13284.  
  13285.       Possible return codes: 
  13286.  
  13287.         -  ERROR_INVALID_STREAM (invalid hstream or both hstream and hid 
  13288.            passed) 
  13289.         -  ERROR_STREAM_NOT_STARTED 
  13290.  
  13291.          Return codes from the following APIs are also returned: 
  13292.  
  13293.         -  DosRequestMutexSem 
  13294.         -  DosResumeThread 
  13295.         -  DosSuspendThread 
  13296.  
  13297.    o  SHC_SEEK 
  13298.  
  13299.       Note:  If you are adding support in the system for a new nonlinear data 
  13300.              type, you can write a MMIO IOProc to support the MMIOM_SEEKBYTIME 
  13301.              message.  This message will be sent (mmioSendMessage) when the 
  13302.              File System Stream Handler gets a seek by time (for information on 
  13303.              the SpiSeekStream SPI_SEEKMMTIME parameter, refer to the OS/2 
  13304.              Multimedia Programming Reference.) and the SPCB indicates this is 
  13305.              a nonlinear data type by having a 0 in the spcb.ulBytesPerUnit 
  13306.              field, the spcb.mmtimePerUnit fields, or both fields. 
  13307.  
  13308.       Possible return codes: 
  13309.  
  13310.         -  ERROR_INVALID_STREAM (invalid hstream or both hstream and hid 
  13311.            passed) 
  13312.         -  ERROR_NOT_SEEKABLE_BY_TIME 
  13313.         -  ERROR_DATA_ITEM_NOT_SEEKABLE 
  13314.         -  ERROR_DATA_ITEM_NOT_SPECIFIED 
  13315.         -  ERROR_STREAM_NOT_STOP 
  13316.  
  13317.          Return codes from the following APIs are also returned: 
  13318.  
  13319.         -  DosRequestMutexSem 
  13320.         -  mmioSeek (the extended error code from mmioGetLastError) 
  13321.         -  mmioSendMessage - MMIOM_SEEKBYTIME (the extended error code from 
  13322.            mmioGetLastError) 
  13323.  
  13324.    o  SHC_GET_PROTOCOL 
  13325.  
  13326.       Possible return codes: 
  13327.  
  13328.         -  ERROR_INVALID_SPCBKEY 
  13329.  
  13330.          Return codes from the following APIs are also returned: 
  13331.  
  13332.         -  DosRequestMutexSem 
  13333.  
  13334.    o  SHC_INSTALL_PROTOCOL 
  13335.  
  13336.       Note:  This stream handler allows any data type and subtype to be 
  13337.              installed. 
  13338.  
  13339.       Possible return codes: 
  13340.  
  13341.         -  ERROR_INVALID_SPCBKEY 
  13342.         -  ERROR_ALLOC_RESOURCES 
  13343.  
  13344.          Return codes from the following APIs are also returned: 
  13345.  
  13346.         -  DosRequestMutexSem 
  13347.  
  13348.    o  SHC_ENUMERATE_PROTOCOLS 
  13349.  
  13350.       Possible return codes: 
  13351.  
  13352.         -  ERROR_INSUFF_BUFFER 
  13353.  
  13354.          Return codes from the following APIs are also returned: 
  13355.  
  13356.         -  DosRequestMutexSem 
  13357.  
  13358.    o  SHC_NEGOTIATE_RESULT 
  13359.  
  13360.       Possible return codes: 
  13361.  
  13362.         -  ERROR_INVALID_STREAM (invalid hstream or both hstream and hid 
  13363.            passed) 
  13364.         -  ERROR_INVALID_FUNCTION (must only be called directly after create) 
  13365.  
  13366.          Return codes from the following APIs are also returned: 
  13367.  
  13368.         -  DosRequestMutexSem 
  13369.  
  13370.  Base Stream Protocol Control Blocks Data Types Supported 
  13371.  
  13372.  The File System Stream Handler has only 1 base SPCB.  It is DATATYPE_GENERIC. 
  13373.  When a stream is created with a SPCBKEY that is not installed, this stream 
  13374.  handler copies over the last installed SPCB of type DATATYPE_GENERIC and uses 
  13375.  it.  The data type, subtype and intkey passed are used in place of the generic 
  13376.  values for these fields.  The base generic SPCB has: 
  13377.  
  13378.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  13379.   ΓöéSPCB Field     ΓöéDATATYPE_GENERIC Values                      Γöé
  13380.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13381.   ΓöéulBufSize      Γöé16KB                                         Γöé
  13382.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13383.   ΓöéulMinBuf       Γöé2                                            Γöé
  13384.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13385.   ΓöéulMaxBuf       Γöé5                                            Γöé
  13386.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13387.   ΓöéulSrcStart     Γöé1                                            Γöé
  13388.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13389.   ΓöéulTgtStart     Γöé1                                            Γöé
  13390.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13391.   ΓöéulBufFlag      ΓöéSPCBBUF_NONCONTIGUOUS                        Γöé
  13392.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13393.   ΓöéulHandFlag     ΓöéSPCBHAND_NOSYNC | SPCB_PHYS_SEEK             Γöé
  13394.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  13395.  
  13396.  Stream Handler Limits 
  13397.  
  13398.  Maximum number of streams (only limited by available memory). 
  13399.  
  13400.  
  13401. ΓòÉΓòÉΓòÉ 8.4. Memory Stream Handler ΓòÉΓòÉΓòÉ
  13402.  
  13403. There are many multimedia application scenarios where data streaming might be 
  13404. performed to or from system memory.  For example, an application can create a 
  13405. waveform data object dynamically, allocating application data buffers in which 
  13406. to store the waveform data.  This data is not read from a device but is 
  13407. generated by an application algorithm.  This waveform data can then be streamed 
  13408. to the Waveform Audio Stream Handler (target). 
  13409.  
  13410. Another example where system memory is used for streaming is when the 
  13411. application must process or convert data read from a file before it can be used 
  13412. as the source of a stream.  There can be some cases where application-unique 
  13413. data compression is used.  In these cases, the application can stream data from 
  13414. a "flat file" into an application buffer. Then, after decompression (or other 
  13415. operation) this data in system memory can be streamed using the Memory Stream 
  13416. Handler as the source, perhaps sending the data to the Waveform Audio Stream 
  13417. Handler. 
  13418.  
  13419. The Memory Stream Handler does not support synchronization. 
  13420.  
  13421. Memory playlists are used to specify the memory addresses to play from or 
  13422. record into. 
  13423.  
  13424. External Interface Description 
  13425.  
  13426. The description for the Memory Stream Handler external interface follows: 
  13427.  
  13428.  File Name           MEMSH.DLL 
  13429.  
  13430.  Handler Name        MEMSH 
  13431.  
  13432.  Handler Class       MEMSYS 
  13433.  
  13434.  PDD/DLL             DLL 
  13435.  
  13436.  Source              This stream handler can be the source in a stream. 
  13437.  
  13438.  Target              This stream handler can be the target in a stream. 
  13439.  
  13440.  Device Control Blocks 
  13441.  
  13442.  None. 
  13443.  
  13444.  Associate Control Blocks 
  13445.  
  13446.  This handler supports type ACBTYPE_MEM_PLAYL associate control blocks. 
  13447.  
  13448.  
  13449.   /******************************************************
  13450.    * MEMSH - Memory Stream Handler Playlist Object ACB
  13451.    ******************************************************/
  13452.   #define ACBTYPE_MEM_PLAYL     0x0003L  /* Memory playlist object     */
  13453.  
  13454.   typedef struct _acb_mem_playl
  13455.      {
  13456.      ULONG   ulACBLen;              /* Length of structure             */
  13457.      ULONG   ulObjType;             /* ACBTYPE_MEM_PLAYL               */
  13458.      PVOID   pMemoryAddr;           /* Starting address of playlist    */
  13459.      } ACB_MEM_PLAYL;
  13460.  
  13461.  Implicit (EVENT_IMPLICIT_TYPE) Events Supported 
  13462.  
  13463.  The following implicit (EVENT_IMPLICIT_TYPE) events for the Memory Stream 
  13464.  Handler are supported: 
  13465.  
  13466.    o  EVENT_ERROR 
  13467.  
  13468.       The error type will be set in the ulFlag field of the event implicit 
  13469.       control block (evcb).  These error types and the flag values are 
  13470.       described in the file system stream handler section. 
  13471.  
  13472.       The ulStatus field will contain the error code.  The possible error codes 
  13473.       that can be generated and returned by this stream handler are: 
  13474.  
  13475.         -  ERROR_PLAYLIST_STACK_OVERFLOW (too many CALL instructions 
  13476.            encountered.  The maximum CALL depth is 20 calls.) 
  13477.         -  ERROR_PLAYLIST_STACK_UNDERFLOW (too many RETURN instructions 
  13478.            encountered.  There should be exactly one RETURN instruction 
  13479.            executed for each CALL instruction.) 
  13480.         -  ERROR_INVALID_FUNCTION (invalid playlist opcode encountered.) 
  13481.         -  ERROR_INVALID_BLOCK (playlist is not read/write accessible or data 
  13482.            is not read (play) or write (record) accessible.) 
  13483.         -  ERROR_END_OF_PLAYLIST (when recording into a playlist, the EXIT 
  13484.            opcode was encountered before EOS.  The stream handler stops). 
  13485.  
  13486.          Also, errors from the following APIs can be returned: 
  13487.  
  13488.         -  DosGetInfoBlocks 
  13489.         -  DosQueryMem 
  13490.         -  SMHEntryPoint SMH_NOTIFY (GiveBuf function for Play) 
  13491.         -  SMHEntryPoint SMH_NOTIFY (GetFull, ReturnEmpty for Record) 
  13492.         -  SMHEntryPoint SMH_REPORTEVENT 
  13493.  
  13494.    o  EVENT_PLAYLISTCUEPOINT 
  13495.  
  13496.       The Memory Stream Handler does not receive playlist cuepoint indicators 
  13497.       within the stream.  This handler will place a cuepoint indicator into a 
  13498.       stream when it interprets a CUEPOINT playlist operation.  Therefore this 
  13499.       stream handler does not generate the EVENT_PLAYLISTCUEPOINT, but it 
  13500.       enables it in the stream for the target stream handler.  Check the 
  13501.       description of the target stream handler to determine if it supports this 
  13502.       EVENT_PLAYLISTCUEPOINT. 
  13503.  
  13504.    o  EVENT_PLAYLISTMESSAGE 
  13505.  
  13506.       This is generated when a MESSAGE instruction is encountered.  The 
  13507.       ulMessageParm field of the PLAYL_EVCB will be filled in with the message 
  13508.       supplied in the message parameter (operand2) of the playlist MESSAGE 
  13509.       instruction.  The ulStatus field contains the playlist instruction 
  13510.       number. 
  13511.  
  13512.  Explicit Events Supported 
  13513.  
  13514.  No explicit events are supported for the Memory Stream Handler. 
  13515.  
  13516.  Stream Handler Commands Supported 
  13517.  
  13518.  The following stream handler commands (SHC) are supported.  Refer to the OS/2 
  13519.  Multimedia Programming Reference for a description of these SHC commands and 
  13520.  the error return codes. 
  13521.  
  13522.    o  SHC_ASSOCIATE 
  13523.  
  13524.       Note:  A stream requires a file to be opened and associated to the stream 
  13525.              before a stream can be started.  Reassociating a new object 
  13526.              without stopping the stream is not supported. 
  13527.  
  13528.       Possible return codes: 
  13529.  
  13530.         -  ERROR_INVALID_STREAM (invalid hstream or hstream and hid passed) 
  13531.         -  ERROR_INVALID_OBJTYPE (only ACBTYPE_MEM_PLAYL is supported) 
  13532.         -  ERROR_INVALID_BUFFER_SIZE (ulAcbLen is smaller than needed) 
  13533.         -  ERROR_STREAM_NOT_STOP (stream must be stopped to associate) 
  13534.         -  ERROR_INVALID_BLOCK (invalid memory address - not read/write 
  13535.            accessible) 
  13536.  
  13537.          Return codes from the following APIs are also returned: 
  13538.  
  13539.         -  DosRequestMutexSem 
  13540.         -  DosQueryMem 
  13541.  
  13542.    o  SHC_CREATE 
  13543.  
  13544.       Note:  If the SPCBKEY passed does not match any of the installed 
  13545.              protocols, the last installed SPCB with DATATYPE_GENERIC will be 
  13546.              used.  If the MEMSH is the source, create will always set the 
  13547.              SPCBBUF_USERPROVIDED flag in the spcb.ulBufFlag field. 
  13548.  
  13549.       Possible return codes: 
  13550.  
  13551.         -  ERROR_INVALID_SPCBKEY 
  13552.         -  ERROR_ALLOC_RESOURCES 
  13553.  
  13554.          Return codes from the following APIs are also returned: 
  13555.  
  13556.         -  DosRequestMutexSem 
  13557.         -  DosCreateThread 
  13558.  
  13559.    o  SHC_DESTROY 
  13560.  
  13561.       Possible return codes: 
  13562.  
  13563.         -  ERROR_INVALID_STREAM (invalid hstream or hstream and hid passed) 
  13564.  
  13565.          Return codes from the following APIs are also returned: 
  13566.  
  13567.         -  DosRequestMutexSem 
  13568.  
  13569.    o  SHC_START 
  13570.  
  13571.       Possible return codes: 
  13572.  
  13573.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13574.         -  ERROR_DATA_ITEM_NOT_SPECIFIED (stream must be associated before it 
  13575.            is started). 
  13576.  
  13577.          Return codes from the following APIs are also returned: 
  13578.  
  13579.         -  DosRequestMutexSem 
  13580.  
  13581.    o  SHC_STOP 
  13582.  
  13583.       Possible return codes: 
  13584.  
  13585.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13586.         -  ERROR_STREAM_NOT_STARTED 
  13587.  
  13588.          Return codes from the following APIs are also returned: 
  13589.  
  13590.         -  DosRequestMutexSem 
  13591.         -  DosResumeThread 
  13592.         -  DosSuspendThread 
  13593.  
  13594.    o  SHC_SEEK 
  13595.  
  13596.       Note:  Seeking backward is not supported.  SEEK_END is only supported if 
  13597.              the lSeekPoint is 0.  A playlist seek is accomplished by going 
  13598.              back to the beginning of the playlist and executing each 
  13599.              instruction without playing the data, but counting the time it 
  13600.              takes.  The Seek operates on the current playlist, that means that 
  13601.              if the playlist was modified by the application the Seek uses the 
  13602.              modified playlist to calculate the seek position.  When a seek 
  13603.              absolute is performed all LOOP iterations are reset to 0 before 
  13604.              the Seek starts calculating the position. 
  13605.  
  13606.       Possible return codes: 
  13607.  
  13608.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13609.         -  ERROR_NOT_SEEKABLE_BY_TIME 
  13610.         -  ERROR_DATA_ITEM_NOT_SEEKABLE 
  13611.         -  ERROR_STREAM_NOT_STOP 
  13612.         -  ERROR_SEEK_BACK_NOT_SUPPORTED 
  13613.         -  ERROR_SEEK_PAST_END 
  13614.         -  ERROR_INVALID_BLOCK 
  13615.         -  ERROR_PLAYLIST_STACK_OVERFLOW 
  13616.         -  ERROR_PLAYLIST_STACK_UNDERFLOW 
  13617.         -  ERROR_INVALID_FUNCTION 
  13618.         -  ERROR_DATA_ITEM_NOT_SPECIFIED 
  13619.  
  13620.          Return codes from the following APIs are also returned: 
  13621.  
  13622.         -  DosRequestMutexSem 
  13623.         -  DosQueryMem 
  13624.  
  13625.    o  SHC_GET_PROTOCOL 
  13626.  
  13627.       Possible return codes: 
  13628.  
  13629.         -  ERROR_INVALID_SPCBKEY 
  13630.  
  13631.          Return codes from the following APIs are also returned: 
  13632.  
  13633.         -  DosRequestMutexSem 
  13634.  
  13635.    o  SHC_INSTALL_PROTOCOL 
  13636.  
  13637.       Note:  This stream handler allows any data type and subtype to be 
  13638.              installed. 
  13639.  
  13640.       Possible return codes: 
  13641.  
  13642.         -  ERROR_INVALID_SPCBKEY 
  13643.         -  ERROR_ALLOC_RESOURCES 
  13644.  
  13645.          Return codes from the following APIs are also returned: 
  13646.  
  13647.         -  DosRequestMutexSem 
  13648.  
  13649.    o  SHC_ENUMERATE_PROTOCOLS 
  13650.  
  13651.       Possible return codes: 
  13652.  
  13653.         -  ERROR_INSUFF_BUFFER 
  13654.  
  13655.          Return codes from the following APIs are also returned: 
  13656.  
  13657.         -  DosRequestMutexSem 
  13658.  
  13659.    o  SHC_NEGOTIATE_RESULT 
  13660.  
  13661.       Possible return codes: 
  13662.  
  13663.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13664.         -  ERROR_INVALID_FUNCTION (must only be called directly after create) 
  13665.  
  13666.          Return codes from the following APIs are also returned: 
  13667.  
  13668.         -  DosRequestMutexSem 
  13669.  
  13670.  Base Stream Protocol Control Block Data Types Supported 
  13671.  
  13672.  The Memory Stream Handler has only 1 base stream protocol control block 
  13673.  (SPCB).  It is DATATYPE_GENERIC.  When a stream is created with a SPCBKEY that 
  13674.  is not one installed, this stream handler copies over the last installed SPCB 
  13675.  of type DATATYPE_GENERIC and uses it.  The data type, subtype and intkey 
  13676.  passed are used in place of the generic values for these fields.  The base 
  13677.  generic SPCB has: 
  13678.  
  13679.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  13680.   ΓöéSPCB Field     ΓöéDATATYPE_GENERIC Values                      Γöé
  13681.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13682.   ΓöéulBufSize      Γöé16KB                                         Γöé
  13683.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13684.   ΓöéulMinBuf       Γöé3                                            Γöé
  13685.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13686.   ΓöéulMaxBuf       Γöé10                                           Γöé
  13687.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13688.   ΓöéulSrcStart     Γöé1                                            Γöé
  13689.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13690.   ΓöéulTgtStart     Γöé1                                            Γöé
  13691.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13692.   ΓöéulBufFlag      ΓöéSPCBBUF_NONCONTIGUOUS                        Γöé
  13693.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13694.   ΓöéulHandFlag     ΓöéSPCBHAND_NOSYNC | SPCBHAND_PHYS_SEEK         Γöé
  13695.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  13696.  
  13697.  Stream Handler Limits 
  13698.  
  13699.  Maximum number of streams (only limited by available memory). 
  13700.  
  13701.  
  13702. ΓòÉΓòÉΓòÉ 8.5. Compact Disc-Digital Audio Stream Handler ΓòÉΓòÉΓòÉ
  13703.  
  13704. Many CDs have CD-DA ("Redbook audio") tracks that contain digital audio.  These 
  13705. audio tracks can be played using the built-in DAC or the data can be read into 
  13706. the system and streamed to an adapter with DAC hardware KB (for example, ACPA 
  13707. card).  For the latter case, the CD-DA Stream Handler DLL is required and acts 
  13708. as the source stream handler. 
  13709.  
  13710. This handler does not operate fully in a real-time mode, but it must support 
  13711. continuous data streaming.  It also does not support synchronization mastering, 
  13712. because of the lack of real-time nature of CD devices. 
  13713.  
  13714. This handler operates on the specific CD addresses.  Most CD-DA do not have 
  13715. data in approximately the first 2 seconds of the CD, but some discs do.  CD-DA 
  13716. tracks can also be placed between other data tracks on mixed-mode disks. 
  13717. Because of this operation, the CD-DA Stream Handler will interpret the absolute 
  13718. beginning of the disc as MMTIME 0.  The calling program must query the disc and 
  13719. find where the desired CD-DA track begins and call SpiSeekStream before 
  13720. starting the stream.  The CD Audio media control interface driver does this 
  13721. operation for the applications coding to the media control interface. 
  13722.  
  13723. External Interface Description 
  13724.  
  13725. The description for the Compact Disc-Digital Audio Stream Handler external 
  13726. interface follows: 
  13727.  
  13728.  File Name           CDDASH.DLL 
  13729.  
  13730.  Handler Name        CDDASH 
  13731.  
  13732.  Handler Class       FILESYS 
  13733.  
  13734.  PDD/DLL             DLL 
  13735.  
  13736.  Source              This stream handler can be the source in a stream. 
  13737.  
  13738.  Target              This stream handler cannot be the target in a stream. 
  13739.  
  13740.  Device Control Blocks 
  13741.  
  13742.  None. 
  13743.  
  13744.  Associate Control Blocks 
  13745.  
  13746.  This handler supports type ACBTYPE_CDDA associate control blocks. 
  13747.  
  13748.    /******************************************************
  13749.     * CDDASH - CD DA Stream Handler Object ACB
  13750.     ******************************************************/
  13751.     #define ACBTYPE_CDDA        0x0004L   /* Compact disc - digital audio */
  13752.     typedef struct _acb_CDDA        /* acbcdda - CD Assoc. Control Block  */
  13753.        {
  13754.        ULONG   ulACBLen;              /* Length of structure     */
  13755.        ULONG   ulObjType;             /* ACB_CDDA                */
  13756.        CHAR    bCDDrive;              /* CD drive letter         */
  13757.        } ACB_CDDA;
  13758.  
  13759.  Implicit (EVENT_IMPLICIT_TYPE) Events Supported 
  13760.  
  13761.  The following implicit (EVENT_IMPLICIT_TYPE) events for the Compact 
  13762.  Disc-Digital Audio Stream Handler are supported: 
  13763.  
  13764.    o  EVENT_ERROR 
  13765.  
  13766.       The error type will be set in the ulFlag field of the event implicit 
  13767.       control block (evcb). The three types of errors that will be reported 
  13768.       are: 
  13769.  
  13770.         -  Temporary Error (TEMPORARY_ERROR 0x0000L) 
  13771.  
  13772.            An error occurred during streaming but the stream handler, the 
  13773.            Sync/Stream Manager or both the stream handler and the Sync/Stream 
  13774.            Manager were able to continue streaming. 
  13775.  
  13776.         -  Recoverable Error (RECOVERABLE_ERROR 0x0001L) 
  13777.  
  13778.            An error occurred that required the stream to be stopped.  The 
  13779.            application can restart the stream if appropriate. 
  13780.  
  13781.         -  NonRecoverable Error (NONRECOVERABLE_ERROR 0x0002L) 
  13782.  
  13783.            A severe error occurred causing the stream handler to stop this 
  13784.            stream.  The stream can not be restarted.  The application must 
  13785.            issue an SpiDestroyStream. 
  13786.  
  13787.          The ulStatus field will contain the error code.  The possible error 
  13788.          codes that can be generated and returned by this stream handler are: 
  13789.  
  13790.         -  None 
  13791.  
  13792.          Also, errors from the following APIs can be returned: 
  13793.  
  13794.         -  DosGetInfoBlocks 
  13795.         -  SMHEntryPoint SMH_NOTIFY 
  13796.         -  DosDevIOCtl (from ReadLong command to CD device driver). 
  13797.  
  13798.  Explicit Events Supported 
  13799.  
  13800.  No explicit events are supported for the Compact Disc-Digital Audio Stream 
  13801.  Handler. 
  13802.  
  13803.  Stream Handler Commands Supported 
  13804.  
  13805.  The following stream handler commands (SHC) are supported.  Refer to the OS/2 
  13806.  Multimedia Programming Reference for a description of these SHC commands and 
  13807.  the error return codes. 
  13808.  
  13809.    o  SHC_ASSOCIATE 
  13810.  
  13811.       Note:  A stream requires a file to be opened and associated to the stream 
  13812.              before a stream can be started.  Reassociating a new drive letter 
  13813.              without stopping the stream is not supported. 
  13814.  
  13815.       Possible return codes: 
  13816.  
  13817.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13818.         -  ERROR_INVALID_OBJTYPE (only ACBTYPE_CDDA is supported) 
  13819.         -  ERROR_INVALID_BUFFER_SIZE (ulAcbLen is smaller than needed) 
  13820.         -  ERROR_STREAM_NOT_STOP (stream must be stopped to associate) 
  13821.  
  13822.          Return codes from the following APIs are also returned: 
  13823.  
  13824.         -  DosRequestMutexSem 
  13825.         -  DosOpen (for CD device). 
  13826.  
  13827.    o  SHC_CREATE 
  13828.  
  13829.       Note:  The only data type supported is 16-bit PCM Stereo sampled at 44.1 
  13830.              kHz. 
  13831.  
  13832.       Possible return codes: 
  13833.  
  13834.         -  ERROR_INVALID_SPCBKEY 
  13835.         -  ERROR_ALLOC_RESOURCES 
  13836.  
  13837.          Return codes from the following APIs are also returned: 
  13838.  
  13839.         -  DosRequestMutexSem 
  13840.         -  DosCreateThread 
  13841.  
  13842.    o  SHC_DESTROY 
  13843.  
  13844.       Possible return codes: 
  13845.  
  13846.         -  ERROR_INVALID_STREAM (invalid hstream or hstream and hid passed) 
  13847.  
  13848.          Return codes from the following APIs are also returned: 
  13849.  
  13850.         -  DosRequestMutexSem 
  13851.  
  13852.    o  SHC_START 
  13853.  
  13854.       Possible return codes: 
  13855.  
  13856.         -  ERROR_INVALID_STREAM (invalid hstream or hstream and hid passed) 
  13857.         -  ERROR_DATA_ITEM_NOT_SPECIFIED (stream must be associated before it 
  13858.            is started). 
  13859.  
  13860.          Return codes from the following APIs are also returned: 
  13861.  
  13862.         -  DosRequestMutexSem 
  13863.  
  13864.    o  SHC_STOP 
  13865.  
  13866.       Possible return codes: 
  13867.  
  13868.         -  ERROR_INVALID_STREAM (invalid hstream or hstream and hid passed) 
  13869.         -  ERROR_STREAM_NOT_STARTED 
  13870.  
  13871.          Return codes from the following APIs are also returned: 
  13872.  
  13873.         -  DosRequestMutexSem 
  13874.         -  DosResumeThread 
  13875.         -  DosSuspendThread 
  13876.  
  13877.    o  SHC_SEEK 
  13878.  
  13879.       Note:  Keep in mind that SEEK will go to the specified address in 
  13880.              absolute terms.  The absolute address from the beginning of the 
  13881.              disc might not be the beginning of the CD-DA music. 
  13882.  
  13883.       Also the seekpoint is granular to the mmtimePerUnit specified in the 
  13884.       SPCB. 
  13885.  
  13886.       Possible return codes: 
  13887.  
  13888.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13889.         -  ERROR_DATA_ITEM_NOT_SEEKABLE 
  13890.         -  ERROR_DATA_ITEM_NOT_SPECIFIED 
  13891.         -  ERROR_STREAM_NOT_STOP 
  13892.  
  13893.  
  13894.         -  ERROR_SEEK_PAST_END 
  13895.         -  ERROR_SEEK_BEFORE_BEGINNING 
  13896.  
  13897.          Return codes from the following APIs are also returned: 
  13898.  
  13899.         -  DosRequestMutexSem 
  13900.         -  DosDevIOCtl (DiskInfo command for Seek_End) 
  13901.         -  DosDevIOCtl (Seek command) 
  13902.  
  13903.    o  SHC_GET_PROTOCOL 
  13904.  
  13905.       Possible return codes: 
  13906.  
  13907.         -  ERROR_INVALID_SPCBKEY 
  13908.  
  13909.          Return codes from the following APIs are also returned: 
  13910.  
  13911.         -  DosRequestMutexSem 
  13912.  
  13913.    o  SHC_INSTALL_PROTOCOL 
  13914.  
  13915.       Note:  This stream handler allows any data type and subtype to be 
  13916.              installed. 
  13917.  
  13918.       Possible return codes: 
  13919.  
  13920.         -  ERROR_INVALID_SPCBKEY 
  13921.         -  ERROR_ALLOC_RESOURCES 
  13922.  
  13923.          Return codes from the following APIs are also returned: 
  13924.  
  13925.         -  DosRequestMutexSem 
  13926.  
  13927.    o  SHC_ENUMERATE_PROTOCOLS 
  13928.  
  13929.       Possible return codes: 
  13930.  
  13931.         -  ERROR_INSUFF_BUFFER 
  13932.  
  13933.          Return codes from the following APIs are also returned: 
  13934.  
  13935.         -  DosRequestMutexSem 
  13936.  
  13937.    o  SHC_NEGOTIATE_RESULT 
  13938.  
  13939.       Possible return codes: 
  13940.  
  13941.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  13942.         -  ERROR_INVALID_FUNCTION (must only be called directly after create). 
  13943.  
  13944.          Return codes from the following APIs are also returned: 
  13945.  
  13946.         -  DosRequestMutexSem 
  13947.  
  13948.  Base Stream Protocol Control Block Data Types Supported 
  13949.  
  13950.  The Compact Disc-Digital Audio Stream Handler has only 1 base SPCB.  It is 
  13951.  DATATYPE_WAVEFORM with DataSubType WAVE_FORMAT_4S16.  This SPCB has the 
  13952.  following defaults: 
  13953.  
  13954.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  13955.   ΓöéSPCB Field          ΓöéDATATYPE_WAVEFORM Values                Γöé
  13956.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13957.   ΓöéulBufSize           Γöé48KB                                    Γöé
  13958.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13959.   ΓöéulMinBuf            Γöé8                                       Γöé
  13960.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13961.   ΓöéulMaxBuf            Γöé12                                      Γöé
  13962.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13963.   ΓöéulSrcStart          Γöé1                                       Γöé
  13964.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13965.   ΓöéulTgtStart          Γöé7                                       Γöé
  13966.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13967.   ΓöéulBufFlag           ΓöéSPCBBUF_FIXEDBUF                        Γöé
  13968.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13969.   ΓöéulHandFlag          ΓöéSPCBHAND_NOSYNC | SPCBHAND_PHYS_SEEK    Γöé
  13970.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13971.   ΓöéulBytesPerUnit      Γöé588                                     Γöé
  13972.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  13973.   ΓöémmtimePerUnit       Γöé10                                      Γöé
  13974.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  13975.  
  13976.  Stream Handler Limits 
  13977.  
  13978.  Maximum number of streams (only limited by available memory). 
  13979.  
  13980.  
  13981. ΓòÉΓòÉΓòÉ 8.6. CD-ROM XA Stream Handler ΓòÉΓòÉΓòÉ
  13982.  
  13983. The CD-ROM XA Stream Handler is used to stream interleaved data to multiple 
  13984. streams and therefore multiple target devices.  This is required to play 
  13985. multiple streams from a CD-ROM XA.  For example, a CD-ROM XA file could have 
  13986. one channel of audio and one channel of video that need to be streamed at the 
  13987. same time.  Because the audio and video are interleaved in the same file the 
  13988. CD-ROM XA Stream Handler can take these individual channels from the file and 
  13989. pass them to the Sync/Stream Manager as independent streams. 
  13990.  
  13991. External Interface Description 
  13992.  
  13993. The description for the CD-ROM XA Stream Handler external interface follows: 
  13994.  
  13995.  File Name           SSSH.DLL 
  13996.  
  13997.  Handler Name        SSSH 
  13998.  
  13999.  Handler Class       FILESYS 
  14000.  
  14001.  PDD/DLL             DLL 
  14002.  
  14003.  Source              This stream handler can be the source in a stream. 
  14004.  
  14005.  Target              This stream handler cannot be the target in a stream. 
  14006.  
  14007.  Device Control Blocks 
  14008.  
  14009.  This handler requires the standard DCB structure on the SHC_CREATE function. 
  14010.  The szDevName must have the drive letter of the CD-ROM XA drive. 
  14011.  
  14012.     typedef struct _dcb              /* dcb  -  Device Control Block   */
  14013.        {
  14014.        ULONG   ulDCBLen;                   /* Length of structure  */
  14015.        SZ      szDevName[MAX_SPI_NAME];    /* Device driver name   */
  14016.        } DCB;
  14017.  
  14018.  Associate Control Blocks 
  14019.  
  14020.  None. 
  14021.  
  14022.  Implicit (EVENT_IMPLICIT_TYPE) Events Supported 
  14023.  
  14024.  The following implicit (EVENT_IMPLICIT_TYPE) events for the CD-ROM XA Stream 
  14025.  Handler are supported: 
  14026.  
  14027.    o  EVENT_ERROR 
  14028.  
  14029.       The error type will be set in the ulFlag field of the event implicit 
  14030.       control block (evcb). The three types of errors that will be reported 
  14031.       are: 
  14032.  
  14033.         -  Temporary Error (TEMPOARY_ERROR 0x0000L) 
  14034.  
  14035.            An error occurred during streaming but the stream handler, the 
  14036.            Sync/Stream Manager or both the stream handler and the Sync/Stream 
  14037.            Manager were able to continue streaming. 
  14038.  
  14039.         -  Recoverable Error (RECOVERABLE_ERROR 0x0001L) 
  14040.  
  14041.            An error occurred that required the stream to be stopped.  The 
  14042.            application can restart the stream if appropriate. 
  14043.  
  14044.         -  NonRecoverable Error (NONRECOVERABLE_ERROR 0x0002L) 
  14045.  
  14046.            A severe error occurred causing the stream handler to stop this 
  14047.            stream.  The stream cannot be restarted.  The application must issue 
  14048.            an SpiDestroyStream. 
  14049.  
  14050.          The ulStatus field will contain the error code.  The possible error 
  14051.          codes that can be generated and returned by this stream handler are: 
  14052.  
  14053.         -  None 
  14054.  
  14055.          Also, errors from the following APIs can be returned: 
  14056.  
  14057.         -  DosRequestMutexSem 
  14058.         -  DosGetInfoBlocks 
  14059.         -  SMHEntryPoint SMH_NOTIFY 
  14060.         -  DosDevIOCtl (from ReadLong command to CD device driver). 
  14061.  
  14062.  Explicit Events Supported 
  14063.  
  14064.  No explicit events are supported for the CD-ROM XA Stream Handler. 
  14065.  
  14066.  Stream Handler Commands Supported 
  14067.  
  14068.  The following stream handler commands (SHC) are supported.  Refer to the OS/2 
  14069.  Multimedia Programming Reference for a description of these SHC commands and 
  14070.  the error return codes. 
  14071.  
  14072.    o  SHC_ASSOCIATE 
  14073.  
  14074.       Note:  A stream requires a file to be opened and associated to the stream 
  14075.              before a stream can be started. 
  14076.  
  14077.       Possible return codes: 
  14078.  
  14079.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  14080.         -  ERROR_INVALID_OBJTYPE (only ACBTYPE_SSSH is supported) 
  14081.         -  ERROR_INVALID_BUFFER_SIZE (ulAcbLen is smaller than needed) 
  14082.         -  ERROR_STREAM_NOT_STOP (stream must be stopped to associate) 
  14083.         -  ERROR_FILE_FORMAT_INCORRECT (file is not cdxa mode 2) 
  14084.  
  14085.          Return codes from the following APIs are also returned: 
  14086.  
  14087.         -  DosRequestMutexSem 
  14088.         -  DosDevIOCtl (ReadLong on CD drive) 
  14089.         -  DosFSCtl (to CDFS) 
  14090.         -  DosSetFilePtr 
  14091.  
  14092.    o  SHC_CREATE 
  14093.  
  14094.       Note:  The primary stream is the stream that is created first for a 
  14095.              interleaved file.  The secondary streams must have the hstream 
  14096.              handle of the primary stream in the hstreambuf parameter of the 
  14097.              SpiCreateStream API. Only the CREATE for the primary stream needs 
  14098.              to have the DCB filled in with the drive letter.  Any DCB passed 
  14099.              in on the secondary stream creates is ignored by this stream 
  14100.              handler. 
  14101.  
  14102.       Possible return codes: 
  14103.  
  14104.         -  ERROR_INVALID_SPCBKEY 
  14105.         -  ERROR_ALLOC_RESOURCES 
  14106.         -  ERROR_TOO_MANY_STREAMS (only 16 streams per XA file) 
  14107.         -  ERROR_INVALID_BUFFER_SIZE (DCB is too small) 
  14108.         -  ERROR_INVALID_PARAMETER (DCB parameter is NULL). 
  14109.  
  14110.          Return codes from the following APIs are also returned: 
  14111.  
  14112.         -  DosRequestMutexSem 
  14113.         -  DosCreateThread 
  14114.         -  DosOpen for CD Drive 
  14115.  
  14116.    o  SHC_DESTROY 
  14117.  
  14118.       Note:  Destroying the primary stream will suspend the streaming of the 
  14119.              secondary streams because all the associated streams use the 
  14120.              buffers owned by the primary stream. 
  14121.  
  14122.       Possible return codes: 
  14123.  
  14124.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  14125.  
  14126.          Return codes from the following APIs are also returned: 
  14127.  
  14128.         -  DosRequestMutexSem 
  14129.  
  14130.    o  SHC_START 
  14131.  
  14132.       Note:  The streaming will only start when the SHC_START command is 
  14133.              received for the primary stream, because it owns the I/O thread 
  14134.              and the stream buffers. 
  14135.  
  14136.       Possible return codes: 
  14137.  
  14138.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  14139.         -  ERROR_DATA_ITEM_NOT_SPECIFIED (stream must be associated before it 
  14140.            is started). 
  14141.  
  14142.          Return codes from the following APIs are also returned: 
  14143.  
  14144.         -  DosRequestMutexSem 
  14145.  
  14146.    o  SHC_STOP 
  14147.  
  14148.       Note:  A stop for the primary stream will stop all the streams because it 
  14149.              owns the I/O thread and the buffers.  A stop for a secondary 
  14150.              stream will only stop the data for that stream.  If a secondary 
  14151.              stream is stopped and restarted while the primary stream is still 
  14152.              going, the secondary stream data will pick up at the interleaved 
  14153.              point where the primary stream is. 
  14154.  
  14155.       Possible return codes: 
  14156.  
  14157.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  14158.         -  ERROR_STREAM_NOT_STARTED 
  14159.  
  14160.          Return codes from the following APIs are also returned: 
  14161.  
  14162.         -  DosRequestMutexSem 
  14163.         -  DosResumeThread 
  14164.         -  DosSuspendThread 
  14165.  
  14166.    o  SHC_SEEK 
  14167.  
  14168.       Note:  SEEK is only valid on the primary stream.  A SEEK command on a 
  14169.              secondary stream will return ERROR_DATA_ITEM_NOT_SEEKABLE. 
  14170.  
  14171.       The seek point is granular to the mmtimePerUnit specified in the SPCB. 
  14172.  
  14173.       Possible return codes: 
  14174.  
  14175.         -  ERROR_INVALID_STREAM (invalid hstream or hid-or both-passed) 
  14176.         -  ERROR_DATA_ITEM_NOT_SEEKABLE 
  14177.         -  ERROR_DATA_ITEM_NOT_SPECIFIED 
  14178.         -  ERROR_STREAM_NOT_STOP 
  14179.         -  ERROR_SEEK_PAST_END 
  14180.         -  ERROR_SEEK_BEFORE_BEGINNING 
  14181.         -  ERROR_LARGE_SEEK_BY_TIME 
  14182.  
  14183.          Return codes from the following APIs are also returned: 
  14184.  
  14185.         -  DosRequestMutexSem 
  14186.         -  DosDevIOCtl (ReadLong command to CD device driver). 
  14187.  
  14188.    o  SHC_GET_PROTOCOL 
  14189.  
  14190.       Possible return codes: 
  14191.  
  14192.         -  ERROR_INVALID_SPCBKEY 
  14193.  
  14194.          Return codes from the following APIs are also returned: 
  14195.  
  14196.         -  DosRequestMutexSem 
  14197.  
  14198.    o  SHC_INSTALL_PROTOCOL 
  14199.  
  14200.       Note:  This stream handler allows only data types of DATATYPE_CDXA_AUDIO, 
  14201.              DATATYPE_CDXA_VIDEO, or DATATYPE_CDXA_DATA to be installed. 
  14202.  
  14203.       Possible return codes: 
  14204.  
  14205.         -  ERROR_INVALID_SPCBKEY 
  14206.         -  ERROR_ALLOC_RESOURCES 
  14207.  
  14208.          Return codes from the following APIs are also returned: 
  14209.  
  14210.         -  DosRequestMutexSem 
  14211.  
  14212.    o  SHC_ENUMERATE_PROTOCOLS 
  14213.  
  14214.       Possible return codes: 
  14215.  
  14216.         -  ERROR_INSUFF_BUFFER 
  14217.  
  14218.          Return codes from the following APIs are also returned: 
  14219.  
  14220.         -  DosRequestMutexSem 
  14221.  
  14222.    o  SHC_NEGOTIATE_RESULT 
  14223.  
  14224.       Possible return codes: 
  14225.  
  14226.         -  ERROR_INVALID_STREAM (invalid hstream, hid, or both passed) 
  14227.         -  ERROR_INVALID_FUNCTION (must only be called directly after create). 
  14228.  
  14229.          Return codes from the following APIs are also returned: 
  14230.  
  14231.         -  DosRequestMutexSem 
  14232.  
  14233.  Base Stream Protocol Control Block Data Types Supported 
  14234.  
  14235.  The CD-ROM XA Stream Handler has 7 base SPCBs. 
  14236.  
  14237.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  14238.   ΓöéSPCB Field            ΓöéCDXA_LEVELB Values      ΓöéCDXA_LEVELC Values      Γöé
  14239.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14240.   Γöéspcbkey.ulDataType    ΓöéDATATYPE_CDXA_AUDIO     ΓöéDATATYPE_CDXA_AUDIO     Γöé
  14241.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14242.   Γöéspcbkey.ulDataSubType ΓöéCDXA_LEVELB             ΓöéCDXA_LEVELC             Γöé
  14243.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14244.   ΓöéulDataFlag            ΓöéSPCBDATA_CUETIME        ΓöéSPCBDATA_CUETIME        Γöé
  14245.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14246.   ΓöéulNumRec              Γöé17                      Γöé17                      Γöé
  14247.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14248.   ΓöéulBlockSize           Γöé1                       Γöé1                       Γöé
  14249.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14250.   ΓöéulBufSize             Γöé39984                   Γöé39984                   Γöé
  14251.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14252.   ΓöéulMinBuf              Γöé8                       Γöé8                       Γöé
  14253.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14254.   ΓöéulMaxBuf              Γöé16                      Γöé16                      Γöé
  14255.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14256.   ΓöéulSrcStart            Γöé1                       Γöé1                       Γöé
  14257.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14258.   ΓöéulTgtStart            Γöé1                       Γöé1                       Γöé
  14259.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14260.   ΓöéulBufFlag             ΓöéSPCBBUF_INTERLEAVED     ΓöéSPCBBUF_INTERLEAVED     Γöé
  14261.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14262.   ΓöéulHandFlag            ΓöéSPCBHAND_NOSYNC |       Γöé                        Γöé
  14263.   Γöé                      ΓöéSPCBHAND_PHYS_SEEK      Γöé                        Γöé
  14264.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14265.   ΓöéulBytesPerUnit        Γöé2304                    Γöé2304                    Γöé
  14266.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14267.   ΓöémmtimePerUnit         Γöé160                     Γöé320                     Γöé
  14268.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  14269.  
  14270.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  14271.   ΓöéSPCB Field            ΓöéLEVELB_MONO Values      ΓöéLEVELC_MONO Values      Γöé
  14272.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14273.   Γöéspcbkey.ulDataType    ΓöéDATATYPE_CDXA_AUDIO     ΓöéDATATYPE_CDXA_AUDIO     Γöé
  14274.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14275.   Γöéspcbkey.ulDataSubType ΓöéCDXA_LEVELB_MONO        ΓöéCDXA_LEVELC_MONO        Γöé
  14276.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14277.   ΓöéulDataFlag            ΓöéSPCBDATA_CUETIME        ΓöéSPCBDATA_CUETIME        Γöé
  14278.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14279.   ΓöéulNumRec              Γöé17                      Γöé17                      Γöé
  14280.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14281.   ΓöéulBlockSize           Γöé1                       Γöé1                       Γöé
  14282.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14283.   ΓöéulBufSize             Γöé39984                   Γöé39984                   Γöé
  14284.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14285.   ΓöéulMinBuf              Γöé8                       Γöé8                       Γöé
  14286.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14287.   ΓöéulMaxBuf              Γöé16                      Γöé16                      Γöé
  14288.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14289.   ΓöéulSrcStart            Γöé1                       Γöé1                       Γöé
  14290.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14291.   ΓöéulTgtStart            Γöé1                       Γöé1                       Γöé
  14292.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14293.   ΓöéulBufFlag             ΓöéSPCBBUF_INTERLEAVED     ΓöéSPCBBUF_INTERLEAVED     Γöé
  14294.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14295.   ΓöéulHandFlag            ΓöéSPCBHAND_NOSYNC |       Γöé                        Γöé
  14296.   Γöé                      ΓöéSPCBHAND_PHYS_SEEK      Γöé                        Γöé
  14297.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14298.   ΓöéulBytesPerUnit        Γöé2304                    Γöé2304                    Γöé
  14299.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14300.   ΓöémmtimePerUnit         Γöé320                     Γöé640                     Γöé
  14301.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  14302.  
  14303.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  14304.   ΓöéSPCB Field     ΓöéCDXA_AUDIO Values                            Γöé
  14305.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14306.   Γöéspcbkey.ulDataTΓöéDATATYPE_CDXA_AUDIO                          Γöé
  14307.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14308.   Γöéspcbkey.ulDataSΓöéCDXA_AUDIO_HD                                Γöé
  14309.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14310.   ΓöéulDataFlag     ΓöéSPCBDATA_CUETIME                             Γöé
  14311.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14312.   ΓöéulNumRec       Γöé17                                           Γöé
  14313.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14314.   ΓöéulBlockSize    Γöé1                                            Γöé
  14315.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14316.   ΓöéulBufSize      Γöé39984                                        Γöé
  14317.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14318.   ΓöéulMinBuf       Γöé8                                            Γöé
  14319.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14320.   ΓöéulMaxBuf       Γöé16                                           Γöé
  14321.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14322.   ΓöéulSrcStart     Γöé1                                            Γöé
  14323.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14324.   ΓöéulTgtStart     Γöé1                                            Γöé
  14325.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14326.   ΓöéulBufFlag      ΓöéSPCBBUF_INTERLEAVED                          Γöé
  14327.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14328.   ΓöéulHandFlag     ΓöéSPCBHAND_NOSYNC | SPCBHAND_PHYS_SEEK         Γöé
  14329.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14330.   ΓöéulBytesPerUnit Γöé0                                            Γöé
  14331.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14332.   ΓöémmtimePerUnit  Γöé0                                            Γöé
  14333.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  14334.  
  14335.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  14336.   ΓöéSPCB Field            ΓöéCDXA_DATA Values        ΓöéCDXA_VIDEO Values       Γöé
  14337.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14338.   Γöéspcbkey.ulDataType    ΓöéDATATYPE_CDXA_DATA      ΓöéDATATYPE_CDXA_VIDEO     Γöé
  14339.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14340.   Γöéspcbkey.ulDataSubType Γöé0                       Γöé0                       Γöé
  14341.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14342.   ΓöéulNumRec              Γöé17                      Γöé17                      Γöé
  14343.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14344.   ΓöéulBlockSize           Γöé1                       Γöé1                       Γöé
  14345.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14346.   ΓöéulBufSize             Γöé39984                   Γöé39984                   Γöé
  14347.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14348.   ΓöéulMinBuf              Γöé8                       Γöé8                       Γöé
  14349.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14350.   ΓöéulMaxBuf              Γöé16                      Γöé16                      Γöé
  14351.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14352.   ΓöéulSrcStart            Γöé1                       Γöé1                       Γöé
  14353.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14354.   ΓöéulTgtStart            Γöé1                       Γöé1                       Γöé
  14355.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14356.   ΓöéulBufFlag             ΓöéSPCBBUF_INTERLEAVED     ΓöéSPCBBUF_INTERLEAVED     Γöé
  14357.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14358.   ΓöéulHandFlag            ΓöéSPCBHAND_NOSYNC |       Γöé                        Γöé
  14359.   Γöé                      ΓöéSPCBHAND_PHYS_SEEK      Γöé                        Γöé
  14360.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14361.   ΓöéulBytesPerUnit        Γöé0                       Γöé0                       Γöé
  14362.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14363.   ΓöémmtimePerUnit         Γöé0                       Γöé0                       Γöé
  14364.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  14365.  
  14366.  Stream Handler Limits 
  14367.  
  14368.  Maximum number of streams associated to a primary stream is 15. 
  14369.  
  14370.  Maximum number of streams supported by the stream handler at one time is only 
  14371.  limited by available memory. 
  14372.  
  14373.  
  14374. ΓòÉΓòÉΓòÉ 9. P2STRING Tool ΓòÉΓòÉΓòÉ
  14375.  
  14376. The P2STRING tool processes script files (containing string commands and tool 
  14377. directives) to test the behavior of subsystems in OS/2 multimedia.  P2STRING 
  14378. extracts the strings from the script files and processes the commands through 
  14379. the mciSendString function.  Messages and error conditions of the processes 
  14380. included in the scripts are logged to an output file and displayed in windows 
  14381. (as shown in the following figure). Each process logs to its own display 
  14382. window, but all processes log to the same output file.  In addition, if you 
  14383. close the display window, the string execution thread is immediately destroyed 
  14384. and the entire process ends. 
  14385.  
  14386. Output messages include all non-comment lines read from the script (for 
  14387. example, script directives, command strings, expected return values, expected 
  14388. and received notify messages, and status lines). In addition, errors and 
  14389. debugging statements of unsuccessful string commands are logged to a file named 
  14390. P2STRING.LOG file. 
  14391.  
  14392.  
  14393. ΓòÉΓòÉΓòÉ 9.1. Setting Font Size and Type ΓòÉΓòÉΓòÉ
  14394.  
  14395. Before you start the P2STRING tool, you can change the size and type of font 
  14396. displayed in the P2STRING window on the desktop. For example, to specify Times 
  14397. Roman font with a 10 point font size, type: 
  14398.  
  14399. SET P2STRING_FONTFACE=TIMES
  14400. SET P2STRING_FONTSIZE=10
  14401.  
  14402. You can specify either font face, font size, or both. Possible FONTFACE values 
  14403. include SYSTEM, COURIER, TIMES, or HELVETICA** (default). Possible FONTSIZE 
  14404. values include 8 (default), 10, 12, 14, or 18. 
  14405.  
  14406.  
  14407. ΓòÉΓòÉΓòÉ 9.2. Starting P2STRING ΓòÉΓòÉΓòÉ
  14408.  
  14409. The P2STRING tool consists of two files: P2STRING.EXE and P2S_DLL.DLL. These 
  14410. files are located in the \TOOLKIT\BIN\BETA\P2STRING subdirectory. The following 
  14411. figure displays the syntax used to start the P2STRING program.  Associated 
  14412. parameters are described in the next table in this section. 
  14413.  
  14414.  
  14415. P2STRING inp_file [-a]out_file [-eerr_file] [-d|-D] [-E] [-t]
  14416.  
  14417. Note:  The parameters are case sensitive. 
  14418.  
  14419.  The following table describes the parameters associated with the P2STRING 
  14420.  program. 
  14421.  
  14422.  Parameter           Description 
  14423.  
  14424.  script_file         Specifies the script file name you want to process. 
  14425.  
  14426.                      Note:  See P2STRING Script Language for information on the 
  14427.                             contents of a script file and how to interpret the 
  14428.                             script language. 
  14429.  
  14430.  [-a]out_file        Specifies the output file name containing the results of 
  14431.                      the test. This file contains only the results of the test 
  14432.                      you are running, unless you specify the optional -a 
  14433.                      parameter. For example, to append the output of a script 
  14434.                      file named SAMPLE.SCR to output currently in a file named 
  14435.                      MDM.OUT, type: 
  14436.  
  14437.                                           P2STRING SAMPLE.SCR -aMDM.OUT
  14438.  
  14439.  [-eerr_file]        Specifies the optional error file name that receives 
  14440.                      messages from string commands that completed 
  14441.                      unsuccessfully. For example, to create an error file named 
  14442.                      MDM.ERR, type: 
  14443.  
  14444.                                           P2STRING SAMPLE.SCR MDM.OUT -eMDM.ERR
  14445.  
  14446.  [-d|-D]             Specifies one of the following optional parameters: 
  14447.  
  14448.                                           -d   Instructs P2STRING to end after processing a script file.
  14449.                                               Use this parameter when you are running test cases automatically.
  14450.                                               There is no change in the output.
  14451.                                               When the script file has completed processing, P2STRING prompts
  14452.                                               you with a message requiring you to end the test.
  14453.  
  14454.                                           -D   Behaves identically to the -d parameter except that the script
  14455.                                               directives requiring user input are ignored.
  14456.  
  14457.                      Note:  See Tool Directives for information on how to add 
  14458.                             execution directives (which require user input) in 
  14459.                             a script file. 
  14460.  
  14461.  -E                  Causes the script file to exit after the first error. By 
  14462.                      default, script files run to completion regardless of 
  14463.                      errors. For example, the following command ends the 
  14464.                      processing of SAMPLE.SCR after an error is encountered: 
  14465.  
  14466.                                           P2STRING SAMPLE.SCR -aMDM.OUT -d -eMDM.ERR -E
  14467.  
  14468.  -t                  Records time stamps for strings and MM_MCIPASSDEVICE 
  14469.                      notification messages. 
  14470.  
  14471.  
  14472. ΓòÉΓòÉΓòÉ 9.3. P2STRING Script Language ΓòÉΓòÉΓòÉ
  14473.  
  14474. This section describes the contents of a script file and how to interpret the 
  14475. script language.  Script files can contain the following types of lines: 
  14476.  
  14477.    o  Comments 
  14478.    o  Tool Directives 
  14479.    o  OS/2 Multimedia String Commands 
  14480.    o  Expected Return Strings 
  14481.    o  Expected Error Messages 
  14482.    o  Expected Notification Messages 
  14483.  
  14484.  The following discussion provides information on how to create a script file 
  14485.  containing these various line types. The following figure displays an example 
  14486.  of how a script file appears. 
  14487.  
  14488.   @PROCESSES=2
  14489.   @EVENTS={HASCTRL1=1,HASCTRL2=0}
  14490.   #
  14491.   #
  14492.   #
  14493.   @PROCESS 1
  14494.   ;
  14495.   ; set masteraudio level for session to 10% - will affect all
  14496.   ; 3 processes
  14497.   ;
  14498.   masteraudio volume 10
  14499.   ;
  14500.   ; open waveaudio device non-exclusively
  14501.   ;
  14502.   open waveaudio alias wav1 shareable notify
  14503.   +MM_MCINOTIFY MCI_NOTIFY_SUCCESSFUL MCI_OPEN #1
  14504.   @WAIT_NOTIFY 1 60000
  14505.   @WAIT_PASSDEVICE wav1 60000
  14506.   @WAIT_NOTIFY 21 60000
  14507.  
  14508.  
  14509. ΓòÉΓòÉΓòÉ 9.3.1. Comments ΓòÉΓòÉΓòÉ
  14510.  
  14511. Script comment lines must start with either a semi-colon (;) or pound sign (#) 
  14512. in the first column.  These comment lines are neither displayed nor echoed in 
  14513. the output file.  If you want a remark to appear in the output, use the @REM 
  14514. directive. 
  14515.  
  14516. P2STRING allows for a variable number of lines to be displayed in its window. 
  14517. Regular comment lines (header lines) are not displayed nor written to the 
  14518. output file. 
  14519.  
  14520.  
  14521. ΓòÉΓòÉΓòÉ 9.3.2. Tool Directives ΓòÉΓòÉΓòÉ
  14522.  
  14523. The P2STRING tool supports either multithreaded or multiprocess execution, but 
  14524. not both.  You can use tool directives to test either @PROCESSES or @THREADS in 
  14525. a script file. 
  14526.  
  14527. Tool directives start with an at sign (@) in the first column.  These 
  14528. directives affect the execution and appearance of the output.  The following 
  14529. classes of directives are recognized: 
  14530.  
  14531.    o  Initialization 
  14532.    o  Execution 
  14533.  
  14534.  
  14535. ΓòÉΓòÉΓòÉ 9.3.2.1. Initialization Directives ΓòÉΓòÉΓòÉ
  14536.  
  14537. Use initialization directives to set up the content of the script file.  These 
  14538. directives must appear before execution directives because the tool 
  14539. preprocesses the script file and builds process command buffers. 
  14540.  
  14541. The @THREADS and @PROCESSES directives are mutually exclusive.  In other words, 
  14542. the P2STRING tool supports either multithreaded or multiprocess execution in a 
  14543. script file (not both).  In addition, there is a limit of 10 processes or 
  14544. threads per script file. The following table lists the supported initialization 
  14545. directives. 
  14546.  
  14547.  Directive                            Description 
  14548.  
  14549.   @PROCESSES=x
  14550.                                       Specifies the number (x) of processes the 
  14551.                                       script file will be running.  For 
  14552.                                       example: 
  14553.  
  14554.                                                                             @PROCESSES=2
  14555.  
  14556.   @THREADS=x
  14557.                                       Specifies the number (x) of threads the 
  14558.                                       script file will be running. 
  14559.  
  14560.   @EVENTS={n[=0|1] [,n[=0|1]]}
  14561.                                       Specifies one or more names of events. 
  14562.                                       Events are user-defined with a maximum of 
  14563.                                       15 characters. Events can be set to 1 or 
  14564.                                       0. Set an event to 1 for an event that is 
  14565.                                       set with the @SET_EVENT execution 
  14566.                                       directive. Set an event to 0 to clear or 
  14567.                                       reset the event. If no initialization 
  14568.                                       values are specified, the event is 
  14569.                                       initialized to 0. For example: 
  14570.  
  14571.                                                                             @EVENTS={brad=1,john=1,test=0}
  14572.  
  14573.  
  14574. ΓòÉΓòÉΓòÉ 9.3.2.2. Execution Directives ΓòÉΓòÉΓòÉ
  14575.  
  14576. Use execution directives to process the script file.  Again, the @THREAD and 
  14577. @PROCESS directives are mutually exclusive. 
  14578.  
  14579. The following table lists the supported execution directives. 
  14580.  
  14581. Note:  Timing out on the @WAIT_EVENT and @WAIT_NOTIFY directives is not 
  14582.        considered a failure. 
  14583.  
  14584.  Directive                                Description 
  14585.  
  14586.   @THREAD x
  14587.                                           Specifies that the script lines 
  14588.                                           following this directive belong to 
  14589.                                           thread number x until the next 
  14590.                                           @THREAD directive is encountered. 
  14591.  
  14592.   @PROCESS x
  14593.                                           Specifies that the script lines 
  14594.                                           following this directive belong to 
  14595.                                           process number x until the next 
  14596.                                           @PROCESS directive is encountered. 
  14597.  
  14598.   @SET_EVENT name 0|1
  14599.                                           Sets the event name to either 1 or 0. 
  14600.                                           Use 1 to mark that the event has 
  14601.                                           happened. Use 0 to clear or reset the 
  14602.                                           event. 
  14603.  
  14604.                                           Note:  The event must be declared 
  14605.                                                  through the @EVENTS directive. 
  14606.  
  14607.   @WAIT_EVENT name [to]
  14608.                                           Waits until the event name is set to 
  14609.                                           1. @WAIT_EVENT does not cause a 
  14610.                                           change of the event state. If you 
  14611.                                           need a reusable event, use this 
  14612.                                           directive. 
  14613.  
  14614.                                           The timeout (to) is specified in 
  14615.                                           milliseconds. If omitted, it defaults 
  14616.                                           to 3 minutes. 
  14617.  
  14618.   @WAIT_NOTIFY x [to]
  14619.                                           Waits for a specific number (x) from 
  14620.                                           an expected MM_MCINOTIFY notification 
  14621.                                           message. This number must match the 
  14622.                                           index used in the MM_MCINOTIFY 
  14623.                                           reference line. The @WAIT_NOTIFY 
  14624.                                           events are not reusable because there 
  14625.                                           are no events that logically reset 
  14626.                                           it. 
  14627.  
  14628.                                           The timeout (to) is specified in 
  14629.                                           milliseconds. If omitted, it defaults 
  14630.                                           to 3 minutes. 
  14631.  
  14632.                                           If the associated mciSendString 
  14633.                                           function fails, the event is posted 
  14634.                                           to prevent delays for notifications 
  14635.                                           that are never going to be sent. 
  14636.  
  14637.   @WAIT_PASSDEVICE alias [to]
  14638.                                           Waits until the device instance with 
  14639.                                           an alias of alias gains use. This 
  14640.                                           assumes that the alias names used 
  14641.                                           within a script file are unique. The 
  14642.                                           maximum alias name length is 20 
  14643.                                           characters. 
  14644.  
  14645.                                           Note:  Use a unique alias for every 
  14646.                                                  OPEN command. 
  14647.  
  14648.                                           The timeout (to) is specified in 
  14649.                                           milliseconds. If omitted, it defaults 
  14650.                                           to 3 minutes. 
  14651.  
  14652.                                           The tool assumes that a unique alias 
  14653.                                           is specified on each OPEN string 
  14654.                                           command. If unique aliases are not 
  14655.                                           used, errors conditions might occur. 
  14656.  
  14657.   @REM comment
  14658.                                           Echoes the comment to the screen and 
  14659.                                           the output log file. All other script 
  14660.                                           comment lines (those starting with ; 
  14661.                                           or #) are neither transferred nor 
  14662.                                           displayed. 
  14663.  
  14664.   @PAUSE to
  14665.                                           Pauses processing of the current 
  14666.                                           thread or process in the input script 
  14667.                                           file for the specified time. It does 
  14668.                                           not stop the processing of the 
  14669.                                           notifications or window functions. 
  14670.                                           Other threads or processes are not 
  14671.                                           affected by this directive. 
  14672.  
  14673.   @BREAK [message]
  14674.                                           Causes a message box to appear with 
  14675.                                           message text. Script processing is 
  14676.                                           halted until the user responds with 
  14677.                                           the correct action. For example: 
  14678.  
  14679.                                                                                     @BREAK [replace the CD]
  14680.  
  14681.   @CHECK [message]
  14682.                                           Grades the success of the previous 
  14683.                                           command based on the user's response. 
  14684.                                           A pop-up window displays the message 
  14685.                                           and prompts the user with Yes or No 
  14686.                                           push buttons. The status is passed if 
  14687.                                           the user selects Yes, or failed if No 
  14688.                                           is selected. For example: 
  14689.  
  14690.                                                                                     @BREAK The music will play for 5 secs.  Ready to time it?
  14691.                                                                                     play cdaudio notify
  14692.                                                                                     @PAUSE 5000
  14693.                                                                                     @CHECK Did it play?
  14694.  
  14695.  
  14696. ΓòÉΓòÉΓòÉ 9.3.3. OS/2 Multimedia String Commands ΓòÉΓòÉΓòÉ
  14697.  
  14698. All lines that do not fall into any of the other categories are interpreted as 
  14699. OS/2 multimedia string commands.  These lines are passed to the Media Device 
  14700. Manager (MDM) through the mciSendString function after the environment 
  14701. variables have been substituted. 
  14702.  
  14703. Any token in the string command line bracketed by question marks (such as 
  14704. ?FOO?) is interpreted as an environment variable.  The actual value of the 
  14705. environment variable is substituted into the string before it is passed to the 
  14706. mciSendString function.  If the variable is not found, a warning is issued and 
  14707. the token is replaced with a NULL string.  For example, assuming the 
  14708. environment string MMDATA is set to D:\DATA, open ?mmdata?\temp.wav alias a is 
  14709. equal to open d:\data\temp.wav alias a. 
  14710.  
  14711.  
  14712. ΓòÉΓòÉΓòÉ 9.3.4. Expected Return Strings ΓòÉΓòÉΓòÉ
  14713.  
  14714. Many OS/2 multimedia commands return strings.  It is possible to check these 
  14715. strings against an expected value with an expected return string line. 
  14716.  
  14717. An expected return string line has the format: 
  14718.  
  14719. =result
  14720.  
  14721. The equal sign (=) must be in column 1 and should have no trailing spaces.  If 
  14722. an empty string is expected, nothing should follow the = (not even spaces). 
  14723. For example: 
  14724.  
  14725. status cdaudio ready wait
  14726. =TRUE
  14727. status cdaudio mode wait
  14728. =stopped
  14729.  
  14730. The expected result is always interpreted as a string.  This might produce some 
  14731. unusual outputs for commands that return binary data. 
  14732.  
  14733. Where the return is a textual numerical value, it may be matched to a tolerance 
  14734. range of ╤æ10% using a tilde (~) before the number.  This is typically used when 
  14735. the exact value cannot be known.  For example: 
  14736.  
  14737. set foo time format milliseconds wait
  14738. play foo notify
  14739. @PAUSE 1000
  14740. stop foo wait
  14741. status foo position wait
  14742. =~1000
  14743.  
  14744. Thus, the status command is considered successful if the returned string is in 
  14745. the range 900-1100. 
  14746.  
  14747.  
  14748. ΓòÉΓòÉΓòÉ 9.3.5. Expected Error Messages ΓòÉΓòÉΓòÉ
  14749.  
  14750. When an OS/2 multimedia string command is expected to fail with an error, use 
  14751. the expected error line to specify the expected error.  The expected error line 
  14752. has the format: 
  14753.  
  14754. =!error
  14755.  
  14756. The =! must start in column 1.  If any error is acceptable, then use the 
  14757. keyword ERROR.  If a specific error is expected, enter the exact error message 
  14758. after the =!.  For example: 
  14759.  
  14760. open sequencer alias mymidi wait
  14761. load mymidi nofile.foo
  14762. =!File not found.
  14763.  
  14764. Be careful about extra blanks in the expected-error and expected-result lines. 
  14765. The case of the strings is unimportant; however the comparison will fail if the 
  14766. spacing or punctuation does not match exactly. 
  14767.  
  14768.  
  14769. ΓòÉΓòÉΓòÉ 9.3.6. Expected Notification Messages ΓòÉΓòÉΓòÉ
  14770.  
  14771. Many OS/2 multimedia string commands cause notification messages to be sent to 
  14772. the P2STRING tool.  The system uses notification messages to respond to 
  14773. applications.  For example, notification messages indicate system status 
  14774. regarding completion of a media device function or passing of the ownership of 
  14775. a media control device from one process to another. 
  14776.  
  14777. It is possible to verify that the proper notifications are received by using an 
  14778. expected-notify line.  Each expected notification line begins with a plus sign 
  14779. (+) in column 1.  The following types of notification lines are possible: 
  14780.  
  14781.    o  Command completion/error notifications 
  14782.    o  Event notifications 
  14783.    o  Position change notifications 
  14784.  
  14785.  Note:  Any or all notification messages might be expected for a single OS/2 
  14786.         multimedia string command. 
  14787.  
  14788.  
  14789. ΓòÉΓòÉΓòÉ 9.3.6.1. Command Completion/Error Notifications ΓòÉΓòÉΓòÉ
  14790.  
  14791. An MM_MCINOTIFY line notifies an application when a device successfully 
  14792. completes the action indicated by a media message or when an error occurs. 
  14793.  
  14794. +MM_MCINOTIFY  notify-code[#x]
  14795.  
  14796. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  14797. ΓöéKeyword             ΓöéDescription                                       Γöé
  14798. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14799. Γöénotify-code         ΓöéSpecifies the notification message code, for      Γöé
  14800. Γöé                    Γöéexample, MCI_NOTIFY_SUCCESSFUL.  The spelling mustΓöé
  14801. Γöé                    Γöébe the same as the #defines in the OS2ME.H file   Γöé
  14802. Γöé                    Γöéfor the notify codes.                             Γöé
  14803. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14804. Γöémessage             ΓöéSpecifies the media control interface message thatΓöé
  14805. Γöé                    Γöécaused the notification, for example, MCI_PLAY.   Γöé
  14806. Γöé                    ΓöéThe spelling must be the same as the #defines in  Γöé
  14807. Γöé                    Γöéthe OS2ME.H file for MCI messages.                Γöé
  14808. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14809. Γöéx                   ΓöéSpecifies a unique number (x) used to associate   Γöé
  14810. Γöé                    Γöé@WAIT_NOTIFY directives with particular           Γöé
  14811. Γöé                    Γöénotifications.  This number has nothing to do withΓöé
  14812. Γöé                    Γöéthe order in which strings are sent.  The number  Γöé
  14813. Γöé                    Γöémust be unique and in the range 1-99.             Γöé
  14814. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  14815.  
  14816.  
  14817. ΓòÉΓòÉΓòÉ 9.3.6.2. Event Notifications ΓòÉΓòÉΓòÉ
  14818.  
  14819. An MM_MCIPOSITIONCHANGE line notifies an application of the current media 
  14820. position. 
  14821.  
  14822. +MM_MCIPOSITIONCHANGE position %user-parameter #x
  14823.  
  14824. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  14825. ΓöéKeyword        ΓöéDescription                                  Γöé
  14826. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14827. Γöéposition       ΓöéSpecifies the expected MMTIME position of theΓöé
  14828. Γöé               Γöéfirst position-change message.               Γöé
  14829. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14830. Γöéuser-parameter ΓöéSpecifies the user parameter to be returned. Γöé
  14831. Γöé               ΓöéThis should be the same as the return value  Γöé
  14832. Γöé               Γöéspecified in the SETPOSITIONADVISE string    Γöé
  14833. Γöé               Γöécommand.  Note that the return value must be Γöé
  14834. Γöé               Γöéa unique integer in the range of 1-99.       Γöé
  14835. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14836. Γöéx              ΓöéSpecifies the number (x) of position change  Γöé
  14837. Γöé               Γöémessages expected.  For further information, Γöé
  14838. Γöé               Γöésee Limitations of MM_MCIPOSITIONCHANGE      Γöé
  14839. Γöé               ΓöéVerification.                                Γöé
  14840. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  14841.  
  14842.  
  14843. ΓòÉΓòÉΓòÉ 9.3.6.3. Position Change Notifications ΓòÉΓòÉΓòÉ
  14844.  
  14845. An MM_MCICUEPOINT line notifies an application that the playlist processor has 
  14846. encountered a message instruction. 
  14847.  
  14848. +MM_MCICUEPOINT position %user-parameter
  14849.  
  14850. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  14851. ΓöéKeyword           ΓöéDescription                               Γöé
  14852. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14853. Γöéposition          ΓöéSpecifies the expected MMTIME position of Γöé
  14854. Γöé                  Γöéthe first position-change message.        Γöé
  14855. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  14856. Γöéuser-parameter    ΓöéSpecifies the user parameter to be        Γöé
  14857. Γöé                  Γöéreturned.  This should be the same as the Γöé
  14858. Γöé                  Γöéreturn value specified in the             Γöé
  14859. Γöé                  ΓöéSETPOSITIONADVISE string command.  Note   Γöé
  14860. Γöé                  Γöéthat the return value must be a unique    Γöé
  14861. Γöé                  Γöéinteger in the range of 1-99.             Γöé
  14862. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  14863.  
  14864. Note:  Other notifications cannot be compared because they do not allow for a 
  14865.        user-parameter as part of the message, which is essential for the 
  14866.        tracking of related notifications. 
  14867.  
  14868.  
  14869. ΓòÉΓòÉΓòÉ 9.4. Limitations of MM_MCIPOSITIONCHANGE Verification ΓòÉΓòÉΓòÉ
  14870.  
  14871. There are limitation to what you can verify in the P2STRING tool using event 
  14872. notification lines.  The MM_MCIPOSITIONCHANGE line requires the use of the 
  14873. "return value" item in the respective string commands.  This line also does not 
  14874. provide for timing start point; for example, playing has started.  The P2STRING 
  14875. tool can only count the number of messages received for a specific user 
  14876. parameter (used as a key) and check if subsequent messages have positions 
  14877. approximate to the given expected position interval.  The script writer must 
  14878. determine how many SETPOSITIONADVISE messages are expected, considering the 
  14879. duration of playing, time format, and start position of the play/record.  The 
  14880. reference position given in the expected notification line must be in MMTIME 
  14881. units.  If the "expected number of messages" parameter is omitted, the tool 
  14882. only verifies the position interval (not the number).  In case of scripts where 
  14883. play, seek, or record are used to cover non-monotonic ranges, P2STRING might 
  14884. report failures on position-advises because it expects each SETPOSITIONADVISE 
  14885. to be in the next position interval from the previous message.  If the script 
  14886. makes a jump to a position that does not conform to this, the status will be 
  14887. logged as failed. 
  14888.  
  14889. For example: 
  14890.  
  14891. setpositionadvise SomeDevice every 10000 on return 5
  14892. +MM_MCIPOSITIONCHANGE 10000 %5
  14893. play SomeDevice from 35000 to 55000 notify (produce 3 positionchange msgs)
  14894. seek SomeDevice to 30000 wait
  14895. play SomeDevice notify (produces a number of messages starting at 30000)
  14896.  
  14897. MM_MCIPOSITIONCHANGE messages are logged as failed, because of the lapse in 
  14898. position interval.  A way to handle this situation is to disable the 
  14899. MM_MCIPOSITIONCHANGE before an explicit position jump is made and enable the 
  14900. same SETPOSITIONADVISE with a different user parameter. 
  14901.  
  14902. For example: 
  14903.  
  14904. setpositionadvise SomeDevice every 10000 on return 5
  14905. +MM_MCIPOSITIONCHANGE 10000 %5
  14906. play SomeDevice from 35000 to 55000 notify (produce 3 positionchange msgs)
  14907. setpositionadvise SomeDevice every 10000 off
  14908. seek SomeDevice to 30000 wait
  14909. setpositionadvise SomeDevice every 10000 on return 6
  14910. +MM_MCIPOSITIONCHANGE 10000 %6
  14911. play SomeDevice notify (produce a number of messages starting at 30000)
  14912.  
  14913.  
  14914. ΓòÉΓòÉΓòÉ 9.5. Processing Logic ΓòÉΓòÉΓòÉ
  14915.  
  14916. A string command line can be followed by zero to one return value lines, or 
  14917. zero to three notification lines.  Note that this is an exclusive OR, meaning 
  14918. that specifying both expected return value and expected notification is not 
  14919. going to give reliable results due to the fact that the returned buffer does 
  14920. not become valid prior to the end of the notify message.  Also, in case of 
  14921. notify flags, return values are in the procedural interface format rather than 
  14922. in the string interface format. 
  14923.  
  14924. The MDM will not be able to convert return values to strings for commands 
  14925. processed with the notify flag because media control drivers will be sending 
  14926. their notify messages directly to the application. 
  14927.  
  14928. Status of each command is determined in two stages.  The first stage is at 
  14929. string execution.  If the mciSendString function returns an error and there was 
  14930. no =!ERROR reference line in the script following the command string line, the 
  14931. command is considered failed.  If a return value was found after mciSendString 
  14932. is processed, the tool will check for expected return and perform comparison of 
  14933. the two.  It they do not match, the command is considered failed.  In case of 
  14934. an error that is not in the range understood by the mciGetErrorString function, 
  14935. the command is considered failed even if the !ERROR was encountered. 
  14936.  
  14937. The second stage of the comparison is after a notification is received and 
  14938. after all the commands are issued.  If a notification was received and it 
  14939. successfully compared to the expected notification line, the command is 
  14940. considered successful.  If there was no reference notification line, status of 
  14941. the command will not be assigned, unless notify-error was returned.  After all 
  14942. the scripts are processed, expected reference notifications will be used to 
  14943. determine if all the notifications were received.  The commands that did not 
  14944. receive a notify, and had an expected notification line of the type, are marked 
  14945. failed.  Note that command strings are not examined for presence of a notify 
  14946. flag and it is the writer's responsibility to create an expected notify line if 
  14947. it is of importance.  In case of expected NOTIFY_SUCCESSFUL messages, all codes 
  14948. other than NOTIFY_ERROR are considered valid.  This includes NOTIFY_SUCCESSFUL, 
  14949. NOTIFY_ABORTED and NOTIFY_SUPERCEDED.  If any other notify code was specified 
  14950. as expected, and exact match will be checked for.  If NOTIFY_ERROR is expected, 
  14951. all errors in the range are verified as passed.  There is no facility for 
  14952. verification of an exact error code returned in the notification. 
  14953.  
  14954.  
  14955. ΓòÉΓòÉΓòÉ 10. Glossary ΓòÉΓòÉΓòÉ
  14956.  
  14957.  
  14958. ΓòÉΓòÉΓòÉ <hidden> Glossary ΓòÉΓòÉΓòÉ
  14959.  
  14960. Select the starting letter of the glossary term you want to locate. 
  14961.  
  14962.  
  14963. ΓòÉΓòÉΓòÉ <hidden> A ΓòÉΓòÉΓòÉ
  14964.  
  14965.  AB roll Synchronized playback of two recorded video images so that one can 
  14966.    perform effects, such as dissolves, wipes, or inserts, using both images 
  14967.    simultaneously. 
  14968.  
  14969.  ACPA Audio capture and playback adapter. 
  14970.  
  14971.  active matrix A technology that gives every pel (dot) on the screen its own 
  14972.    transistor to control it more accurately.  (This allows for better contrast 
  14973.    and less motion smearing.) 
  14974.  
  14975.  adaptive differential pulse code modulation A bit-rate reduction technique 
  14976.    where the difference in pulse code modulation samples are not compressed 
  14977.    before being stored. 
  14978.  
  14979.  ADC Analog-to-digital converter. 
  14980.  
  14981.  ADPCM Adaptive differential pulse code modulation. 
  14982.  
  14983.  aliasing The phenomenon of generating a false (alias) frequency, along with 
  14984.    the correct one, as an artifact of sampling a signal at discrete points.  In 
  14985.    audio, this produces a "buzz."  In imagery, this produces a jagged edge, or 
  14986.    stair-step effect. 
  14987.  
  14988.  all points addressable (APA) In computer graphics, pertaining to the ability 
  14989.    to address and display or not display each picture element on a display 
  14990.    surface. 
  14991.  
  14992.  AM Animation metafile. 
  14993.  
  14994.  ambience In audio, the reverberation pattern of a particular concert hall, or 
  14995.    listening space. 
  14996.  
  14997.  ambient noise In acoustics, the noise associated with a particular 
  14998.    environment, usually a composite of sounds from many distant or nearby 
  14999.    sources. 
  15000.  
  15001.  American National Standards Institute (ANSI) An organization consisting of 
  15002.    producers, consumers, and general interest groups, that establishes the 
  15003.    procedures by which accredited organizations create and maintain voluntary 
  15004.    industry standards in the United States. 
  15005.  
  15006.  AMF Animation metafile format. 
  15007.  
  15008.  amp See amplifier. 
  15009.  
  15010.  amp-mixer (1) A combination amplifier and mixer that is used to control the 
  15011.    characteristics of an audio signal from one or more audio sources. (2) Also 
  15012.    referred to as an amplifier-mixer. 
  15013.  
  15014.  amplifier (1) A device that increases the strength of input signals (either 
  15015.    voltage or current) (2) Also referred to as an amp. 
  15016.  
  15017.  analog Pertaining to data consisting of continuously variable physical 
  15018.    quantities. Contrast with digital. 
  15019.  
  15020.  analog audio Audio in which all information representing sounds is stored or 
  15021.    transmitted in a continuous-scale electrical signal, such as line level 
  15022.    audio in stereo components. See also digital audio. 
  15023.  
  15024.  analog video Video in which all the information representing images is in a 
  15025.    continuous-scale electrical signal for both amplitude and time. See also 
  15026.    digital video. 
  15027.  
  15028.  analog video overlay See overlay. 
  15029.  
  15030.  analog-to-digital converter (ADC) A functional unit that converts data from an 
  15031.    analog representation to a digital representation. (I) (A) 
  15032.  
  15033.  anchor An area of a display screen that is activated to accept user input. 
  15034.    Synonymous with hot spot, touch area, and trigger. 
  15035.  
  15036.  animate Make or design in such a way as to create apparently spontaneous, 
  15037.    lifelike movement. 
  15038.  
  15039.  animated Having the appearance of something alive. 
  15040.  
  15041.  animated screen capture Recording a computing session for replay on a similar 
  15042.    computer with voice annotation.  (An example is sending a spreadsheet with 
  15043.    an accompanying screen recording as an explanation and overview.) 
  15044.  
  15045.  animatic A limited animation consisting of artwork shot on film or videotape 
  15046.    and edited to serve as an on-screen storyboard. 
  15047.  
  15048.  animation metafile A compound file format, the elements of which are the 
  15049.    frames of animation themselves.  These frames are stored sequentially so 
  15050.    that they can be played back in time by streaming to the video agent. 
  15051.  
  15052.  animation metafile format (AMF) The file format used to store animated frame 
  15053.    sequences. 
  15054.  
  15055.  annotation The linking of an object with another, where the second contains 
  15056.    some information related to the first.  For example, an audio annotation of 
  15057.    a spreadsheet cell might a verbal explanation about the contents of the 
  15058.    cell. 
  15059.  
  15060.  ANSI American National Standards Institute. 
  15061.  
  15062.  anthropomorphic software agent The concept of a simulated agent, seemingly 
  15063.    living inside the computer, that talks to and listens to the user, and then 
  15064.    acts for the user on command. 
  15065.  
  15066.  antiliasing (1) In imagery, using several intensities of colors (a ramp) 
  15067.    between the color of the line and the background color to create the effect 
  15068.    of smoother curves and fewer jagged edges on curves and diagonals. (2) In 
  15069.    imagery or audio, removing aliases by eliminating frequencies above half the 
  15070.    sample frequencies. 
  15071.  
  15072.  AOCA Audio Object Content Architecture. 
  15073.  
  15074.  APA All points addressable. 
  15075.  
  15076.  APA graphics All Points Addressable graphics.  See bit-mapped graphics. 
  15077.  
  15078.  API Application programming interface. 
  15079.  
  15080.  Application programming interface (API). A functional interface supplied by 
  15081.    the operating system or a separately orderable licensed program that allows 
  15082.    an application program written in a high-level language to use specific data 
  15083.    or functions of the operating system or the licensed program. 
  15084.  
  15085.  application-defined video window An application can specify to the multimedia 
  15086.    system that it wants video played in a specific window (controlled by the 
  15087.    application) instead of the default window (controlled by the multimedia 
  15088.    system).  The application-defined video window can be used to implement 
  15089.    advanced features not supported by the default video window.  Also referred 
  15090.    to as an alternate video window. 
  15091.  
  15092.  artifact A product resulting from human activity; in computer activity, a 
  15093.    (usually unwanted) by-product of a process. 
  15094.  
  15095.  aspect ratio (1) On a display screen, the ratio of the maximum length of a 
  15096.    display line to the maximum length of a display column. (2) The ratio of 
  15097.    height to width.  (This term applies to areas or individual pels.)  Refer to 
  15098.    enhanced graphics adapter and video graphics adapter. 
  15099.  
  15100.  asymmetric video compression In multimedia applications, the use of a powerful 
  15101.    computer to compress a video for mastering so that a less powerful (less 
  15102.    expensive) system is needed to decompress it. Contrast with symmetric video 
  15103.    compression. 
  15104.  
  15105.  audible cue A sound generated by the computer to draw a user's attention to, 
  15106.    or provide feedback about, an event or state of the computer.  Audible cues 
  15107.    enhance and reinforce visible cues. 
  15108.  
  15109.  audio Pertaining to the portion of recorded information that can be heard. 
  15110.  
  15111.  audio attribute control Provides access to and operation of the standard audio 
  15112.    attributes: mute, volume, balance, treble, and bass. All device 
  15113.    communication and user interface support is handled by the control. 
  15114.  
  15115.  audio attributes Refers to the standard audio attributes. mute, volume, 
  15116.    balance, treble and bass. 
  15117.  
  15118.  audio clip A section of recorded audio material. 
  15119.  
  15120.  Audio Object Content Architecture A data format for multimedia products. 
  15121.  
  15122.  audio processing Manipulating digital audio to, for example, edit or create 
  15123.    special effects. 
  15124.  
  15125.  audio segment A contiguous set of recorded data from an audio track.  An audio 
  15126.    segment might or might not be associated with a video segment. 
  15127.  
  15128.  audio track (1) The audio (sound) portion of the program. (2) The physical 
  15129.    location where the audio is placed beside the image.  (A system with two 
  15130.    audio tracks can have either stereo sound or two independent audio tracks.) 
  15131.    (3) Synonymous with sound track. 
  15132.  
  15133.  Audio Visual Connection* (AVC)* An authoring system used on an IBM PS/2 to 
  15134.    develop and display audiovisual productions. 
  15135.  
  15136.  audiovisual A generic term referring to experiences, equipment, and materials 
  15137.    used for communication that make use of both hearing and sight. 
  15138.  
  15139.  audiovisual computer program A computer program that makes use of both hearing 
  15140.    and sight. 
  15141.  
  15142.  authoring A structured approach to combining all media elements within an 
  15143.    interactive production, assisted by computer software designed for this 
  15144.    purpose. 
  15145.  
  15146.  authoring system A set of tools used to create an interactive multimedia 
  15147.    application without implementing formal programming. 
  15148.  
  15149.  AVI file format The Audio/Video Interleaved (AVI) file format is the standard 
  15150.    file format used to support software motion video.  AVI files can contain 
  15151.    multiple streams (tracks) of data (for example, a video and an audio 
  15152.    stream).  The streams may be interleaved to improve access times during 
  15153.    playback. The present implementation is limited to a single video stream and 
  15154.    a single, optional, audio stream. 
  15155.  
  15156.  
  15157. ΓòÉΓòÉΓòÉ <hidden> B ΓòÉΓòÉΓòÉ
  15158.  
  15159.  background image The part of a display image, such as a form overlay, that is 
  15160.    not changed during a particular sequence of transactions. Contrast with 
  15161.    foreground image. 
  15162.  
  15163.  background music In videotaping, music that accompanies dialog or action. 
  15164.  
  15165.  balance For audio, refers to the relative strength of the left and right 
  15166.    channels.  A balance level of 0 is left channel only.  A balance level of 
  15167.    100 is right channel only. 
  15168.  
  15169.  basic input/output system (BIOS) In an IBM personal computer, microcode that 
  15170.    controls basic hardware operations, such as interactions with diskette 
  15171.    drives, hard disk drives, and the keyboard.  (For example, the IBM Enhanced 
  15172.    Graphics Adapter has an addressable BIOS, located on the adapter itself, 
  15173.    that is used to control the IBM InfoWindow. 
  15174.  
  15175.  beta format A consumer and industrial 0.5-inch tape format. 
  15176.  
  15177.  BG Script abbreviation for background. 
  15178.  
  15179.  BIOS Basic input/output system. 
  15180.  
  15181.  bit map A coded representation in which each bit, or group of bits, represents 
  15182.    or corresponds to an item, for example, a configuration of bits in main 
  15183.    storage in which each bit indicates whether a peripheral device or a storage 
  15184.    block is available or in which each group of bits corresponds to one pel of 
  15185.    a display image. 
  15186.  
  15187.  bit-block transfer Transfer of a rectangular array of bit-map data. 
  15188.  
  15189.  bit-map graphics A form of graphics whereby all points on the display are 
  15190.    directly addressable.  See also all points addressable. 
  15191.  
  15192.  bitblt Bit-block transfer.  Synonymous with blit. 
  15193.  
  15194.  blit Synonym for bitblt. 
  15195.  
  15196.  blitter Hardware that performs bit-block transfer operations. 
  15197.  
  15198.  BND (1) An internal I/O procedure, provided by the OS/2 multimedia system, 
  15199.    that supports RIFF compound files (commonly called bundle files). (2) The 
  15200.    four-character code (FOURCC) of a bundle file. See RIFF compound file. 
  15201.  
  15202.  BND file A RIFF compound file. 
  15203.  
  15204.  BND IOProc An internal I/O procedure, provided by the OS/2 multimedia system, 
  15205.    that supports the elements in a RIFF compound file. See also CF IOProc. 
  15206.  
  15207.  boom A long, relatively horizontal supporting brace used for holding a 
  15208.    microphone or camera; sometimes used to refer to the machinery that supports 
  15209.    the camera and allows it to move while shooting. 
  15210.  
  15211.  brightness Refers to the level of luminosity of the video signal. A brightness 
  15212.    level of 0 produces a maximally white signal.  A brightness level of 100 
  15213.    produces a maximally black signal. 
  15214.  
  15215.  buffer A portion of storage used to hold input or output data temporarily. 
  15216.  
  15217.  bundle file (BND) A file that contains many individual files, called file 
  15218.    elements, bound together.  The MMIO file manager provides services to 
  15219.    locate, query, and access file elements in a bundle file. (2) A RIFF 
  15220.    compound file. 
  15221.  
  15222.  bus A facility for transferring data between several devices located between 
  15223.    two end points, only one device being able to transmit at a given moment. 
  15224.  
  15225.  buy In videotaping, footage that is judged acceptable for use in the final 
  15226.    video.  Synonymous with keeper. 
  15227.  
  15228.  
  15229. ΓòÉΓòÉΓòÉ <hidden> C ΓòÉΓòÉΓòÉ
  15230.  
  15231.  CAI Computer-assisted instruction.  Synonymous with CBT. 
  15232.  
  15233.  calibration The adjustment of a piece of equipment so that it meets normal 
  15234.    operational standards.  (For example, for the IBM InfoWindow system, 
  15235.    calibration refers to touching a series of points on the screen so that the 
  15236.    system can accurately determine their location for further reference.) 
  15237.  
  15238.  camcorder A compact, hand-held video camera with integrated videotape 
  15239.    recorder. 
  15240.  
  15241.  capture To take a snapshot of motion video and retain it in memory.  The video 
  15242.    image may then be saved to a file or restored to the display. 
  15243.  
  15244.  cast animation (1) A sequence of frames consisting of manipulations of 
  15245.    graphical objects. (2) The action of bringing a computer program, routine, 
  15246.    or subroutine into effect, usually by specifying the entry conditions and 
  15247.    jumping to an entry point.  See also frame animation. 
  15248.  
  15249.  CAV Constant angular velocity. 
  15250.  
  15251.  CBT Computer-based training.  Synonym for CAI. 
  15252.  
  15253.  CCITT Comite Consultatif International Telegraphique et Telephonique. The 
  15254.    International Telegraph and Telephone Consultative Committee. 
  15255.  
  15256.  CD Compact disc. 
  15257.  
  15258.  CD-DA Compact disc, digital audio. 
  15259.  
  15260.  CD-I Compact Disc-Interactive. 
  15261.  
  15262.  CD-ROM Compact disc, read-only memory. 
  15263.  
  15264.  CD-ROM XA Compact disc, read-only memory extended architecture. 
  15265.  
  15266.  cel A single frame (display screen) of an animation.  (The term originated in 
  15267.    cartooning days when the artist drew each image on a sheet of celluloid 
  15268.    film.) 
  15269.  
  15270.  CF IOProc An internal I/O procedure, provided by the OS/2 multimedia system, 
  15271.    that supports RIFF compound files.  The CF IOProc operates on the entire 
  15272.    compound file (rather than on the elements in a RIFF compound file, as with 
  15273.    the BND IOProc).  The CF IOProc is limited to operations required by the 
  15274.    system to ensure storage system transparency at the application level. See 
  15275.    also BND IOProc. 
  15276.  
  15277.  CGA Color graphics adapter. 
  15278.  
  15279.  CGRP Compound file resource group. 
  15280.  
  15281.  channel mapping The translation of a MIDI channel number for a sending device 
  15282.    to an appropriate channel for a receiving device. 
  15283.  
  15284.  check disc A videodisc produced from the glass master that is used to check 
  15285.    the quality of the finished interactive program. 
  15286.  
  15287.  chord To press more than one button at a time on a pointing device. 
  15288.  
  15289.  chroma signal The portion of image information that provides the color (hue 
  15290.    and saturation). 
  15291.  
  15292.  chroma-key color The specified first color in a combined signal.  See also 
  15293.    chroma-keying. 
  15294.  
  15295.  chroma-keying Combining two video signals that are in sync.  The combined 
  15296.    signal is the second signal whenever the first is of some specified color, 
  15297.    called the chroma-key color, and is the first signal otherwise.  (For 
  15298.    example, the weatherman stands in front of a blue background - blue is the 
  15299.    chroma-key color.)  At home, the TV viewer sees the weather map in place of 
  15300.    the chroma-key color, with the weatherman suspended in front. 
  15301.  
  15302.  chrominance The difference between a color and a reference white of the same 
  15303.    luminous intensity. 
  15304.  
  15305.  chunk (1) The basic building block of a RIFF file. (2) A RIFF term for a 
  15306.    formalized data area.  There are different types of chunks, depending on the 
  15307.    chunk ID. See LIST chunk and RIFF chunk. 
  15308.  
  15309.  chunk ID A four-character code (FOURCC) that identifies the representation of 
  15310.    the chunk data. 
  15311.  
  15312.  circular slider control A knob-like control that performs like a control on a 
  15313.    TV or stereo. 
  15314.  
  15315.  circular slider knob A knob-like dial that operates like a control on a 
  15316.    television or stereo. 
  15317.  
  15318.  class A categorization or grouping of objects that share similar behaviors and 
  15319.    characteristics.  Synonymous with object class. 
  15320.  
  15321.  click To press and release a button on a pointing device without moving the 
  15322.    pointer off the object or choice.  See double-click. 
  15323.  
  15324.  clip A section of recorded, filmed, or videotaped material.  See also audio 
  15325.    clip and video clip. 
  15326.  
  15327.  close-up In videotaping, the picture obtained when the camera is positioned to 
  15328.    show only the head and shoulders of a subject; in the case of an object, the 
  15329.    camera is close enough to show details clearly. See also extreme close-up. 
  15330.  
  15331.  closed circuit A system of transmitting television signals from a point of 
  15332.    origin to one or many restricted destination points specially equipped to 
  15333.    receive the signals. 
  15334.  
  15335.  CLP Common loader primitive. 
  15336.  
  15337.  CODEC compressor/decompressor. 
  15338.  
  15339.  CLUT Color look-up table.  Synonym for color palette. 
  15340.  
  15341.  CLV Constant linear velocity. 
  15342.  
  15343.  collaborative document production A system feature that provides the ability 
  15344.    for a group of people to manage document production. 
  15345.  
  15346.  collision An unwanted condition that results from concurrent transmissions on 
  15347.    a channel. (T)  (For example, an overlapping condition that occurs when one 
  15348.    sprite hides another as it passes over it.) 
  15349.  
  15350.  color cycling An animation effect in which colors in a series are displayed in 
  15351.    rapid succession. 
  15352.  
  15353.  color graphics adapter (CGA) An adapter that simultaneously provides four 
  15354.    colors and is supported on all IBM Personal Computer and Personal System/2. 
  15355.  
  15356.  color palette A set of colors that can be displayed on the screen at one time. 
  15357.    This can be a standard set used for all images or a set that can be 
  15358.    customized for each image.  Synonymous with CLUT. See also standard palette 
  15359.    and custom palette. 
  15360.  
  15361.  colorization The color tinting of a monochrome original. 
  15362.  
  15363.  common loader primitive A system service that provides a high-level interface 
  15364.    to hardware-specific loaders. 
  15365.  
  15366.  common user access (CUA) (1) Guidelines for the dialog between a human and a 
  15367.    workstation or terminal. (2) One of the three SAA architectural areas. 
  15368.  
  15369.  compact disc (CD) A disc, usually 4.75 inches in diameter, from which data is 
  15370.    read optically by means of a laser. 
  15371.  
  15372.  Compact Disc-Interactive (CD-I) A low-cost computer, being developed by N.V. 
  15373.    Phillips (The Netherlands) and Sony (Japan), that plugs into standard 
  15374.    television sets to display text and video stored on compact discs. 
  15375.  
  15376.  compact disc, digital audio (CD-DA) The specification for audio compact discs. 
  15377.    See also Redbook audio. 
  15378.  
  15379.  compact disc, read-only memory (CD-ROM) High-capacity, read-only memory in the 
  15380.    form of an optically read compact disc. 
  15381.  
  15382.  compact disc, read-only memory extended architecture (CD-ROM XA) An extension 
  15383.    to CD-ROM supporting additional audio and video levels for compression and 
  15384.    interlacing of audio, video, and digital data. 
  15385.  
  15386.  component video A video signal using three signals, one of which is luminance, 
  15387.    and the other two of which are the color vectors. See also composite video 
  15388.    and S-video. 
  15389.  
  15390.  composed view A view of an object in which relationships of the parts 
  15391.    contribute to the overall meaning.  Composed views are provided primarily 
  15392.    for data objects. 
  15393.  
  15394.  composite The combination of two or more film, video, or electronic images 
  15395.    into a single frame or display.  See also composite video. 
  15396.  
  15397.  composite monitor A monitor that can decode a color image from a single 
  15398.    signal, such as NTSC or PAL. Contrast with RGB. 
  15399.  
  15400.  composite object An object that contains other objects.  For example, a 
  15401.    document object that contains not only text, but graphics, audio, image, 
  15402.    and/or video objects, each of which can be manipulated separately as an 
  15403.    individual object. 
  15404.  
  15405.  composite video A single signal composed of chroma, luminance, and sync.  NTSC 
  15406.    is the composite video that is currently the U.S. standard for television. 
  15407.    See also component video and S-video. 
  15408.  
  15409.  compound device A multimedia device model for hardware that requires 
  15410.    additional data objects, referred to as device elements, before multimedia 
  15411.    operations can be performed. 
  15412.  
  15413.  compound file A file that contains multiple file elements. 
  15414.  
  15415.  compound file resource group (CGRP) A RIFF chunk that contains all the 
  15416.    compound file elements, concatenated together. 
  15417.  
  15418.  compound file table of contents (CTOC) A RIFF chunk that indexes the CGRP 
  15419.    chunk, which contains the actual multimedia data elements.  Each entry 
  15420.    contains the name of, and other information about, the element, including 
  15421.    the offset of the element within the CGRP chunk.  All the CTOC entries of a 
  15422.    table are of the same length and can be specified when the file is created. 
  15423.  
  15424.  compressor/decompressor (CODEC) An algorithm implemented either in hardware or 
  15425.    software that can either compress or decompress a data object.  For example, 
  15426.    a CODEC procedure can compress raw digital images into a smaller form so 
  15427.    that they use less storage space.  When used in the context of playing 
  15428.    motion video, decompressors reconstruct the original image from the 
  15429.    compressed data.  This is done at a high rate of speed to simulate motion. 
  15430.  
  15431.  computer-controlled device An external video source device with frame-stepping 
  15432.    capability, usually a videodisc player, whose output can be controlled by 
  15433.    the multimedia subsystem. 
  15434.  
  15435.  computer-animated graphics Graphics animated by using a computer, compared to 
  15436.    using videotape or film. 
  15437.  
  15438.  computer-assisted instruction (CAI) A data processing application in which a 
  15439.    computing system is used t assist in the instruction of students.  The 
  15440.    application usually involves a dialog between the student and a computer 
  15441.    program.  An example is the OS/2 tutorial. Synonymous with computer-based 
  15442.    training. 
  15443.  
  15444.  computer-based training (CBT) Synonym for computer-assisted instruction. 
  15445.  
  15446.  conforming Performing final editing on film or video using an offline edited 
  15447.    master as a guide. 
  15448.  
  15449.  connection The establishment of the flow of information from a connector on 
  15450.    one device to a compatible connector on another device. A connection can be 
  15451.    made that is dependent on a physical connection, for example the attachment 
  15452.    of a speaker to an audio adapter with a speaker wire.  A connection can also 
  15453.    be made that is completely internal to the PC, such as the connection 
  15454.    between the waveaudio media device and the ampmix device. See also 
  15455.    connector. 
  15456.  
  15457.  connector A software representation of the physical way in which multimedia 
  15458.    data moves from one device to another. A connector can have an external 
  15459.    representation, such as a headphone jack on a CD-ROM player. A connector can 
  15460.    also have an internal representation, such as the flow of digital 
  15461.    information into an audio adapter. See also connection. 
  15462.  
  15463.  contrast The difference in brightness or color between a display image and the 
  15464.    area in which it is displayed. A contrast level of 0 is minimum difference. 
  15465.    A contrast level of 100 is maximum difference. 
  15466.  
  15467.  constant angular velocity (CAV) Refers to both the format of data stored on a 
  15468.    videodisc and the videodisc player rotational characteristics. CAV 
  15469.    videodiscs contain 1 frame per track.  This allows approximately 30 minutes 
  15470.    of playing time per videodisc side.  CAV videodisc players spin at a 
  15471.    rotational speed (1800 rpm for NTSC or 1500 rpm for PAL) and play 1 frame 
  15472.    per disc revolution.  CAV player support frame accurate searches. allowing 
  15473.    freeze-frame and slow-motion.  See also constant linear velocity. 
  15474.  
  15475.  constant linear velocity (CLV) Refers to both the format of data stored on a 
  15476.    videodisc and the videodisc player rotational characteristics.  CLV 
  15477.    videodiscs contain 1 frame on the innermost track and gradually increase to 
  15478.    3 frames on the outermost track. This allows approximately 1 hour of playing 
  15479.    time per videodisc side. CLV videodisc players vary the rotational speed 
  15480.    from approximately 1800 rpm at the inner tracks to 600 rpm at the outer 
  15481.    tracks (for NTSC). 
  15482.  
  15483.    Currently, few CLV players support frame-accurate searches. They only 
  15484.    support search or play to within one second (30 frames for NTSC or 25 frames 
  15485.    for PAL). See also constant angular velocity. 
  15486.  
  15487.  container An object whose specific purpose is to hold other objects.  A folder 
  15488.    is an example of a container object. 
  15489.  
  15490.  contents view A view of an object that shows the contents of the object in 
  15491.    list form.  Contents views are provided for container objects and for any 
  15492.    object that has container behavior, for example, a device object such as a 
  15493.    printer. 
  15494.  
  15495.  continuity In videotaping, consistency maintained from shot to shot and 
  15496.    throughout the take.  For example, a switch that is on in one shot should 
  15497.    not be off in the next unless it was shown being turned off. 
  15498.  
  15499.  continuous media object A data object that varies over time; a stream-oriented 
  15500.    data object.  Examples include audio, animation, and video. 
  15501.  
  15502.  control A visual user interface component that allows a user to interact with 
  15503.    data. 
  15504.  
  15505.  coordinate graphics (1) Computer graphics in which display images are 
  15506.    generated from display commands and coordinate data. (2) Contrast with 
  15507.    raster graphics. (3) Synonymous with line graphics. 
  15508.  
  15509.  crop To cut off; to trim (for example, a tape). 
  15510.  
  15511.  cross-platform Used to describe applications that are operable with more than 
  15512.    one operating system. 
  15513.  
  15514.  cross-platform transmission Electronic transmission of information (such as 
  15515.    mail) between incompatible operating systems. 
  15516.  
  15517.  crossfade Synonym for dissolve. 
  15518.  
  15519.  CTOC Compound file table of contents. 
  15520.  
  15521.  CU Script abbreviation for close-up. 
  15522.  
  15523.  CUA Common User Access. 
  15524.  
  15525.  cue point A point that the system recognizes as a signal that may be acted 
  15526.    upon. 
  15527.  
  15528.  custom palette A set of colors that is unique to one image or one application. 
  15529.    See also standard palette and color palette. 
  15530.  
  15531.  cut The procedure of instantly replacing a picture from one source with a 
  15532.    picture from another.  (This is the most common form of editing scene to 
  15533.    scene.) 
  15534.  
  15535.  
  15536. ΓòÉΓòÉΓòÉ <hidden> D ΓòÉΓòÉΓòÉ
  15537.  
  15538.  DAC Digital-to-analog converter. 
  15539.  
  15540.  data object In an application, an element of a data structure (such as a file, 
  15541.    an array, or an operand) that is needed for program execution and that is 
  15542.    named or otherwise specified by the allowable character set of the language 
  15543.    in which the program is coded. 
  15544.  
  15545.  data stream All data transmitted through a data channel. 
  15546.  
  15547.  data streaming Real-time, continuous flowing of data. 
  15548.  
  15549.  DCP See device control panel. 
  15550.  
  15551.  decode (1) To convert data by reversing the effect of previous encoding. (2) 
  15552.    To interpret a code. (3) To convert encoded text into plain text by means of 
  15553.    a code system. Contrast with encode. 
  15554.  
  15555.  default video window Refers to where video is displayed when an application 
  15556.    does not indicate an application-defined window with the MCI_WINDOW message. 
  15557.    This is provided by and managed for the application by the multimedia 
  15558.    system. See also application-defined window. 
  15559.  
  15560.  default window See default video window. 
  15561.  
  15562.  delta frame Refers to one or more frames occurring between reference frames in 
  15563.    the output stream.  Unlike a reference frame, which stores a complete image, 
  15564.    a delta frame stores only the changes in the image form one frame to the 
  15565.    next.  See reference frame. 
  15566.  
  15567.  destination rectangle An abstract region that defines the size of an image to 
  15568.    be created during the recording of images for software motion video 
  15569.    playback. The ratio of the size of this rectangle to that of the source 
  15570.    rectangle determines the scaling factor to be applied to the video. 
  15571.  
  15572.  destination window See destination rectangle. 
  15573.  
  15574.  DevHlp Device helper. 
  15575.  
  15576.  device capabilities The functionality of a device, including supported 
  15577.    component functions. 
  15578.  
  15579.  device context The device status and characteristics associated with an opened 
  15580.    instance of a media control interface device. 
  15581.  
  15582.  device control panel (DCP) An integrated set of controls that is used to 
  15583.    control a device or media object (such as by playing, rewinding, increasing 
  15584.    volume, and so on). 
  15585.  
  15586.  device controls See standard multimedia device controls. 
  15587.  
  15588.  device driver A program that contains the code needed to attach and use a 
  15589.    device. 
  15590.  
  15591.  device element A data object, such as a file, utilized by a compound device. 
  15592.  
  15593.  device helper (DevHlp) (1) A kernel service (memory, hardware interrupt, 
  15594.    software interrupt, queuing, semaphore, and so forth) provided to physical 
  15595.    device drivers. (2) A callable C-language or assembler-language routine that 
  15596.    provides an operating system service for an OS/2 device driver. 
  15597.  
  15598.  device object An object that provides a means for communication between a 
  15599.    computer and the outside world.  A printer is an example of a device object. 
  15600.  
  15601.  device sharing (1) The ability to share a device among many different 
  15602.    applications simultaneously.  If a device is opened shareable, the device 
  15603.    context will be saved by the operating system when going from one 
  15604.    application to another application. (2) Allowing a device context to be 
  15605.    switched between media control interface devices. 
  15606.  
  15607.  device-specific format The storage or transmission format used by a device, 
  15608.    especially if it is different from an accepted standard. 
  15609.  
  15610.  dialog In an interactive system, a series of related inquiries and responses 
  15611.    similar to a conversation between two people. 
  15612.  
  15613.  digital Pertaining to data in the form of numeric characters. Contrast with 
  15614.    analog. 
  15615.  
  15616.  digital audio Material that can be heard that has been converted to digital 
  15617.    form. Synonymous with digitized audio. 
  15618.  
  15619.  digital signal processor (DSP) A high-speed coprocessor designed to do 
  15620.    real-time manipulation of signals. 
  15621.  
  15622.  digital video Material that can be seen that has been converted to digital 
  15623.    form. Synonymous with digitized video. 
  15624.  
  15625.  digital video device A device which can record and/or play files containing 
  15626.    digitally stored video. 
  15627.  
  15628.  digital video effects (DVE) An online editing technique that manipulates 
  15629.    on-screen a full video image; activity for creating sophisticated 
  15630.    transitions and special effects.  Digital video effects (DVE) can involve 
  15631.    moving, enlarging, or overlaying pictures. 
  15632.  
  15633.  Digital Video Interactive (DVI) A system for bringing full-screen, full-motion 
  15634.    television pictures and sound to a regular PC.  DVI is a chip set and uses 
  15635.    delta compression; that is, only the image-to-image changes in each frame 
  15636.    are saved rather than the whole frame.  Data (video footage) is compressed 
  15637.    into a form that reduces memory requirements by factors of 100 or greater. 
  15638.    This compressed data is stored on optical discs and can be retrieved at a 
  15639.    rate of 30 frames per second.  (The DVI technology was developed by RCA and 
  15640.    then sold to Intel.  IBM has chosen this technology for future use in the 
  15641.    PS/2.) 
  15642.  
  15643.  digital-to-analog converter (DAC) (1) A functional unit that converts data 
  15644.    from a digital representation to an analog representation. (2) A device that 
  15645.    converts a digital value to a proportional analog signal. 
  15646.  
  15647.  digitize To convert an analog signal into digital format. (An analog signal 
  15648.    during conversion must be sampled at discrete points and quantized to 
  15649.    discrete numbers.) 
  15650.  
  15651.  digitized audio Synonym for digital audio. 
  15652.  
  15653.  digitized video Synonym for digital video. 
  15654.  
  15655.  digitizer A device that converts to digital format any image captured by the 
  15656.    camera. 
  15657.  
  15658.  direct manipulation A set of techniques that allow a user to work with an 
  15659.    object by dragging it with a pointing device or interacting with its pop-up 
  15660.    menu. 
  15661.  
  15662.  direct memory access The transfer of data between memory and input and output 
  15663.    units without processor intervention. 
  15664.  
  15665.  direct-read-after-write (DRAW) disc A videodisc produced directly from a 
  15666.    videotape, one copy at a time.  A DRAW disc usually is used to check program 
  15667.    material and author applications before replicated discs are available. 
  15668.  
  15669.  disc Alternate spelling for disk. 
  15670.  
  15671.  discard stop In data streaming, requests that the data stream be stopped and 
  15672.    the data remaining in the stream buffers be discarded. 
  15673.  
  15674.  disk A round, flat, data medium that is rotated in order to read or write 
  15675.    data. 
  15676.  
  15677.  display image A collection of display elements or segments that are 
  15678.    represented together at any one time on a display surface. See also 
  15679.    background image and foreground image. 
  15680.  
  15681.  dissolve To fade down one picture as the next fades up. Synonymous with 
  15682.    crossfade. 
  15683.  
  15684.  dithering When different pixels in an image are prebiased with a varying 
  15685.    threshold to produce a more continuous gray scale despite a limited palette. 
  15686.    This technique is used to soften a color line or shape.  This technique also 
  15687.    is used for alternating pixel colors to create the illusion of a third 
  15688.    color. 
  15689.  
  15690.  DLL Dynamic-link library. 
  15691.  
  15692.  dolly A wheeled platform for a camera; a camera movement where the tripod on 
  15693.    which the camera is mounted physically moves toward or away from the 
  15694.    subject. 
  15695.  
  15696.  DOS IOProc An internal I/O procedure, provided by the OS/2 multimedia system, 
  15697.    that supports DOS files. 
  15698.  
  15699.  double-click To press and release a button on a pointing device twice without 
  15700.    moving the pointer off of the object or choice. 
  15701.  
  15702.  DRAW disc Direct-read-after-write disc. 
  15703.  
  15704.  drop-frame time code A nonsequential time code used to keep tape time code 
  15705.    matched to real time. Must not be used in tapes intended for videodisc 
  15706.    mastering. 
  15707.  
  15708.  DSP Digital signal processor. 
  15709.  
  15710.  DTMF Dual-tone modulation frequency. 
  15711.  
  15712.  dual plane video system Refers to when graphics from the graphics adapter are 
  15713.    separate from the analog video.  That is, there is a separate graphics plane 
  15714.    and video plane. The analog video appears behind the graphics, showing 
  15715.    through only in the areas that are transparent. Since graphics and video are 
  15716.    separate, capturing the graphics screen will only obtain graphics, and 
  15717.    capturing the video screen will  only obtain video.  This is also true for 
  15718.    restoring images. See also single plane video system. 
  15719.  
  15720.  dual-state push button A push button that has two states, in and out.  It is 
  15721.    used for setting and resetting complementary states, such as Mute and 
  15722.    Unmute. 
  15723.  
  15724.  dual-tone modulation frequency (DTMF) Pushbutton phone tones. 
  15725.  
  15726.  dub To copy a tape; to add (sound effects or new dialog) to a film; to provide 
  15727.    a new audio track of dialog in a different language.  (Often used with "in" 
  15728.    as "dub in".) 
  15729.  
  15730.  DVE Digital video effects. 
  15731.  
  15732.  DVI Digital Video Interface 
  15733.  
  15734.  dynamic icon An icon that changes to convey some information about the object 
  15735.    that it represents.  For example, a folder icon can show a count, indicating 
  15736.    the number of objects contained within the folder.  Also, a tape player icon 
  15737.    can show an animation of turning wheels to indicate that the machine 
  15738.    playing. 
  15739.  
  15740.  dynamic linking A function that enables programs to have external references 
  15741.    to segments of a program that are not included in the program's .EXE file. 
  15742.    See also dynamic-link library (DLL). 
  15743.  
  15744.  dynamic-link library (DLL) A file that has the same format as an .EXE file and 
  15745.    contains the actual dynamic-link run-time code. Contrast with LIB. See also 
  15746.    dynamic linking. 
  15747.  
  15748.  dynamic resource A multimedia program unit of data that resides in system 
  15749.    memory. Contrast with static resource. 
  15750.  
  15751.  
  15752. ΓòÉΓòÉΓòÉ <hidden> E ΓòÉΓòÉΓòÉ
  15753.  
  15754.  earcon An icon with an audio enhancement, such as a ringing telephone. 
  15755.  
  15756.  ECB Event control block. 
  15757.  
  15758.  ECU Script abbreviation for extreme close-up. 
  15759.  
  15760.  edit decision list (EDL) Synonym for edit list. 
  15761.  
  15762.  edit list A list of the specific video footage, with time-code numbers, that 
  15763.    will be edited together to form the program.  It is completed during the 
  15764.    offline edit and used during the online edit. Synonymous with edit decision 
  15765.    list (EDL). 
  15766.  
  15767.  edit master The final videotape from which all copies are made. See also glass 
  15768.    master. 
  15769.  
  15770.  editing Assembling various segments into the composite program. 
  15771.  
  15772.  EDL Edit decision list. 
  15773.  
  15774.  EGA Enhanced graphics adapter. 
  15775.  
  15776.  element (1) A file or other stored data item. (2) An individual file that is 
  15777.    part of a RIFF compound file.  An element of a compound file also could be 
  15778.    an entire RIFF file, a non-RIFF file, an arbitrary RIFF chunk, or arbitrary 
  15779.    binary data. (3) The particular resource within a subarea that is identified 
  15780.    by an element address. 
  15781.  
  15782.  emphasis Highlighting, color change, or other visible indication of the 
  15783.    condition of an object or choice and the effect of that condition on a 
  15784.    user's ability to interact with that object or choice.  Emphasis can also 
  15785.    give a user additional information about the state of an object or choice. 
  15786.  
  15787.  encode To convert data by the use of a code in such a manner that reconversion 
  15788.    to the original form is possible.  Contrast with decode. 
  15789.  
  15790.  enhanced graphics adapter (EGA) A graphics controller for color displays.  The 
  15791.    pel resolution of an enhanced graphics adapter is 3:4. 
  15792.  
  15793.  entry field An area into which a user places text.  Its boundaries are usually 
  15794.    indicated. 
  15795.  
  15796.  erasable optical discs Optical discs that can be erased and written to 
  15797.    repeatedly. 
  15798.  
  15799.  establishing shot In videotaping, a long shot used in the beginning of a 
  15800.    program or segment to establish where the action is taking place and to give 
  15801.    the sense of an environment. 
  15802.  
  15803.  EVCB Event control block. 
  15804.  
  15805.  event An occurrence of significance to a task; for example, the completion of 
  15806.    an asynchronous operation, such as I/O. 
  15807.  
  15808.  event control block (ECB or EVCB) A control block used to represent the status 
  15809.    of an event. 
  15810.  
  15811.  event queue In computer graphics, a queue that records changes in input 
  15812.    devices such as buttons, valuators, and the keyboard.  The event queue 
  15813.    provides a time-ordered list of input events. 
  15814.  
  15815.  event semaphore (1) Used when one or more threads must wait for a single event 
  15816.    to occur. (2) A blocking flag used to signal when an event has occurred. 
  15817.  
  15818.  explicit event An event supported by only some handlers, such as a custom 
  15819.    event unique to a particular type of data. 
  15820.  
  15821.  EXT Script abbreviation for exterior. 
  15822.  
  15823.  extended selection A type of selection optimized for the selection of a single 
  15824.    object.  A user can extend selection to more than one object, if required. 
  15825.    The two kinds of extended selection are contiguous extended selection and 
  15826.    discontiguous extended selection. 
  15827.  
  15828.  extreme close-up The shot obtained when the camera is positioned to show only 
  15829.    the face or a single feature of the subject; in the case of an object, the 
  15830.    camera is close enough to reveal an individual part of the object clearly. 
  15831.  
  15832.  
  15833. ΓòÉΓòÉΓòÉ <hidden> F ΓòÉΓòÉΓòÉ
  15834.  
  15835.  facsimile machine A functional unit that converts images to signals for 
  15836.    transmission over a telephone system or that converts received signals back 
  15837.    to images. 
  15838.  
  15839.  fade To change the strength or loudness of a video or audio signal, as in 
  15840.    "fade up" or "fade down." 
  15841.  
  15842.  fast threads Threads created by an application that provide minimal process 
  15843.    context, for example, just stack, register, and memory.  With the reduced 
  15844.    function, fast threads can be processed quickly. 
  15845.  
  15846.  FAX machine Synonym for facsimile machine. 
  15847.  
  15848.  file cleanup The removal of superfluous or obsolete data from a file. 
  15849.  
  15850.  file compaction Any method of encoding data to reduce its required storage 
  15851.    space. 
  15852.  
  15853.  file element (1) An individual file that is part of a RIFF compound file. (2) 
  15854.    An element of a compound file can also be an entire RIFF file, a non-RIFF 
  15855.    file, an arbitrary RIFF chunk, or arbitrary binary data. See media element. 
  15856.  
  15857.  file format A language construct that specifies the representation, in 
  15858.    character form, of data objects in a file.  For example, MIDI, M-Motion, or 
  15859.    AVC. 
  15860.  
  15861.  file format handler I/O procedure. Provides functions that operate on the 
  15862.    media object of a particular data format.  These functions include opening, 
  15863.    reading, writing, seeking, and closing elements of a storage system. 
  15864.  
  15865.  file format IOProc An installable I/O procedure that is responsible for all 
  15866.    technical knowledge of the format of a specific type of data, such as 
  15867.    headers and data compression schemes.  A file format IOProc manipulates 
  15868.    multimedia data at the element level.  A file format IOProc handles the 
  15869.    element type it was written for and does not rely on any other file format 
  15870.    IOProcs to do any processing.  However, a file format IOProc might need to 
  15871.    call a storage system IOProc to obtain data within a file containing 
  15872.    multiple file elements. See IOProc and storage system IOProc. 
  15873.  
  15874.  final script The finished script that will be used as a basis for shooting the 
  15875.    video. Synonymous with shooting script. 
  15876.  
  15877.  first draft A rough draft of the complete script. 
  15878.  
  15879.  first generation In videotaping, the original or master tape; not a copy. 
  15880.  
  15881.  flashback Interruption of chronological sequence by interjection of events 
  15882.    occurring earlier. 
  15883.  
  15884.  flush stop In data streaming, requests that the source stream handler be 
  15885.    stopped but the target stream handler continue until the last buffer held at 
  15886.    the time the stop was requested is consumed by the target stream handler. 
  15887.  
  15888.  flutter A phenomenon that occurs in a videodisc freeze-frame when both video 
  15889.    fields are not identically matched, thus creating two different pictures 
  15890.    alternating every 1/60th of a second. 
  15891.  
  15892.  fly-by Animation simulating a bird's-eye view of a three-dimensional 
  15893.    environment. 
  15894.  
  15895.  fly-in A DVE where one picture "flies" into another. 
  15896.  
  15897.  folder A container used to organize objects. 
  15898.  
  15899.  footage The total number of running feet of film used (as for a scene). 
  15900.  
  15901.  foreground image The part of a display image that can be changed for every 
  15902.    transaction. Contrast with background image. 
  15903.  
  15904.  form overlay A pattern such as a report form, grid, or map used as background 
  15905.    for a display image. 
  15906.  
  15907.  form type A field in the first four bytes of the data field of a RIFF chunk. 
  15908.    It is a four-character code identifying the format of the data stored in the 
  15909.    file.  A RIFF form is a chunk with a chunk ID of RIFF. For example, waveform 
  15910.    audio files (WAVE files) have a form type of WAVE. 
  15911.  
  15912.  Format 0 MIDI file All MIDI data is stored on a single track. 
  15913.  
  15914.  Format 1 MIDI file All MIDI data is stored on multiple tracks. 
  15915.  
  15916.  four-character code (FOURCC) A 32-bit quantity representing a sequence of one 
  15917.    to four ASCII alphanumeric characters (padded on the right with blank 
  15918.    characters). Four-character codes are unique identifiers that represent the 
  15919.    file format and IOProc. 
  15920.  
  15921.  FOURCC Four-character code. 
  15922.  
  15923.  fps Frames per second. 
  15924.  
  15925.  frame A complete television picture frame is composed of two scanned fields, 
  15926.    one of the even lines and one of the odd lines.  In the NTSC system, a frame 
  15927.    has 525 horizontal lines and is scanned in 1/30th of a second.  In the PAL 
  15928.    system, a frame has 625 horizontal lines and is scanned in 1/25th of a 
  15929.    second. 
  15930.  
  15931.  frame-step recording Refers to the capturing of video and audio data frame by 
  15932.    frame, from a computer-controlled, frame-steppable video source device, or a 
  15933.    previously recorded AVI file. 
  15934.  
  15935.  frame-accurate searches The ability of a videodisc player to play or search to 
  15936.    specific frames on the videodisc via software or remote control.  This 
  15937.    capability is available on all CAV players, but currently only on a few CLV 
  15938.    players. Most CLV players can only search or play to within one second (30 
  15939.    frames for NTSC or 25 frames for PAL). 
  15940.  
  15941.  frame animation A process where still images are shown at a constant rate. See 
  15942.    also cast animation. 
  15943.  
  15944.  frame grabber A device that digitizes video images. 
  15945.  
  15946.  frame number The number used to identify a frame.  On videodisc, frames are 
  15947.    numbered sequentially from 1 to 54,000 on each side and can be accessed 
  15948.    individually; on videotape, the numbers are assigned by way of the SMPTE 
  15949.    time code. 
  15950.  
  15951.  frame rate The speed at which the frames are scanned.  For a videodisc player, 
  15952.    the speed at which frames are scanned is 30 frames a second for NTSC video 
  15953.    and 25 frames a second in PAL video.  For most videotape devices, the speed 
  15954.    is 24 frames a second. 
  15955.  
  15956.  freeze Disables updates to all or part of the video buffer. The last video 
  15957.    displayed remains visible. See also unfreeze. 
  15958.  
  15959.  freeze-frame A frame of a motion-picture film that is repeated so as to give 
  15960.    the illusion of a still picture. 
  15961.  
  15962.  full-frame time code A standardized method, set by the Society of Motion 
  15963.    Picture and Television Engineers (SMPTE), of address coding a videotape.  It 
  15964.    gives an accurate frame count rather than an accurate clock time. Synonymous 
  15965.    with nondrop time code. 
  15966.  
  15967.  full-motion video Video playback at 30 frames per second for NTSC signals or 
  15968.    25 frames per second for PAL signals. 
  15969.  
  15970.  
  15971. ΓòÉΓòÉΓòÉ <hidden> G ΓòÉΓòÉΓòÉ
  15972.  
  15973.  game port A connector on a computer used to attach hardware devices, such as 
  15974.    joy sticks. 
  15975.  
  15976.  GDT Global Descriptor Table. 
  15977.  
  15978.  general purpose interface bus An adapter that controls the interface between 
  15979.    the PC, Personal Computer XT or Personal Computer AT and, for example, the 
  15980.    InfoWindow display; also known as the IBM IEEE 488. 
  15981.  
  15982.  genlock A device that comes on an adapter or plugs into a computer port and 
  15983.    provides the technology to overlay computer-generated titles and graphics 
  15984.    onto video images.  It does this by phase-locking the sync generation of two 
  15985.    video signals together so they can be merged. Genlock also converts a 
  15986.    digital signal to NTSC or PAL format.  (For example, flying logos and 
  15987.    scrolling text on television shows are overlaid using a genlock.) 
  15988.  
  15989.  glass master The final videodisc format from which copies are made. 
  15990.  
  15991.  Global Descriptor Table (GDT) Defines code and data segments available to all 
  15992.    tasks in an application. 
  15993.  
  15994.  GOCA Graphic Object Content Architecture. 
  15995.  
  15996.  Graphic Object Content Architecture (GOCA) (1) A data format for multimedia 
  15997.    products. (2) A push button with graphic, two-state, and animation 
  15998.    capabilities. 
  15999.  
  16000.  graphics overlay The nature of dual plane video systems makes it possible to 
  16001.    place graphics over video.  Only the pels of the designated transparent 
  16002.    color allows the video to show through.  All other graphics pels appear on 
  16003.    top of the video.  Note that the video still exists in the video buffer 
  16004.    under the non-transparent graphics pels. 
  16005.  
  16006.  graphics plane In a dual plane video system, the graphics plane contains 
  16007.    material drawn or generated by the graphics adapter.  The graphics plane 
  16008.    will be combined with the video plane to create an entire display image. 
  16009.  
  16010.  grayscale See greyscale. 
  16011.  
  16012.  greyscale When video is displayed in shades of black and white. 
  16013.  
  16014.  grouping For media control interface devices, refers to the ability to 
  16015.    associate dissimilar devices for a common purpose. 
  16016.  
  16017.  
  16018. ΓòÉΓòÉΓòÉ <hidden> H ΓòÉΓòÉΓòÉ
  16019.  
  16020.  handshaking The exchange of predetermined signals when a connection is 
  16021.    established between two data set devices. 
  16022.  
  16023.  help view A view of an object that provides information to assist users in 
  16024.    working with that object. 
  16025.  
  16026.  HID Handler identification. 
  16027.  
  16028.  High Sierra Group (HSG) (1) A group that set the standards for information 
  16029.    exchange for a CD-ROM. (2) HSG also refers to those standards (HSG 
  16030.    standards). 
  16031.  
  16032.  Hi8 High-band 8mm videotape format. 
  16033.  
  16034.  HMS (1) Hours-minutes-seconds. (2) A time format for videodisc players. 
  16035.  
  16036.  HMSF Hours-minutes-seconds-frames. A time format for videodisc players. 
  16037.  
  16038.  hot spot The area of a display screen that is activated to accept user input. 
  16039.    Synonymous with touch area. 
  16040.  
  16041.  HSG High Sierra Group. 
  16042.  
  16043.  HSI Hue saturation intensity. 
  16044.  
  16045.  hue Describes the position of a color in a range from blue to green.  A hue 
  16046.    level of 0 is maximum blue.  A hue level of 100 is maximum green. Also 
  16047.    referred to as tint. 
  16048.  
  16049.  hue saturation intensity (HSI) A method of describing color in 
  16050.    three-dimensional color space. 
  16051.  
  16052.  HWID Hardware identifier. 
  16053.  
  16054.  hypermedia Navigation or data transfer between connected objects of different 
  16055.    media types.  For example, a user might navigate from an image object to an 
  16056.    audio object that describes the image over a hypermedia link. Or, a 
  16057.    representation of a graph object might be embedded in a document object with 
  16058.    a hypermedia data transfer link, such that when the graph object is changed, 
  16059.    the representation of that object in the document is also changed. 
  16060.  
  16061.  Hytime An ANSI standard proposal that addresses the synchronization and 
  16062.    linking of multimedia objects. 
  16063.  
  16064.  
  16065. ΓòÉΓòÉΓòÉ <hidden> I ΓòÉΓòÉΓòÉ
  16066.  
  16067.  I-Frame A video frame that contains information to reconstruct the complete 
  16068.    image. Synonymous with key frame and reference frame See delta frame. 
  16069.  
  16070.  IDC Inter-device communication mechanism provided by the OS/2 function 
  16071.    ATTACHDD DevHelp. 
  16072.  
  16073.  identifier (1) A sequence of bits or characters that identifies a program, 
  16074.    device, or system to another program, device, or system. (2) In the C 
  16075.    language, a sequence of letters, digits, and underscores used to identify a 
  16076.    data object or function. See four-character code (FOURCC). 
  16077.  
  16078.  IDOCA Integrated Data Object Content Architecture. 
  16079.  
  16080.  image An electronic representation of a video still. 
  16081.  
  16082.  image bitsperpel Pertaining to the number of colors supported by the current 
  16083.    pel format. The currently accepted standard values are those supported by 
  16084.    OS/2 bitmaps, for example, 1, 4, 8, or 24 bits per pel.  In addition, 12 
  16085.    bits per pel formats are accepted for YUV images (including the 'yuvb' pel 
  16086.    format for RDIB files). 
  16087.  
  16088.  image buffer A location in memory where video images are stored for later use. 
  16089.  
  16090.  image buffer formats The format or representation of data buffers containing 
  16091.    video images. 
  16092.  
  16093.  image compression The method of compressing video image data to conserve 
  16094.    storage space. 
  16095.  
  16096.  image file format The format or representation of data files containing video 
  16097.    images. 
  16098.  
  16099.  Image Object Content Architecture (IOCA) A data format for multimedia 
  16100.    products. 
  16101.  
  16102.  image pelformat Indicates the color representation that is to be used for 
  16103.    images that are captured and saved.  This normally includes palettized RGB, 
  16104.    true-color RGB, or YUV color formats. 
  16105.  
  16106.  image quality Represents the user's or application's subjective evaluation of 
  16107.    complexity and quality of the image to be captured or saved. This setting is 
  16108.    used to determine specific compression methods to use for saving the image. 
  16109.  
  16110.  implicit event An event that all stream handlers always must support, such as 
  16111.    end of stream or preroll complete). 
  16112.  
  16113.  implicit event An event that all stream handlers always must support, such as 
  16114.    end of stream or preroll complete). 
  16115.  
  16116.  in frame Refers to a subject that is included within the frame. See also 
  16117.    frame. 
  16118.  
  16119.  in-betweening Synonym for tweening. 
  16120.  
  16121.  InfoWindow system A display system that can combine text, graphics, and video 
  16122.    images on a single display.  The minimum system configuration is the IBM 
  16123.    InfoWindow Color Display, a system unit, a keyboard, and one or two 
  16124.    videodisc players. 
  16125.  
  16126.  input locking mask A filter, or mask, that controls which areas of the display 
  16127.    can display or freeze video. 
  16128.  
  16129.  input/output control (IOCtl) A system function that provides a method for an 
  16130.    application to send device-specific control commands to a device driver. 
  16131.  
  16132.  installable I/O procedure A file format handler that provides functions that 
  16133.    operate on the media object of a particular data format.  These functions 
  16134.    include opening, reading, writing, seeking, and closing elements. 
  16135.  
  16136.  INT Script abbreviation for interior. 
  16137.  
  16138.  Integrated Data Object Control Architecture (IDOCA) A data format for 
  16139.    multimedia products. 
  16140.  
  16141.  interactive multimedia The delivery of information content through 
  16142.    combinations of video, computer graphics, sound, and text in a manner that 
  16143.    allows the user to interact. 
  16144.  
  16145.  interactive program A running program that can receive input from the keyboard 
  16146.    or another input device.  Contrast with noninteractive program. 
  16147.  
  16148.  interactive videodisc system (IVS) A system in which a user can interact with 
  16149.    a videodisc display image by entering commands to the computer through a 
  16150.    device such as a keyboard or keypad or by touching a touch-sensitive screen 
  16151.    at specific points on the display surface. 
  16152.  
  16153.  interlace flicker The apparent flicker when one field of an interlaced image 
  16154.    contains more light than the other field due to the placement of image 
  16155.    details with respect to the separate fields.  Two methods used to avoid 
  16156.    interlace flicker:  limit the vertical resolution on natural images (as 
  16157.    opposed to text or graphics); design characters so that each character has 
  16158.    an equal number of pels in each field. 
  16159.  
  16160.  interlacing A characteristic of video image display that results in greater 
  16161.    image clarity.  In effect, the video image is traced across the screen 
  16162.    twice.  (The time delay between the two tracings makes this effect 
  16163.    undesirable for normal computer-generated graphics.)  Synonymous with 
  16164.    interleaving. 
  16165.  
  16166.  interleaving The simultaneous accessing of two or more bytes or streams of 
  16167.    data from distinct storage units. Synonymous with interlacing. 
  16168.  
  16169.  internal I/O procedure An I/O procedure that is built in to the OS/2 
  16170.    multimedia system, including DOS, MEM, and CF IOProcs. 
  16171.  
  16172.  International Organization for Standardization (ISO) An organization of 
  16173.    national standards bodies from various countries established to promote 
  16174.    development of standards to facilitate international exchange of goods and 
  16175.    services, and develop cooperation in intellectual, scientific, 
  16176.    technological, and economic activity. 
  16177.  
  16178.  IOCtl Input/output control. 
  16179.  
  16180.  IOProc A file format handler that provides functions that operate on the media 
  16181.    object of a particular data format.  These processes include opening, 
  16182.    reading, writing, seeking, and closing elements of a storage system.  There 
  16183.    are two classes of I/O procedures: file format and storage system. 
  16184.  
  16185.  iris To fade a picture by operating the iris (aperture) on the camera in a 
  16186.    certain way; the type of computer image dissolve accomplished by operating 
  16187.    the aperture in a certain way. 
  16188.  
  16189.  ISO International Organization for Standardization. 
  16190.  
  16191.  ISP IBM Signal Processor.  An IBM proprietary digital signal processor. 
  16192.  
  16193.  ISPOS IBM Signal Processor Operating System. 
  16194.  
  16195.  ISV Independent software vendor. 
  16196.  
  16197.  items Options, choices or keywords such as one or more of the following 
  16198.    options, choices or keywords can or should be specified.  Sometimes use of 
  16199.    these items can also be exclusive or some items may not be compatible with 
  16200.    other items. 
  16201.  
  16202.  IVS Interactive videodisc system. 
  16203.  
  16204.  
  16205. ΓòÉΓòÉΓòÉ <hidden> J ΓòÉΓòÉΓòÉ
  16206.  
  16207.  JIT Just in time.  (Often used with "learning" as "JIT learning.)  Multimedia 
  16208.    help functions, closely integrated with applications, that employ voice 
  16209.    output to guide the user. 
  16210.  
  16211.  Joint Photographic Experts Group (JPEG) A group that is working to establish a 
  16212.    standard for compressing and storing still images in digital form.  JPEG 
  16213.    also refers to the standard under development by this group (JPEG standard). 
  16214.  
  16215.  joy stick In computer graphics, a lever that can pivot in all directions and 
  16216.    that is used as a locater device.  (Resembles an airplane's joy stick). 
  16217.  
  16218.  JPEG Joint Photographic Experts Group. 
  16219.  
  16220.  
  16221. ΓòÉΓòÉΓòÉ <hidden> K ΓòÉΓòÉΓòÉ
  16222.  
  16223.  keeper Synonym for buy. 
  16224.  
  16225.  kernel The part of the operating system that performs basic functions. 
  16226.  
  16227.  key frames The start and end frames of a single movement in an animation 
  16228.    sequence; also can refer to the periodic full-frame image interspersed in 
  16229.    the stream to allow random starts from these full-frame images (key frames). 
  16230.  
  16231.  keypad A small, often hand-held, keyboard. 
  16232.  
  16233.  
  16234. ΓòÉΓòÉΓòÉ <hidden> L ΓòÉΓòÉΓòÉ
  16235.  
  16236.  laser Light amplification by stimulated emission of radiation; the device that 
  16237.    produces this light. 
  16238.  
  16239.  latency In video, the time it takes for the light from the phosphor screen to 
  16240.    decay after the excitation is removed. Long-persistence phosphor has less 
  16241.    flicker of still images, but more blurring of moving images. 
  16242.  
  16243.  level one videodisc applications Interactive applications based on manual 
  16244.    keypad functions, picture stops, and chapter stops. 
  16245.  
  16246.  level three videodisc applications Interactive applications controlled by an 
  16247.    external computer that uses the videodisc player as a peripheral device. 
  16248.  
  16249.  level two videodisc applications Interactive applications controlled by the 
  16250.    keypad and the videodisc player's internal computer. The control program is 
  16251.    recorded on the videodisc itself. 
  16252.  
  16253.  LIB Dynamic-link definition library.  A file containing the data needed to 
  16254.    build a program .EXE file but which does not contain the dynamic-link 
  16255.    programs themselves. Contrast with dynamic-link library. 
  16256.  
  16257.  light pen A light-sensitive pick device that is used by pointing it at the 
  16258.    display surface. 
  16259.  
  16260.  line graphics Synonym for coordinate graphics. 
  16261.  
  16262.  line pairing A faulty interlace pattern in which the lines of the second field 
  16263.    begin to pair with the lines of the first field rather than fit exactly 
  16264.    within them. 
  16265.  
  16266.  linear audio The analog audio on the linear track of videotape that can be 
  16267.    recorded without erasing existing video; used for audio dubbing after video 
  16268.    is edited. 
  16269.  
  16270.  linear video A sequence of motion footage played from start to finish without 
  16271.    stops or branching, like a movie. 
  16272.  
  16273.  LIST chunk A chunk that contains a list or an ordered sequence of subchunks. 
  16274.  
  16275.  list type (1) A field in the first four bytes of the data field of a LIST 
  16276.    chunk (2) A four-character code identifying the contents of the list. 
  16277.  
  16278.  locked memory An area of memory that is not available for use because it is 
  16279.    being held by another process. 
  16280.  
  16281.  long shot A camera angle that reveals the subject and the surroundings. Often 
  16282.    used as an establishing shot.  Synonymous with wide shot. 
  16283.  
  16284.  LS Script abbreviation for long shot. 
  16285.  
  16286.  luminance signal The portion of image information that provides brightness. 
  16287.    Alone, luminance provides a monochrome image. 
  16288.  
  16289.  
  16290. ΓòÉΓòÉΓòÉ <hidden> M ΓòÉΓòÉΓòÉ
  16291.  
  16292.  M-ACPA M-Audio Capture and Playback Adapter. 
  16293.  
  16294.  M-Audio Capture and Playback Adapter (M-ACPA) An adapter card (for use with 
  16295.    the IBM PS/2 product line) that provides the ability to record and play back 
  16296.    high quality sound.  The adapter converts the audio input (analog) signals 
  16297.    to a digital format that is compressed and stored for later use. 
  16298.  
  16299.  M-Control Program/2 The software interface required for the M-Motion Video 
  16300.    Adapter/A. It consists of APIs or toolkits for DOS, Windows, Windows Media 
  16301.    Control Interface, OS/2, and OS/2 multimedia. It also includes Pioneer and 
  16302.    Sony videodisc player drivers for these environments. See also M-Motion 
  16303.    Video Adapter/A. 
  16304.  
  16305.  M-Motion A multimedia platform that offers analog video in addition to quality 
  16306.    sound and images.  The M-Motion environment consists of the M-Motion Video 
  16307.    Adapter/A and the M-Control Program/2 master stream handler. 
  16308.  
  16309.  M-Motion Video Adapter/A (1) A Micro Channel adapter that receives and 
  16310.    processes signals from multiple video and audio sources, and then sends 
  16311.    these signals to a monitor and speakers. (2) Dual plane video hardware that 
  16312.    offers analog video in addition to quality sound and images. (3) The 
  16313.    M-Motion Video Adapter/A requires the M-Control Program/2. 
  16314.  
  16315.  master stream handler Controls the behavior of one or more subordinate objects 
  16316.    (the slave streams). 
  16317.  
  16318.  matte In film, an opaque piece of art or a model that leaves a selected area 
  16319.    unexposed to be filled on a subsequent pass or in composite. 
  16320.  
  16321.  MCD Media Control Driver. 
  16322.  
  16323.  MDM Media Device Manager. 
  16324.  
  16325.  media More than one hardware medium. 
  16326.  
  16327.  media component A processor of audiovisual information or media.  Media 
  16328.    components can be either internal or external physical devices or defined 
  16329.    mechanisms for effecting higher-level function from internal hardware and 
  16330.    software subsystems.  (An example is a waveform player that utilizes the DSP 
  16331.    subsystem and data streaming services to effect audio playback functions.) 
  16332.  
  16333.  media control driver (MCD) A software implementation or method that effects 
  16334.    the function of a media component.  For OS/2, a media control driver, or 
  16335.    media driver, is a dynamic-link library (or set of libraries) that utilizes 
  16336.    physical device drivers, MCI services, and OS/2 to implement the function of 
  16337.    the media component. 
  16338.  
  16339.  media device capabilities The functionality of a media component, including 
  16340.    component functions that are supported. 
  16341.  
  16342.  media device connection A physical or logical link between media component 
  16343.    connectors for a particular set of media component instances. 
  16344.  
  16345.  media device connector A physical or logical input or output on a media 
  16346.    component. 
  16347.  
  16348.  media device connector index An identifier for a media component connector. 
  16349.  
  16350.  media device ID Media component identification.  A unique identifier for a 
  16351.    component. 
  16352.  
  16353.  media device instance A case of an application's use of a media component. 
  16354.  
  16355.  media component type A class of media components that exhibit similar behavior 
  16356.    and capabilities.  Examples of media component types are analog video 
  16357.    display hardware and MIDI synthesizers. 
  16358.  
  16359.  media control interface A generalized interface to control multimedia devices. 
  16360.    Each device has its own media control interface driver that implements a 
  16361.    standard set of media control interface functions.  In addition, each media 
  16362.    driver can implement functions that are specific to the particular device. 
  16363.  
  16364.  media device capabilities The functionality of a media component, including 
  16365.    supported component functions. 
  16366.  
  16367.  media device connection A physical or logical link between media component 
  16368.    connectors for a particular set of media component instances. 
  16369.  
  16370.  media device connector A physical or logical input or output on a media 
  16371.    component. 
  16372.  
  16373.  media device connector index An identifier for a media component connector. 
  16374.  
  16375.  media device manager (MDM) A system service that, when two or more 
  16376.    applications attempt to control a media device, determines which process 
  16377.    gains access. 
  16378.  
  16379.  media driver A device driver for a multimedia device. See also device driver. 
  16380.  
  16381.  media driver A software implementation or method that effects the function of 
  16382.    a media device. 
  16383.  
  16384.  media element manager (MEM) A system service that manipulates multimedia data. 
  16385.  
  16386.  media programming interface (MPI) A subsystem that provides a comprehensive 
  16387.    system programming API layer for multimedia applications. 
  16388.  
  16389.  media segment An audiovisual object of some type, such as a waveform, song, 
  16390.    video clip, and so on. 
  16391.  
  16392.  media unit A medium on which files are stored; for example, a diskette. 
  16393.  
  16394.  media volume A (possibly heterogeneous) physical or logical collection of 
  16395.    media segments.  (Examples are a videodisc, video tape, compact audio disc, 
  16396.    OFF file, and RIFF file.) 
  16397.  
  16398.  media volume file A media volume that is embodied as a conventional binary 
  16399.    computer file within a computer file system on storage devices such as 
  16400.    disks, diskettes, or CD-ROMs.  Such storage devices can be either local or 
  16401.    remote.  Media volume files can be of various formats, such as OFF or RIFF, 
  16402.    and contain segments of various types. 
  16403.  
  16404.  medium shot A camera angle that reveals more of the subject than a close-up 
  16405.    but less than a wide shot, usually from face to waistline; sometimes called 
  16406.    a mid-shot. 
  16407.  
  16408.  MEM Media element manager. 
  16409.  
  16410.  MEM IOProc An internal I/O procedure provided by the OS/2 multimedia system 
  16411.    that supports memory files. 
  16412.  
  16413.  memory file A block of memory that is perceived as a file by an application. 
  16414.  
  16415.  memory playlist A data structure in the application used to specify the memory 
  16416.    addresses to play from or record to.  The application can modify the 
  16417.    playlist to achieve various effects in controlling the memory stream. 
  16418.  
  16419.  message interface See command message interface. 
  16420.  
  16421.  mid-shot See medium shot. 
  16422.  
  16423.  MIDI Mapper Provides the ability to translate and redirect MIDI messages to 
  16424.    achieve device-independent playback of MIDI sequences. 
  16425.  
  16426.  millisecond One thousandth of a second. 
  16427.  
  16428.  minutes-seconds-frames (MSF) A time format based on the 75-frames-per-second 
  16429.    CD digital audio standard. 
  16430.  
  16431.  MIPS Millions of instructions per second.  A unit of measure of processing 
  16432.    performance equal to one million instructions per second. 
  16433.  
  16434.  mix The combination of audio or video sources during postproduction. 
  16435.  
  16436.  mixed-media system Synonym for multimedia system. 
  16437.  
  16438.  mixer A device used to simultaneously combine and blend several inputs into 
  16439.    one or two outputs. 
  16440.  
  16441.  mixing (1) In computer graphics, the result of the intersection of two or more 
  16442.    colors. (2) In filming, the combining of audio and video sources that is 
  16443.    accomplished during postproduction at the mix. (3) In recording, the 
  16444.    combining of audio sources. 
  16445.  
  16446.  MMIO Multimedia Input/Output. 
  16447.  
  16448.  MMIO file services System services that enable an application to access and 
  16449.    manipulate multimedia data files. 
  16450.  
  16451.  MMIO manager Multimedia input/output manager.  The MMIO manager provides 
  16452.    services to find, query, and access multimedia data objects. It also 
  16453.    supports the functions of memory allocation and file compaction.  The MMIO 
  16454.    manager uses I/O procedures to direct the input and output associated with 
  16455.    reading from and writing to different types of storage systems or file 
  16456.    formats. 
  16457.  
  16458.  MMPM/2 Multimedia Presentation Manager/2.  See OS/2 Multimedia. 
  16459.  
  16460.  MMTIME Standard time and media position format supported by the media control 
  16461.    interface.  This time unit is 1/3000 second, or 333 microseconds. 
  16462.  
  16463.  mode A method of operation in which the actions that are available to a user 
  16464.    are determined by the state of the system. 
  16465.  
  16466.  model The conceptual and operational understanding that a person has about 
  16467.    something. 
  16468.  
  16469.  module A language construct that consists of procedures or data declarations 
  16470.    and that can interact with other constructs. 
  16471.  
  16472.  moire An independent, usually shimmering pattern seen when two geometrically 
  16473.    regular patterns (as a sampling frequency and a correct frequency) are 
  16474.    superimposed.  The moire pattern is an alias frequency. See also aliasing. 
  16475.  
  16476.  monitor See video monitor. 
  16477.  
  16478.  monitor window A graphical window, available from a digital video device, that 
  16479.    displays the source rectangle and any subset of this video capture region. 
  16480.    See also destination rectangle. 
  16481.  
  16482.  motion video capture adapter An adapter that, when attached to a computer, 
  16483.    allows an ordinary television picture to be displayed on all or part of the 
  16484.    screen, mixing high-resolution computer graphics with video; also enables a 
  16485.    video camera to become an input device. 
  16486.  
  16487.  Motion Video Object Content Architecture (MVOCA) A data format for multimedia 
  16488.    products. 
  16489.  
  16490.  motion-control photography A system for using computers to precisely control 
  16491.    camera movements so that the different elements of a shot-models and 
  16492.    backgrounds, for example-can later be composited with a natural and 
  16493.    believable unity. 
  16494.  
  16495.  Moving Pictures Experts Group (MPEG) A group that is working to establish a 
  16496.    standard for compressing and storing motion video and animation in digital 
  16497.    form. 
  16498.  
  16499.  MPEG Moving Pictures Experts Group. 
  16500.  
  16501.  MPI Media Programming Interface. 
  16502.  
  16503.  MPI application services Media Programming Interface application services. 
  16504.    Functional services provided by MPI to application programs and higher-level 
  16505.    programming constructs, such as multimedia controls. 
  16506.  
  16507.  MS Script abbreviation for medium shot. 
  16508.  
  16509.  MSF Minutes-seconds-frames. 
  16510.  
  16511.  multimedia Material presented in a combination of text, graphics, video, 
  16512.    image, animation, and sound. 
  16513.  
  16514.  multimedia data object In an application, an element of a data structure (such 
  16515.    as a file, an array, or an operand) that is needed for program execution and 
  16516.    that is named or otherwise specified by the allowable character set of the 
  16517.    language in which the program is coded. 
  16518.  
  16519.  Multimedia File I/O Services System services that provide a generalized 
  16520.    interface to manipulate multimedia data.  The services support buffered and 
  16521.    unbuffered file I/O, standard RIFF files, and installable I/O procedures. 
  16522.  
  16523.  multimedia input/output (MMIO) (1) System services that provide a variety of 
  16524.    functions for media file access and manipulation. (2) A consistent 
  16525.    programming interface where an application, media driver, or stream handler 
  16526.    can refer to multimedia files, read and write data to the files, and query 
  16527.    the contents of the files, while remaining independent of the underlying 
  16528.    file formats or the storage systems that contain the files. 
  16529.  
  16530.  multimedia navigation system A tool that gives the information product 
  16531.    designer the freedom to link various kinds and pieces of data in a variety 
  16532.    of ways so that users can move through it nonsequentially. 
  16533.  
  16534.  multimedia system A system capable of presenting multimedia material in its 
  16535.    entirety. Synonymous with mixed-media system. 
  16536.  
  16537.  multiple selection A selection technique in which a user can select any number 
  16538.    of objects, or not select any. 
  16539.  
  16540.  multitrack A file containing multiple types of information, such as 
  16541.    interleaved audio and video. 
  16542.  
  16543.  Musical Instrument Digital Interface (MIDI) A protocol that allows a 
  16544.    synthesizer to send signals to another synthesizer or to a computer, or a 
  16545.    computer to a musical instrument, or a computer to another computer. 
  16546.  
  16547.  mute To temporarily turn off the audio for the associated medium. 
  16548.  
  16549.  mutex Mutually exclusive (semaphore). 
  16550.  
  16551.  mux An abbreviation for multiplexer. See also mixer. 
  16552.  
  16553.  MVOCA Motion Video Object Content Architecture. 
  16554.  
  16555.  
  16556. ΓòÉΓòÉΓòÉ <hidden> N ΓòÉΓòÉΓòÉ
  16557.  
  16558.  NAPLPS North American Presentation Level Protocol Syntax. 
  16559.  
  16560.  National Television Standard Committee (NTSC) A committee that defines the 
  16561.    video standard in the United States. 
  16562.  
  16563.  NTSC (1) The video standard in the United States, Canada, Mexico, and Japan. 
  16564.    (2) 525 lines of resolution at 30 frames per second.  (3) See also National 
  16565.    Television Standard Committee. 
  16566.  
  16567.  non-streaming device (1) A device that contains both source and destination 
  16568.    information for multimedia. (2) A device that transmits data (usually 
  16569.    analog) directly, without streaming to system memory. 
  16570.  
  16571.  nondrop time code Synonym for full-frame time code. 
  16572.  
  16573.  noninteractive program A running program that cannot receive input from the 
  16574.    keyboard or other input device. 
  16575.  
  16576.  North American Presentation Level Protocol Syntax (NAPLPS) A protocol used for 
  16577.    display and communication of text and graphics in a videotex system; a form 
  16578.    of vector graphics. 
  16579.  
  16580.  notebook A graphical representation that resembles a perfect bound or spiral 
  16581.    bound notebook that contains pages separated into sections by tabbed divider 
  16582.    pages. A user can turn the pages of a notebook to move from one section to 
  16583.    another. 
  16584.  
  16585.  NTSC National Television Standard Committee. 
  16586.  
  16587.  null streaming (1) The behavior of a stream that can be created and started 
  16588.    but which has no associated data flow. (2) The behavior of a stream that can 
  16589.    be created and started but which has no associated data flow.  For example, 
  16590.    a CD-DA is a non-streaming device. (3) A device that does not stream its 
  16591.    data through the OS/2 multimedia streaming system. For example, a CD-DA 
  16592.    device is a non-streaming device. 
  16593.  
  16594.  
  16595. ΓòÉΓòÉΓòÉ <hidden> O ΓòÉΓòÉΓòÉ
  16596.  
  16597.  object (1) Anything that exists in and occupies space in storage and on which 
  16598.    operations can be performed; for example, programs, files, libraries, and 
  16599.    folders. (2) Anything to which access is controlled; for example, a file, a 
  16600.    program, an area of main storage. (3) See also data object and media object. 
  16601.  
  16602.  object Anything a user can manipulate as a single unit; icons and files are 
  16603.    examples of objects. 
  16604.  
  16605.  object class A categorization or grouping of objects that share similar 
  16606.    behaviors and characteristics. 
  16607.  
  16608.  object connection A link between two objects.  Connections can be used for 
  16609.    navigation, as with hypermedia, or for data transfer between objects. 
  16610.  
  16611.  Object Content Architecture (OCA) A data format for multimedia products. 
  16612.  
  16613.  object decomposition The process of breaking an object into its component 
  16614.    parts. 
  16615.  
  16616.  object orientation An orientation in a user interface in which user attention 
  16617.    is directed toward the objects the user works with, rather than 
  16618.    applications, to perform a task. 
  16619.  
  16620.  object template An object that can be used to create another object of the 
  16621.    same object class.  The template is a basic framework of the object class, 
  16622.    and the newly created object is an instance of the object class. 
  16623.  
  16624.  object-action paradigm A method where users select the object that they want 
  16625.    to work with, then choose the action they wish to perform on that object. 
  16626.    See object orientation. 
  16627.  
  16628.  object-oriented user interface A type of user interface that implements object 
  16629.    orientation and the object-action paradigm. 
  16630.  
  16631.  OCA Object Content Architecture. 
  16632.  
  16633.  OEM Original equipment manufacturer. 
  16634.  
  16635.  OFF Operational file format. 
  16636.  
  16637.  offline edit A preliminary or test edit usually done on a low-cost editing 
  16638.    system using videocassette work tapes.  (An offline edit is done so that 
  16639.    decisions can be made and approvals given prior to the final edit.) 
  16640.  
  16641.  online edit The final edit, using the master tapes to produce a finished 
  16642.    program. 
  16643.  
  16644.  operational file format (OFF) A file format standard. 
  16645.  
  16646.  optical disc A disc with a plastic coating on which information (as sound or 
  16647.    visual images) is recorded digitally as tiny pits and read using a laser. 
  16648.    The three categories of optical discs are CD-ROM, WORM, and erasable. 
  16649.  
  16650.  optical drive Drives that run optical discs. 
  16651.  
  16652.  optical reflective disc A designation of the means by which the laser beam 
  16653.    reads data on an optical videodisc.  In the case of a reflective disc, the 
  16654.    laser beam is reflected off a shiny surface on the disc. 
  16655.  
  16656.  opticals Visual effects produced optically by means of a device (an optical 
  16657.    printer) that contains one camera head and several projectors.  The 
  16658.    projectors are precisely aligned so as to produce multiple exposures in 
  16659.    exact registration on the film as in the camera head. 
  16660.  
  16661.  original footage The footage from which the program is constructed. 
  16662.  
  16663.  OS/2 multimedia A subsystem service of OS/2 that provides a software platform 
  16664.    for multimedia applications.  It defines standard interfaces between 
  16665.    multimedia devices and OS/2 multimedia applications. 
  16666.  
  16667.  overlay The ability to superimpose text and graphics over video. 
  16668.  
  16669.  overlay device (1) Provides support for video overlaying along with video 
  16670.    attribute elements. The video overlaying handles tasks such as displaying, 
  16671.    and sizing video. (2) Also referred to as video overlay device. 
  16672.  
  16673.  
  16674. ΓòÉΓòÉΓòÉ <hidden> P ΓòÉΓòÉΓòÉ
  16675.  
  16676.  PAL See Phase Alteration Line. 
  16677.  
  16678.  palette See color palette, standard palette, and custom palette. 
  16679.  
  16680.  pan A camera movement where the camera moves sideways on its stationary 
  16681.    tripod; left-to-right balance in an audio system. 
  16682.  
  16683.  panel A particular arrangement of information grouped together for 
  16684.    presentation to users in a window. 
  16685.  
  16686.  panning Progressively translating an entire display image to give the visual 
  16687.    impression of lateral movement of the image. 
  16688.  
  16689.    In computer graphics, the viewing of an image that is too large to fit on a 
  16690.    single screen by moving from one part of the image to another. 
  16691.  
  16692.  paradigm An example, pattern, or model. 
  16693.  
  16694.  patch mapping The reassignment of an instrument patch number associated with a 
  16695.    specific synthesizer to the corresponding standard patch number in the 
  16696.    General MIDI specification. 
  16697.  
  16698.  pause To temporarily halt the medium. The halted visual should remain 
  16699.    displayed but no audio should be played. 
  16700.  
  16701.  pause stop In data streaming, a stop that pauses the data stream but does not 
  16702.    disturb any data. 
  16703.  
  16704.  PDC Physical device component. 
  16705.  
  16706.  PDD Physical device driver. 
  16707.  
  16708.  pedestal up/down A camera movement where the camera glides up or down on a 
  16709.    boom. 
  16710.  
  16711.  pel An acronym derived from the words "picture element" that is used when the 
  16712.    associated numerical value is binary, that is, 0 or 1. See also pixel. 
  16713.  
  16714.  Phase Alternation Line (PAL) (1) The video standard in most of Europe, 
  16715.    Australia, and New Zealand. (2) 625 lines of resolution at 25 frames per 
  16716.    second. 
  16717.  
  16718.  physical device driver (PDD) A program that handles hardware interrupts and 
  16719.    supports a set of input and output functions. 
  16720.  
  16721.  picon A  graphic or natural image reduced to icon size.  Similar to thumbnail. 
  16722.  
  16723.  picture element In computer graphics, the smallest element of a display 
  16724.    surface that can be independently assigned color and intensity. 
  16725.  
  16726.  picture-in-picture A video window within a larger video window. 
  16727.  
  16728.  pixel An acronym derived from the words "picture element" that is used when 
  16729.    the associated numerical value defines a gray scale of, for example, 0-255. 
  16730.  
  16731.  plaintext Nonencrypted data. 
  16732.  
  16733.  platform In computer technology, the principles on which an operating system 
  16734.    is based. 
  16735.  
  16736.  playback window A graphical window in which software motion video is 
  16737.    displayed. This window can be supplied by an application, or a default 
  16738.    window can be created by a digital video device. 
  16739.  
  16740.  play backward To play the medium in the backward direction. 
  16741.  
  16742.  play forward To play the medium in the forward direction. 
  16743.  
  16744.  pointer A symbol, usually in the shape of an arrow, that a user can move with 
  16745.    a pointing device.  Users place the pointer over objects they want to work 
  16746.    with. 
  16747.  
  16748.  pointing device A device, such as a mouse, trackball, or joystick, used to 
  16749.    move a pointer on the screen. 
  16750.  
  16751.  polish The version of the script submitted for final approval. 
  16752.  
  16753.  polyphony A synthesizer mode where more than 1 note can be played at a time. 
  16754.    Most synthesizers are 16-note to 32-note polyphonic. 
  16755.  
  16756.  postproduction The online and offline editing process. 
  16757.  
  16758.  PPQN (1) Parts-per-quarter-note. (2) A time format used in musical instrument 
  16759.    digital interface (MIDI). 
  16760.  
  16761.  preproduction The preparation stage for video production, when all logistics 
  16762.    are planned and prepared. 
  16763.  
  16764.  preroll The process of preparing a device to begin a playback or recording 
  16765.    function with minimal latency.  During a multimedia sequence, it might 
  16766.    require that two devices be cued (prerolled) to start playing and recording 
  16767.    at the same time. 
  16768.  
  16769.  primary window A window in which the main interaction between a user and an 
  16770.    object takes place. 
  16771.  
  16772.  Proc See IOProc and CODEC. 
  16773.  
  16774.  production In videotaping, the actual shooting. 
  16775.  
  16776.  production control room The room or location where the monitoring and 
  16777.    switching equipment is placed for the direction and control of a television 
  16778.    production. 
  16779.  
  16780.  progress indicator A control, usually a read-only slider, that informs the 
  16781.    user about the status of a user request. 
  16782.  
  16783.  props In videotaping, support material for the shoot, for example, equipment 
  16784.    being promoted, auxiliary equipment, software, or supplies; anything 
  16785.    provided to make the set look realistic and attractive. 
  16786.  
  16787.  protection master A copy of the edit master that is stored as a backup. 
  16788.  
  16789.  PS/2 CD-ROM-II Drive An IBM CD-ROM drive that can play compact disc digital 
  16790.    audio (CD-DA) and CD-ROM/XA interleaved audio, video, and text, and adheres 
  16791.    to the Small Computer System Interface (SCSI).  The drive can be installed 
  16792.    on Micro Channel and non-Micro Channel IBM PS/2 systems. 
  16793.  
  16794.  pulse code modulation (PCM) In data communication, variation of a digital 
  16795.    signal to represent information. 
  16796.  
  16797.  push button A graphical control, labeled with text, graphics, or both, that 
  16798.    represents an action that will be initiated when a user selects it. For 
  16799.    example, when a user clicks on a Play button, a media object begins playing. 
  16800.  
  16801.  
  16802. ΓòÉΓòÉΓòÉ <hidden> R ΓòÉΓòÉΓòÉ
  16803.  
  16804.  raster graphics Computer graphics in which a display image is composed of an 
  16805.    array of pels arranged in rows and columns. 
  16806.  
  16807.  raw footage Synonym for original footage. 
  16808.  
  16809.  ray-tracing A technique used by 3-D rendering software programs that 
  16810.    automatically figures an object's position in three dimensions and 
  16811.    calculates shadows, reflections, and hidden surfaces based on user-entered 
  16812.    light locations and material characteristics.  (In other words, if the user 
  16813.    orders an object to be a mirror, the computer produces the mirror with all 
  16814.    its correct reflective properties.) 
  16815.  
  16816.  real time (1) Pertaining to the processing of data by a computer in connection 
  16817.    with another process outside the computer according to time requirements 
  16818.    imposed by the outside process.  This term is also used to describe systems 
  16819.    operating in conversational mode and processes that can be influenced by 
  16820.    human intervention while they are in progress. (2) A process control system 
  16821.    or a computer-assisted instruction program, in which response to input is 
  16822.    fast enough to affect subsequent output. 
  16823.  
  16824.  record To transfer data from one source (for example, microphone, CD, 
  16825.    videodisc) or set of sources to another medium. 
  16826.  
  16827.  reference frame Refers to the complete frame that is created at periodic 
  16828.    intervals in the output stream.  An editing operation always begins at a 
  16829.    reference frame. Also referred to as a key frame or an I-frame. See delta 
  16830.    frame. 
  16831.  
  16832.  reference frame interval Frequency with which reference frames are to be 
  16833.    inserted in the output data stream. 
  16834.  
  16835.  Redbook audio The storage format of standard audio CDs. See also compact disc, 
  16836.    digital audio (CD-DA). 
  16837.  
  16838.  reflective disc See optical reflective disc. 
  16839.  
  16840.  render In videotaping, to create a realistic image from objects and light data 
  16841.    in a scene. 
  16842.  
  16843.  repeat A mode which causes the medium to go to the beginning and start 
  16844.    replaying when it reaches the medium's end. 
  16845.  
  16846.  resolution (1) In computer graphics, a measure of the sharpness of an image, 
  16847.    expressed as the number of lines and columns on the display screen or the 
  16848.    number of pels per unit of area. (2) The number of lines in an image that an 
  16849.    imaging system (for example, a telescope, the human eye, a camera, and so 
  16850.    on) can resolve. A higher resolution makes text and graphics appear clearer. 
  16851.  
  16852.  resource As used in the multimedia operating system, any specific unit of data 
  16853.    created or used by a multimedia program. See also static resource and 
  16854.    dynamic resource. 
  16855.  
  16856.  resource handler A system service that loads, saves, and manipulates 
  16857.    multimedia program units of data. 
  16858.  
  16859.  resource interchange file format (RIFF) A tagged file format framework 
  16860.    intended to be the basis for defining new file formats. 
  16861.  
  16862.  resync Recovery processing performed by sync-point services when the failure 
  16863.    of a session, transaction program, or LU occurs during sync-point 
  16864.    processing.  The purpose of resync is to return protected resources to 
  16865.    consistent states. 
  16866.  
  16867.  resync tolerance value A minimum time difference expressed in MMTIME format. 
  16868.  
  16869.  rewind To advance the medium in the backward direction quickly, and optionally 
  16870.    allow the user to scan the medium. 
  16871.  
  16872.  RGB Color coding where the brightness of the additive primary colors of light, 
  16873.    red, green, and blue, are specified as three distinct values of white light. 
  16874.  
  16875.  RIFF Resource interchange file format. 
  16876.  
  16877.  RIFF chunk A chunk with a chunk ID of RIFF.  In a RIFF file, this must be the 
  16878.    first chunk. 
  16879.  
  16880.  RIFF compound file A file containing multiple file elements or one file 
  16881.    element that makes up the entire RIFF file.  The MMIO manager provides 
  16882.    services to find, query, and access any file elements in a RIFF compound 
  16883.    file. Synonymous with bundle file. 
  16884.  
  16885.  rotoscope A camera setup that projects live-action film, one frame at a time, 
  16886.    onto a surface so that an animator can trace complicated movements.  When 
  16887.    filmed, the completed animation matches the motion of the original action. 
  16888.  
  16889.  rough cut (1) The result of the offline edit. (2) A video program that 
  16890.    includes the appropriate footage in the correct order but does not include 
  16891.    special effects. 
  16892.  
  16893.  
  16894. ΓòÉΓòÉΓòÉ <hidden> S ΓòÉΓòÉΓòÉ
  16895.  
  16896.  S-video (1) Separated video or super video. (2) A signal system using a Y/C 
  16897.    format. See also Y/C, composite video, and component video. 
  16898.  
  16899.  S-Video input connector A special connector that separates the chrominance 
  16900.    from the luminance signal. 
  16901.  
  16902.  SAA Systems Application Architecture. 
  16903.  
  16904.  safety An extra shot of a scene that is taken as a backup after an acceptable 
  16905.    shot (the buy) has been acquired. 
  16906.  
  16907.  saturation Refers to the depth of color intensity.  A saturation level of 0 is 
  16908.    no color (greyscale).  A saturation level of 100 is maximum color intensity. 
  16909.    Also referred to as color. 
  16910.  
  16911.  sampler A device that converts real sound into digital information for storage 
  16912.    on a computer. 
  16913.  
  16914.  scan backward To display the video and optionally play the audio while the 
  16915.    medium is advancing in the backward direction rapidly. 
  16916.  
  16917.  scan converter A device that converts digital signal to NTSC or PAL format. 
  16918.  
  16919.  scan forward To display the video and optionally play the audio while the 
  16920.    medium is advancing in the forward direction rapidly. 
  16921.  
  16922.  scan line (1) In a laser printer, one horizontal sweep of the laser beam 
  16923.    across the photoconductor. (2) A single row of picture elements. 
  16924.  
  16925.  scanner A device that examines a spatial pattern, one part after another, and 
  16926.    generates analog or digital signals corresponding to the pattern. 
  16927.  
  16928.  SCB Subsystem control block. 
  16929.  
  16930.  scene A portion of video captured by the camera in one continuous shot.  The 
  16931.    scene is shot repeatedly (each attempt is called a take) until an acceptable 
  16932.    version, called the buy, is taken. 
  16933.  
  16934.  scripting Writing needed dialog. 
  16935.  
  16936.  scroll bar A window component that shows a user that more information is 
  16937.    available in a particular direction and can be scrolled into view. Scroll 
  16938.    bars should not be used to represent an analog setting, like volume. 
  16939.    Sliders should be used. 
  16940.  
  16941.  SCSI Small computer system interface. 
  16942.  
  16943.  SECAM Sequential Couleurs a Memoire.  The French standard for color 
  16944.    television. 
  16945.  
  16946.  second generation A direct copy from the master or original tape. 
  16947.  
  16948.  secondary window A window that contains information that is dependent on 
  16949.    information in a primary window and is used to supplement the interaction in 
  16950.    the primary window. 
  16951.  
  16952.  secondary window manager A sizable dialog manager that enables application 
  16953.    writers to use CUA-defined secondary windows instead of dialog boxes. 
  16954.  
  16955.  selection The act of explicitly identifying one or more objects to which a 
  16956.    subsequent choice will apply. 
  16957.  
  16958.  selection technique The method by which users indicate objects on the 
  16959.    interface that they want to work with. 
  16960.  
  16961.  semaphore (1) A variable that is used to enforce mutual exclusion. (T) (2) An 
  16962.    indicator used to control access to a file; for example, in a multiuser 
  16963.    application, a flag that prevents simultaneous access to a file. 
  16964.  
  16965.  sequencer A digital tape recorder. 
  16966.  
  16967.  set In videotaping, the basic background or area for production. 
  16968.  
  16969.  settings Characteristics of objects that can be viewed and sometimes altered 
  16970.    by the user.  Examples of a file's settings include name, size, and creation 
  16971.    date.  Examples of video clip's settings include brightness, contrast, 
  16972.    color, and tint. 
  16973.  
  16974.  settings view A view of an object that provides a way to change 
  16975.    characteristics and options associated with the object. 
  16976.  
  16977.  SFX Script abbreviation for special effects. 
  16978.  
  16979.  shade To darken with, or as if with, a shadow; to add shading to. 
  16980.  
  16981.  sharpness Refers to the clarity and detail of a video image.  A sharpness 
  16982.    value of 0 causes the video to be generally fuzzy with little detail.  A 
  16983.    sharpness value of 100 causes the video to be generally very detailed, and 
  16984.    may appear grainy. 
  16985.  
  16986.  SHC Stream handler command. 
  16987.  
  16988.  shoot To videotape the needed pictures for the production. 
  16989.  
  16990.  shooting script Synonym for final script. 
  16991.  
  16992.  shot list A list containing each shot needed to complete a production, usually 
  16993.    broken down into a schedule. 
  16994.  
  16995.  simple device A multimedia device model for hardware that does not require any 
  16996.    additional data objects, referred to as device elements, to perform 
  16997.    multimedia operations. 
  16998.  
  16999.  sine wave A waveform that represents periodic oscillations of a pure 
  17000.    frequency. 
  17001.  
  17002.  single plane video system Refers to when video and graphics are combined into 
  17003.    one buffer.  This may appear the same as a dual plane video system, but 
  17004.    since all the data is in one buffer, capture and restore operations will 
  17005.    obtain both graphics and video components in one operation. See also dual 
  17006.    plane video system. 
  17007.  
  17008.  single selection A selection technique in which a user selects one, and only 
  17009.    one, item at a time. 
  17010.  
  17011.  slave stream A stream that is dependent on the master stream to maintain 
  17012.    synchronization. 
  17013.  
  17014.  slave stream handler In SPI, regularly updates the sync pulse EVCB with the 
  17015.    stream time.  The Sync/Stream Manager checks the slave stream handler time 
  17016.    against the master stream time to determine whether to send a sync pulse to 
  17017.    the slave stream handler. 
  17018.  
  17019.  slide-show presentation Synonym for storyboard. 
  17020.  
  17021.  slider A visual component of a user interface that represents a quantity and 
  17022.    its relationship to the range of possible values for that quantity.  A user 
  17023.    can also change the value of the quantity.  Sliders are used for volume and 
  17024.    time control. 
  17025.  
  17026.  slider arm The visual indicator in the slider that a user can move to change 
  17027.    the numerical value. 
  17028.  
  17029.  slider button A button on a slider that a user clicks on to move the slider 
  17030.    arm one increment in a particular direction, as indicated by the directional 
  17031.    arrow on the button. 
  17032.  
  17033.  small computer system interface (SCSI) An input and output bus that provides a 
  17034.    standard interface between the OS/2 multimedia system and peripheral 
  17035.    devices. 
  17036.  
  17037.  SMH Stream manager helper. 
  17038.  
  17039.  SMPTE Society of Motion Picture and Television Engineers. 
  17040.  
  17041.  SMPTE time code A frame-numbering system developed by SMPTE that assigns a 
  17042.    number to each frame of video.  The 8-digit code is in the form HH:MM:SS:FF 
  17043.    (hours, minutes, seconds, frame number).  The numbers track elapsed hours, 
  17044.    minutes, seconds, and frames from any chosen point. 
  17045.  
  17046.  socketable user interface An interface defined by multimedia controls that 
  17047.    enable the interface to be plugged into and unplugged from applications 
  17048.    without affecting the underlying object control subsystem. 
  17049.  
  17050.  sound track Synonym for audio track. 
  17051.  
  17052.  source rectangle An abstract region representing the area available for use by 
  17053.    a video capture adapter.  This area is displayed in the monitor window of a 
  17054.    digital video device.  A subset of the largest possible region to be 
  17055.    captured can be defined; such a subset is indicated by an animated, dashed 
  17056.    rectangle in the monitor window. 
  17057.  
  17058.  source window See source rectangle. 
  17059.  
  17060.  SPCB Stream protocol control block. 
  17061.  
  17062.  special effects In videotaping, any activity that is not live footage, such as 
  17063.    digital effects, computer manipulation of the picture, and nonbackground 
  17064.    music. 
  17065.  
  17066.  SPI Stream programming interface. 
  17067.  
  17068.  split streaming A mechanism provided by the Sync/Stream Manager to create one 
  17069.    data stream source with multiple targets. 
  17070.  
  17071.  SPP A time format based on the number of beats-per-minute in the MIDI file. 
  17072.  
  17073.  sprite An animated object that moves around the screen without affecting the 
  17074.    background. 
  17075.  
  17076.  sprite graphics A small graphics picture, or series of pictures, that can be 
  17077.    moved independently around the screen, producing animated effects. 
  17078.  
  17079.  squeeze-zoom A DVE where one picture is reduced in size and displayed with a 
  17080.    full-screen picture. 
  17081.  
  17082.  SSM Sync/Stream Manager. 
  17083.  
  17084.  standard multimedia device controls These controls provide the application 
  17085.    developer with a CUA compliant interface for controlling audio attributes, 
  17086.    video attributes, and videodisc players. These controls simplify the 
  17087.    programming task required to create the interface and handle the 
  17088.    presentation of the interface and all interaction with the user.  They also 
  17089.    send the media control interface commands to the Media Device Manager (MDM) 
  17090.    for processing. 
  17091.  
  17092.  standard objects A set of common, cross-product objects provided and supported 
  17093.    by the system.  Examples include folders, printers, shredders, and media 
  17094.    players. 
  17095.  
  17096.  standard palette A set of colors that is common between applications or 
  17097.    images. See also custom palette and color palette. 
  17098.  
  17099.  static resource A resource that resides on any read-and-write or read-only 
  17100.    medium. Contrast with dynamic resource. 
  17101.  
  17102.  status area Provides information as to the state of the medium and device, or 
  17103.    both.  It should indicate what button is currently pressed and what modes 
  17104.    (for example, mute) are active. 
  17105.  
  17106.  step backward To move the medium backward one frame or segment at a time. 
  17107.  
  17108.  still A static photograph. 
  17109.  
  17110.  still image See video image. 
  17111.  
  17112.  still video capture adapter An adapter that, when attached to a computer, 
  17113.    enables a video camera to become an input device.  See also motion video 
  17114.    capture adapter. 
  17115.  
  17116.  stop Halt (stops) the medium. 
  17117.  
  17118.  storage system The method or format a functional unit uses to retain or 
  17119.    retrieve data placed within the unit. 
  17120.  
  17121.  storage system IOProc A procedure that unwraps data objects such as RIFF 
  17122.    files, RIFF compound files, and AVC files.  IOProcs are ignorant of the 
  17123.    content of the data they contain.  A storage system IOProc goes directly to 
  17124.    the OS/2 file system (or to memory in the case of a MEM file) and does not 
  17125.    pass information to any other file format or storage system IOProc.  The 
  17126.    internal I/O procedures provided for DOS files, memory files, and RIFF 
  17127.    compound files are examples of storage system IOProcs, because they operate 
  17128.    on the storage mechanism rather than on the data itself. See also file 
  17129.    format IOProc. 
  17130.  
  17131.  storyboard A visual representation of the script, showing a picture of each 
  17132.    scene and describing its corresponding audio. Synonymous with slide-show 
  17133.    presentation. 
  17134.  
  17135.  storyboarding Producing a sequence of still images, such as titles, graphics, 
  17136.    and images, to work out the visual details of a script. 
  17137.  
  17138.  stream To send data from source to destination via buffered system memory. 
  17139.  
  17140.  stream connector A port or connector that a device uses to send or receive. 
  17141.    See also connector. 
  17142.  
  17143.  stream handler A routine that controls a program reaction to a specific 
  17144.    external event through a continuous string of individual data values. 
  17145.  
  17146.  stream handler command (SHC) Synchronous calls provided by both ring 3 DLL 
  17147.    stream handlers as a DLL call and by ring 0 PDD stream handlers as a IDC 
  17148.    call.  The stream handler commands are provided through a single entry 
  17149.    point, SHCEntryPoint, which accepts a parameter structure on input.  This 
  17150.    enables the DLL and PDD interfaces to the stream manager to be the same. 
  17151.  
  17152.  stream manager A system service that controls the registration and activities 
  17153.    of all stream handlers. 
  17154.  
  17155.  stream manager helper (SMH) Routines provided by the stream manager for use by 
  17156.    all stream handlers.  The stream handlers use these helper routines to 
  17157.    register with the manager, report events, and synchronize cues to the 
  17158.    manager to request or return buffers to the manager.  They are synchronous 
  17159.    functions and are available to both ring 3 DLL stream handlers as a DLL call 
  17160.    and to ring 0 PDD stream handlers. 
  17161.  
  17162.  stream programming interface A system service that supports continual flow of 
  17163.    data between physical devices. 
  17164.  
  17165.  stream programming interface (SPI) A system service that supports continual 
  17166.    flow of data between physical devices. 
  17167.  
  17168.  stream protocol control block (SPCB) The system service that controls the 
  17169.    behavior of a specified stream type.  This enables you to subclass a stream 
  17170.    data type, change data buffering characteristics, and alter synchronization 
  17171.    behavior and other stream events. 
  17172.  
  17173.  strike In videotaping, to clear away, remove, or dismantle anything on the 
  17174.    set. 
  17175.  
  17176.  string commands See command string interface. 
  17177.  
  17178.  subchunk The first chunk in a RIFF file is a RIFF chunk; all other chunks in 
  17179.    the file are subchunks of the RIFF chunk. 
  17180.  
  17181.  subclassing The act of intercepting messages and passing them on to their 
  17182.    original intended recipient. 
  17183.  
  17184.  super Titles or graphics overlaid on the picture electronically. See also 
  17185.    superimpose. 
  17186.  
  17187.  superimpose To overlay titles or graphics on the picture electronically. 
  17188.  
  17189.  sweetening (1) The equalization of audio to eliminate noise and obtain the 
  17190.    cleanest and most level sound possible. (2) The addition of laughter to an 
  17191.    audio track. 
  17192.  
  17193.  switching Electronically designating, from between two or more video sources, 
  17194.    which source's pictures are recorded on tape.  Switching can occur during a 
  17195.    shoot or during an edit. 
  17196.  
  17197.  symmetric video compression A technology in which the computer can be used to 
  17198.    create, as well as play back, full-motion, full-color video. 
  17199.  
  17200.  sync Synchronization or synchronized. 
  17201.  
  17202.  sync group A master stream and all its slaves that can be started, stopped, 
  17203.    and searched as a group by using the slaves flag on each of the following 
  17204.    SPI functions: 
  17205.  
  17206.    o  SpiStartStream 
  17207.    o  SpiStopStream 
  17208.    o  SpiSeekStream 
  17209.  
  17210.  sync pulse A system service that enables each slave stream handler to adjust 
  17211.    the activity of that stream so that synchronization can be maintained. Sync 
  17212.    pulses are introduced by transmission equipment into the receiving equipment 
  17213.    to keep the two equipments operating in step. 
  17214.  
  17215.  sync signal Video signal used to synchronize video equipment. 
  17216.  
  17217.  synchronization The action of forcing certain points in the execution 
  17218.    sequences of two or more asynchronous procedures to coincide in time. 
  17219.  
  17220.  synchronous Pertaining to two or more processes that depend upon the 
  17221.    occurrence of specific events such as common timing signals. 
  17222.  
  17223.  synthesizer A musical instrument that allows its user to produce and control 
  17224.    electronically generated sounds. 
  17225.  
  17226.  system message A predefined message sent by the MMIO manager for the message 
  17227.    associated function.  For example, when an application calls mmioOpen, the 
  17228.    MMIO manager sends an MMIOM_OPEN message to an I/O procedure to open the 
  17229.    specified file. 
  17230.  
  17231.  Systems Application Architecture (SAA) A set of IBM software interfaces, 
  17232.    conventions, and protocols that provide a framework for designing and 
  17233.    developing applications that are consistent across systems. 
  17234.  
  17235.  
  17236. ΓòÉΓòÉΓòÉ <hidden> T ΓòÉΓòÉΓòÉ
  17237.  
  17238.  tagged image file format (TIFF) An easily transportable image file type used 
  17239.    by a wide range of multimedia software. 
  17240.  
  17241.  tagged image file format (TIFF) An easily transportable image file type used 
  17242.    by a wide range of multimedia software. 
  17243.  
  17244.  take During the shoot in videotaping, each separate attempt at shooting a 
  17245.    scene. This is expressed as: Scene 1, Take 1; Scene 1, Take 2, and so on. 
  17246.  
  17247.  talent On-screen person (professional or amateur) who appears before the 
  17248.    camera or does voice-over narration. 
  17249.  
  17250.  TAM Telephone answering machine. 
  17251.  
  17252.  tearing Refers to when video is displaced horizontally.  This may be caused by 
  17253.    sync problems. 
  17254.  
  17255.  TelePrompTer A special monitor mounted in front of a camera so that talent can 
  17256.    read text and will appear to be looking at the camera. 
  17257.  
  17258.  thaw See unfreeze. 
  17259.  
  17260.  thumbnail A small representation of an object.  For example, a full screen 
  17261.    image might be presented in a much smaller area in an authoring system time 
  17262.    line.  A picon is an example of a thumbnail. 
  17263.  
  17264.  TIFF Tagged Image File Format time code. 
  17265.  
  17266.  tilt A camera movement where the camera pivots up or down on its stationary 
  17267.    tripod. 
  17268.  
  17269.  timbre The distinctive tone of a musical instrument or human voice that 
  17270.    distinguishes it from other sounds. 
  17271.  
  17272.  time code See SMPTE time code. 
  17273.  
  17274.  time-line processor A type of authoring facility that displays an event as 
  17275.    elements that represent time from the start of the event. 
  17276.  
  17277.  tint See hue. 
  17278.  
  17279.  TMSF A time format expressed in tracks, minutes, seconds, and frames, which is 
  17280.    used primarily by compact disc audio devices. 
  17281.  
  17282.  tone (bass, treble, etc... ) A control that adjusts the various attributes of 
  17283.    the audio. 
  17284.  
  17285.  tool palette A palette containing choices that represent tools, often used in 
  17286.    media editors (such as graphics and audio editors).  For example, a user 
  17287.    might select a "pencil"  choice from the tool palette to draw a line in the 
  17288.    window. 
  17289.  
  17290.  touch area An area of a display screen that is activated to accept user input. 
  17291.    Synonymous with anchor, hot spot, and trigger. 
  17292.  
  17293.  track A path associated with a single Read/Write head as the data medium moves 
  17294.    past it. 
  17295.  
  17296.  track advance To advance the medium to the beginning of the next track. 
  17297.  
  17298.  track reverse To rewind the medium to the beginning of the current track.  If 
  17299.    it is at the beginning of the track it will then jump to the beginning of 
  17300.    the previous track. 
  17301.  
  17302.  transform device A device that modifies a signal or stream received from a 
  17303.    transport device.  Examples are amplifier-mixer and overlay devices. 
  17304.  
  17305.  translator A computer program that can translate.  In telephone equipment the 
  17306.    device that converts dialed digits into call-routine information. 
  17307.  
  17308.  transparency Refers to when a selected color on a graphics screen is made 
  17309.    transparent to allow the video "behind it" to become visible.  Often found 
  17310.    in dual plane video subsystems. 
  17311.  
  17312.  transparent color Video information is considered as being present on the 
  17313.    video plane which is maintained behind the graphics plane.  When an area on 
  17314.    the graphics plane is painted with a transparent color, the video 
  17315.    information in the video plane is made visible. See also dual plane video 
  17316.    system. 
  17317.  
  17318.  transport device A device that plays, records, and positions a media element, 
  17319.    and either presents the result directly or sends the material to a transform 
  17320.    device.  Examples are videodisc players, CD-ROMs, and digital audio (wave) 
  17321.    player. 
  17322.  
  17323.  treatment A detailed design document of the video. 
  17324.  
  17325.  tremolo A vibrating effect of a musical instrument produced by small and rapid 
  17326.    amplitude variations to produce special musical effects. 
  17327.  
  17328.  trigger An area of a display screen that is activated to accept user input. 
  17329.    Synonymous with anchor, hot spot, and touch area. 
  17330.  
  17331.  truck In videotaping, a sideways camera movement of the tripod on which the 
  17332.    camera is mounted. 
  17333.  
  17334.  tweening The process of having the computer draw intermediate animation frames 
  17335.    between key frames.  In other words, the animation tool requires only that 
  17336.    pictures of key sections of a motion be provided; the software calculates 
  17337.    all the in-between movements.  Synonymous with in-betweening. 
  17338.  
  17339.  
  17340. ΓòÉΓòÉΓòÉ <hidden> U ΓòÉΓòÉΓòÉ
  17341.  
  17342.  U-matic A video cassette system using 0.75-inch tape format. 
  17343.  
  17344.  Ultimatte The trade name of a very high-quality, special-effects system used 
  17345.    for background replacement and image composites. 
  17346.  
  17347.  underrun Loss of data caused by the inability of a transmitting device or 
  17348.    channel to provide data to the communication control logic (SDLC or BSC/SS) 
  17349.    at a rate fast enough for the attached data link or loop. 
  17350.  
  17351.  unfreeze (1) To return to action after a freeze. (2) Enables updates to the 
  17352.    video buffer. (3) Also referred to as a thaw. 
  17353.  
  17354.  unidirectional microphone A microphone that responds to sound from only one 
  17355.    direction and is not subject to change of direction.  (A unidirectional 
  17356.    microphone is the type of microphone employed in computers capable of voice 
  17357.    recognition.) 
  17358.  
  17359.  unload To eject the medium from the device. 
  17360.  
  17361.  user interface The area at which a user and an object come together to 
  17362.    interact. As applied to computers, the ensemble of hardware and software 
  17363.    that allows a user to interact with a computer. 
  17364.  
  17365.  user-defined message A private message sent directly to an I/O procedure by 
  17366.    using the mmioSendMessage function.  All messages begin with an MMIOM 
  17367.    prefix, with user-defined messages starting at MMIOM_USER or above. 
  17368.  
  17369.  user's conceptual model A user's mental model about how things should work. 
  17370.    Much of the concepts and expectations that make up the model are derived 
  17371.    from the user's experience with real-world objects of similar type, and 
  17372.    experience with other computer systems. 
  17373.  
  17374.  value set A control used to present a series of mutually exclusive graphical 
  17375.    choices.  A tool palette in a paint program can be implemented using a value 
  17376.    set. 
  17377.  
  17378.  
  17379. ΓòÉΓòÉΓòÉ <hidden> V ΓòÉΓòÉΓòÉ
  17380.  
  17381.  VCR Videocassette recorder. 
  17382.  
  17383.  VDD Virtual device driver. 
  17384.  
  17385.  VDH Virtual device helper. 
  17386.  
  17387.  VDP Video display processor. 
  17388.  
  17389.  vector graphics See coordinate graphics. 
  17390.  
  17391.  vendor-specific driver (VSD) An extension to an MCD to execute 
  17392.    hardware-specific commands. 
  17393.  
  17394.  VHS Very high speed.  A consumer and industrial tape format (VHS format). 
  17395.  
  17396.  vicon A vicon, or video icon, can be an animation or motion video segment in 
  17397.    icon size.  Usually this would be a short, repeating segment, such as an 
  17398.    animation of a cassette tape with turning wheels. 
  17399.  
  17400.  video Pertaining to the portion of recorded information that can be seen. 
  17401.  
  17402.  video aspect ratio See aspect ratio. 
  17403.  
  17404.  video attribute control Provides access to and operation of the standard video 
  17405.    attributes: brightness, contrast, freeze, hue, saturation, and sharpness. 
  17406.    All device communication and user interface support is handled by the 
  17407.    control. 
  17408.  
  17409.  video attributes Refers to the standard video attributes: brightness, 
  17410.    contrast, freeze, hue, saturation, and sharpness. 
  17411.  
  17412.  video clip A section of filmed or videotaped material. 
  17413.  
  17414.  video clipping See clipping. 
  17415.  
  17416.  video digitizer Any system for converting analog video material to digital 
  17417.    representation.  (For example, see DVI.) 
  17418.  
  17419.  video display buffer The buffer containing the visual information to be 
  17420.    displayed.  This buffer is read by the video display controller. 
  17421.  
  17422.  video display controller The graphics or video adapter that connects to a 
  17423.    display and presents visual information. 
  17424.  
  17425.  video encoder A device (adapter) that transforms the high-resolution digital 
  17426.    image from the computer into a standard television signal, thereby allowing 
  17427.    the computer to create graphics for use in video production. 
  17428.  
  17429.  video graphics adapter A graphics controller for color displays.  The pel 
  17430.    resolution of the video graphics adapter is 4:4. 
  17431.  
  17432.  video image A still video image that has been captured. Also referred to as 
  17433.    image or still image. 
  17434.  
  17435.  video monitor A display device capable of accepting a video signal that is not 
  17436.    modulated for broadcast either on cable or over the air; in videotaping, a 
  17437.    television screen located away from the set where the footage can be viewed 
  17438.    as it is being recorded. 
  17439.  
  17440.  video overlay See overlay. 
  17441.  
  17442.  video overlay device See overlay device. 
  17443.  
  17444.  video plane In a dual plane video system, the video plane contains the video. 
  17445.    This video plane will be combined with the graphics plane to create an 
  17446.    entire display image. 
  17447.  
  17448.  video programming interface (VPI) A subsystem that performs output from video 
  17449.    source to video window. 
  17450.  
  17451.  video quality The compression quality level setting to be set for the CODEC. 
  17452.    This value is in the range of 0 (min) - 100 (max). 
  17453.  
  17454.  video record rate Frame rate for recording as an integral number of frames per 
  17455.    second. This sets the target capture rate, but there are no assurances this 
  17456.    rate will be attained.  Drop frame records will be inserted into the output 
  17457.    data stream to indicate frames dropped during the capture/record process. 
  17458.  
  17459.  video record frame duration Frame rate for recording as the time duration of 
  17460.    each frame in microseconds. Useful for setting non-integer frame rates, for 
  17461.    example, 12.5 FPS of a PAL videodisc:  1000000/12.5 = 8000 microseconds. 
  17462.  
  17463.  video signal An electrical signal containing video information.  The signal 
  17464.    must be in some standard format, such as NTSC or PAL. 
  17465.  
  17466.  VSD Vendor-specific driver. 
  17467.  
  17468.  video scaling Expanding or reducing video information in size or area. See 
  17469.    also aspect ratio. 
  17470.  
  17471.  video scan converter A device that emits a video signal in one standard into 
  17472.    another device of different resolution or scan rate. 
  17473.  
  17474.  video segment A contiguous set of recorded data from a video track.  A video 
  17475.    segment might or might not be associated with an audio segment. 
  17476.  
  17477.  video signal An electrical signal containing video information.  The signal 
  17478.    must be in some standard format, such as NTSC or PAL. 
  17479.  
  17480.  video source selection The ability of an application to change to an alternate 
  17481.    video input using the connector command. 
  17482.  
  17483.  video tearing See tearing. 
  17484.  
  17485.  video teleconferencing A means of telecommunication characterized by audio and 
  17486.    video transmission, usually involving several parties.  Desktop video 
  17487.    teleconferencing could involve having the audio and video processed by the 
  17488.    user's computer system, that is, with the other users' voices coming through 
  17489.    the computer's speaker, and video windows of the other users displayed on 
  17490.    the computer's screen. 
  17491.  
  17492.  video windows Graphical PM-style windows in which video is displayed.  Most 
  17493.    often associated with the video overlay device. 
  17494.  
  17495.  videocassette recorder (VCR) A device for recording or playing back 
  17496.    videocassettes. 
  17497.  
  17498.  videodisc A disc on which programs have been recorded for playback on a 
  17499.    computer (or a television set) or a recording on a videodisc.  The most 
  17500.    common format in the United States and Japan is an NTSC signal recorded on 
  17501.    the optical reflective format. 
  17502.  
  17503.  videodisc player control Provides access to and operation of the following 
  17504.    videodisc functions: eject, pause, play forward, play reverse, position, 
  17505.    record, repeat, rewind, scan forward, scan reverse, step forward, step 
  17506.    reverse, and stop. All device communication and user interface support is 
  17507.    handled by the control. 
  17508.  
  17509.  videotape (1) The tape used to record visual images and sound. (2) To make a 
  17510.    videotape of. (3) A recording of visual images and sound made on magnetic 
  17511.    tape.  (All shooting is done in this format, even if the results are later 
  17512.    transferred to videodisc or film.) 
  17513.  
  17514.  videotape recorder (VTR) A device for recording and playing back videotapes. 
  17515.    (The professional counterpart of a consumer VCR.) 
  17516.  
  17517.  videotex A system that provides two-way interactive information services, 
  17518.    including the exchange of alphanumeric and graphic information, over common 
  17519.    carrier facilities to a mass consumer market using modified TV displays with 
  17520.    special decoders and modems. 
  17521.  
  17522.  view The form in which an object is presented.  The four kinds of views are: 
  17523.    composed, contents, settings, and help. 
  17524.  
  17525.  viewport An area on the usable area of the display surface over which the 
  17526.    developer has control of the size, location, and scaling, and in which the 
  17527.    user can view all or a portion of the data outlined by the window. 
  17528.  
  17529.  virtual device driver (VDD) (1) Virtualizes the hardware interfaces of an 
  17530.    option adapter or device, usually to migrate an existing DOS application 
  17531.    into an OS/2 DOS session. (2) Essentially a Dynamic Link Library; a virtual 
  17532.    device driver generally does not interface directly with the hardware. (3) A 
  17533.    32-bit .EXE file that can contain initialization code, initialization data, 
  17534.    and swappable global code. (4) Maintains shadow state of hardware, if 
  17535.    necessary. Allows a DOS session to execute in a window or in the background 
  17536.    by intercepting direct device access and simulating that device. 
  17537.  
  17538.  virtual device helper (VDH) A system service that is available to perform 
  17539.    essential functions. 
  17540.  
  17541.  VO Script abbreviation for voice-over. 
  17542.  
  17543.  voice-over (1) The voice of an unseen narrator in a video presentation. (2) A 
  17544.    voice indicating the thoughts of a visible character without the character' 
  17545.    lips moving. 
  17546.  
  17547.  volume The intensity of sound.  A volume of 0 is minimum volume.  A volume of 
  17548.    100 is maximum volume. 
  17549.  
  17550.  VPI Video programming interface. 
  17551.  
  17552.  VTR Videotape recorder. 
  17553.  
  17554.  
  17555. ΓòÉΓòÉΓòÉ <hidden> W ΓòÉΓòÉΓòÉ
  17556.  
  17557.  walk-through A type of animated presentation that simulates a walking tour of 
  17558.    a three-dimensional scene. 
  17559.  
  17560.  walk-up-and-use interface An interface that the target audience should be able 
  17561.    to use without having to read manuals or instructions, even if they have 
  17562.    never seen the interface. 
  17563.  
  17564.  waveform (1) A graphic representation of the shape of a wave that indicates 
  17565.    its characteristics (such as frequency and amplitude). (2) A digital method 
  17566.    of storing and manipulating audio data. 
  17567.  
  17568.  wide shot Synonym for long shot. 
  17569.  
  17570.  wild footage Synonym for original footage. 
  17571.  
  17572.  window An area of the screen with visible boundaries through which panel 
  17573.    information is displayed. 
  17574.  
  17575.  window An area of the screen with visible boundaries that presents a view of 
  17576.    an object or with which a user conducts a dialog with a computer system. 
  17577.  
  17578.  window coordinates The size and location of a window. 
  17579.  
  17580.  wipe Technical effect of fading away one screen to reveal another. 
  17581.  
  17582.  workplace A container that fills the entire screen and holds all of the 
  17583.    objects that make up the user interface. 
  17584.  
  17585.  write once/read many (WORM) Describes an optical disc that once written to, 
  17586.    cannot be overwritten.  Storage capacity ranges from 400MB to 3.2GB. 
  17587.    Present technology allows only one side to be read at a time; to access the 
  17588.    other side, the disk must be turned over. 
  17589.  
  17590.  WS Script abbreviation for wide shot. 
  17591.  
  17592.  WYSIWYG What You See Is What You Get.  The appearance of the object is in 
  17593.    actual form.  For example, a document that looks the same on a display 
  17594.    screen as it does when it is printed.  Composed views of objects are often 
  17595.    WYSIWYG. 
  17596.  
  17597.  
  17598. ΓòÉΓòÉΓòÉ <hidden> X Y Z ΓòÉΓòÉΓòÉ
  17599.  
  17600.  Y Refers to the luminance portion of a Y/C video signal. 
  17601.  
  17602.  Y/C Color image encoding that separates luminance (Y) and chrominance (C) 
  17603.    signals. 
  17604.  
  17605.  YIQ Image encoding scheme similar to YUV that selects the direction of the two 
  17606.    color axes, I and Q, to align with natural images.  As an average, the I 
  17607.    signal bears much more information than the Q signal.  (YIQ is used in the 
  17608.    NTSC video standard.) 
  17609.  
  17610.  YUV Color image encoding scheme that separates luminance (Y) and two color 
  17611.    signals: red minus Y (U), and blue minus Y (V).  Transmission of YUV can 
  17612.    take advantage of the eye's greater sensitivity to luminance detail than 
  17613.    color detail. 
  17614.  
  17615.  zoom in An optical camera change where the camera appears to approach the 
  17616.    subject it is shooting. 
  17617.  
  17618.  zoom out An optical camera change where the camera appears to back up from the 
  17619.    subject it is shooting. 
  17620.  
  17621.  zooming The progressive scaling of an image in order to give the visual 
  17622.    impression of movement of all or part of a display group toward or away from 
  17623.    an observer. 
  17624.  
  17625.  3-D modeling Presenting material in a three-dimensional format. 
  17626.