home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / MMSYSTEM.PAS < prev    next >
Pascal/Delphi Source File  |  1997-02-28  |  139KB  |  3,306 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Delphi Runtime Library                          }
  5. {       Windows 32bit API Interface Unit                }
  6. {       Multimedia Interface unit                       }
  7. {                                                       }
  8. {       Copyright (c) 1992-1997 Borland International   }
  9. {                                                       }
  10. {*******************************************************}
  11.  
  12. unit MMSystem;        // $Revision:   1.3  $
  13.  
  14. interface
  15.  
  16. uses Windows;
  17.  
  18. {***************************************************************************
  19.  
  20.                     General constants and data types
  21.  
  22. ***************************************************************************}
  23.  
  24. { general constants }
  25. const
  26.   MAXPNAMELEN      =  32;    { max product name length (including nil) }
  27.   MAXERRORLENGTH   = 128;    { max error text length (including nil) }
  28.   MAX_JOYSTICKOEMVXDNAME = 260; { max oem vxd name length (including nil) }
  29.  
  30. {***************************************************************************
  31.  
  32.                          Manufacturer and product IDs
  33.  
  34.     Used with wMid and wPid fields in WAVEOUTCAPS, WAVEINCAPS,
  35.     MIDIOUTCAPS, MIDIINCAPS, AUXCAPS, JOYCAPS structures.
  36.  
  37. ***************************************************************************}
  38.  
  39. { manufacturer IDs }
  40. const
  41.   MM_MICROSOFT            = 1;       { Microsoft Corp. }
  42.  
  43. { product IDs }
  44.   MM_MIDI_MAPPER          = 1;       { MIDI Mapper }
  45.   MM_WAVE_MAPPER          = 2;       { Wave Mapper }
  46.   MM_SNDBLST_MIDIOUT      = 3;       { Sound Blaster MIDI output port }
  47.   MM_SNDBLST_MIDIIN       = 4;       { Sound Blaster MIDI input port  }
  48.   MM_SNDBLST_SYNTH        = 5;       { Sound Blaster internal synthesizer }
  49.   MM_SNDBLST_WAVEOUT      = 6;       { Sound Blaster waveform output }
  50.   MM_SNDBLST_WAVEIN       = 7;       { Sound Blaster waveform input }
  51.   MM_ADLIB                = 9;       { Ad Lib-compatible synthesizer }
  52.   MM_MPU401_MIDIOUT       = 10;      { MPU401-compatible MIDI output port }
  53.   MM_MPU401_MIDIIN        = 11;      { MPU401-compatible MIDI input port }
  54.   MM_PC_JOYSTICK          = 12;      { Joystick adapter }
  55.  
  56. { general data types }
  57. type
  58.   VERSION = UINT;               { major (high byte), minor (low byte) }
  59.   {$nonamespace VERSION}
  60.   MMVERSION = UINT;             { major (high byte), minor (low byte) }
  61.   {$nonamespace MMVERSION}
  62.   MMRESULT = UINT;              { error return code, 0 means no error }
  63.   {$nonamespace MMRESULT}
  64.  
  65. { types for wType field in MMTIME struct }
  66. const
  67.   TIME_MS         = $0001;  { time in milliseconds }
  68.   TIME_SAMPLES    = $0002;  { number of wave samples }
  69.   TIME_BYTES      = $0004;  { current byte offset }
  70.   TIME_SMPTE      = $0008;  { SMPTE time }
  71.   TIME_MIDI       = $0010;  { MIDI time }
  72.   TIME_TICKS      = $0020;  { Ticks within MIDI stream }
  73.  
  74. { MMTIME data structure }
  75. type
  76.   PMMTime = ^TMMTime;
  77.   mmtime_tag = record
  78.     case wType: UINT of        { indicates the contents of the variant record }
  79.      TIME_MS:      (ms: DWORD);
  80.      TIME_SAMPLES: (sample: DWORD);
  81.      TIME_BYTES:   (cb: DWORD);
  82.      TIME_TICKS:   (ticks: DWORD);
  83.      TIME_SMPTE: (
  84.         hour: Byte;
  85.         min: Byte;
  86.         sec: Byte;
  87.         frame: Byte;
  88.         fps: Byte;
  89.         dummy: Byte;
  90.         pad: array[0..1] of Byte);
  91.       TIME_MIDI : (songptrpos: DWORD);
  92.   end;
  93.   {$nonamespace mmtime_tag}
  94.   TMMTime = mmtime_tag;
  95.  
  96. {***************************************************************************
  97.  
  98.                     Multimedia Extensions Window Messages
  99.  
  100. ***************************************************************************}
  101.  
  102. { joystick }
  103. const
  104.   MM_JOY1MOVE         = $3A0;
  105.   MM_JOY2MOVE         = $3A1;
  106.   MM_JOY1ZMOVE        = $3A2;
  107.   MM_JOY2ZMOVE        = $3A3;
  108.   MM_JOY1BUTTONDOWN   = $3B5;
  109.   MM_JOY2BUTTONDOWN   = $3B6;
  110.   MM_JOY1BUTTONUP     = $3B7;
  111.   MM_JOY2BUTTONUP     = $3B8;
  112.  
  113. { MCI }
  114.   MM_MCINOTIFY        = $3B9;
  115.  
  116. { waveform output }
  117.   MM_WOM_OPEN         = $3BB;
  118.   MM_WOM_CLOSE        = $3BC;
  119.   MM_WOM_DONE         = $3BD;
  120.  
  121. { waveform input }
  122.   MM_WIM_OPEN         = $3BE;
  123.   MM_WIM_CLOSE        = $3BF;
  124.   MM_WIM_DATA         = $3C0;
  125.  
  126. { MIDI input }
  127.   MM_MIM_OPEN         = $3C1;
  128.   MM_MIM_CLOSE        = $3C2;
  129.   MM_MIM_DATA         = $3C3;
  130.   MM_MIM_LONGDATA     = $3C4;
  131.   MM_MIM_ERROR        = $3C5;
  132.   MM_MIM_LONGERROR    = $3C6;
  133.  
  134. { MIDI output }
  135.   MM_MOM_OPEN         = $3C7;
  136.   MM_MOM_CLOSE        = $3C8;
  137.   MM_MOM_DONE         = $3C9;
  138.  
  139.   MM_DRVM_OPEN        = $3D0;
  140.   MM_DRVM_CLOSE       = $3D1;
  141.   MM_DRVM_DATA        = $3D2;
  142.   MM_DRVM_ERROR       = $3D3;
  143.  
  144.   MM_STREAM_OPEN        = $3D4;
  145.   MM_STREAM_CLOSE        = $3D5;
  146.   MM_STREAM_DONE        = $3D6;
  147.   MM_STREAM_ERROR        = $3D7;
  148.  
  149.   MM_MOM_POSITIONCB   = $3CA;
  150.  
  151.   MM_MCISIGNAL        = $3CB;
  152.   MM_MIM_MOREDATA     = $3CC;
  153.  
  154.   MM_MIXM_LINE_CHANGE     = $3D0;
  155.   MM_MIXM_CONTROL_CHANGE  = $3D1;
  156.  
  157. {***************************************************************************
  158.  
  159.                 String resource number bases (internal use)
  160.  
  161. ***************************************************************************}
  162.  
  163. const
  164.   MMSYSERR_BASE          = 0;
  165.   WAVERR_BASE            = 32;
  166.   MIDIERR_BASE           = 64;
  167.   TIMERR_BASE            = 96;
  168.   JOYERR_BASE            = 160;
  169.   MCIERR_BASE            = 256;
  170.   MIXERR_BASE            = 1024;
  171.  
  172.   MCI_STRING_OFFSET      = 512;
  173.   MCI_VD_OFFSET          = 1024;
  174.   MCI_CD_OFFSET          = 1088;
  175.   MCI_WAVE_OFFSET        = 1152;
  176.   MCI_SEQ_OFFSET         = 1216;
  177.  
  178. {***************************************************************************
  179.  
  180.                         General error return values
  181.  
  182. ***************************************************************************}
  183.  
  184. { general error return values }
  185. const
  186.   MMSYSERR_NOERROR      = 0;                  { no error }
  187.   MMSYSERR_ERROR        = MMSYSERR_BASE + 1;  { unspecified error }
  188.   MMSYSERR_BADDEVICEID  = MMSYSERR_BASE + 2;  { device ID out of range }
  189.   MMSYSERR_NOTENABLED   = MMSYSERR_BASE + 3;  { driver failed enable }
  190.   MMSYSERR_ALLOCATED    = MMSYSERR_BASE + 4;  { device already allocated }
  191.   MMSYSERR_INVALHANDLE  = MMSYSERR_BASE + 5;  { device handle is invalid }
  192.   MMSYSERR_NODRIVER     = MMSYSERR_BASE + 6;  { no device driver present }
  193.   MMSYSERR_NOMEM        = MMSYSERR_BASE + 7;  { memory allocation error }
  194.   MMSYSERR_NOTSUPPORTED = MMSYSERR_BASE + 8;  { function isn't supported }
  195.   MMSYSERR_BADERRNUM    = MMSYSERR_BASE + 9;  { error value out of range }
  196.   MMSYSERR_INVALFLAG    = MMSYSERR_BASE + 10; { invalid flag passed }
  197.   MMSYSERR_INVALPARAM   = MMSYSERR_BASE + 11; { invalid parameter passed }
  198.   MMSYSERR_HANDLEBUSY   = MMSYSERR_BASE + 12; { handle being used
  199.                                                 simultaneously on another
  200.                                                 thread (eg callback) }
  201.   MMSYSERR_INVALIDALIAS = MMSYSERR_BASE + 13; { specified alias not found }
  202.   MMSYSERR_BADDB        = MMSYSERR_BASE + 14; { bad registry database }
  203.   MMSYSERR_KEYNOTFOUND  = MMSYSERR_BASE + 15; { registry key not found }
  204.   MMSYSERR_READERROR    = MMSYSERR_BASE + 16; { registry read error }
  205.   MMSYSERR_WRITEERROR   = MMSYSERR_BASE + 17; { registry write error }
  206.   MMSYSERR_DELETEERROR  = MMSYSERR_BASE + 18; { registry delete error }
  207.   MMSYSERR_VALNOTFOUND  = MMSYSERR_BASE + 19; { registry value not found }
  208.   MMSYSERR_NODRIVERCB   = MMSYSERR_BASE + 20; { driver does not call DriverCallback }
  209.   MMSYSERR_LASTERROR    = MMSYSERR_BASE + 20; { last error in range }
  210.  
  211. type
  212.   HDRVR = Integer;
  213.   {$nonamespace HDRVR}
  214.  
  215. {***************************************************************************
  216.  
  217.                         Installable driver support
  218.  
  219. ***************************************************************************}
  220.  
  221. type
  222.   PDrvConfigInfoEx = ^TDrvConfigInfoEx;
  223.   DRVCONFIGINFOEX = packed record
  224.     dwDCISize: DWORD;
  225.     lpszDCISectionName: PWideChar;
  226.     lpszDCIAliasName: PWideChar;
  227.     dnDevNode: DWORD;
  228.   end;
  229.   {$nonamespace DRVCONFIGINFOEX}
  230.   TDrvConfigInfoEx = DRVCONFIGINFOEX;
  231.  
  232. const
  233. { Driver messages }
  234.   DRV_LOAD                = $0001;
  235.   DRV_ENABLE              = $0002;
  236.   DRV_OPEN                = $0003;
  237.   DRV_CLOSE               = $0004;
  238.   DRV_DISABLE             = $0005;
  239.   DRV_FREE                = $0006;
  240.   DRV_CONFIGURE           = $0007;
  241.   DRV_QUERYCONFIGURE      = $0008;
  242.   DRV_INSTALL             = $0009;
  243.   DRV_REMOVE              = $000A;
  244.   DRV_EXITSESSION         = $000B;
  245.   DRV_POWER               = $000F;
  246.   DRV_RESERVED            = $0800;
  247.   DRV_USER                = $4000;
  248.  
  249. type
  250. { LPARAM of DRV_CONFIGURE message }
  251.   PDrvConfigInfo = ^TDrvConfigInfo;
  252.   tagDRVCONFIGINFO = packed record
  253.     dwDCISize: DWORD;
  254.     lpszDCISectionName: PWideChar;
  255.     lpszDCIAliasName: PWideChar;
  256.   end;
  257.   {$nonamespace tagDRVCONFIGINFO}
  258.   TDrvConfigInfo = tagDRVCONFIGINFO;
  259.  
  260. const
  261. { Supported return values for DRV_CONFIGURE message }
  262.   DRVCNF_CANCEL           = $0000;
  263.   DRVCNF_OK               = $0001;
  264.   DRVCNF_RESTART          = $0002;
  265.  
  266. { installable driver function prototypes }
  267. type 
  268.   TFNDriverProc = function(dwDriverId: DWORD; hdrvr: HDRVR; 
  269.     msg: UINT; lparam1, lparam2: LPARAM): Longint stdcall;
  270.  
  271. function CloseDriver(hDriver: HDRVR; lParam1, lParam2: Longint): Longint; stdcall;
  272. function OpenDriver(szDriverName: PWideChar; szSectionName: PWideChar; lParam2: Longint): HDRVR; stdcall;
  273. function SendDriverMessage(hDriver: HDRVR; message: UINT; lParam1, lParam2: Longint): Longint; stdcall;
  274. function DrvGetModuleHandle(hDriver: HDRVR): HMODULE; stdcall;
  275. function GetDriverModuleHandle(hDriver: HDRVR): HMODULE; stdcall;
  276. function DefDriverProc(dwDriverIdentifier: DWORD; hdrvr: HDRVR; uMsg: UINT; 
  277.   lParam1, lParam2: LPARAM): Longint; stdcall;
  278.  
  279. { return values from DriverProc() function }
  280. const
  281.   DRV_CANCEL             = DRVCNF_CANCEL;
  282.   DRV_OK                 = DRVCNF_OK;
  283.   DRV_RESTART            = DRVCNF_RESTART;
  284.  
  285.   DRV_MCI_FIRST          = DRV_RESERVED;
  286.   DRV_MCI_LAST           = DRV_RESERVED + $FFF;
  287.  
  288. {***************************************************************************
  289.  
  290.                           Driver callback support
  291.  
  292. ***************************************************************************}
  293.  
  294. { flags used with waveOutOpen(), waveInOpen(), midiInOpen(), and }
  295. { midiOutOpen() to specify the type of the dwCallback parameter. }
  296.  
  297. const
  298.   CALLBACK_TYPEMASK   = $00070000;    { callback type mask }
  299.   CALLBACK_NULL       = $00000000;    { no callback }
  300.   CALLBACK_WINDOW     = $00010000;    { dwCallback is a HWND }
  301.   CALLBACK_TASK       = $00020000;    { dwCallback is a HTASK }
  302.   CALLBACK_FUNCTION   = $00030000;    { dwCallback is a FARPROC }
  303.   CALLBACK_THREAD     = CALLBACK_TASK;{ thread ID replaces 16 bit task }
  304.   CALLBACK_EVENT      = $00050000;    { dwCallback is an EVENT Handle }
  305.  
  306. { driver callback prototypes }
  307.  
  308. type
  309.   TFNDrvCallBack = procedure(hdrvr: HDRVR; uMsg: UINT; dwUser: DWORD;
  310.     dw1, dw2: DWORD) stdcall;
  311.  
  312. {***************************************************************************
  313.  
  314.                     General MMSYSTEM support
  315.  
  316. ***************************************************************************}
  317.  
  318. function mmsystemGetVersion: UINT; stdcall;
  319.  
  320. {***************************************************************************
  321.  
  322.                             Sound support
  323.  
  324. ***************************************************************************}
  325.  
  326. function sndPlaySoundA(lpszSoundName: PAnsiChar; uFlags: UINT): BOOL; stdcall;
  327. function sndPlaySoundW(lpszSoundName: PWideChar; uFlags: UINT): BOOL; stdcall;
  328. function sndPlaySound(lpszSoundName: PChar; uFlags: UINT): BOOL; stdcall;
  329.  
  330. { flag values for wFlags parameter }
  331. const
  332.   SND_SYNC            = $0000;  { play synchronously (default) }
  333.   SND_ASYNC           = $0001;  { play asynchronously }
  334.   SND_NODEFAULT       = $0002;  { don't use default sound }
  335.   SND_MEMORY          = $0004;  { lpszSoundName points to a memory file }
  336.   SND_LOOP            = $0008;  { loop the sound until next sndPlaySound }
  337.   SND_NOSTOP          = $0010;  { don't stop any currently playing sound }
  338.  
  339.   SND_NOWAIT          = $00002000;  { don't wait if the driver is busy }
  340.   SND_ALIAS           = $00010000;  { name is a registry alias }
  341.   SND_ALIAS_ID        = $00110000;  { alias is a predefined ID }
  342.   SND_FILENAME        = $00020000;  { name is file name }
  343.   SND_RESOURCE        = $00040004;  { name is resource name or atom }
  344.   SND_PURGE           = $0040;      { purge non-static events for task }
  345.   SND_APPLICATION     = $0080;      { look for application specific association }
  346.  
  347.   SND_ALIAS_START     = 0;   { alias base }
  348.  
  349.   SND_ALIAS_SYSTEMASTERISK       = SND_ALIAS_START + (Longint(Ord('S')) or (Longint(Ord('*')) shl 8));
  350.   SND_ALIAS_SYSTEMQUESTION       = SND_ALIAS_START + (Longint(Ord('S')) or (Longint(Ord('?')) shl 8));
  351.   SND_ALIAS_SYSTEMHAND           = SND_ALIAS_START + (Longint(Ord('S')) or (Longint(Ord('H')) shl 8));
  352.   SND_ALIAS_SYSTEMEXIT           = SND_ALIAS_START + (Longint(Ord('S')) or (Longint(Ord('E')) shl 8));
  353.   SND_ALIAS_SYSTEMSTART          = SND_ALIAS_START + (Longint(Ord('S')) or (Longint(Ord('S')) shl 8));
  354.   SND_ALIAS_SYSTEMWELCOME        = SND_ALIAS_START + (Longint(Ord('S')) or (Longint(Ord('W')) shl 8));
  355.   SND_ALIAS_SYSTEMEXCLAMATION    = SND_ALIAS_START + (Longint(Ord('S')) or (Longint(Ord('!')) shl 8));
  356.   SND_ALIAS_SYSTEMDEFAULT        = SND_ALIAS_START + (Longint(Ord('S')) or (Longint(Ord('D')) shl 8));
  357.  
  358. function PlaySoundA(pszSound: PAnsiChar; hmod: HMODULE; fdwSound: DWORD): BOOL; stdcall;
  359. function PlaySoundW(pszSound: PWideChar; hmod: HMODULE; fdwSound: DWORD): BOOL; stdcall;
  360. function PlaySound(pszSound: PChar; hmod: HMODULE; fdwSound: DWORD): BOOL; stdcall;
  361.  
  362. {***************************************************************************
  363.  
  364.                         Waveform audio support
  365.  
  366. ***************************************************************************}
  367.  
  368. { waveform audio error return values }
  369. const
  370.   WAVERR_BADFORMAT      = WAVERR_BASE + 0;    { unsupported wave format }
  371.   WAVERR_STILLPLAYING   = WAVERR_BASE + 1;    { still something playing }
  372.   WAVERR_UNPREPARED     = WAVERR_BASE + 2;    { header not prepared }
  373.   WAVERR_SYNC           = WAVERR_BASE + 3;    { device is synchronous }
  374.   WAVERR_LASTERROR      = WAVERR_BASE + 3;    { last error in range }
  375.  
  376. { waveform audio data types }
  377. type
  378.   PHWAVE = ^HWAVE;
  379.   HWAVE = Integer;
  380.   {$nonamespace HWAVE}
  381.   PHWAVEIN = ^HWAVEIN;
  382.   HWAVEIN = Integer;
  383.   {$nonamespace HWAVEIN}
  384.   PHWAVEOUT = ^HWAVEOUT;
  385.   HWAVEOUT = Integer;
  386.   {$nonamespace HWAVEOUT}
  387.  
  388. type
  389.   TFNWaveCallBack = TFNDrvCallBack;
  390.  
  391. { wave callback messages }
  392. const
  393.   WOM_OPEN        = MM_WOM_OPEN;
  394.   WOM_CLOSE       = MM_WOM_CLOSE;
  395.   WOM_DONE        = MM_WOM_DONE;
  396.   WIM_OPEN        = MM_WIM_OPEN;
  397.   WIM_CLOSE       = MM_WIM_CLOSE;
  398.   WIM_DATA        = MM_WIM_DATA;
  399.  
  400. { device ID for wave device mapper }
  401.   WAVE_MAPPER     = UINT(-1);
  402.  
  403. { flags for dwFlags parameter in waveOutOpen() and waveInOpen() }
  404.   WAVE_FORMAT_QUERY     = $0001;
  405.   WAVE_ALLOWSYNC        = $0002;
  406.   WAVE_MAPPED           = $0004;
  407.  
  408. { wave data block header }
  409. type
  410.   PWaveHdr = ^TWaveHdr;
  411.   wavehdr_tag = record
  412.     lpData: PChar;              { pointer to locked data buffer }
  413.     dwBufferLength: DWORD;      { length of data buffer }
  414.     dwBytesRecorded: DWORD;     { used for input only }
  415.     dwUser: DWORD;              { for client's use }
  416.     dwFlags: DWORD;             { assorted flags (see defines) }
  417.     dwLoops: DWORD;             { loop control counter }
  418.     lpNext: PWaveHdr;           { reserved for driver }
  419.     reserved: DWORD;            { reserved for driver }
  420.   end;
  421.   {$nonamespace wavehdr_tag}
  422.   TWaveHdr = wavehdr_tag;
  423.  
  424. { flags for dwFlags field of WAVEHDR }
  425. const
  426.   WHDR_DONE       = $00000001;  { done bit }
  427.   WHDR_PREPARED   = $00000002;  { set if this header has been prepared }
  428.   WHDR_BEGINLOOP  = $00000004;  { loop start block }
  429.   WHDR_ENDLOOP    = $00000008;  { loop end block }
  430.   WHDR_INQUEUE    = $00000010;  { reserved for driver }
  431.  
  432. { waveform output device capabilities structure }
  433. type
  434.   PWaveOutCapsA = ^TWaveOutCapsA;
  435.   PWaveOutCapsW = ^TWaveOutCapsW;
  436.   PWaveOutCaps = PWaveOutCapsA;
  437.   tagWAVEOUTCAPSA = record
  438.     wMid: Word;                 { manufacturer ID }
  439.     wPid: Word;                 { product ID }
  440.     vDriverVersion: MMVERSION;       { version of the driver }
  441.     szPname: array[0..MAXPNAMELEN-1] of AnsiChar;  { product name (NULL terminated string) }
  442.     dwFormats: DWORD;          { formats supported }
  443.     wChannels: Word;            { number of sources supported }
  444.     dwSupport: DWORD;          { functionality supported by driver }
  445.   end;
  446.   {$nonamespace tagWAVEOUTCAPSA}
  447.   TWaveOutCapsA = tagWAVEOUTCAPSA;
  448.   tagWAVEOUTCAPSW = record
  449.     wMid: Word;                 { manufacturer ID }
  450.     wPid: Word;                 { product ID }
  451.     vDriverVersion: MMVERSION;       { version of the driver }
  452.     szPname: array[0..MAXPNAMELEN-1] of WideChar;  { product name (NULL terminated string) }
  453.     dwFormats: DWORD;          { formats supported }
  454.     wChannels: Word;            { number of sources supported }
  455.     dwSupport: DWORD;          { functionality supported by driver }
  456.   end;
  457.   {$nonamespace tagWAVEOUTCAPSW}
  458.   TWaveOutCapsW = tagWAVEOUTCAPSW;
  459.   TWaveOutCaps = TWaveOutCapsA;
  460.  
  461. { flags for dwSupport field of WAVEOUTCAPS }
  462. const
  463.   WAVECAPS_PITCH          = $0001;   { supports pitch control }
  464.   WAVECAPS_PLAYBACKRATE   = $0002;   { supports playback rate control }
  465.   WAVECAPS_VOLUME         = $0004;   { supports volume control }
  466.   WAVECAPS_LRVOLUME       = $0008;   { separate left-right volume control }
  467.   WAVECAPS_SYNC           = $0010;
  468.   WAVECAPS_SAMPLEACCURATE = $0020;
  469.   WAVECAPS_DIRECTSOUND    = $0040;
  470.  
  471. { waveform input device capabilities structure }
  472. type
  473.   PWaveInCapsA = ^TWaveInCapsA;
  474.   PWaveInCapsW = ^TWaveInCapsW;
  475.   PWaveInCaps = PWaveInCapsA;
  476.   tagWAVEINCAPSA = record
  477.     wMid: Word;                   { manufacturer ID }
  478.     wPid: Word;                   { product ID }
  479.     vDriverVersion: MMVERSION;         { version of the driver }
  480.     szPname: array[0..MAXPNAMELEN-1] of AnsiChar;    { product name (NULL terminated string) }
  481.     dwFormats: DWORD;             { formats supported }
  482.     wChannels: Word;              { number of channels supported }
  483.     wReserved1: Word;             { structure packing }
  484.   end;
  485.   {$nonamespace tagWAVEINCAPSA}
  486.   TWaveInCapsA = tagWAVEINCAPSA;
  487.   tagWAVEINCAPSW = record
  488.     wMid: Word;                   { manufacturer ID }
  489.     wPid: Word;                   { product ID }
  490.     vDriverVersion: MMVERSION;         { version of the driver }
  491.     szPname: array[0..MAXPNAMELEN-1] of WideChar;    { product name (NULL terminated string) }
  492.     dwFormats: DWORD;             { formats supported }
  493.     wChannels: Word;              { number of channels supported }
  494.     wReserved1: Word;             { structure packing }
  495.   end;
  496.   {$nonamespace tagWAVEINCAPSW}
  497.   TWaveInCapsW = tagWAVEINCAPSW;
  498.   TWaveInCaps = TWaveInCapsA;
  499.  
  500. { defines for dwFormat field of WAVEINCAPS and WAVEOUTCAPS }
  501. const
  502.   WAVE_INVALIDFORMAT     = $00000000;       { invalid format }
  503.   WAVE_FORMAT_1M08       = $00000001;       { 11.025 kHz, Mono,   8-bit  }
  504.   WAVE_FORMAT_1S08       = $00000002;       { 11.025 kHz, Stereo, 8-bit  }
  505.   WAVE_FORMAT_1M16       = $00000004;       { 11.025 kHz, Mono,   16-bit }
  506.   WAVE_FORMAT_1S16       = $00000008;       { 11.025 kHz, Stereo, 16-bit }
  507.   WAVE_FORMAT_2M08       = $00000010;       { 22.05  kHz, Mono,   8-bit  }
  508.   WAVE_FORMAT_2S08       = $00000020;       { 22.05  kHz, Stereo, 8-bit  }
  509.   WAVE_FORMAT_2M16       = $00000040;       { 22.05  kHz, Mono,   16-bit }
  510.   WAVE_FORMAT_2S16       = $00000080;       { 22.05  kHz, Stereo, 16-bit }
  511.   WAVE_FORMAT_4M08       = $00000100;       { 44.1   kHz, Mono,   8-bit  }
  512.   WAVE_FORMAT_4S08       = $00000200;       { 44.1   kHz, Stereo, 8-bit  }
  513.   WAVE_FORMAT_4M16       = $00000400;       { 44.1   kHz, Mono,   16-bit }
  514.   WAVE_FORMAT_4S16       = $00000800;       { 44.1   kHz, Stereo, 16-bit }
  515.  
  516. { general waveform format structure (information common to all formats) }
  517. type
  518.   PWaveFormat = ^TWaveFormat;
  519.   waveformat_tag = packed record
  520.     wFormatTag: Word;         { format type }
  521.     nChannels: Word;          { number of channels (i.e. mono, stereo, etc.) }
  522.     nSamplesPerSec: DWORD;  { sample rate }
  523.     nAvgBytesPerSec: DWORD; { for buffer estimation }
  524.     nBlockAlign: Word;      { block size of data }
  525.   end;
  526.   {$nonamespace waveformat_tag}
  527.   TWaveFormat = waveformat_tag;
  528.  
  529. { flags for wFormatTag field of WAVEFORMAT }
  530. const
  531.   WAVE_FORMAT_PCM     = 1;
  532.  
  533. { specific waveform format structure for PCM data }
  534. type
  535.   PPCMWaveFormat = ^TPCMWaveFormat;
  536.   pcmwaveformat_tag = record
  537.       wf: TWaveFormat;
  538.       wBitsPerSample: Word;
  539.    end;
  540.   {$nonamespace pcmwaveformat_tag}
  541.   TPCMWaveFormat = pcmwaveformat_tag;
  542.  
  543. { extended waveform format structure used for all non-PCM formats. this
  544.   structure is common to all non-PCM formats. }
  545.  
  546.   PWaveFormatEx = ^TWaveFormatEx;
  547.   tWAVEFORMATEX = packed record
  548.     wFormatTag: Word;         { format type }
  549.     nChannels: Word;          { number of channels (i.e. mono, stereo, etc.) }
  550.     nSamplesPerSec: DWORD;  { sample rate }
  551.     nAvgBytesPerSec: DWORD; { for buffer estimation }
  552.     nBlockAlign: Word;      { block size of data }
  553.     wBitsPerSample: Word;   { number of bits per sample of mono data }
  554.     cbSize: Word;           { the count in bytes of the size of }
  555.   end;
  556.   {$nonamespace tWAVEFORMATEX}
  557.  
  558. { waveform audio function prototypes }
  559. function waveOutGetNumDevs: UINT; stdcall;
  560.  
  561. function waveOutGetDevCapsA(uDeviceID: UINT; lpCaps: PWaveOutCapsA; uSize: UINT): MMRESULT; stdcall;
  562. function waveOutGetDevCapsW(uDeviceID: UINT; lpCaps: PWaveOutCapsW; uSize: UINT): MMRESULT; stdcall;
  563. function waveOutGetDevCaps(uDeviceID: UINT; lpCaps: PWaveOutCaps; uSize: UINT): MMRESULT; stdcall;
  564. function waveOutGetVolume(hwo: HWAVEOUT; lpdwVolume: PDWORD): MMRESULT; stdcall;
  565. function waveOutSetVolume(hwo: HWAVEOUT; dwVolume: DWORD): MMRESULT; stdcall;
  566. function waveOutGetErrorTextA(mmrError: MMRESULT; lpText: PAnsiChar; uSize: UINT): MMRESULT; stdcall;
  567. function waveOutGetErrorTextW(mmrError: MMRESULT; lpText: PWideChar; uSize: UINT): MMRESULT; stdcall;
  568. function waveOutGetErrorText(mmrError: MMRESULT; lpText: PChar; uSize: UINT): MMRESULT; stdcall;
  569. function waveOutOpen(lphWaveOut: PHWaveOut; uDeviceID: UINT;
  570.   lpFormat: PWaveFormatEx; dwCallback, dwInstance, dwFlags: DWORD): MMRESULT; stdcall;
  571. function waveOutClose(hWaveOut: HWAVEOUT): MMRESULT; stdcall;
  572. function waveOutPrepareHeader(hWaveOut: HWAVEOUT; lpWaveOutHdr: PWaveHdr;
  573.   uSize: UINT): MMRESULT; stdcall;
  574. function waveOutUnprepareHeader(hWaveOut: HWAVEOUT; lpWaveOutHdr: PWaveHdr;
  575.   uSize: UINT): MMRESULT; stdcall;
  576. function waveOutWrite(hWaveOut: HWAVEOUT; lpWaveOutHdr: PWaveHdr;
  577.   uSize: UINT): MMRESULT; stdcall;
  578. function waveOutPause(hWaveOut: HWAVEOUT): MMRESULT; stdcall;
  579. function waveOutRestart(hWaveOut: HWAVEOUT): MMRESULT; stdcall;
  580. function waveOutReset(hWaveOut: HWAVEOUT): MMRESULT; stdcall;
  581. function waveOutBreakLoop(hWaveOut: HWAVEOUT): MMRESULT; stdcall;
  582. function waveOutGetPosition(hWaveOut: HWAVEOUT; lpInfo: PMMTime; uSize: UINT): MMRESULT; stdcall;
  583. function waveOutGetPitch(hWaveOut: HWAVEOUT; lpdwPitch: PDWORD): MMRESULT; stdcall;
  584. function waveOutSetPitch(hWaveOut: HWAVEOUT; dwPitch: DWORD): MMRESULT; stdcall;
  585. function waveOutGetPlaybackRate(hWaveOut: HWAVEOUT; lpdwRate: PDWORD): MMRESULT; stdcall;
  586. function waveOutSetPlaybackRate(hWaveOut: HWAVEOUT; dwRate: DWORD): MMRESULT; stdcall;
  587. function waveOutGetID(hWaveOut: HWAVEOUT; lpuDeviceID: PUINT): MMRESULT; stdcall;
  588. function waveOutMessage(hWaveOut: HWAVEOUT; uMessage: UINT; dw1, dw2: DWORD): Longint; stdcall;
  589. function waveInGetNumDevs: UINT; stdcall;
  590. function waveInGetDevCapsA(hwo: HWAVEOUT; lpCaps: PWaveInCapsA; uSize: UINT): MMRESULT; stdcall;
  591. function waveInGetDevCapsW(hwo: HWAVEOUT; lpCaps: PWaveInCapsW; uSize: UINT): MMRESULT; stdcall;
  592. function waveInGetDevCaps(hwo: HWAVEOUT; lpCaps: PWaveInCaps; uSize: UINT): MMRESULT; stdcall;
  593. function waveInGetErrorTextA(mmrError: MMRESULT; lpText: PAnsiChar; uSize: UINT): MMRESULT; stdcall;
  594. function waveInGetErrorTextW(mmrError: MMRESULT; lpText: PWideChar; uSize: UINT): MMRESULT; stdcall;
  595. function waveInGetErrorText(mmrError: MMRESULT; lpText: PChar; uSize: UINT): MMRESULT; stdcall;
  596. function waveInOpen(lphWaveIn: PHWAVEIN; uDeviceID: UINT;
  597.   lpFormatEx: PWaveFormatEx; dwCallback, dwInstance, dwFlags: DWORD): MMRESULT; stdcall;
  598. function waveInClose(hWaveIn: HWAVEIN): MMRESULT; stdcall;
  599. function waveInPrepareHeader(hWaveIn: HWAVEIN; lpWaveInHdr: PWaveHdr;
  600.   uSize: UINT): MMRESULT; stdcall;
  601. function waveInUnprepareHeader(hWaveIn: HWAVEIN; lpWaveInHdr: PWaveHdr;
  602.   uSize: UINT): MMRESULT; stdcall;
  603. function waveInAddBuffer(hWaveIn: HWAVEIN; lpWaveInHdr: PWaveHdr;
  604.   uSize: UINT): MMRESULT; stdcall;
  605. function waveInStart(hWaveIn: HWAVEIN): MMRESULT; stdcall;
  606. function waveInStop(hWaveIn: HWAVEIN): MMRESULT; stdcall;
  607. function waveInReset(hWaveIn: HWAVEIN): MMRESULT; stdcall;
  608. function waveInGetPosition(hWaveIn: HWAVEIN; lpInfo: PMMTime;
  609.   uSize: UINT): MMRESULT; stdcall;
  610. function waveInGetID(hWaveIn: HWAVEIN; lpuDeviceID: PUINT): MMRESULT; stdcall;
  611. function waveInMessage(hWaveIn: HWAVEIN; uMessage: UINT;
  612.   dw1, dw2: DWORD): MMRESULT; stdcall;
  613.  
  614. {***************************************************************************
  615.  
  616.                             MIDI audio support
  617.  
  618. ***************************************************************************}
  619.  
  620. { MIDI error return values }
  621. const
  622.   MIDIERR_UNPREPARED    = MIDIERR_BASE + 0;   { header not prepared }
  623.   MIDIERR_STILLPLAYING  = MIDIERR_BASE + 1;   { still something playing }
  624.   MIDIERR_NOMAP         = MIDIERR_BASE + 2;   { no current map }
  625.   MIDIERR_NOTREADY      = MIDIERR_BASE + 3;   { hardware is still busy }
  626.   MIDIERR_NODEVICE      = MIDIERR_BASE + 4;   { port no longer connected }
  627.   MIDIERR_INVALIDSETUP  = MIDIERR_BASE + 5;   { invalid setup }
  628.   MIDIERR_BADOPENMODE   = MIDIERR_BASE + 6;   { operation unsupported w/ open mode }
  629.   MIDIERR_DONT_CONTINUE = MIDIERR_BASE + 7;   { thru device 'eating' a message }
  630.   MIDIERR_LASTERROR     = MIDIERR_BASE + 5;   { last error in range }
  631.  
  632. { MIDI audio data types }
  633. type
  634.   PHMIDI = ^HMIDI;
  635.   HMIDI = Integer;
  636.   {$nonamespace HMIDI}
  637.   PHMIDIIN = ^HMIDIIN;
  638.   HMIDIIN = Integer;
  639.   {$nonamespace HMIDIIN}
  640.   PHMIDIOUT = ^HMIDIOUT;
  641.   HMIDIOUT = Integer;
  642.   {$nonamespace HMIDIOUT}
  643.   PHMIDISTRM = ^HMIDISTRM;
  644.   HMIDISTRM = Integer;
  645.   {$nonamespace HMIDISTRM}
  646.  
  647. type
  648.   TFNMidiCallBack = TFNDrvCallBack;
  649.  
  650. const
  651.   MIDIPATCHSIZE   = 128;
  652.  
  653. type
  654.   PPatchArray = ^TPatchArray;
  655.   TPatchArray = array[0..MIDIPATCHSIZE-1] of Word;
  656.  
  657.   PKeyArray = ^TKeyArray;
  658.   TKeyArray = array[0..MIDIPATCHSIZE-1] of Word;
  659.  
  660. { MIDI callback messages }
  661. const
  662.   MIM_OPEN        = MM_MIM_OPEN;
  663.   MIM_CLOSE       = MM_MIM_CLOSE;
  664.   MIM_DATA        = MM_MIM_DATA;
  665.   MIM_LONGDATA    = MM_MIM_LONGDATA;
  666.   MIM_ERROR       = MM_MIM_ERROR;
  667.   MIM_LONGERROR   = MM_MIM_LONGERROR;
  668.   MOM_OPEN        = MM_MOM_OPEN;
  669.   MOM_CLOSE       = MM_MOM_CLOSE;
  670.   MOM_DONE        = MM_MOM_DONE;
  671.  
  672.   MIM_MOREDATA    = MM_MIM_MOREDATA;
  673.   MOM_POSITIONCB  = MM_MOM_POSITIONCB;
  674.  
  675. { device ID for MIDI mapper }
  676.   MIDIMAPPER     = UINT(-1);
  677.   MIDI_MAPPER    = UINT(-1);
  678.  
  679. { flags for dwFlags parm of midiInOpen() }
  680.   MIDI_IO_STATUS = $00000020;
  681.  
  682. { flags for wFlags parm of midiOutCachePatches(), midiOutCacheDrumPatches() }
  683.   MIDI_CACHE_ALL      = 1;
  684.   MIDI_CACHE_BESTFIT  = 2;
  685.   MIDI_CACHE_QUERY    = 3;
  686.   MIDI_UNCACHE        = 4;
  687.  
  688. { MIDI output device capabilities structure }
  689. type
  690.   PMidiOutCapsA = ^TMidiOutCapsA;
  691.   PMidiOutCapsW = ^TMidiOutCapsW;
  692.   PMidiOutCaps = PMidiOutCapsA;
  693.   tagMIDIOUTCAPSA = record
  694.     wMid: Word;                  { manufacturer ID }
  695.     wPid: Word;                  { product ID }
  696.     vDriverVersion: MMVERSION;        { version of the driver }
  697.     szPname: array[0..MAXPNAMELEN-1] of AnsiChar;  { product name (NULL terminated string) }
  698.     wTechnology: Word;           { type of device }
  699.     wVoices: Word;               { # of voices (internal synth only) }
  700.     wNotes: Word;                { max # of notes (internal synth only) }
  701.     wChannelMask: Word;          { channels used (internal synth only) }
  702.     dwSupport: DWORD;            { functionality supported by driver }
  703.   end;
  704.   {$nonamespace tagMIDIOUTCAPSA}
  705.   TMidiOutCapsA = tagMIDIOUTCAPSA;
  706.   tagMIDIOUTCAPSW = record
  707.     wMid: Word;                  { manufacturer ID }
  708.     wPid: Word;                  { product ID }
  709.     vDriverVersion: MMVERSION;        { version of the driver }
  710.     szPname: array[0..MAXPNAMELEN-1] of WideChar;  { product name (NULL terminated string) }
  711.     wTechnology: Word;           { type of device }
  712.     wVoices: Word;               { # of voices (internal synth only) }
  713.     wNotes: Word;                { max # of notes (internal synth only) }
  714.     wChannelMask: Word;          { channels used (internal synth only) }
  715.     dwSupport: DWORD;            { functionality supported by driver }
  716.   end;
  717.   {$nonamespace tagMIDIOUTCAPSW}
  718.   TMidiOutCapsW = tagMIDIOUTCAPSW;
  719.   TMidiOutCaps = TMidiOutCapsA;
  720.  
  721. { flags for wTechnology field of MIDIOUTCAPS structure }
  722. const
  723.   MOD_MIDIPORT    = 1;  { output port }
  724.   MOD_SYNTH       = 2;  { generic internal synth }
  725.   MOD_SQSYNTH     = 3;  { square wave internal synth }
  726.   MOD_FMSYNTH     = 4;  { FM internal synth }
  727.   MOD_MAPPER      = 5;  { MIDI mapper }
  728.  
  729. { flags for dwSupport field of MIDIOUTCAPS structure }
  730. const
  731.   MIDICAPS_VOLUME          = $0001;  { supports volume control }
  732.   MIDICAPS_LRVOLUME        = $0002;  { separate left-right volume control }
  733.   MIDICAPS_CACHE           = $0004;
  734.   MIDICAPS_STREAM          = $0008;  { driver supports midiStreamOut directly }
  735.  
  736. { MIDI output device capabilities structure }
  737.  
  738. type
  739.   PMidiInCapsA = ^TMidiInCapsA;
  740.   PMidiInCapsW = ^TMidiInCapsW;
  741.   PMidiInCaps = PMidiInCapsA;
  742.   tagMIDIINCAPSA = record
  743.     wMid: Word;                  { manufacturer ID }
  744.     wPid: Word;                  { product ID }
  745.     vDriverVersion: MMVERSION;   { version of the driver }
  746.     szPname: array[0..MAXPNAMELEN-1] of AnsiChar;  { product name (NULL terminated string) }
  747.     dwSupport: DWORD;            { functionality supported by driver }
  748.   end;
  749.   {$nonamespace tagMIDIINCAPSA}
  750.   TMidiInCapsA = tagMIDIINCAPSA;
  751.   tagMIDIINCAPSW = record
  752.     wMid: Word;                  { manufacturer ID }
  753.     wPid: Word;                  { product ID }
  754.     vDriverVersion: MMVERSION;   { version of the driver }
  755.     szPname: array[0..MAXPNAMELEN-1] of WideChar;  { product name (NULL terminated string) }
  756.     dwSupport: DWORD;            { functionality supported by driver }
  757.   end;
  758.   {$nonamespace tagMIDIINCAPSW}
  759.   TMidiInCapsW = tagMIDIINCAPSW;
  760.   TMidiInCaps = TMidiInCapsA;
  761.  
  762. { MIDI data block header }
  763. type
  764.   PMidiHdr = ^TMidiHdr;
  765.   midihdr_tag = record
  766.     lpData: PChar;               { pointer to locked data block }
  767.     dwBufferLength: DWORD;       { length of data in data block }
  768.     dwBytesRecorded: DWORD;      { used for input only }
  769.     dwUser: DWORD;               { for client's use }
  770.     dwFlags: DWORD;              { assorted flags (see defines) }
  771.     lpNext: PMidiHdr;            { reserved for driver }
  772.     reserved: DWORD;             { reserved for driver }
  773.     dwOffset: DWORD;             { Callback offset into buffer }
  774.     dwReserved: array[0..7] of DWORD; { Reserved for MMSYSTEM }
  775.   end;
  776.   {$nonamespace midihdr_tag}
  777.   TMidiHdr = midihdr_tag;
  778.  
  779.   PMidiEvent = ^TMidiEvent;
  780.   midievent_tag = record
  781.     dwDeltaTime: DWORD;          { Ticks since last event }
  782.     dwStreamID: DWORD;           { Reserved; must be zero }
  783.     dwEvent: DWORD;              { Event type and parameters }
  784.     dwParms: array[0..0] of DWORD;  { Parameters if this is a long event }
  785.   end;
  786.   {$nonamespace midievent_tag}
  787.   TMidiEvent = midievent_tag;
  788.  
  789.   PMidiStrmBuffVer = ^TMidiStrmBuffVer;
  790.   midistrmbuffver_tag = record
  791.     dwVersion: DWORD;                  { Stream buffer format version }
  792.     dwMid: DWORD;                      { Manufacturer ID as defined in MMREG.H }
  793.     dwOEMVersion: DWORD;               { Manufacturer version for custom ext }
  794.   end;
  795.   {$nonamespace midistrmbuffver_tag}
  796.   TMidiStrmBuffVer = midistrmbuffver_tag;
  797.  
  798. { flags for dwFlags field of MIDIHDR structure }
  799. const
  800.   MHDR_DONE       = $00000001;       { done bit }
  801.   MHDR_PREPARED   = $00000002;       { set if header prepared }
  802.   MHDR_INQUEUE    = $00000004;       { reserved for driver }
  803.   MHDR_ISSTRM     = $00000008;       { Buffer is stream buffer }
  804.  
  805. (* 
  806.   Type codes which go in the high byte of the event DWORD of a stream buffer 
  807.  
  808.   Type codes 00-7F contain parameters within the low 24 bits 
  809.   Type codes 80-FF contain a length of their parameter in the low 24 
  810.   bits, followed by their parameter data in the buffer. The event 
  811.   DWORD contains the exact byte length; the parm data itself must be 
  812.   padded to be an even multiple of 4 bytes long. 
  813. *) 
  814.  
  815.   MEVT_F_SHORT       = $00000000;
  816.   MEVT_F_LONG        = $80000000;
  817.   MEVT_F_CALLBACK    = $40000000;
  818.  
  819.   MEVT_SHORTMSG     = $00;    { parm = shortmsg for midiOutShortMsg }
  820.   MEVT_TEMPO        = $01;    { parm = new tempo in microsec/qn     }
  821.   MEVT_NOP          = $02;    { parm = unused; does nothing         }
  822.  
  823. { 0x04-0x7F reserved }
  824.  
  825.   MEVT_LONGMSG      = $80;    { parm = bytes to send verbatim       }
  826.   MEVT_COMMENT      = $82;    { parm = comment data                 }
  827.   MEVT_VERSION      = $84;    { parm = MIDISTRMBUFFVER struct       }
  828.  
  829. { 0x81-0xFF reserved }
  830.  
  831.   MIDISTRM_ERROR    =  -2;
  832.  
  833. { Structures and defines for midiStreamProperty }
  834.   MIDIPROP_SET       = $80000000;
  835.   MIDIPROP_GET       = $40000000;
  836.  
  837. { These are intentionally both non-zero so the app cannot accidentally
  838.   leave the operation off and happen to appear to work due to default
  839.   action. }
  840.   MIDIPROP_TIMEDIV   = $00000001;
  841.   MIDIPROP_TEMPO     = $00000002;
  842.  
  843. type
  844.   PMidiPropTimeDiv = ^TMidiPropTimeDiv;
  845.   midiproptimediv_tag = record
  846.     cbStruct: DWORD;
  847.     dwTimeDiv: DWORD;
  848.   end;
  849.   {$nonamespace midiproptimediv_tag}
  850.   TMidiPropTimeDiv = midiproptimediv_tag;
  851.  
  852.   PMidiPropTempo = ^TMidiPropTempo;
  853.   midiproptempo_tag = record
  854.     cbStruct: DWORD;
  855.     dwTempo: DWORD;
  856.   end;
  857.   {$nonamespace midiproptempo_tag}
  858.   TMidiPropTempo = midiproptempo_tag;
  859.  
  860. { MIDI function prototypes }
  861.  
  862. function midiOutGetNumDevs: UINT; stdcall;
  863. function midiStreamOpen(phms: PHMIDISTRM; puDeviceID: PUINT; 
  864.   cMidi, dwCallback, dwInstance, fdwOpen: DWORD): MMRESULT; stdcall
  865. function midiStreamClose(hms: HMIDISTRM): MMRESULT; stdcall;
  866. function midiStreamProperty(hms: HMIDISTRM; lppropdata: PBYTE; dwProperty: DWORD): MMRESULT; stdcall;
  867. function midiStreamPosition(hms: HMIDISTRM; lpmmt: PMMTime; cbmmt: UINT): MMRESULT; stdcall;
  868. function midiStreamOut(hms: HMIDISTRM; pmh: PMidiHdr; cbmh: UINT): MMRESULT; stdcall;
  869. function midiStreamPause(hms: HMIDISTRM): MMRESULT; stdcall;
  870. function midiStreamRestart(hms: HMIDISTRM): MMRESULT; stdcall;
  871. function midiStreamStop(hms: HMIDISTRM): MMRESULT; stdcall;
  872. function midiConnect(hmi: HMIDI; hmo: HMIDIOUT; pReserved: Pointer): MMRESULT; stdcall;
  873. function midiDisconnect(hmi: HMIDI; hmo: HMIDIOUT; pReserved: Pointer): MMRESULT; stdcall;
  874. function midiOutGetDevCapsA(uDeviceID: UINT; lpCaps: PMidiOutCapsA; uSize: UINT): MMRESULT; stdcall;
  875. function midiOutGetDevCapsW(uDeviceID: UINT; lpCaps: PMidiOutCapsW; uSize: UINT): MMRESULT; stdcall;
  876. function midiOutGetDevCaps(uDeviceID: UINT; lpCaps: PMidiOutCaps; uSize: UINT): MMRESULT; stdcall;
  877. function midiOutGetVolume(hmo: HMIDIOUT; lpdwVolume: PDWORD): MMRESULT; stdcall;
  878. function midiOutSetVolume(hmo: HMIDIOUT; dwVolume: DWORD): MMRESULT; stdcall;
  879. function midiOutGetErrorTextA(mmrError: MMRESULT; pszText: PAnsiChar; uSize: UINT): MMRESULT; stdcall;
  880. function midiOutGetErrorTextW(mmrError: MMRESULT; pszText: PWideChar; uSize: UINT): MMRESULT; stdcall;
  881. function midiOutGetErrorText(mmrError: MMRESULT; pszText: PChar; uSize: UINT): MMRESULT; stdcall;
  882. function midiOutOpen(lphMidiOut: PHMIDIOUT; uDeviceID: UINT;
  883.   dwCallback, dwInstance, dwFlags: DWORD): MMRESULT; stdcall;
  884. function midiOutClose(hMidiOut: HMIDIOUT): MMRESULT; stdcall;
  885. function midiOutPrepareHeader(hMidiOut: HMIDIOUT; lpMidiOutHdr: PMidiHdr; uSize: UINT): MMRESULT; stdcall;
  886. function midiOutUnprepareHeader(hMidiOut: HMIDIOUT; lpMidiOutHdr: PMidiHdr; uSize: UINT): MMRESULT; stdcall;
  887. function midiOutShortMsg(hMidiOut: HMIDIOUT; dwMsg: DWORD): MMRESULT; stdcall;
  888. function midiOutLongMsg(hMidiOut: HMIDIOUT; lpMidiOutHdr: PMidiHdr; uSize: UINT): MMRESULT; stdcall;
  889. function midiOutReset(hMidiOut: HMIDIOUT): MMRESULT; stdcall;
  890. function midiOutCachePatches(hMidiOut: HMIDIOUT;
  891.   uBank: UINT; lpwPatchArray: PWord; uFlags: UINT): MMRESULT; stdcall;
  892. function midiOutCacheDrumPatches(hMidiOut: HMIDIOUT;
  893.   uPatch: UINT; lpwKeyArray: PWord; uFlags: UINT): MMRESULT; stdcall;
  894. function midiOutGetID(hMidiOut: HMIDIOUT; lpuDeviceID: PUINT): MMRESULT; stdcall;
  895. function midiOutMessage(hMidiOut: HMIDIOUT; uMessage: UINT; dw1, dw2: DWORD): MMRESULT; stdcall;
  896. function midiInGetNumDevs: UINT; stdcall;
  897. function midiInGetDevCapsA(DeviceID: UINT; lpCaps: PMidiInCapsA; uSize: UINT): MMRESULT; stdcall;
  898. function midiInGetDevCapsW(DeviceID: UINT; lpCaps: PMidiInCapsW; uSize: UINT): MMRESULT; stdcall;
  899. function midiInGetDevCaps(DeviceID: UINT; lpCaps: PMidiInCaps; uSize: UINT): MMRESULT; stdcall;
  900. function midiInGetErrorTextA(mmrError: MMRESULT; pszText: PAnsiChar; uSize: UINT): MMRESULT; stdcall;
  901. function midiInGetErrorTextW(mmrError: MMRESULT; pszText: PWideChar; uSize: UINT): MMRESULT; stdcall;
  902. function midiInGetErrorText(mmrError: MMRESULT; pszText: PChar; uSize: UINT): MMRESULT; stdcall;
  903. function midiInOpen(lphMidiIn: PHMIDIIN; uDeviceID: UINT;
  904.   dwCallback, dwInstance, dwFlags: DWORD): MMRESULT; stdcall;
  905. function midiInClose(hMidiIn: HMIDIIN): MMRESULT; stdcall;
  906. function midiInPrepareHeader(hMidiIn: HMIDIIN; lpMidiInHdr: PMidiHdr; uSize: UINT): MMRESULT; stdcall;
  907. function midiInUnprepareHeader(hMidiIn: HMIDIIN; lpMidiInHdr: PMidiHdr; uSize: UINT): MMRESULT; stdcall;
  908. function midiInAddBuffer(hMidiIn: HMIDIIN; lpMidiInHdr: PMidiHdr; uSize: UINT): MMRESULT; stdcall;
  909. function midiInStart(hMidiIn: HMIDIIN): MMRESULT; stdcall;
  910. function midiInStop(hMidiIn: HMIDIIN): MMRESULT; stdcall;
  911. function midiInReset(hMidiIn: HMIDIIN): MMRESULT; stdcall;
  912. function midiInGetID(hMidiIn: HMIDIIN; lpuDeviceID: PUINT): MMRESULT; stdcall;
  913. function midiInMessage(hMidiIn: HMIDIIN; uMessage: UINT; dw1, dw2: DWORD): MMRESULT; stdcall;
  914.  
  915. {***************************************************************************
  916.  
  917.                         Auxiliary audio support
  918.  
  919. ***************************************************************************}
  920.  
  921. { device ID for aux device mapper }
  922. const
  923.   AUX_MAPPER     = UINT(-1);
  924.  
  925. { Auxiliary audio device capabilities structure }
  926. type
  927.   PAuxCapsA = ^TAuxCapsA;
  928.   PAuxCapsW = ^TAuxCapsW;
  929.   PAuxCaps = PAuxCapsA;
  930.   tagAUXCAPSA = record
  931.     wMid: Word;                  { manufacturer ID }
  932.     wPid: Word;                  { product ID }
  933.     vDriverVersion: MMVERSION;        { version of the driver }
  934.     szPname: array[0..MAXPNAMELEN-1] of AnsiChar;  { product name (NULL terminated string) }
  935.     wTechnology: Word;           { type of device }
  936.     dwSupport: DWORD;            { functionality supported by driver }
  937.   end;
  938.   {$nonamespace tagAUXCAPSA}
  939.   TAuxCapsA = tagAUXCAPSA;
  940.   tagAUXCAPSW = record
  941.     wMid: Word;                  { manufacturer ID }
  942.     wPid: Word;                  { product ID }
  943.     vDriverVersion: MMVERSION;        { version of the driver }
  944.     szPname: array[0..MAXPNAMELEN-1] of WideChar;  { product name (NULL terminated string) }
  945.     wTechnology: Word;           { type of device }
  946.     dwSupport: DWORD;            { functionality supported by driver }
  947.   end;
  948.   {$nonamespace tagAUXCAPSW}
  949.   TAuxCapsW = tagAUXCAPSW;
  950.   TAuxCaps = TAuxCapsA;
  951.  
  952. { flags for wTechnology field in AUXCAPS structure }
  953. const
  954.   AUXCAPS_CDAUDIO    = 1;       { audio from internal CD-ROM drive }
  955.   AUXCAPS_AUXIN      = 2;       { audio from auxiliary input jacks }
  956.  
  957. { flags for dwSupport field in AUXCAPS structure }
  958. const
  959.   AUXCAPS_VOLUME     = $0001;  { supports volume control }
  960.   AUXCAPS_LRVOLUME   = $0002;  { separate left-right volume control }
  961.  
  962. { auxiliary audio function prototypes }
  963. function auxGetNumDevs: UINT; stdcall;
  964. function auxGetDevCapsA(uDeviceID: UINT; lpCaps: PAuxCapsA; uSize: UINT): MMRESULT; stdcall;
  965. function auxGetDevCapsW(uDeviceID: UINT; lpCaps: PAuxCapsW; uSize: UINT): MMRESULT; stdcall;
  966. function auxGetDevCaps(uDeviceID: UINT; lpCaps: PAuxCaps; uSize: UINT): MMRESULT; stdcall;
  967. function auxSetVolume(uDeviceID: UINT; dwVolume: DWORD): MMRESULT; stdcall;
  968. function auxGetVolume(uDeviceID: UINT; lpdwVolume: PDWORD): MMRESULT; stdcall;
  969. function auxOutMessage(uDeviceID, uMessage: UINT; dw1, dw2: DWORD): MMRESULT; stdcall;
  970.  
  971. {****************************************************************************
  972.  
  973.                 Mixer Support
  974.  
  975. ****************************************************************************}
  976.  
  977. type
  978.   PHMIXEROBJ = ^HMIXEROBJ;
  979.   HMIXEROBJ = Integer;
  980.   {$nonamespace HMIXEROBJ}
  981.  
  982.   PHMIXER = ^HMIXER;
  983.   HMIXER = Integer;
  984.   {$nonamespace HMIXER}
  985.  
  986. const
  987.   MIXER_SHORT_NAME_CHARS   = 16;
  988.   MIXER_LONG_NAME_CHARS    = 64;
  989.  
  990. { MMRESULT error return values specific to the mixer API }
  991.  
  992.   MIXERR_INVALLINE            = (MIXERR_BASE + 0);
  993.   MIXERR_INVALCONTROL         = (MIXERR_BASE + 1);
  994.   MIXERR_INVALVALUE           = (MIXERR_BASE + 2);
  995.   MIXERR_LASTERROR            = (MIXERR_BASE + 2);
  996.  
  997.   MIXER_OBJECTF_HANDLE    = $80000000;
  998.   MIXER_OBJECTF_MIXER     = $00000000;
  999.   MIXER_OBJECTF_HMIXER    = (MIXER_OBJECTF_HANDLE or MIXER_OBJECTF_MIXER);
  1000.   MIXER_OBJECTF_WAVEOUT   = $10000000;
  1001.   MIXER_OBJECTF_HWAVEOUT  = (MIXER_OBJECTF_HANDLE or MIXER_OBJECTF_WAVEOUT);
  1002.   MIXER_OBJECTF_WAVEIN    = $20000000;
  1003.   MIXER_OBJECTF_HWAVEIN   = (MIXER_OBJECTF_HANDLE or MIXER_OBJECTF_WAVEIN);
  1004.   MIXER_OBJECTF_MIDIOUT   = $30000000;
  1005.   MIXER_OBJECTF_HMIDIOUT  = (MIXER_OBJECTF_HANDLE or MIXER_OBJECTF_MIDIOUT);
  1006.   MIXER_OBJECTF_MIDIIN    = $40000000;
  1007.   MIXER_OBJECTF_HMIDIIN   = (MIXER_OBJECTF_HANDLE or MIXER_OBJECTF_MIDIIN);
  1008.   MIXER_OBJECTF_AUX       = $50000000;
  1009.  
  1010. function mixerGetNumDevs: UINT; stdcall;
  1011.  
  1012. type
  1013.   PMixerCapsA = ^TMixerCapsA;
  1014.   PMixerCapsW = ^TMixerCapsW;
  1015.   PMixerCaps = PMixerCapsA;
  1016.   tagMIXERCAPSA = record
  1017.     wMid: WORD;                    { manufacturer id }
  1018.     wPid: WORD;                    { product id }
  1019.     vDriverVersion: MMVERSION;     { version of the driver }
  1020.     szPname: array [0..MAXPNAMELEN - 1] of AnsiChar;   { product name }
  1021.     fdwSupport: DWORD;             { misc. support bits }
  1022.     cDestinations: DWORD;          { count of destinations }
  1023.   end;
  1024.   {$nonamespace tagMIXERCAPSA}
  1025.   TMixerCapsA = tagMIXERCAPSA;
  1026.   tagMIXERCAPSW = record
  1027.     wMid: WORD;                    { manufacturer id }
  1028.     wPid: WORD;                    { product id }
  1029.     vDriverVersion: MMVERSION;     { version of the driver }
  1030.     szPname: array [0..MAXPNAMELEN - 1] of WideChar;   { product name }
  1031.     fdwSupport: DWORD;             { misc. support bits }
  1032.     cDestinations: DWORD;          { count of destinations }
  1033.   end;
  1034.   {$nonamespace tagMIXERCAPSW}
  1035.   TMixerCapsW = tagMIXERCAPSW;
  1036.   TMixerCaps = TMixerCapsA;
  1037.  
  1038. function mixerGetDevCapsA(uMxId: UINT; pmxcaps: PMixerCapsA; cbmxcaps: UINT): MMRESULT; stdcall;
  1039. function mixerGetDevCapsW(uMxId: UINT; pmxcaps: PMixerCapsW; cbmxcaps: UINT): MMRESULT; stdcall;
  1040. function mixerGetDevCaps(uMxId: UINT; pmxcaps: PMixerCaps; cbmxcaps: UINT): MMRESULT; stdcall;
  1041. function mixerOpen(phmx: PHMIXER; uMxId: UINT; dwCallback, dwInstance, fdwOpen: DWORD): MMRESULT; stdcall;
  1042. function mixerClose(hmx: HMIXER): MMRESULT; stdcall;
  1043. function erMessage(hmx: HMIXER; uMsg: UINT; dwParam1, dwParam2: DWORD): DWORD; stdcall;
  1044.  
  1045. type
  1046.   PMixerLineA = ^TMixerLineA;
  1047.   PMixerLineW = ^TMixerLineW;
  1048.   PMixerLine = PMixerLineA;
  1049.   tagMIXERLINEA = record
  1050.     cbStruct: DWORD;               { size of MIXERLINE structure }
  1051.     dwDestination: DWORD;          { zero based destination index }
  1052.     dwSource: DWORD;               { zero based source index (if source) }
  1053.     dwLineID: DWORD;               { unique line id for mixer device }
  1054.     fdwLine: DWORD;                { state/information about line }
  1055.     dwUser: DWORD;                 { driver specific information }
  1056.     dwComponentType: DWORD;        { component type line connects to }
  1057.     cChannels: DWORD;              { number of channels line supports }
  1058.     cConnections: DWORD;           { number of connections [possible] }
  1059.     cControls: DWORD;              { number of controls at this line }
  1060.     szShortName: array[0..MIXER_SHORT_NAME_CHARS - 1] of AnsiChar;
  1061.     szName: array[0..MIXER_LONG_NAME_CHARS - 1] of AnsiChar;
  1062.     Target: record
  1063.       dwType: DWORD;                 { MIXERLINE_TARGETTYPE_xxxx }
  1064.       dwDeviceID: DWORD;             { target device ID of device type }
  1065.       wMid: WORD;                                   { of target device }
  1066.       wPid: WORD;                                   {      " }
  1067.       vDriverVersion: MMVERSION;                    {      " }
  1068.       szPname: array[0..MAXPNAMELEN - 1] of AnsiChar;  {      " }
  1069.      end;
  1070.   end;
  1071.   {$nonamespace tagMIXERLINEA}
  1072.   TMixerLineA = tagMIXERLINEA;
  1073.   tagMIXERLINEW = record
  1074.     cbStruct: DWORD;               { size of MIXERLINE structure }
  1075.     dwDestination: DWORD;          { zero based destination index }
  1076.     dwSource: DWORD;               { zero based source index (if source) }
  1077.     dwLineID: DWORD;               { unique line id for mixer device }
  1078.     fdwLine: DWORD;                { state/information about line }
  1079.     dwUser: DWORD;                 { driver specific information }
  1080.     dwComponentType: DWORD;        { component type line connects to }
  1081.     cChannels: DWORD;              { number of channels line supports }
  1082.     cConnections: DWORD;           { number of connections [possible] }
  1083.     cControls: DWORD;              { number of controls at this line }
  1084.     szShortName: array[0..MIXER_SHORT_NAME_CHARS - 1] of WideChar;
  1085.     szName: array[0..MIXER_LONG_NAME_CHARS - 1] of WideChar;
  1086.     Target: record
  1087.       dwType: DWORD;                 { MIXERLINE_TARGETTYPE_xxxx }
  1088.       dwDeviceID: DWORD;             { target device ID of device type }
  1089.       wMid: WORD;                                   { of target device }
  1090.       wPid: WORD;                                   {      " }
  1091.       vDriverVersion: MMVERSION;                    {      " }
  1092.       szPname: array[0..MAXPNAMELEN - 1] of WideChar;  {      " }
  1093.      end;
  1094.   end;
  1095.   {$nonamespace tagMIXERLINEW}
  1096.   TMixerLineW = tagMIXERLINEW;
  1097.   TMixerLine = TMixerLineA;
  1098.  
  1099. const
  1100. { TMixerLine.fdwLine }
  1101.  
  1102.   MIXERLINE_LINEF_ACTIVE              = $00000001;
  1103.   MIXERLINE_LINEF_DISCONNECTED        = $00008000;
  1104.   MIXERLINE_LINEF_SOURCE              = $80000000;
  1105.  
  1106. { TMixerLine.dwComponentType
  1107.   component types for destinations and sources }
  1108.  
  1109.   MIXERLINE_COMPONENTTYPE_DST_FIRST       = $00000000;
  1110.   MIXERLINE_COMPONENTTYPE_DST_UNDEFINED   = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 0);
  1111.   MIXERLINE_COMPONENTTYPE_DST_DIGITAL     = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 1);
  1112.   MIXERLINE_COMPONENTTYPE_DST_LINE        = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 2);
  1113.   MIXERLINE_COMPONENTTYPE_DST_MONITOR     = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 3);
  1114.   MIXERLINE_COMPONENTTYPE_DST_SPEAKERS    = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4);
  1115.   MIXERLINE_COMPONENTTYPE_DST_HEADPHONES  = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 5);
  1116.   MIXERLINE_COMPONENTTYPE_DST_TELEPHONE   = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 6);
  1117.   MIXERLINE_COMPONENTTYPE_DST_WAVEIN      = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 7);
  1118.   MIXERLINE_COMPONENTTYPE_DST_VOICEIN     = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8);
  1119.   MIXERLINE_COMPONENTTYPE_DST_LAST        = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8);
  1120.  
  1121.   MIXERLINE_COMPONENTTYPE_SRC_FIRST       = $00001000;
  1122.   MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED   = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0);
  1123.   MIXERLINE_COMPONENTTYPE_SRC_DIGITAL     = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 1);
  1124.   MIXERLINE_COMPONENTTYPE_SRC_LINE        = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2);
  1125.   MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE  = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3);
  1126.   MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 4);
  1127.   MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 5);
  1128.   MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE   = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 6);
  1129.   MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER   = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7);
  1130.   MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT     = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8);
  1131.   MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY   = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9);
  1132.   MIXERLINE_COMPONENTTYPE_SRC_ANALOG      = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10);
  1133.   MIXERLINE_COMPONENTTYPE_SRC_LAST        = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10);
  1134.  
  1135. { TMixerLine.Target.dwType }
  1136.  
  1137.   MIXERLINE_TARGETTYPE_UNDEFINED      = 0;
  1138.   MIXERLINE_TARGETTYPE_WAVEOUT        = 1;
  1139.   MIXERLINE_TARGETTYPE_WAVEIN         = 2;
  1140.   MIXERLINE_TARGETTYPE_MIDIOUT        = 3;
  1141.   MIXERLINE_TARGETTYPE_MIDIIN         = 4;
  1142.   MIXERLINE_TARGETTYPE_AUX            = 5;
  1143.  
  1144. function mixerGetLineInfoA(hmxobj: HMIXEROBJ; pmxl: PMixerLineA; 
  1145.   fdwInfo: DWORD): MMRESULT; stdcall;
  1146. function mixerGetLineInfoW(hmxobj: HMIXEROBJ; pmxl: PMixerLineW; 
  1147.   fdwInfo: DWORD): MMRESULT; stdcall;
  1148. function mixerGetLineInfo(hmxobj: HMIXEROBJ; pmxl: PMixerLine; 
  1149.   fdwInfo: DWORD): MMRESULT; stdcall;
  1150.  
  1151. const
  1152.   MIXER_GETLINEINFOF_DESTINATION      = $00000000;
  1153.   MIXER_GETLINEINFOF_SOURCE           = $00000001;
  1154.   MIXER_GETLINEINFOF_LINEID           = $00000002;
  1155.   MIXER_GETLINEINFOF_COMPONENTTYPE    = $00000003;
  1156.   MIXER_GETLINEINFOF_TARGETTYPE       = $00000004;
  1157.  
  1158.   MIXER_GETLINEINFOF_QUERYMASK        = $0000000F;
  1159.  
  1160. function mixerGetID(hmxobj: HMIXEROBJ; var puMxId: UINT; fdwId: DWORD): MMRESULT; stdcall;
  1161.  
  1162. type
  1163.   PMixerControlA = ^TMixerControlA;
  1164.   PMixerControlW = ^TMixerControlW;
  1165.   PMixerControl = PMixerControlA;
  1166.   tagMIXERCONTROLA = packed record
  1167.     cbStruct: DWORD;           { size in bytes of MIXERCONTROL }
  1168.     dwControlID: DWORD;        { unique control id for mixer device }
  1169.     dwControlType: DWORD;      { MIXERCONTROL_CONTROLTYPE_xxx }
  1170.     fdwControl: DWORD;         { MIXERCONTROL_CONTROLF_xxx }
  1171.     cMultipleItems: DWORD;     { if MIXERCONTROL_CONTROLF_MULTIPLE set }
  1172.     szShortName: array[0..MIXER_SHORT_NAME_CHARS - 1] of AnsiChar;
  1173.     szName: array[0..MIXER_LONG_NAME_CHARS - 1] of AnsiChar;
  1174.     Bounds: record
  1175.       case Integer of
  1176.         0: (lMinimum, lMaximum: Longint);
  1177.         1: (dwMinimum, dwMaximum: DWORD);
  1178.         2: (dwReserved: array[0..5] of DWORD);
  1179.     end;
  1180.     Metrics: record
  1181.       case Integer of
  1182.         0: (cSteps: DWORD);        { # of steps between min & max }
  1183.         1: (cbCustomData: DWORD);  { size in bytes of custom data }
  1184.         2: (dwReserved: array[0..5] of DWORD);
  1185.     end;
  1186.   end;  
  1187.   {$nonamespace tagMIXERCONTROLA}
  1188.   TMixerControlA = tagMIXERCONTROLA;
  1189.   tagMIXERCONTROLW = packed record
  1190.     cbStruct: DWORD;           { size in bytes of MIXERCONTROL }
  1191.     dwControlID: DWORD;        { unique control id for mixer device }
  1192.     dwControlType: DWORD;      { MIXERCONTROL_CONTROLTYPE_xxx }
  1193.     fdwControl: DWORD;         { MIXERCONTROL_CONTROLF_xxx }
  1194.     cMultipleItems: DWORD;     { if MIXERCONTROL_CONTROLF_MULTIPLE set }
  1195.     szShortName: array[0..MIXER_SHORT_NAME_CHARS - 1] of WideChar;
  1196.     szName: array[0..MIXER_LONG_NAME_CHARS - 1] of WideChar;
  1197.     Bounds: record
  1198.       case Integer of
  1199.         0: (lMinimum, lMaximum: Longint);
  1200.         1: (dwMinimum, dwMaximum: DWORD);
  1201.         2: (dwReserved: array[0..5] of DWORD);
  1202.     end;
  1203.     Metrics: record
  1204.       case Integer of
  1205.         0: (cSteps: DWORD);        { # of steps between min & max }
  1206.         1: (cbCustomData: DWORD);  { size in bytes of custom data }
  1207.         2: (dwReserved: array[0..5] of DWORD);
  1208.     end;
  1209.   end;  
  1210.   {$nonamespace tagMIXERCONTROLW}
  1211.   TMixerControlW = tagMIXERCONTROLW;
  1212.   TMixerControl = TMixerControlA;
  1213.  
  1214. const
  1215. { TMixerControl.fdwControl }
  1216.  
  1217.   MIXERCONTROL_CONTROLF_UNIFORM   = $00000001;
  1218.   MIXERCONTROL_CONTROLF_MULTIPLE  = $00000002;
  1219.   MIXERCONTROL_CONTROLF_DISABLED  = $80000000;
  1220.  
  1221. { MIXERCONTROL_CONTROLTYPE_xxx building block defines }
  1222.  
  1223.   MIXERCONTROL_CT_CLASS_MASK          = $F0000000;
  1224.   MIXERCONTROL_CT_CLASS_CUSTOM        = $00000000;
  1225.   MIXERCONTROL_CT_CLASS_METER         = $10000000;
  1226.   MIXERCONTROL_CT_CLASS_SWITCH        = $20000000;
  1227.   MIXERCONTROL_CT_CLASS_NUMBER        = $30000000;
  1228.   MIXERCONTROL_CT_CLASS_SLIDER        = $40000000;
  1229.   MIXERCONTROL_CT_CLASS_FADER         = $50000000;
  1230.   MIXERCONTROL_CT_CLASS_TIME          = $60000000;
  1231.   MIXERCONTROL_CT_CLASS_LIST          = $70000000;
  1232.  
  1233.   MIXERCONTROL_CT_SUBCLASS_MASK       = $0F000000;
  1234.  
  1235.   MIXERCONTROL_CT_SC_SWITCH_BOOLEAN   = $00000000;
  1236.   MIXERCONTROL_CT_SC_SWITCH_BUTTON    = $01000000;
  1237.  
  1238.   MIXERCONTROL_CT_SC_METER_POLLED     = $00000000;
  1239.  
  1240.   MIXERCONTROL_CT_SC_TIME_MICROSECS   = $00000000;
  1241.   MIXERCONTROL_CT_SC_TIME_MILLISECS   = $01000000;
  1242.  
  1243.   MIXERCONTROL_CT_SC_LIST_SINGLE      = $00000000;
  1244.   MIXERCONTROL_CT_SC_LIST_MULTIPLE    = $01000000;
  1245.  
  1246.   MIXERCONTROL_CT_UNITS_MASK          = $00FF0000;
  1247.   MIXERCONTROL_CT_UNITS_CUSTOM        = $00000000;
  1248.   MIXERCONTROL_CT_UNITS_BOOLEAN       = $00010000;
  1249.   MIXERCONTROL_CT_UNITS_SIGNED        = $00020000;
  1250.   MIXERCONTROL_CT_UNITS_UNSIGNED      = $00030000;
  1251.   MIXERCONTROL_CT_UNITS_DECIBELS      = $00040000; { in 10ths }
  1252.   MIXERCONTROL_CT_UNITS_PERCENT       = $00050000; { in 10ths }
  1253.  
  1254. { Commonly used control types for specifying TMixerControl.dwControlType }
  1255.  
  1256.   MIXERCONTROL_CONTROLTYPE_CUSTOM         = (MIXERCONTROL_CT_CLASS_CUSTOM or MIXERCONTROL_CT_UNITS_CUSTOM);
  1257.   MIXERCONTROL_CONTROLTYPE_BOOLEANMETER   = (MIXERCONTROL_CT_CLASS_METER or MIXERCONTROL_CT_SC_METER_POLLED or MIXERCONTROL_CT_UNITS_BOOLEAN);
  1258.   MIXERCONTROL_CONTROLTYPE_SIGNEDMETER    = (MIXERCONTROL_CT_CLASS_METER or MIXERCONTROL_CT_SC_METER_POLLED or MIXERCONTROL_CT_UNITS_SIGNED);
  1259.   MIXERCONTROL_CONTROLTYPE_PEAKMETER      = (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER + 1);
  1260.   MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER  = (MIXERCONTROL_CT_CLASS_METER or MIXERCONTROL_CT_SC_METER_POLLED or MIXERCONTROL_CT_UNITS_UNSIGNED);
  1261.   MIXERCONTROL_CONTROLTYPE_BOOLEAN        = (MIXERCONTROL_CT_CLASS_SWITCH or MIXERCONTROL_CT_SC_SWITCH_BOOLEAN or 
  1262.     MIXERCONTROL_CT_UNITS_BOOLEAN);
  1263.   MIXERCONTROL_CONTROLTYPE_ONOFF          = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1);
  1264.   MIXERCONTROL_CONTROLTYPE_MUTE           = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2);
  1265.   MIXERCONTROL_CONTROLTYPE_MONO           = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 3);
  1266.   MIXERCONTROL_CONTROLTYPE_LOUDNESS       = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 4);
  1267.   MIXERCONTROL_CONTROLTYPE_STEREOENH      = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 5);
  1268.   MIXERCONTROL_CONTROLTYPE_BUTTON         = (MIXERCONTROL_CT_CLASS_SWITCH or MIXERCONTROL_CT_SC_SWITCH_BUTTON or 
  1269.     MIXERCONTROL_CT_UNITS_BOOLEAN);
  1270.   MIXERCONTROL_CONTROLTYPE_DECIBELS       = (MIXERCONTROL_CT_CLASS_NUMBER or MIXERCONTROL_CT_UNITS_DECIBELS);
  1271.   MIXERCONTROL_CONTROLTYPE_SIGNED         = (MIXERCONTROL_CT_CLASS_NUMBER or MIXERCONTROL_CT_UNITS_SIGNED);
  1272.   MIXERCONTROL_CONTROLTYPE_UNSIGNED       = (MIXERCONTROL_CT_CLASS_NUMBER or MIXERCONTROL_CT_UNITS_UNSIGNED);
  1273.   MIXERCONTROL_CONTROLTYPE_PERCENT        = (MIXERCONTROL_CT_CLASS_NUMBER or MIXERCONTROL_CT_UNITS_PERCENT);
  1274.   MIXERCONTROL_CONTROLTYPE_SLIDER         = (MIXERCONTROL_CT_CLASS_SLIDER or MIXERCONTROL_CT_UNITS_SIGNED);
  1275.   MIXERCONTROL_CONTROLTYPE_PAN            = (MIXERCONTROL_CONTROLTYPE_SLIDER + 1);
  1276.   MIXERCONTROL_CONTROLTYPE_QSOUNDPAN      = (MIXERCONTROL_CONTROLTYPE_SLIDER + 2);
  1277.   MIXERCONTROL_CONTROLTYPE_FADER          = (MIXERCONTROL_CT_CLASS_FADER or MIXERCONTROL_CT_UNITS_UNSIGNED);
  1278.   MIXERCONTROL_CONTROLTYPE_VOLUME         = (MIXERCONTROL_CONTROLTYPE_FADER + 1);
  1279.   MIXERCONTROL_CONTROLTYPE_BASS           = (MIXERCONTROL_CONTROLTYPE_FADER + 2);
  1280.   MIXERCONTROL_CONTROLTYPE_TREBLE         = (MIXERCONTROL_CONTROLTYPE_FADER + 3);
  1281.   MIXERCONTROL_CONTROLTYPE_EQUALIZER      = (MIXERCONTROL_CONTROLTYPE_FADER + 4);
  1282.   MIXERCONTROL_CONTROLTYPE_SINGLESELECT   = (MIXERCONTROL_CT_CLASS_LIST or MIXERCONTROL_CT_SC_LIST_SINGLE or MIXERCONTROL_CT_UNITS_BOOLEAN);
  1283.   MIXERCONTROL_CONTROLTYPE_MUX            = (MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1);
  1284.   MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT = (MIXERCONTROL_CT_CLASS_LIST or MIXERCONTROL_CT_SC_LIST_MULTIPLE or MIXERCONTROL_CT_UNITS_BOOLEAN);
  1285.   MIXERCONTROL_CONTROLTYPE_MIXER          = (MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1);
  1286.   MIXERCONTROL_CONTROLTYPE_MICROTIME      = (MIXERCONTROL_CT_CLASS_TIME or MIXERCONTROL_CT_SC_TIME_MICROSECS or 
  1287.     MIXERCONTROL_CT_UNITS_UNSIGNED);
  1288.   MIXERCONTROL_CONTROLTYPE_MILLITIME      = (MIXERCONTROL_CT_CLASS_TIME or MIXERCONTROL_CT_SC_TIME_MILLISECS or 
  1289.     MIXERCONTROL_CT_UNITS_UNSIGNED);
  1290.  
  1291. type
  1292.   PMixerLineControlsA = ^TMixerLineControlsA;
  1293.   PMixerLineControlsW = ^TMixerLineControlsW;
  1294.   PMixerLineControls = PMixerLineControlsA;
  1295.   tagMIXERLINECONTROLSA = record
  1296.     cbStruct: DWORD;               { size in bytes of MIXERLINECONTROLS }
  1297.     dwLineID: DWORD;               { line id (from MIXERLINE.dwLineID) }
  1298.     case Integer of
  1299.       0: (dwControlID: DWORD);     { MIXER_GETLINECONTROLSF_ONEBYID }
  1300.       1: (dwControlType: DWORD;    { MIXER_GETLINECONTROLSF_ONEBYTYPE }
  1301.           cControls: DWORD;        { count of controls pmxctrl points to }
  1302.           cbmxctrl: DWORD;         { size in bytes of _one_ MIXERCONTROL }
  1303.           pamxctrl: PMixerControlA);   { pointer to first MIXERCONTROL array }
  1304.   end;
  1305.   {$nonamespace tagMIXERLINECONTROLSA}
  1306.   TMixerLineControlsA = tagMIXERLINECONTROLSA;
  1307.   tagMIXERLINECONTROLSW = record
  1308.     cbStruct: DWORD;               { size in bytes of MIXERLINECONTROLS }
  1309.     dwLineID: DWORD;               { line id (from MIXERLINE.dwLineID) }
  1310.     case Integer of
  1311.       0: (dwControlID: DWORD);     { MIXER_GETLINECONTROLSF_ONEBYID }
  1312.       1: (dwControlType: DWORD;    { MIXER_GETLINECONTROLSF_ONEBYTYPE }
  1313.           cControls: DWORD;        { count of controls pmxctrl points to }
  1314.           cbmxctrl: DWORD;         { size in bytes of _one_ MIXERCONTROL }
  1315.           pamxctrl: PMixerControlW);   { pointer to first MIXERCONTROL array }
  1316.   end;
  1317.   {$nonamespace tagMIXERLINECONTROLSW}
  1318.   TMixerLineControlsW = tagMIXERLINECONTROLSW;
  1319.   TMixerLineControls = TMixerLineControlsA;
  1320.  
  1321. function mixerGetLineControlsA(hmxobj: HMIXEROBJ; pmxlc: PMixerLineControlsA; fdwControls: DWORD): MMRESULT; stdcall;
  1322. function mixerGetLineControlsW(hmxobj: HMIXEROBJ; pmxlc: PMixerLineControlsW; fdwControls: DWORD): MMRESULT; stdcall;
  1323. function mixerGetLineControls(hmxobj: HMIXEROBJ; pmxlc: PMixerLineControls; fdwControls: DWORD): MMRESULT; stdcall;
  1324.  
  1325. const
  1326.   MIXER_GETLINECONTROLSF_ALL          = $00000000;
  1327.   MIXER_GETLINECONTROLSF_ONEBYID      = $00000001;
  1328.   MIXER_GETLINECONTROLSF_ONEBYTYPE    = $00000002;
  1329.  
  1330.   MIXER_GETLINECONTROLSF_QUERYMASK    = $0000000F;
  1331.  
  1332. type
  1333.   PMixerControlDetails = ^TMixerControlDetails;
  1334.   tMIXERCONTROLDETAILS = record
  1335.     cbStruct: DWORD;       { size in bytes of MIXERCONTROLDETAILS }
  1336.     dwControlID: DWORD;    { control id to get/set details on }
  1337.     cChannels: DWORD;      { number of channels in paDetails array }
  1338.     case Integer of
  1339.        0: (hwndOwner: HWND);        { for MIXER_SETCONTROLDETAILSF_CUSTOM }
  1340.        1: (cMultipleItems: DWORD;   { if _MULTIPLE, the number of items per channel }
  1341.            cbDetails: DWORD;        { size of _one_ details_XX struct }
  1342.            paDetails: Pointer);     { pointer to array of details_XX structs }
  1343.   end;
  1344.   {$nonamespace tMIXERCONTROLDETAILS}
  1345.  
  1346.   PMixerControlDetailsListTextA = ^TMixerControlDetailsListTextA;
  1347.   PMixerControlDetailsListTextW = ^TMixerControlDetailsListTextW;
  1348.   PMixerControlDetailsListText = PMixerControlDetailsListTextA;
  1349.   tagMIXERCONTROLDETAILS_LISTTEXTA = record
  1350.     dwParam1: DWORD;
  1351.     dwParam2: DWORD;
  1352.     szName: array[0..MIXER_LONG_NAME_CHARS - 1] of AnsiChar;
  1353.   end;
  1354.   {$nonamespace tagMIXERCONTROLDETAILS_LISTTEXTA}
  1355.   TMixerControlDetailsListTextA = tagMIXERCONTROLDETAILS_LISTTEXTA;
  1356.   tagMIXERCONTROLDETAILS_LISTTEXTW = record
  1357.     dwParam1: DWORD;
  1358.     dwParam2: DWORD;
  1359.     szName: array[0..MIXER_LONG_NAME_CHARS - 1] of WideChar;
  1360.   end;
  1361.   {$nonamespace tagMIXERCONTROLDETAILS_LISTTEXTW}
  1362.   TMixerControlDetailsListTextW = tagMIXERCONTROLDETAILS_LISTTEXTW;
  1363.   TMixerControlDetailsListText = TMixerControlDetailsListTextA;
  1364.  
  1365.   PMixerControlDetailsBoolean = ^TMixerControlDetailsBoolean;
  1366.   tMIXERCONTROLDETAILS_BOOLEAN = record
  1367.     fValue: Longint;
  1368.   end;
  1369.   {$nonamespace tMIXERCONTROLDETAILS_BOOLEAN}
  1370.   TMixerControlDetailsBoolean = tMIXERCONTROLDETAILS_BOOLEAN;
  1371.  
  1372.   PMixerControlDetailsSigned = ^TMixerControlDetailsSigned;
  1373.   tMIXERCONTROLDETAILS_SIGNED = record
  1374.     lValue: Longint;
  1375.   end;
  1376.   {$nonamespace tMIXERCONTROLDETAILS_SIGNED}
  1377.   TMixerControlDetailsSigned = tMIXERCONTROLDETAILS_SIGNED;
  1378.  
  1379.   PMixerControlDetailsUnsigned = ^TMixerControlDetailsUnsigned;
  1380.   tMIXERCONTROLDETAILS_UNSIGNED = record
  1381.     dwValue: DWORD;
  1382.   end;
  1383.   {$nonamespace tMIXERCONTROLDETAILS_UNSIGNED}
  1384.   TMixerControlDetailsUnsigned = tMIXERCONTROLDETAILS_UNSIGNED;
  1385.  
  1386. function mixerGetControlDetailsA(hmxobj: HMIXEROBJ; pmxcd: PMixerControlDetails; fdwDetails: DWORD): MMRESULT; stdcall;
  1387. function mixerGetControlDetailsW(hmxobj: HMIXEROBJ; pmxcd: PMixerControlDetails; fdwDetails: DWORD): MMRESULT; stdcall;
  1388. function mixerGetControlDetails(hmxobj: HMIXEROBJ; pmxcd: PMixerControlDetails; fdwDetails: DWORD): MMRESULT; stdcall;
  1389.  
  1390. const
  1391.   MIXER_GETCONTROLDETAILSF_VALUE      = $00000000;
  1392.   MIXER_GETCONTROLDETAILSF_LISTTEXT   = $00000001;
  1393.  
  1394.   MIXER_GETCONTROLDETAILSF_QUERYMASK  = $0000000F;
  1395.  
  1396. function mixerSetControlDetails(hmxobj: HMIXEROBJ; pmxcd: PMixerControlDetails; fdwDetails: DWORD): MMRESULT; stdcall;
  1397.  
  1398. const
  1399.   MIXER_SETCONTROLDETAILSF_VALUE      = $00000000;
  1400.   MIXER_SETCONTROLDETAILSF_CUSTOM     = $00000001;
  1401.  
  1402.   MIXER_SETCONTROLDETAILSF_QUERYMASK  = $0000000F;
  1403.  
  1404. {***************************************************************************
  1405.  
  1406.                             Timer support
  1407.  
  1408. ***************************************************************************}
  1409.  
  1410. { timer error return values }
  1411. const
  1412.   TIMERR_NOERROR        = 0;                  { no error }
  1413.   TIMERR_NOCANDO        = TIMERR_BASE+1;      { request not completed }
  1414.   TIMERR_STRUCT         = TIMERR_BASE+33;     { time struct size }
  1415.  
  1416. { timer data types }
  1417. type
  1418.   TFNTimeCallBack = procedure(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD);
  1419.  
  1420. { flags for wFlags parameter of timeSetEvent() function }
  1421. const
  1422.   TIME_ONESHOT    = 0;   { program timer for single event }
  1423.   TIME_PERIODIC   = 1;   { program for continuous periodic event }
  1424.   TIME_CALLBACK_FUNCTION    = $0000;  { callback is function }
  1425.   TIME_CALLBACK_EVENT_SET   = $0010;  { callback is event - use SetEvent }
  1426.   TIME_CALLBACK_EVENT_PULSE = $0020;  { callback is event - use PulseEvent }
  1427.  
  1428. { timer device capabilities data structure }
  1429. type
  1430.   PTimeCaps = ^TTimeCaps;
  1431.   timecaps_tag = record
  1432.     wPeriodMin: UINT;     { minimum period supported  }
  1433.     wPeriodMax: UINT;     { maximum period supported  }
  1434.   end;
  1435.   {$nonamespace timecaps_tag}
  1436.   TTimeCaps = timecaps_tag;
  1437.  
  1438. { timer function prototypes }
  1439. function timeGetSystemTime(lpTime: PMMTime; uSize: Word): MMRESULT; stdcall;
  1440.  
  1441. function timeGetTime: DWORD; stdcall;
  1442. function timeSetEvent(uDelay, uResolution: UINT;
  1443.   lpFunction: TFNTimeCallBack; dwUser: DWORD; uFlags: UINT): MMRESULT; stdcall;
  1444. function timeKillEvent(uTimerID: UINT): MMRESULT; stdcall;
  1445. function timeGetDevCaps(lpTimeCaps: PTimeCaps; uSize: UINT): MMRESULT; stdcall;
  1446. function timeBeginPeriod(uPeriod: UINT): MMRESULT; stdcall;
  1447. function timeEndPeriod(uPeriod: UINT): MMRESULT; stdcall;
  1448.  
  1449. {***************************************************************************
  1450.  
  1451.                             Joystick support
  1452.  
  1453. ***************************************************************************}
  1454.  
  1455. { joystick error return values }
  1456. const
  1457.   JOYERR_NOERROR        = 0;                  { no error }
  1458.   JOYERR_PARMS          = JOYERR_BASE+5;      { bad parameters }
  1459.   JOYERR_NOCANDO        = JOYERR_BASE+6;      { request not completed }
  1460.   JOYERR_UNPLUGGED      = JOYERR_BASE+7;      { joystick is unplugged }
  1461.  
  1462. { constants used with TJoyInfo and TJoyInfoEx structure and MM_JOY* messages }
  1463. const
  1464.   JOY_BUTTON1         = $0001;
  1465.   JOY_BUTTON2         = $0002;
  1466.   JOY_BUTTON3         = $0004;
  1467.   JOY_BUTTON4         = $0008;
  1468.   JOY_BUTTON1CHG      = $0100;
  1469.   JOY_BUTTON2CHG      = $0200;
  1470.   JOY_BUTTON3CHG      = $0400;
  1471.   JOY_BUTTON4CHG      = $0800;
  1472.  
  1473. { constants used with TJoyInfoEx }
  1474.   JOY_BUTTON5         = $00000010;
  1475.   JOY_BUTTON6         = $00000020;
  1476.   JOY_BUTTON7         = $00000040;
  1477.   JOY_BUTTON8         = $00000080;
  1478.   JOY_BUTTON9         = $00000100;
  1479.   JOY_BUTTON10        = $00000200;
  1480.   JOY_BUTTON11        = $00000400;
  1481.   JOY_BUTTON12        = $00000800;
  1482.   JOY_BUTTON13        = $00001000;
  1483.   JOY_BUTTON14        = $00002000;
  1484.   JOY_BUTTON15        = $00004000;
  1485.   JOY_BUTTON16        = $00008000;
  1486.   JOY_BUTTON17        = $00010000;
  1487.   JOY_BUTTON18        = $00020000;
  1488.   JOY_BUTTON19        = $00040000;
  1489.   JOY_BUTTON20        = $00080000;
  1490.   JOY_BUTTON21        = $00100000;
  1491.   JOY_BUTTON22        = $00200000;
  1492.   JOY_BUTTON23        = $00400000;
  1493.   JOY_BUTTON24        = $00800000;
  1494.   JOY_BUTTON25        = $01000000;
  1495.   JOY_BUTTON26        = $02000000;
  1496.   JOY_BUTTON27        = $04000000;
  1497.   JOY_BUTTON28        = $08000000;
  1498.   JOY_BUTTON29        = $10000000;
  1499.   JOY_BUTTON30        = $20000000;
  1500.   JOY_BUTTON31        = $40000000;
  1501.   JOY_BUTTON32        = $80000000;
  1502.  
  1503. { constants used with TJoyInfoEx }
  1504.   JOY_POVCENTERED    = -1;
  1505.   JOY_POVFORWARD    = 0;
  1506.   JOY_POVRIGHT        = 9000;
  1507.   JOY_POVBACKWARD    = 18000;
  1508.   JOY_POVLEFT        = 27000;
  1509.  
  1510.   JOY_RETURNX        = $00000001;
  1511.   JOY_RETURNY        = $00000002;
  1512.   JOY_RETURNZ        = $00000004;
  1513.   JOY_RETURNR        = $00000008;
  1514.   JOY_RETURNU        = $00000010; { axis 5 }
  1515.   JOY_RETURNV        = $00000020; { axis 6 }
  1516.   JOY_RETURNPOV        = $00000040;
  1517.   JOY_RETURNBUTTONS    = $00000080;
  1518.   JOY_RETURNRAWDATA    = $00000100;
  1519.   JOY_RETURNPOVCTS    = $00000200;
  1520.   JOY_RETURNCENTERED    = $00000400;
  1521.   JOY_USEDEADZONE        = $00000800;
  1522.   JOY_RETURNALL  = (JOY_RETURNX or JOY_RETURNY or JOY_RETURNZ or
  1523.     JOY_RETURNR or JOY_RETURNU or JOY_RETURNV or
  1524.     JOY_RETURNPOV or JOY_RETURNBUTTONS);
  1525.   JOY_CAL_READALWAYS    = $00010000;
  1526.   JOY_CAL_READXYONLY    = $00020000;
  1527.   JOY_CAL_READ3        = $00040000;
  1528.   JOY_CAL_READ4        = $00080000;
  1529.   JOY_CAL_READXONLY    = $00100000;
  1530.   JOY_CAL_READYONLY    = $00200000;
  1531.   JOY_CAL_READ5        = $00400000;
  1532.   JOY_CAL_READ6        = $00800000;
  1533.   JOY_CAL_READZONLY    = $01000000;
  1534.   JOY_CAL_READRONLY    = $02000000;
  1535.   JOY_CAL_READUONLY    = $04000000;
  1536.   JOY_CAL_READVONLY    = $08000000;
  1537.  
  1538. { joystick ID constants }
  1539. const
  1540.   JOYSTICKID1         = 0;
  1541.   JOYSTICKID2         = 1;
  1542.  
  1543. { joystick driver capabilites }
  1544.   JOYCAPS_HASZ        = $000;
  1545.   JOYCAPS_HASR        = $0002;
  1546.   JOYCAPS_HASU        = $0004;
  1547.   JOYCAPS_HASV        = $0008;
  1548.   JOYCAPS_HASPOV        = $0010;
  1549.   JOYCAPS_POV4DIR        = $0020;
  1550.   JOYCAPS_POVCTS        = $0040;
  1551.  
  1552. { joystick device capabilities data structure }
  1553. type
  1554.   PJoyCapsA = ^TJoyCapsA;
  1555.   PJoyCapsW = ^TJoyCapsW;
  1556.   PJoyCaps = PJoyCapsA;
  1557.   tagJOYCAPSA = record
  1558.     wMid: Word;                  { manufacturer ID }
  1559.     wPid: Word;                  { product ID }
  1560.     szPname: array[0..MAXPNAMELEN-1] of AnsiChar;  { product name (NULL terminated string) }
  1561.     wXmin: UINT;                 { minimum x position value }
  1562.     wXmax: UINT;                 { maximum x position value }
  1563.     wYmin: UINT;                 { minimum y position value }
  1564.     wYmax: UINT;                 { maximum y position value }
  1565.     wZmin: UINT;                 { minimum z position value }
  1566.     wZmax: UINT;                 { maximum z position value }
  1567.     wNumButtons: UINT;           { number of buttons }
  1568.     wPeriodMin: UINT;            { minimum message period when captured }
  1569.     wPeriodMax: UINT;            { maximum message period when captured }
  1570.     wRmin: UINT;                 { minimum r position value }
  1571.     wRmax: UINT;                 { maximum r position value }
  1572.     wUmin: UINT;                 { minimum u (5th axis) position value }
  1573.     wUmax: UINT;                 { maximum u (5th axis) position value }
  1574.     wVmin: UINT;                 { minimum v (6th axis) position value }
  1575.     wVmax: UINT;                 { maximum v (6th axis) position value }
  1576.     wCaps: UINT;                 { joystick capabilites }
  1577.     wMaxAxes: UINT;         { maximum number of axes supported }
  1578.     wNumAxes: UINT;         { number of axes in use }
  1579.     wMaxButtons: UINT;         { maximum number of buttons supported }
  1580.     szRegKey: array[0..MAXPNAMELEN - 1] of AnsiChar; { registry key }
  1581.     szOEMVxD: array[0..MAX_JOYSTICKOEMVXDNAME - 1] of AnsiChar; { OEM VxD in use }
  1582.   end;
  1583.   {$nonamespace tagJOYCAPSA}
  1584.   TJoyCapsA = tagJOYCAPSA;
  1585.   tagJOYCAPSW = record
  1586.     wMid: Word;                  { manufacturer ID }
  1587.     wPid: Word;                  { product ID }
  1588.     szPname: array[0..MAXPNAMELEN-1] of WideChar;  { product name (NULL terminated string) }
  1589.     wXmin: UINT;                 { minimum x position value }
  1590.     wXmax: UINT;                 { maximum x position value }
  1591.     wYmin: UINT;                 { minimum y position value }
  1592.     wYmax: UINT;                 { maximum y position value }
  1593.     wZmin: UINT;                 { minimum z position value }
  1594.     wZmax: UINT;                 { maximum z position value }
  1595.     wNumButtons: UINT;           { number of buttons }
  1596.     wPeriodMin: UINT;            { minimum message period when captured }
  1597.     wPeriodMax: UINT;            { maximum message period when captured }
  1598.     wRmin: UINT;                 { minimum r position value }
  1599.     wRmax: UINT;                 { maximum r position value }
  1600.     wUmin: UINT;                 { minimum u (5th axis) position value }
  1601.     wUmax: UINT;                 { maximum u (5th axis) position value }
  1602.     wVmin: UINT;                 { minimum v (6th axis) position value }
  1603.     wVmax: UINT;                 { maximum v (6th axis) position value }
  1604.     wCaps: UINT;                 { joystick capabilites }
  1605.     wMaxAxes: UINT;         { maximum number of axes supported }
  1606.     wNumAxes: UINT;         { number of axes in use }
  1607.     wMaxButtons: UINT;         { maximum number of buttons supported }
  1608.     szRegKey: array[0..MAXPNAMELEN - 1] of WideChar; { registry key }
  1609.     szOEMVxD: array[0..MAX_JOYSTICKOEMVXDNAME - 1] of WideChar; { OEM VxD in use }
  1610.   end;
  1611.   {$nonamespace tagJOYCAPSW}
  1612.   TJoyCapsW = tagJOYCAPSW;
  1613.   TJoyCaps = TJoyCapsA;
  1614.  
  1615. { joystick information data structure }
  1616. type
  1617.   PJoyInfo = ^TJoyInfo;
  1618.   joyinfo_tag = record
  1619.     wXpos: UINT;                 { x position }
  1620.     wYpos: UINT;                 { y position }
  1621.     wZpos: UINT;                 { z position }
  1622.     wButtons: UINT;              { button states }
  1623.   end;
  1624.   {$nonamespace joyinfo_tag}
  1625.   TJoyInfo = joyinfo_tag;
  1626.  
  1627.   PJoyInfoEx = ^TJoyInfoEx;
  1628.   joyinfoex_tag = record
  1629.     dwSize: DWORD;         { size of structure }
  1630.     dwFlags: DWORD;         { flags to indicate what to return }
  1631.     wXpos: UINT;         { x position }
  1632.     wYpos: UINT;         { y position }
  1633.     wZpos: UINT;         { z position }
  1634.     dwRpos: DWORD;         { rudder/4th axis position }
  1635.     dwUpos: DWORD;         { 5th axis position }
  1636.     dwVpos: DWORD;         { 6th axis position }
  1637.     wButtons: UINT;      { button states }
  1638.     dwButtonNumber: DWORD;  { current button number pressed }
  1639.     dwPOV: DWORD;           { point of view state }
  1640.     dwReserved1: DWORD;         { reserved for communication between winmm & driver }
  1641.     dwReserved2: DWORD;         { reserved for future expansion }
  1642.   end;
  1643.   {$nonamespace joyinfoex_tag}
  1644.   TJoyInfoEx = joyinfoex_tag;
  1645.  
  1646. { joystick function prototypes }
  1647. function joyGetNumDevs: UINT; stdcall;
  1648. function joyGetDevCapsA(uJoyID: UINT; lpCaps: PJoyCapsA; uSize: UINT): MMRESULT; stdcall;
  1649. function joyGetDevCapsW(uJoyID: UINT; lpCaps: PJoyCapsW; uSize: UINT): MMRESULT; stdcall;
  1650. function joyGetDevCaps(uJoyID: UINT; lpCaps: PJoyCaps; uSize: UINT): MMRESULT; stdcall;
  1651. function joyGetPos(uJoyID: UINT; lpInfo: PJoyInfo): MMRESULT; stdcall;
  1652. function joyGetPosEx(uJoyID: UINT; lpInfo: PJoyInfoEx): MMRESULT; stdcall;
  1653. function joyGetThreshold(uJoyID: UINT; lpuThreshold: PUINT): MMRESULT; stdcall;
  1654. function joyReleaseCapture(uJoyID: UINT): MMRESULT; stdcall;
  1655. function joySetCapture(Handle: HWND; uJoyID, uPeriod: UINT; bChanged: BOOL): MMRESULT; stdcall;
  1656. function joySetThreshold(uJoyID, uThreshold: UINT): MMRESULT; stdcall;
  1657.  
  1658. {***************************************************************************
  1659.  
  1660.                         Multimedia File I/O support
  1661.  
  1662. ***************************************************************************}
  1663.  
  1664. { MMIO error return values }
  1665. const
  1666.   MMIOERR_BASE            = 256;
  1667.   MMIOERR_FILENOTFOUND    = MMIOERR_BASE + 1;  { file not found }
  1668.   MMIOERR_OUTOFMEMORY     = MMIOERR_BASE + 2;  { out of memory }
  1669.   MMIOERR_CANNOTOPEN      = MMIOERR_BASE + 3;  { cannot open }
  1670.   MMIOERR_CANNOTCLOSE     = MMIOERR_BASE + 4;  { cannot close }
  1671.   MMIOERR_CANNOTREAD      = MMIOERR_BASE + 5;  { cannot read }
  1672.   MMIOERR_CANNOTWRITE     = MMIOERR_BASE + 6;  { cannot write }
  1673.   MMIOERR_CANNOTSEEK      = MMIOERR_BASE + 7;  { cannot seek }
  1674.   MMIOERR_CANNOTEXPAND    = MMIOERR_BASE + 8;  { cannot expand file }
  1675.   MMIOERR_CHUNKNOTFOUND   = MMIOERR_BASE + 9;  { chunk not found }
  1676.   MMIOERR_UNBUFFERED      = MMIOERR_BASE + 10; { file is unbuffered }
  1677.   MMIOERR_PATHNOTFOUND        = MMIOERR_BASE + 11;  { path incorrect }
  1678.   MMIOERR_ACCESSDENIED        = MMIOERR_BASE + 12;  { file was protected }
  1679.   MMIOERR_SHARINGVIOLATION    = MMIOERR_BASE + 13;  { file in use }
  1680.   MMIOERR_NETWORKERROR        = MMIOERR_BASE + 14;  { network not responding }
  1681.   MMIOERR_TOOMANYOPENFILES    = MMIOERR_BASE + 15;  { no more file handles  }
  1682.   MMIOERR_INVALIDFILE         = MMIOERR_BASE + 16;  { default error file error }
  1683.  
  1684. { MMIO constants }
  1685. const
  1686.   CFSEPCHAR       = '+';             { compound file name separator char. }
  1687.  
  1688. type
  1689. { MMIO data types }
  1690.   FOURCC = DWORD;                    { a four character code }
  1691.   {$nonamespace FOURCC}
  1692.  
  1693.   PHMMIO = ^HMMIO;
  1694.   HMMIO = Integer;      { a handle to an open file }
  1695.   {$nonamespace HMMIO}
  1696.  
  1697.   TFNMMIOProc = function(lpmmioinfo: PChar; uMessage: UINT; lParam1, lParam2: LPARAM): Longint stdcall;
  1698.  
  1699. { general MMIO information data structure }
  1700. type
  1701.   PMMIOInfo = ^TMMIOInfo;
  1702.   _MMIOINFO = record
  1703.     { general fields }
  1704.     dwFlags: DWORD;        { general status flags }
  1705.     fccIOProc: FOURCC;      { pointer to I/O procedure }
  1706.     pIOProc: TFNMMIOProc;        { pointer to I/O procedure }
  1707.     wErrorRet: UINT;      { place for error to be returned }
  1708.     hTask: HTASK;          { alternate local task }
  1709.  
  1710.     { fields maintained by MMIO functions during buffered I/O }
  1711.     cchBuffer: Longint;      { size of I/O buffer (or 0L) }
  1712.     pchBuffer: PChar;      { start of I/O buffer (or NULL) }
  1713.     pchNext: PChar;        { pointer to next byte to read/write }
  1714.     pchEndRead: PChar;     { pointer to last valid byte to read }
  1715.     pchEndWrite: PChar;    { pointer to last byte to write }
  1716.     lBufOffset: Longint;     { disk offset of start of buffer }
  1717.  
  1718.     { fields maintained by I/O procedure }
  1719.     lDiskOffset: Longint;    { disk offset of next read or write }
  1720.     adwInfo: array[0..2] of DWORD;     { data specific to type of MMIOPROC }
  1721.  
  1722.     { other fields maintained by MMIO }
  1723.     dwReserved1: DWORD;    { reserved for MMIO use }
  1724.     dwReserved2: DWORD;    { reserved for MMIO use }
  1725.     hmmio: HMMIO;          { handle to open file }
  1726.   end;
  1727.   {$nonamespace _MMIOINFO}
  1728.   TMMIOInfo = _MMIOINFO;
  1729.  
  1730. { RIFF chunk information data structure }
  1731. type
  1732.  
  1733.   PMMCKInfo = ^TMMCKInfo;
  1734.   _MMCKINFO = record
  1735.     ckid: FOURCC;           { chunk ID }
  1736.     cksize: DWORD;         { chunk size }
  1737.     fccType: FOURCC;        { form type or list type }
  1738.     dwDataOffset: DWORD;   { offset of data portion of chunk }
  1739.     dwFlags: DWORD;        { flags used by MMIO functions }
  1740.   end;
  1741.   {$nonamespace _MMCKINFO}
  1742.   TMMCKInfo = _MMCKINFO;
  1743.  
  1744. { bit field masks }
  1745. const
  1746.   MMIO_RWMODE     = $00000003;      { open file for reading/writing/both }
  1747.   MMIO_SHAREMODE  = $00000070;      { file sharing mode number }
  1748.  
  1749. { constants for dwFlags field of MMIOINFO }
  1750. const
  1751.   MMIO_CREATE    = $00001000;     { create new file (or truncate file) }
  1752.   MMIO_PARSE     = $00000100;     { parse new file returning path }
  1753.   MMIO_DELETE    = $00000200;     { create new file (or truncate file) }
  1754.   MMIO_EXIST     = $00004000;     { checks for existence of file }
  1755.   MMIO_ALLOCBUF  = $00010000;     { mmioOpen() should allocate a buffer }
  1756.   MMIO_GETTEMP   = $00020000;     { mmioOpen() should retrieve temp name }
  1757.  
  1758. const
  1759.   MMIO_DIRTY     = $10000000;     { I/O buffer is dirty }
  1760.  
  1761. { read/write mode numbers (bit field MMIO_RWMODE) }
  1762. const
  1763.   MMIO_READ       = $00000000;      { open file for reading only }
  1764.   MMIO_WRITE      = $00000001;      { open file for writing only }
  1765.   MMIO_READWRITE  = $00000002;      { open file for reading and writing }
  1766.  
  1767. { share mode numbers (bit field MMIO_SHAREMODE) }
  1768. const
  1769.   MMIO_COMPAT     = $00000000;      { compatibility mode }
  1770.   MMIO_EXCLUSIVE  = $00000010;      { exclusive-access mode }
  1771.   MMIO_DENYWRITE  = $00000020;      { deny writing to other processes }
  1772.   MMIO_DENYREAD   = $00000030;      { deny reading to other processes }
  1773.   MMIO_DENYNONE   = $00000040;      { deny nothing to other processes }
  1774.  
  1775. { various MMIO flags }
  1776. const
  1777.   MMIO_FHOPEN             = $0010;  { mmioClose: keep file handle open }
  1778.   MMIO_EMPTYBUF           = $0010;  { mmioFlush: empty the I/O buffer }
  1779.   MMIO_TOUPPER            = $0010;  { mmioStringToFOURCC: to u-case }
  1780.   MMIO_INSTALLPROC    = $00010000;  { mmioInstallIOProc: install MMIOProc }
  1781.   MMIO_GLOBALPROC     = $10000000;  { mmioInstallIOProc: install globally }
  1782.   MMIO_REMOVEPROC     = $00020000;  { mmioInstallIOProc: remove MMIOProc }
  1783.   MMIO_UNICODEPROC    = $01000000;  { mmioInstallIOProc: Unicode MMIOProc }
  1784.   MMIO_FINDPROC       = $00040000;  { mmioInstallIOProc: find an MMIOProc }
  1785.   MMIO_FINDCHUNK          = $0010;  { mmioDescend: find a chunk by ID }
  1786.   MMIO_FINDRIFF           = $0020;  { mmioDescend: find a LIST chunk }
  1787.   MMIO_FINDLIST           = $0040;  { mmioDescend: find a RIFF chunk }
  1788.   MMIO_CREATERIFF         = $0020;  { mmioCreateChunk: make a LIST chunk }
  1789.   MMIO_CREATELIST         = $0040;  { mmioCreateChunk: make a RIFF chunk }
  1790.  
  1791. { message numbers for MMIOPROC I/O procedure functions }
  1792. const
  1793.   MMIOM_READ      = MMIO_READ;       { read }
  1794.   MMIOM_WRITE    = MMIO_WRITE;       { write }
  1795.   MMIOM_SEEK              = 2;       { seek to a new position in file }
  1796.   MMIOM_OPEN              = 3;       { open file }
  1797.   MMIOM_CLOSE             = 4;       { close file }
  1798.   MMIOM_WRITEFLUSH        = 5;       { write and flush }
  1799.  
  1800. const
  1801.   MMIOM_RENAME            = 6;       { rename specified file }
  1802.  
  1803.   MMIOM_USER         = $8000;       { beginning of user-defined messages }
  1804.  
  1805. { standard four character codes }
  1806. const
  1807.   FOURCC_RIFF = $46464952;   { 'RIFF' }
  1808.   FOURCC_LIST = $5453494C;   { 'LIST' }
  1809.  
  1810. { four character codes used to identify standard built-in I/O procedures }
  1811. const
  1812.   FOURCC_DOS  = $20532F44;   { 'DOS '}
  1813.   FOURCC_MEM  = $204D454D;   { 'MEM '}
  1814.  
  1815. { flags for mmioSeek() }
  1816. const
  1817.   SEEK_SET        = 0;               { seek to an absolute position }
  1818.   SEEK_CUR        = 1;               { seek relative to current position }
  1819.   SEEK_END        = 2;               { seek relative to end of file }
  1820.  
  1821. { other constants }
  1822. const
  1823.   MMIO_DEFAULTBUFFER      = 8192;    { default buffer size }
  1824.  
  1825. { MMIO function prototypes }
  1826. function mmioStringToFOURCCA(sz: PAnsiChar; uFlags: UINT): FOURCC; stdcall;
  1827. function mmioStringToFOURCCW(sz: PWideChar; uFlags: UINT): FOURCC; stdcall;
  1828. function mmioStringToFOURCC(sz: PChar; uFlags: UINT): FOURCC; stdcall;
  1829. function mmioInstallIOProcA(fccIOProc: FOURCC; pIOProc: TFNMMIOProc;
  1830.   dwFlags: DWORD): TFNMMIOProc; stdcall;
  1831. function mmioInstallIOProcW(fccIOProc: FOURCC; pIOProc: TFNMMIOProc;
  1832.   dwFlags: DWORD): TFNMMIOProc; stdcall;
  1833. function mmioInstallIOProc(fccIOProc: FOURCC; pIOProc: TFNMMIOProc;
  1834.   dwFlags: DWORD): TFNMMIOProc; stdcall;
  1835. function mmioOpenA(szFileName: PChar; lpmmioinfo: PMMIOInfo;
  1836.   dwOpenFlags: DWORD): HMMIO; stdcall;
  1837. function mmioOpenW(szFileName: PChar; lpmmioinfo: PMMIOInfo;
  1838.   dwOpenFlags: DWORD): HMMIO; stdcall;
  1839. function mmioOpen(szFileName: PChar; lpmmioinfo: PMMIOInfo;
  1840.   dwOpenFlags: DWORD): HMMIO; stdcall;
  1841. function mmioRenameA(szFileName, szNewFileName: PAnsiChar;
  1842.   lpmmioinfo: PMMIOInfo; dwRenameFlags: DWORD): MMRESULT; stdcall;
  1843. function mmioRenameW(szFileName, szNewFileName: PWideChar;
  1844.   lpmmioinfo: PMMIOInfo; dwRenameFlags: DWORD): MMRESULT; stdcall;
  1845. function mmioRename(szFileName, szNewFileName: PChar;
  1846.   lpmmioinfo: PMMIOInfo; dwRenameFlags: DWORD): MMRESULT; stdcall;
  1847. function mmioClose(hmmio: HMMIO; uFlags: UINT): MMRESULT; stdcall;
  1848. function mmioRead(hmmio: HMMIO; pch: PChar; cch: Longint): Longint; stdcall;
  1849. function mmioWrite(hmmio: HMMIO; pch: PChar; cch: Longint): Longint; stdcall;
  1850. function mmioSeek(hmmio: HMMIO; lOffset: Longint; 
  1851.   iOrigin: Integer): Longint; stdcall;
  1852. function mmioGetInfo(hmmio: HMMIO; lpmmioinfo: PMMIOInfo; uFlags: UINT): MMRESULT; stdcall;
  1853. function mmioSetInfo(hmmio: HMMIO; lpmmioinfo: PMMIOInfo; uFlags: UINT): MMRESULT; stdcall;
  1854. function mmioSetBuffer(hmmio: HMMIO; pchBuffer: PChar; cchBuffer: Longint;
  1855.   uFlags: Word): MMRESULT; stdcall;
  1856. function mmioFlush(hmmio: HMMIO; uFlags: UINT): MMRESULT; stdcall;
  1857. function mmioAdvance(hmmio: HMMIO; lpmmioinfo: PMMIOInfo; uFlags: UINT): MMRESULT; stdcall;
  1858. function mmioSendMessage(hmmio: HMMIO; uMessage: UINT;
  1859.   lParam1, lParam2: DWORD): Longint; stdcall;
  1860. function mmioDescend(hmmio: HMMIO; lpck: PMMCKInfo;
  1861.   lpckParent: PMMCKInfo; uFlags: UINT): MMRESULT; stdcall;
  1862. function mmioAscend(hmmio: HMMIO; lpck: PMMCKInfo; uFlags: UINT): MMRESULT; stdcall;
  1863. function mmioCreateChunk(hmmio: HMMIO; lpck: PMMCKInfo; uFlags: UINT): MMRESULT; stdcall;
  1864.  
  1865. {***************************************************************************
  1866.  
  1867.                             MCI support
  1868.  
  1869. ***************************************************************************}
  1870.  
  1871. type
  1872.   MCIERROR = DWORD;     { error return code, 0 means no error }
  1873.   {$nonamespace MCIERROR}
  1874.   MCIDEVICEID = UINT;   { MCI device ID type }
  1875.   {$nonamespace MCIDEVICEID}
  1876.  
  1877.   TFNYieldProc = function(mciId: MCIDEVICEID; dwYieldData: DWORD): UINT stdcall;
  1878.  
  1879. { MCI function prototypes }
  1880. function mciSendCommandA(mciId: MCIDEVICEID; uMessage: UINT;
  1881.   dwParam1, dwParam2: DWORD): MCIERROR; stdcall;
  1882. function mciSendCommandW(mciId: MCIDEVICEID; uMessage: UINT;
  1883.   dwParam1, dwParam2: DWORD): MCIERROR; stdcall;
  1884. function mciSendCommand(mciId: MCIDEVICEID; uMessage: UINT;
  1885.   dwParam1, dwParam2: DWORD): MCIERROR; stdcall;
  1886. function mciSendStringA(lpstrCommand, lpstrReturnString: PAnsiChar;
  1887.   uReturnLength: UINT; hWndCallback: HWND): MCIERROR; stdcall;
  1888. function mciSendStringW(lpstrCommand, lpstrReturnString: PWideChar;
  1889.   uReturnLength: UINT; hWndCallback: HWND): MCIERROR; stdcall;
  1890. function mciSendString(lpstrCommand, lpstrReturnString: PChar;
  1891.   uReturnLength: UINT; hWndCallback: HWND): MCIERROR; stdcall;
  1892. function mciGetDeviceIDA(pszDevice: PAnsiChar): MCIDEVICEID; stdcall;
  1893. function mciGetDeviceIDW(pszDevice: PWideChar): MCIDEVICEID; stdcall;
  1894. function mciGetDeviceID(pszDevice: PChar): MCIDEVICEID; stdcall;
  1895. function mciGetDeviceIDFromElementIDA(dwElementID: DWORD; lpstrType: PAnsiChar): MCIDEVICEID; stdcall;
  1896. function mciGetDeviceIDFromElementIDW(dwElementID: DWORD; lpstrType: PWideChar): MCIDEVICEID; stdcall;
  1897. function mciGetDeviceIDFromElementID(dwElementID: DWORD; lpstrType: PChar): MCIDEVICEID; stdcall;
  1898. function mciGetErrorStringA(mcierr: MCIERROR; pszText: PAnsiChar; uLength: UINT): BOOL; stdcall;
  1899. function mciGetErrorStringW(mcierr: MCIERROR; pszText: PWideChar; uLength: UINT): BOOL; stdcall;
  1900. function mciGetErrorString(mcierr: MCIERROR; pszText: PChar; uLength: UINT): BOOL; stdcall;
  1901. function mciSetYieldProc(mcierr: MCIERROR; fpYieldProc: TFNYieldProc;
  1902.   dwYieldData: DWORD): BOOL; stdcall;
  1903. function mciGetCreatorTask(mcierr: MCIERROR): HTASK; stdcall;
  1904. function mciGetYieldProc(mcierr: MCIERROR; lpdwYieldData: PDWORD): TFNYieldProc; stdcall;
  1905. function mciExecute(pszCommand: LPCSTR): BOOL; stdcall;
  1906.  
  1907. { MCI error return values }
  1908. const
  1909.   MCIERR_INVALID_DEVICE_ID        = MCIERR_BASE + 1;
  1910.   MCIERR_UNRECOGNIZED_KEYWORD     = MCIERR_BASE + 3;
  1911.   MCIERR_UNRECOGNIZED_COMMAND     = MCIERR_BASE + 5;
  1912.   MCIERR_HARDWARE                 = MCIERR_BASE + 6;
  1913.   MCIERR_INVALID_DEVICE_NAME      = MCIERR_BASE + 7;
  1914.   MCIERR_OUT_OF_MEMORY            = MCIERR_BASE + 8;
  1915.   MCIERR_DEVICE_OPEN              = MCIERR_BASE + 9;
  1916.   MCIERR_CANNOT_LOAD_DRIVER       = MCIERR_BASE + 10;
  1917.   MCIERR_MISSING_COMMAND_STRING   = MCIERR_BASE + 11;
  1918.   MCIERR_PARAM_OVERFLOW           = MCIERR_BASE + 12;
  1919.   MCIERR_MISSING_STRING_ARGUMENT  = MCIERR_BASE + 13;
  1920.   MCIERR_BAD_INTEGER              = MCIERR_BASE + 14;
  1921.   MCIERR_PARSER_INTERNAL          = MCIERR_BASE + 15;
  1922.   MCIERR_DRIVER_INTERNAL          = MCIERR_BASE + 16;
  1923.   MCIERR_MISSING_PARAMETER        = MCIERR_BASE + 17;
  1924.   MCIERR_UNSUPPORTED_FUNCTION     = MCIERR_BASE + 18;
  1925.   MCIERR_FILE_NOT_FOUND           = MCIERR_BASE + 19;
  1926.   MCIERR_DEVICE_NOT_READY         = MCIERR_BASE + 20;
  1927.   MCIERR_INTERNAL                 = MCIERR_BASE + 21;
  1928.   MCIERR_DRIVER                   = MCIERR_BASE + 22;
  1929.   MCIERR_CANNOT_USE_ALL           = MCIERR_BASE + 23;
  1930.   MCIERR_MULTIPLE                 = MCIERR_BASE + 24;
  1931.   MCIERR_EXTENSION_NOT_FOUND      = MCIERR_BASE + 25;
  1932.   MCIERR_OUTOFRANGE               = MCIERR_BASE + 26;
  1933.   MCIERR_FLAGS_NOT_COMPATIBLE     = MCIERR_BASE + 28;
  1934.   MCIERR_FILE_NOT_SAVED           = MCIERR_BASE + 30;
  1935.   MCIERR_DEVICE_TYPE_REQUIRED     = MCIERR_BASE + 31;
  1936.   MCIERR_DEVICE_LOCKED            = MCIERR_BASE + 32;
  1937.   MCIERR_DUPLICATE_ALIAS          = MCIERR_BASE + 33;
  1938.   MCIERR_BAD_CONSTANT             = MCIERR_BASE + 34;
  1939.   MCIERR_MUST_USE_SHAREABLE       = MCIERR_BASE + 35;
  1940.   MCIERR_MISSING_DEVICE_NAME      = MCIERR_BASE + 36;
  1941.   MCIERR_BAD_TIME_FORMAT          = MCIERR_BASE + 37;
  1942.   MCIERR_NO_CLOSING_QUOTE         = MCIERR_BASE + 38;
  1943.   MCIERR_DUPLICATE_FLAGS          = MCIERR_BASE + 39;
  1944.   MCIERR_INVALID_FILE             = MCIERR_BASE + 40;
  1945.   MCIERR_NULL_PARAMETER_BLOCK     = MCIERR_BASE + 41;
  1946.   MCIERR_UNNAMED_RESOURCE         = MCIERR_BASE + 42;
  1947.   MCIERR_NEW_REQUIRES_ALIAS       = MCIERR_BASE + 43;
  1948.   MCIERR_NOTIFY_ON_AUTO_OPEN      = MCIERR_BASE + 44;
  1949.   MCIERR_NO_ELEMENT_ALLOWED       = MCIERR_BASE + 45;
  1950.   MCIERR_NONAPPLICABLE_FUNCTION   = MCIERR_BASE + 46;
  1951.   MCIERR_ILLEGAL_FOR_AUTO_OPEN    = MCIERR_BASE + 47;
  1952.   MCIERR_FILENAME_REQUIRED        = MCIERR_BASE + 48;
  1953.   MCIERR_EXTRA_CHARACTERS         = MCIERR_BASE + 49;
  1954.   MCIERR_DEVICE_NOT_INSTALLED     = MCIERR_BASE + 50;
  1955.   MCIERR_GET_CD                   = MCIERR_BASE + 51;
  1956.   MCIERR_SET_CD                   = MCIERR_BASE + 52;
  1957.   MCIERR_SET_DRIVE                = MCIERR_BASE + 53;
  1958.   MCIERR_DEVICE_LENGTH            = MCIERR_BASE + 54;
  1959.   MCIERR_DEVICE_ORD_LENGTH        = MCIERR_BASE + 55;
  1960.   MCIERR_NO_INTEGER               = MCIERR_BASE + 56;
  1961.  
  1962. const
  1963.   MCIERR_WAVE_OUTPUTSINUSE        = MCIERR_BASE + 64;
  1964.   MCIERR_WAVE_SETOUTPUTINUSE      = MCIERR_BASE + 65;
  1965.   MCIERR_WAVE_INPUTSINUSE         = MCIERR_BASE + 66;
  1966.   MCIERR_WAVE_SETINPUTINUSE       = MCIERR_BASE + 67;
  1967.   MCIERR_WAVE_OUTPUTUNSPECIFIED   = MCIERR_BASE + 68;
  1968.   MCIERR_WAVE_INPUTUNSPECIFIED    = MCIERR_BASE + 69;
  1969.   MCIERR_WAVE_OUTPUTSUNSUITABLE   = MCIERR_BASE + 70;
  1970.   MCIERR_WAVE_SETOUTPUTUNSUITABLE = MCIERR_BASE + 71;
  1971.   MCIERR_WAVE_INPUTSUNSUITABLE    = MCIERR_BASE + 72;
  1972.   MCIERR_WAVE_SETINPUTUNSUITABLE  = MCIERR_BASE + 73;
  1973.  
  1974.   MCIERR_SEQ_DIV_INCOMPATIBLE     = MCIERR_BASE + 80;
  1975.   MCIERR_SEQ_PORT_INUSE           = MCIERR_BASE + 81;
  1976.   MCIERR_SEQ_PORT_NONEXISTENT     = MCIERR_BASE + 82;
  1977.   MCIERR_SEQ_PORT_MAPNODEVICE     = MCIERR_BASE + 83;
  1978.   MCIERR_SEQ_PORT_MISCERROR       = MCIERR_BASE + 84;
  1979.   MCIERR_SEQ_TIMER                = MCIERR_BASE + 85;
  1980.   MCIERR_SEQ_PORTUNSPECIFIED      = MCIERR_BASE + 86;
  1981.   MCIERR_SEQ_NOMIDIPRESENT        = MCIERR_BASE + 87;
  1982.  
  1983.   MCIERR_NO_WINDOW                = MCIERR_BASE + 90;
  1984.   MCIERR_CREATEWINDOW             = MCIERR_BASE + 91;
  1985.   MCIERR_FILE_READ                = MCIERR_BASE + 92;
  1986.   MCIERR_FILE_WRITE               = MCIERR_BASE + 93;
  1987.  
  1988.   MCIERR_NO_IDENTITY              = MCIERR_BASE + 94;
  1989.  
  1990. { all custom device driver errors must be >= this value }
  1991. const
  1992.   MCIERR_CUSTOM_DRIVER_BASE       = mcierr_Base + 256;
  1993.  
  1994. { MCI command message identifiers }
  1995. const
  1996.   MCI_OPEN       = $0803;
  1997.   MCI_CLOSE      = $0804;
  1998.   MCI_ESCAPE     = $0805;
  1999.   MCI_PLAY       = $0806;
  2000.   MCI_SEEK       = $0807;
  2001.   MCI_STOP       = $0808;
  2002.   MCI_PAUSE      = $0809;
  2003.   MCI_INFO       = $080A;
  2004.   MCI_GETDEVCAPs = $080B;
  2005.   MCI_SPIN       = $080C;
  2006.   MCI_SET        = $080D;
  2007.   MCI_STEP       = $080E;
  2008.   MCI_RECORD     = $080F;
  2009.   MCI_SYSINFO    = $0810;
  2010.   MCI_BREAK      = $0811;
  2011.   MCI_SOUND      = $0812;
  2012.   MCI_SAVE       = $0813;
  2013.   MCI_STATUS     = $0814;
  2014.   MCI_CUE        = $0830;
  2015.   MCI_REALIZE    = $0840;
  2016.   MCI_WINDOW     = $0841;
  2017.   MCI_PUT        = $0842;
  2018.   MCI_WHERE      = $0843;
  2019.   MCI_FREEZE     = $0844;
  2020.   MCI_UNFREEZE   = $0845;
  2021.   MCI_LOAD       = $0850;
  2022.   MCI_CUT        = $0851;
  2023.   MCI_COPY       = $0852;
  2024.   MCI_PASTE      = $0853;
  2025.   MCI_UPDATE     = $0854;
  2026.   MCI_RESUME     = $0855;
  2027.   MCI_DELETE     = $0856;
  2028.  
  2029. { all custom MCI command messages must be >= this value }
  2030. const
  2031.   MCI_USER_MESSAGES               = $400 + drv_MCI_First;
  2032.   MCI_LAST                        = $0FFF;
  2033.  
  2034. { device ID for "all devices" }
  2035. const
  2036.   MCI_ALL_DEVICE_ID               = UINT(-1);
  2037.  
  2038. { constants for predefined MCI device types }
  2039. const
  2040.   MCI_DEVTYPE_VCR                 = MCI_STRING_OFFSET + 1;
  2041.   MCI_DEVTYPE_VIDEODISC           = MCI_STRING_OFFSET + 2;
  2042.   MCI_DEVTYPE_OVERLAY             = MCI_STRING_OFFSET + 3;
  2043.   MCI_DEVTYPE_CD_AUDIO            = MCI_STRING_OFFSET + 4;
  2044.   MCI_DEVTYPE_DAT                 = MCI_STRING_OFFSET + 5;
  2045.   MCI_DEVTYPE_SCANNER             = MCI_STRING_OFFSET + 6;
  2046.   MCI_DEVTYPE_ANIMATION           = MCI_STRING_OFFSET + 7;
  2047.   MCI_DEVTYPE_DIGITAL_VIDEO       = MCI_STRING_OFFSET + 8;
  2048.   MCI_DEVTYPE_OTHER               = MCI_STRING_OFFSET + 9;
  2049.   MCI_DEVTYPE_WAVEFORM_AUDIO      = MCI_STRING_OFFSET + 10;
  2050.   MCI_DEVTYPE_SEQUENCER           = MCI_STRING_OFFSET + 11;
  2051.  
  2052.   MCI_DEVTYPE_FIRST              = MCI_DEVTYPE_VCR;
  2053.   MCI_DEVTYPE_LAST               = MCI_DEVTYPE_SEQUENCER;
  2054.  
  2055.   MCI_DEVTYPE_FIRST_USER         = 1000;
  2056.  
  2057. { return values for 'status mode' command }
  2058. const
  2059.   MCI_MODE_NOT_READY              = MCI_STRING_OFFSET + 12;
  2060.   MCI_MODE_STOP                   = MCI_STRING_OFFSET + 13;
  2061.   MCI_MODE_PLAY                   = MCI_STRING_OFFSET + 14;
  2062.   MCI_MODE_RECORD                 = MCI_STRING_OFFSET + 15;
  2063.   MCI_MODE_SEEK                   = MCI_STRING_OFFSET + 16;
  2064.   MCI_MODE_PAUSE                  = MCI_STRING_OFFSET + 17;
  2065.   MCI_MODE_OPEN                   = MCI_STRING_OFFSET + 18;
  2066.  
  2067. { constants used in 'set time format' and 'status time format' commands }
  2068. const
  2069.   MCI_FORMAT_MILLISECONDS         = 0;
  2070.   MCI_FORMAT_HMS                  = 1;
  2071.   MCI_FORMAT_MSF                  = 2;
  2072.   MCI_FORMAT_FRAMES               = 3;
  2073.   MCI_FORMAT_SMPTE_24             = 4;
  2074.   MCI_FORMAT_SMPTE_25             = 5;
  2075.   MCI_FORMAT_SMPTE_30             = 6;
  2076.   MCI_FORMAT_SMPTE_30DROP         = 7;
  2077.   MCI_FORMAT_BYTES                = 8;
  2078.   MCI_FORMAT_SAMPLES              = 9;
  2079.   MCI_FORMAT_TMSF                 = 10;
  2080.  
  2081. { MCI time format conversion macros }
  2082.  
  2083. function mci_MSF_Minute(msf: Longint): Byte;
  2084. function mci_MSF_Second(msf: Longint): Byte;
  2085. function mci_MSF_Frame(msf: Longint): Byte;
  2086. function mci_Make_MSF(m, s, f: Byte): Longint;
  2087. function mci_TMSF_Track(tmsf: Longint): Byte;
  2088. function mci_TMSF_Minute(tmsf: Longint): Byte;
  2089. function mci_TMSF_Second(tmsf: Longint): Byte;
  2090. function mci_TMSF_Frame(tmsf: Longint): Byte;
  2091. function mci_Make_TMSF(t, m, s, f: Byte): Longint;
  2092. function mci_HMS_Hour(hms: Longint): Byte;
  2093. function mci_HMS_Minute(hms: Longint): Byte;
  2094. function mci_HMS_Second(hms: Longint): Byte;
  2095. function mci_Make_HMS(h, m, s: Byte): Longint;
  2096.  
  2097. { flags for wParam of MM_MCINOTIFY message }
  2098. const
  2099.   MCI_NOTIFY_SUCCESSFUL           = $0001;
  2100.   MCI_NOTIFY_SUPERSEDED           = $0002;
  2101.   MCI_NOTIFY_ABORTED              = $0004;
  2102.   MCI_NOTIFY_FAILURE              = $0008;
  2103.  
  2104. { common flags for dwFlags parameter of MCI command messages }
  2105. const
  2106.   MCI_NOTIFY                      = $00000001;
  2107.   MCI_WAIT                        = $00000002;
  2108.   MCI_FROM                        = $00000004;
  2109.   MCI_TO                          = $00000008;
  2110.   MCI_TRACK                       = $00000010;
  2111.  
  2112. { flags for dwFlags parameter of MCI_OPEN command message }
  2113. const
  2114.   MCI_OPEN_SHAREABLE              = $00000100;
  2115.   MCI_OPEN_ELEMENT                = $00000200;
  2116.   MCI_OPEN_ALIAS                  = $00000400;
  2117.   MCI_OPEN_ELEMENT_ID             = $00000800;
  2118.   MCI_OPEN_TYPE_ID                = $00001000;
  2119.   MCI_OPEN_TYPE                   = $00002000;
  2120.  
  2121. { flags for dwFlags parameter of MCI_SEEK command message }
  2122. const
  2123.   MCI_SEEK_TO_START               = $00000100;
  2124.   MCI_SEEK_TO_END                 = $00000200;
  2125.  
  2126. { flags for dwFlags parameter of MCI_STATUS command message }
  2127. const
  2128.   MCI_STATUS_ITEM                 = $00000100;
  2129.   MCI_STATUS_START                = $00000200;
  2130.  
  2131. { flags for dwItem field of the MCI_STATUS_PARMS parameter block }
  2132. const
  2133.   MCI_STATUS_LENGTH               = $00000001;
  2134.   MCI_STATUS_POSITION             = $00000002;
  2135.   MCI_STATUS_NUMBER_OF_TRACKS     = $00000003;
  2136.   MCI_STATUS_MODE                 = $00000004;
  2137.   MCI_STATUS_MEDIA_PRESENT        = $00000005;
  2138.   MCI_STATUS_TIME_FORMAT          = $00000006;
  2139.   MCI_STATUS_READY                = $00000007;
  2140.   MCI_STATUS_CURRENT_TRACK        = $00000008;
  2141.  
  2142. { flags for dwFlags parameter of MCI_INFO command message }
  2143. const
  2144.   MCI_INFO_PRODUCT                = $00000100;
  2145.   MCI_INFO_FILE                   = $00000200;
  2146.   MCI_INFO_MEDIA_UPC              = $00000400;
  2147.   MCI_INFO_MEDIA_IDENTITY         = $00000800;
  2148.   MCI_INFO_NAME                   = $00001000;
  2149.   MCI_INFO_COPYRIGHT              = $00002000;
  2150.  
  2151. { flags for dwFlags parameter of MCI_GETDEVCAPS command message }
  2152. const
  2153.   MCI_GETDEVCAPS_ITEM             = $00000100;
  2154.  
  2155. { flags for dwItem field of the MCI_GETDEVCAPS_PARMS parameter block }
  2156. const
  2157.   MCI_GETDEVCAPS_CAN_RECORD       = $00000001;
  2158.   MCI_GETDEVCAPS_HAS_AUDIO        = $00000002;
  2159.   MCI_GETDEVCAPS_HAS_VIDEO        = $00000003;
  2160.   MCI_GETDEVCAPS_DEVICE_TYPE      = $00000004;
  2161.   MCI_GETDEVCAPS_USES_FILES       = $00000005;
  2162.   MCI_GETDEVCAPS_COMPOUND_DEVICE  = $00000006;
  2163.   MCI_GETDEVCAPS_CAN_EJECT        = $00000007;
  2164.   MCI_GETDEVCAPS_CAN_PLAY         = $00000008;
  2165.   MCI_GETDEVCAPS_CAN_SAVE         = $00000009;
  2166.  
  2167. { flags for dwFlags parameter of MCI_SYSINFO command message }
  2168. const
  2169.   MCI_SYSINFO_QUANTITY            = $00000100;
  2170.   MCI_SYSINFO_OPEN                = $00000200;
  2171.   MCI_SYSINFO_NAME                = $00000400;
  2172.   MCI_SYSINFO_INSTALLNAME         = $00000800;
  2173.  
  2174. { flags for dwFlags parameter of MCI_SET command message }
  2175. const
  2176.   MCI_SET_DOOR_OPEN               = $00000100;
  2177.   MCI_SET_DOOR_CLOSED             = $00000200;
  2178.   MCI_SET_TIME_FORMAT             = $00000400;
  2179.   MCI_SET_AUDIO                   = $00000800;
  2180.   MCI_SET_VIDEO                   = $00001000;
  2181.   MCI_SET_ON                      = $00002000;
  2182.   MCI_SET_OFF                     = $00004000;
  2183.  
  2184. { flags for dwAudio field of MCI_SET_PARMS or MCI_SEQ_SET_PARMS }
  2185. const
  2186.   MCI_SET_AUDIO_ALL               = $00000000;
  2187.   MCI_SET_AUDIO_LEFT              = $00000001;
  2188.   MCI_SET_AUDIO_RIGHT             = $00000002;
  2189.  
  2190. { flags for dwFlags parameter of MCI_BREAK command message }
  2191. const
  2192.   MCI_BREAK_KEY                   = $00000100;
  2193.   MCI_BREAK_HWND                  = $00000200;
  2194.   MCI_BREAK_OFF                   = $00000400;
  2195.  
  2196. { flags for dwFlags parameter of MCI_RECORD command message }
  2197. const
  2198.   MCI_RECORD_INSERT               = $00000100;
  2199.   MCI_RECORD_OVERWRITE            = $00000200;
  2200.  
  2201. { flags for dwFlags parameter of MCI_SOUND command message }
  2202. const
  2203.   MCI_SOUND_NAME                  = $00000100;
  2204.  
  2205. { flags for dwFlags parameter of MCI_SAVE command message }
  2206. const
  2207.   MCI_SAVE_FILE                   = $00000100;
  2208.  
  2209. { flags for dwFlags parameter of MCI_LOAD command message }
  2210. const
  2211.   MCI_LOAD_FILE                   = $00000100;
  2212.  
  2213. { generic parameter block for MCI command messages with no special parameters }
  2214. type
  2215.   PMCI_Generic_Parms = ^TMCI_Generic_Parms;
  2216.   tagMCI_GENERIC_PARMS = record
  2217.     dwCallback: DWORD;
  2218.   end;
  2219.   {$nonamespace tagMCI_GENERIC_PARMS}
  2220.   TMCI_Generic_Parms = tagMCI_GENERIC_PARMS;
  2221.  
  2222. { parameter block for MCI_OPEN command message }
  2223. type
  2224.   PMCI_Open_ParmsA = ^TMCI_Open_ParmsA;
  2225.   PMCI_Open_ParmsW = ^TMCI_Open_ParmsW;
  2226.   PMCI_Open_Parms = PMCI_Open_ParmsA;
  2227.   tagMCI_OPEN_PARMSA = record
  2228.     dwCallback: DWORD;
  2229.     wDeviceID: MCIDEVICEID;
  2230.     lpstrDeviceType: PAnsiChar;
  2231.     lpstrElementName: PAnsiChar;
  2232.     lpstrAlias: PAnsiChar;
  2233.   end;
  2234.   {$nonamespace tagMCI_OPEN_PARMSA}
  2235.   TMCI_Open_ParmsA = tagMCI_OPEN_PARMSA;
  2236.   tagMCI_OPEN_PARMSW = record
  2237.     dwCallback: DWORD;
  2238.     wDeviceID: MCIDEVICEID;
  2239.     lpstrDeviceType: PWideChar;
  2240.     lpstrElementName: PWideChar;
  2241.     lpstrAlias: PWideChar;
  2242.   end;
  2243.   {$nonamespace tagMCI_OPEN_PARMSW}
  2244.   TMCI_Open_ParmsW = tagMCI_OPEN_PARMSW;
  2245.   TMCI_Open_Parms = TMCI_Open_ParmsA;
  2246.  
  2247. { parameter block for MCI_PLAY command message }
  2248. type
  2249.   PMCI_Play_Parms = ^TMCI_Play_Parms;
  2250.   tagMCI_PLAY_PARMS = record
  2251.     dwCallback: DWORD;
  2252.     dwFrom: DWORD;
  2253.     dwTo: DWORD;
  2254.   end;
  2255.   {$nonamespace tagMCI_PLAY_PARMS}
  2256.   TMCI_Play_Parms = tagMCI_PLAY_PARMS;
  2257.  
  2258. { parameter block for MCI_SEEK command message }
  2259. type
  2260.   PMCI_Seek_Parms = ^TMCI_Seek_Parms;
  2261.   tagMCI_SEEK_PARMS = record
  2262.     dwCallback: DWORD;
  2263.     dwTo: DWORD;
  2264.   end;
  2265.   {$nonamespace tagMCI_SEEK_PARMS}
  2266.   TMCI_Seek_Parms = tagMCI_SEEK_PARMS;
  2267.  
  2268. { parameter block for MCI_STATUS command message }
  2269. type
  2270.   PMCI_Status_Parms = ^TMCI_Status_Parms;
  2271.   tagMCI_STATUS_PARMS = record
  2272.     dwCallback: DWORD;
  2273.     dwReturn: DWORD;
  2274.     dwItem: DWORD;
  2275.     dwTrack: DWORD;
  2276.   end;
  2277.   {$nonamespace tagMCI_STATUS_PARMS}
  2278.   TMCI_Status_Parms = tagMCI_STATUS_PARMS;
  2279.  
  2280. { parameter block for MCI_INFO command message }
  2281. type
  2282.   PMCI_Info_ParmsA = ^TMCI_Info_ParmsA;
  2283.   PMCI_Info_ParmsW = ^TMCI_Info_ParmsW;
  2284.   PMCI_Info_Parms = PMCI_Info_ParmsA;
  2285.   tagMCI_INFO_PARMSA = record
  2286.     dwCallback: DWORD;
  2287.     lpstrReturn: PAnsiChar;
  2288.     dwRetSize: DWORD;
  2289.   end;
  2290.   {$nonamespace tagMCI_INFO_PARMSA}
  2291.   TMCI_Info_ParmsA = tagMCI_INFO_PARMSA;
  2292.   tagMCI_INFO_PARMSW = record
  2293.     dwCallback: DWORD;
  2294.     lpstrReturn: PWideChar;
  2295.     dwRetSize: DWORD;
  2296.   end;
  2297.   {$nonamespace tagMCI_INFO_PARMSW}
  2298.   TMCI_Info_ParmsW = tagMCI_INFO_PARMSW;
  2299.   TMCI_Info_Parms = TMCI_Info_ParmsA;
  2300.  
  2301. { parameter block for MCI_GETDEVCAPS command message }
  2302. type
  2303.   PMCI_GetDevCaps_Parms = ^TMCI_GetDevCaps_Parms;
  2304.   tagMCI_GETDEVCAPS_PARMS = record
  2305.     dwCallback: DWORD;
  2306.     dwReturn: DWORD;
  2307.     dwItem: DWORD;
  2308.   end;
  2309.   {$nonamespace tagMCI_GETDEVCAPS_PARMS}
  2310.   TMCI_GetDevCaps_Parms = tagMCI_GETDEVCAPS_PARMS;
  2311.  
  2312. { parameter block for MCI_SYSINFO command message }
  2313. type
  2314.   PMCI_SysInfo_ParmsA = ^TMCI_SysInfo_ParmsA;
  2315.   PMCI_SysInfo_ParmsW = ^TMCI_SysInfo_ParmsW;
  2316.   PMCI_SysInfo_Parms = PMCI_SysInfo_ParmsA;
  2317.   tagMCI_SYSINFO_PARMSA = record
  2318.     dwCallback: DWORD;
  2319.     lpstrReturn: PAnsiChar;
  2320.     dwRetSize: DWORD;
  2321.     dwNumber: DWORD;
  2322.     wDeviceType: UINT;
  2323.   end;
  2324.   {$nonamespace tagMCI_SYSINFO_PARMSA}
  2325.   TMCI_SysInfo_ParmsA = tagMCI_SYSINFO_PARMSA;
  2326.   tagMCI_SYSINFO_PARMSW = record
  2327.     dwCallback: DWORD;
  2328.     lpstrReturn: PWideChar;
  2329.     dwRetSize: DWORD;
  2330.     dwNumber: DWORD;
  2331.     wDeviceType: UINT;
  2332.   end;
  2333.   {$nonamespace tagMCI_SYSINFO_PARMSW}
  2334.   TMCI_SysInfo_ParmsW = tagMCI_SYSINFO_PARMSW;
  2335.   TMCI_SysInfo_Parms = TMCI_SysInfo_ParmsA;
  2336.  
  2337. { parameter block for MCI_SET command message }
  2338. type
  2339.   PMCI_Set_Parms = ^TMCI_Set_Parms;
  2340.   tagMCI_SET_PARMS = record
  2341.     dwCallback: DWORD;
  2342.     dwTimeFormat: DWORD;
  2343.     dwAudio: DWORD;
  2344.   end;
  2345.   {$nonamespace tagMCI_SET_PARMS}
  2346.   TMCI_Set_Parms = tagMCI_SET_PARMS;
  2347.  
  2348. { parameter block for MCI_BREAK command message }
  2349. type
  2350.   PMCI_Break_Parms = ^TMCI_BReak_Parms;
  2351.   tagMCI_BREAK_PARMS = record
  2352.     dwCallback: DWORD;
  2353.     nVirtKey: Integer;
  2354.     hWndBreak: HWND;
  2355.   end;
  2356.   {$nonamespace tagMCI_BREAK_PARMS}
  2357.   TMCI_BReak_Parms = tagMCI_BREAK_PARMS;
  2358.  
  2359. { parameter block for MCI_SOUND command message }
  2360. type
  2361.   PMCI_Sound_Parms = ^TMCI_Sound_Parms;
  2362.   TMCI_Sound_Parms = record
  2363.     dwCallback: Longint;
  2364.     lpstrSoundName: PChar;
  2365.   end;
  2366.  
  2367. { parameter block for MCI_SAVE command message }
  2368. type
  2369.   PMCI_Save_ParmsA = ^TMCI_SaveParmsA;
  2370.   PMCI_Save_ParmsW = ^TMCI_SaveParmsW;
  2371.   PMCI_Save_Parms = PMCI_Save_ParmsA;
  2372.   TMCI_SaveParmsA = record
  2373.     dwCallback: DWORD;
  2374.     lpfilename: PAnsiChar;
  2375.   end;
  2376.   TMCI_SaveParmsW = record
  2377.     dwCallback: DWORD;
  2378.     lpfilename: PWideChar;
  2379.   end;
  2380.   TMCI_SaveParms = TMCI_SaveParmsA;
  2381.  
  2382. { parameter block for MCI_LOAD command message }
  2383. type
  2384.   PMCI_Load_ParmsA = ^TMCI_Load_ParmsA;
  2385.   PMCI_Load_ParmsW = ^TMCI_Load_ParmsW;
  2386.   PMCI_Load_Parms = PMCI_Load_ParmsA;
  2387.   tagMCI_LOAD_PARMSA = record
  2388.     dwCallback: DWORD;
  2389.     lpfilename: PAnsiChar;
  2390.   end;
  2391.   {$nonamespace tagMCI_LOAD_PARMSA}
  2392.   TMCI_Load_ParmsA = tagMCI_LOAD_PARMSA;
  2393.   tagMCI_LOAD_PARMSW = record
  2394.     dwCallback: DWORD;
  2395.     lpfilename: PWideChar;
  2396.   end;
  2397.   {$nonamespace tagMCI_LOAD_PARMSW}
  2398.   TMCI_Load_ParmsW = tagMCI_LOAD_PARMSW;
  2399.   TMCI_Load_Parms = TMCI_Load_ParmsA;
  2400.  
  2401. { parameter block for MCI_RECORD command message }
  2402. type
  2403.   PMCI_Record_Parms = ^TMCI_Record_Parms;
  2404.   tagMCI_RECORD_PARMS = record
  2405.     dwCallback: DWORD;
  2406.     dwFrom: DWORD;
  2407.     dwTo: DWORD;
  2408.   end;
  2409.   {$nonamespace tagMCI_RECORD_PARMS}
  2410.   TMCI_Record_Parms = tagMCI_RECORD_PARMS;
  2411.  
  2412. { MCI extensions for videodisc devices }
  2413.  
  2414. { flag for dwReturn field of MCI_STATUS_PARMS }
  2415. { MCI_STATUS command, (dwItem == MCI_STATUS_MODE) }
  2416. const
  2417.   MCI_VD_MODE_PARK                = MCI_VD_OFFSET + 1;
  2418.  
  2419. { flag for dwReturn field of MCI_STATUS_PARMS }
  2420. { MCI_STATUS command, (dwItem == MCI_VD_STATUS_MEDIA_TYPE) }
  2421. const
  2422.   MCI_VD_MEDIA_CLV                = MCI_VD_OFFSET + 2;
  2423.   MCI_VD_MEDIA_CAV                = MCI_VD_OFFSET + 3;
  2424.   MCI_VD_MEDIA_OTHER              = MCI_VD_OFFSET + 4;
  2425.  
  2426. const
  2427.   MCI_VD_FORMAT_TRACK             = $4001;
  2428.  
  2429. { flags for dwFlags parameter of MCI_PLAY command message }
  2430. const
  2431.   MCI_VD_PLAY_REVERSE             = $00010000;
  2432.   MCI_VD_PLAY_FAST                = $00020000;
  2433.   MCI_VD_PLAY_SPEED               = $00040000;
  2434.   MCI_VD_PLAY_SCAN                = $00080000;
  2435.   MCI_VD_PLAY_SLOW                = $00100000;
  2436.  
  2437. { flag for dwFlags parameter of MCI_SEEK command message }
  2438. const
  2439.   MCI_VD_SEEK_REVERSE             = $00010000;
  2440.  
  2441. { flags for dwItem field of MCI_STATUS_PARMS parameter block }
  2442. const
  2443.   MCI_VD_STATUS_SPEED             = $00004002;
  2444.   MCI_VD_STATUS_FORWARD           = $00004003;
  2445.   MCI_VD_STATUS_MEDIA_TYPE        = $00004004;
  2446.   MCI_VD_STATUS_SIDE              = $00004005;
  2447.   MCI_VD_STATUS_DISC_SIZE         = $00004006;
  2448.  
  2449. { flags for dwFlags parameter of MCI_GETDEVCAPS command message }
  2450. const
  2451.   MCI_VD_GETDEVCAPS_CLV           = $00010000;
  2452.   MCI_VD_GETDEVCAPS_CAV           = $00020000;
  2453.  
  2454.   MCI_VD_SPIN_UP                  = $00010000;
  2455.   MCI_VD_SPIN_DOWN                = $00020000;
  2456.  
  2457. { flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block }
  2458. const
  2459.   MCI_VD_GETDEVCAPS_CAN_REVERSE   = $00004002;
  2460.   MCI_VD_GETDEVCAPS_FAST_RATE     = $00004003;
  2461.   MCI_VD_GETDEVCAPS_SLOW_RATE     = $00004004;
  2462.   MCI_VD_GETDEVCAPS_NORMAL_RATE   = $00004005;
  2463.  
  2464. { flags for the dwFlags parameter of MCI_STEP command message }
  2465. const
  2466.   MCI_VD_STEP_FRAMES              = $00010000;
  2467.   MCI_VD_STEP_REVERSE             = $00020000;
  2468.  
  2469. { flag for the MCI_ESCAPE command message }
  2470. const
  2471.   MCI_VD_ESCAPE_STRING            = $00000100;
  2472.  
  2473. { parameter block for MCI_PLAY command message }
  2474. type
  2475.   PMCI_VD_Play_Parms = ^TMCI_VD_Play_Parms;
  2476.   tagMCI_VD_PLAY_PARMS = record
  2477.     dwCallback: DWORD;
  2478.     dwFrom: DWORD;
  2479.     dwTo: DWORD;
  2480.     dwSpeed: DWORD;
  2481.   end;
  2482.   {$nonamespace tagMCI_VD_PLAY_PARMS}
  2483.   TMCI_VD_Play_Parms = tagMCI_VD_PLAY_PARMS;
  2484.  
  2485. { parameter block for MCI_STEP command message }
  2486. type
  2487.   PMCI_VD_Step_Parms = ^TMCI_VD_Step_Parms;
  2488.   tagMCI_VD_STEP_PARMS = record
  2489.     dwCallback: DWORD;
  2490.     dwFrames: DWORD;
  2491.   end;
  2492.   {$nonamespace tagMCI_VD_STEP_PARMS}
  2493.   TMCI_VD_Step_Parms = tagMCI_VD_STEP_PARMS;
  2494.  
  2495. { parameter block for MCI_ESCAPE command message }
  2496. type
  2497.   PMCI_VD_Escape_ParmsA = ^TMCI_VD_Escape_ParmsA;
  2498.   PMCI_VD_Escape_ParmsW = ^TMCI_VD_Escape_ParmsW;
  2499.   PMCI_VD_Escape_Parms = PMCI_VD_Escape_ParmsA;
  2500.   tagMCI_VD_ESCAPE_PARMSA = record
  2501.     dwCallback: DWORD;
  2502.     lpstrCommand: PAnsiChar;
  2503.   end;
  2504.   {$nonamespace tagMCI_VD_ESCAPE_PARMSA}
  2505.   TMCI_VD_Escape_ParmsA = tagMCI_VD_ESCAPE_PARMSA;
  2506.   tagMCI_VD_ESCAPE_PARMSW = record
  2507.     dwCallback: DWORD;
  2508.     lpstrCommand: PWideChar;
  2509.   end;
  2510.   {$nonamespace tagMCI_VD_ESCAPE_PARMSW}
  2511.   TMCI_VD_Escape_ParmsW = tagMCI_VD_ESCAPE_PARMSW;
  2512.   TMCI_VD_Escape_Parms = TMCI_VD_Escape_ParmsA;
  2513.  
  2514. { MCI extensions for CD audio devices }
  2515.  
  2516. { flags for the dwItem field of the MCI_STATUS_PARMS parameter block }
  2517. const
  2518.   MCI_CDA_STATUS_TYPE_TRACK       = 00004001;
  2519.  
  2520. { flags for the dwReturn field of MCI_STATUS_PARMS parameter block }
  2521. { MCI_STATUS command, (dwItem == MCI_CDA_STATUS_TYPE_TRACK) }
  2522.   MCI_CDA_TRACK_AUDIO             = MCI_CD_OFFSET + 0;
  2523.   MCI_CDA_TRACK_OTHER             = MCI_CD_OFFSET + 1;
  2524.  
  2525. { MCI extensions for waveform audio devices }
  2526.   MCI_WAVE_PCM                    = MCI_WAVE_OFFSET + 0;
  2527.   MCI_WAVE_MAPPER                 = MCI_WAVE_OFFSET + 1;
  2528.  
  2529. { flags for the dwFlags parameter of MCI_OPEN command message }
  2530. const
  2531.   MCI_WAVE_OPEN_BUFFER            = $00010000;
  2532.  
  2533. { flags for the dwFlags parameter of MCI_SET command message }
  2534. const
  2535.   MCI_WAVE_SET_FORMATTAG          = $00010000;
  2536.   MCI_WAVE_SET_CHANNELS           = $00020000;
  2537.   MCI_WAVE_SET_SAMPLESPERSEC      = $00040000;
  2538.   MCI_WAVE_SET_AVGBYTESPERSEC     = $00080000;
  2539.   MCI_WAVE_SET_BLOCKALIGN         = $00100000;
  2540.   MCI_WAVE_SET_BITSPERSAMPLE      = $00200000;
  2541.  
  2542. { flags for the dwFlags parameter of MCI_STATUS, MCI_SET command messages }
  2543. const
  2544.   MCI_WAVE_INPUT                  = $00400000;
  2545.   MCI_WAVE_OUTPUT                 = $00800000;
  2546.  
  2547. { flags for the dwItem field of MCI_STATUS_PARMS parameter block }
  2548. const
  2549.   MCI_WAVE_STATUS_FORMATTAG       = $00004001;
  2550.   MCI_WAVE_STATUS_CHANNELS        = $00004002;
  2551.   MCI_WAVE_STATUS_SAMPLESPERSEC   = $00004003;
  2552.   MCI_WAVE_STATUS_AVGBYTESPERSEC  = $00004004;
  2553.   MCI_WAVE_STATUS_BLOCKALIGN      = $00004005;
  2554.   MCI_WAVE_STATUS_BITSPERSAMPLE   = $00004006;
  2555.   MCI_WAVE_STATUS_LEVEL           = $00004007;
  2556.  
  2557. { flags for the dwFlags parameter of MCI_SET command message }
  2558. const
  2559.   MCI_WAVE_SET_ANYINPUT           = $04000000;
  2560.   MCI_WAVE_SET_ANYOUTPUT          = $08000000;
  2561.  
  2562. { flags for the dwFlags parameter of MCI_GETDEVCAPS command message }
  2563. const
  2564.   MCI_WAVE_GETDEVCAPS_INPUTS      = $00004001;
  2565.   MCI_WAVE_GETDEVCAPS_OUTPUTS     = $00004002;
  2566.  
  2567. { parameter block for MCI_OPEN command message }
  2568. type
  2569.   PMCI_Wave_Open_ParmsA = ^TMCI_Wave_Open_ParmsA;
  2570.   PMCI_Wave_Open_ParmsW = ^TMCI_Wave_Open_ParmsW;
  2571.   PMCI_Wave_Open_Parms = PMCI_Wave_Open_ParmsA;
  2572.   tagMCI_WAVE_OPEN_PARMSA = record
  2573.     dwCallback: DWORD;
  2574.     wDeviceID: MCIDEVICEID;
  2575.     lpstrDeviceType: PAnsiChar;
  2576.     lpstrElementName: PAnsiChar;
  2577.     lpstrAlias: PAnsiChar;
  2578.     dwBufferSeconds: DWORD;
  2579.   end;
  2580.   {$nonamespace tagMCI_WAVE_OPEN_PARMSA}
  2581.   TMCI_Wave_Open_ParmsA = tagMCI_WAVE_OPEN_PARMSA;
  2582.   tagMCI_WAVE_OPEN_PARMSW = record
  2583.     dwCallback: DWORD;
  2584.     wDeviceID: MCIDEVICEID;
  2585.     lpstrDeviceType: PWideChar;
  2586.     lpstrElementName: PWideChar;
  2587.     lpstrAlias: PWideChar;
  2588.     dwBufferSeconds: DWORD;
  2589.   end;
  2590.   {$nonamespace tagMCI_WAVE_OPEN_PARMSW}
  2591.   TMCI_Wave_Open_ParmsW = tagMCI_WAVE_OPEN_PARMSW;
  2592.   TMCI_Wave_Open_Parms = TMCI_Wave_Open_ParmsA;
  2593.  
  2594. { parameter block for MCI_DELETE command message }
  2595. type
  2596.   PMCI_Wave_Delete_Parms = ^TMCI_Wave_Delete_Parms;
  2597.   tagMCI_WAVE_DELETE_PARMS = record
  2598.     dwCallback: DWORD;
  2599.     dwFrom: DWORD;
  2600.     dwTo: DWORD;
  2601.   end;
  2602.   {$nonamespace tagMCI_WAVE_DELETE_PARMS}
  2603.   TMCI_Wave_Delete_Parms = tagMCI_WAVE_DELETE_PARMS;
  2604.  
  2605. { parameter block for MCI_SET command message }
  2606. type
  2607.   PMCI_Wave_Set_Parms = ^TMCI_Wave_Set_Parms;
  2608.   tagMCI_WAVE_SET_PARMS = record
  2609.     dwCallback: DWORD;
  2610.     dwTimeFormat: DWORD;
  2611.     dwAudio: DWORD;
  2612.     wInput: UINT;
  2613.     wOutput: UINT;
  2614.     wFormatTag: Word;
  2615.     wReserved2: Word;
  2616.     nChannels: Word;
  2617.     wReserved3: Word;
  2618.     nSamplesPerSec: DWORD;
  2619.     nAvgBytesPerSec: DWORD;
  2620.     nBlockAlign: Word;
  2621.     wReserved4: Word;
  2622.     wBitsPerSample: Word;
  2623.     wReserved5: Word;
  2624.   end;
  2625.   {$nonamespace tagMCI_WAVE_SET_PARMS}
  2626.   TMCI_Wave_Set_Parms = tagMCI_WAVE_SET_PARMS;
  2627.  
  2628. { MCI extensions for MIDI sequencer devices }
  2629.  
  2630. { flags for the dwReturn field of MCI_STATUS_PARMS parameter block }
  2631. { MCI_STATUS command, (dwItem == MCI_SEQ_STATUS_DIVTYPE) }
  2632. const
  2633.   MCI_SEQ_DIV_PPQN            = 0 + MCI_SEQ_OFFSET;
  2634.   MCI_SEQ_DIV_SMPTE_24        = 1 + MCI_SEQ_OFFSET;
  2635.   MCI_SEQ_DIV_SMPTE_25        = 2 + MCI_SEQ_OFFSET;
  2636.   MCI_SEQ_DIV_SMPTE_30DROP    = 3 + MCI_SEQ_OFFSET;
  2637.   MCI_SEQ_DIV_SMPTE_30        = 4 + MCI_SEQ_OFFSET;
  2638.  
  2639. { flags for the dwMaster field of MCI_SEQ_SET_PARMS parameter block }
  2640. { MCI_SET command, (dwFlags == MCI_SEQ_SET_MASTER) }
  2641. const
  2642.   MCI_SEQ_FORMAT_SONGPTR      = $4001;
  2643.   MCI_SEQ_FILE                = $4002;
  2644.   MCI_SEQ_MIDI                = $4003;
  2645.   MCI_SEQ_SMPTE               = $4004;
  2646.   MCI_SEQ_NONE                = 65533;
  2647.   MCI_SEQ_MAPPER              = 65535;
  2648.  
  2649. { flags for the dwItem field of MCI_STATUS_PARMS parameter block }
  2650. const
  2651.   MCI_SEQ_STATUS_TEMPO            = $00004002;
  2652.   MCI_SEQ_STATUS_PORT             = $00004003;
  2653.   MCI_SEQ_STATUS_SLAVE            = $00004007;
  2654.   MCI_SEQ_STATUS_MASTER           = $00004008;
  2655.   MCI_SEQ_STATUS_OFFSET           = $00004009;
  2656.   MCI_SEQ_STATUS_DIVTYPE          = $0000400A;
  2657.   MCI_SEQ_STATUS_NAME             = $0000400B;
  2658.   MCI_SEQ_STATUS_COPYRIGHT        = $0000400C;
  2659.  
  2660. { flags for the dwFlags parameter of MCI_SET command message }
  2661. const
  2662.   MCI_SEQ_SET_TEMPO               = $00010000;
  2663.   MCI_SEQ_SET_PORT                = $00020000;
  2664.   MCI_SEQ_SET_SLAVE               = $00040000;
  2665.   MCI_SEQ_SET_MASTER              = $00080000;
  2666.   MCI_SEQ_SET_OFFSET              = $01000000;
  2667.  
  2668. { parameter block for MCI_SET command message }
  2669. type
  2670.   PMCI_Seq_Set_Parms = ^TMCI_Seq_Set_Parms;
  2671.   tagMCI_SEQ_SET_PARMS = record
  2672.     dwCallback: DWORD;
  2673.     dwTimeFormat: DWORD;
  2674.     dwAudio: DWORD;
  2675.     dwTempo: DWORD;
  2676.     dwPort: DWORD;
  2677.     dwSlave: DWORD;
  2678.     dwMaster: DWORD;
  2679.     dwOffset: DWORD;
  2680.   end;
  2681.   {$nonamespace tagMCI_SEQ_SET_PARMS}
  2682.   TMCI_Seq_Set_Parms = tagMCI_SEQ_SET_PARMS;
  2683.  
  2684. { MCI extensions for animation devices }
  2685.  
  2686. { flags for dwFlags parameter of MCI_OPEN command message }
  2687. const
  2688.   MCI_ANIM_OPEN_WS                = $00010000;
  2689.   MCI_ANIM_OPEN_PARENT            = $00020000;
  2690.   MCI_ANIM_OPEN_NOSTATIC          = $00040000;
  2691.  
  2692. { flags for dwFlags parameter of MCI_PLAY command message }
  2693. const
  2694.   MCI_ANIM_PLAY_SPEED             = $00010000;
  2695.   MCI_ANIM_PLAY_REVERSE           = $00020000;
  2696.   MCI_ANIM_PLAY_FAST              = $00040000;
  2697.   MCI_ANIM_PLAY_SLOW              = $00080000;
  2698.   MCI_ANIM_PLAY_SCAN              = $00100000;
  2699.  
  2700. { flags for dwFlags parameter of MCI_STEP command message }
  2701. const
  2702.   MCI_ANIM_STEP_REVERSE           = $00010000;
  2703.   MCI_ANIM_STEP_FRAMES            = $00020000;
  2704.  
  2705. { flags for dwItem field of MCI_STATUS_PARMS parameter block }
  2706. const
  2707.   MCI_ANIM_STATUS_SPEED           = $00004001;
  2708.   MCI_ANIM_STATUS_FORWARD         = $00004002;
  2709.   MCI_ANIM_STATUS_HWND            = $00004003;
  2710.   MCI_ANIM_STATUS_HPAL            = $00004004;
  2711.   MCI_ANIM_STATUS_STRETCH         = $00004005;
  2712.  
  2713. { flags for the dwFlags parameter of MCI_INFO command message }
  2714. const
  2715.   MCI_ANIM_INFO_TEXT              = $00010000;
  2716.  
  2717. { flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block }
  2718. const
  2719.   MCI_ANIM_GETDEVCAPS_CAN_REVERSE = $00004001;
  2720.   MCI_ANIM_GETDEVCAPS_FAST_RATE   = $00004002;
  2721.   MCI_ANIM_GETDEVCAPS_SLOW_RATE   = $00004003;
  2722.   MCI_ANIM_GETDEVCAPS_NORMAL_RATE = $00004004;
  2723.   MCI_ANIM_GETDEVCAPS_PALETTES    = $00004006;
  2724.   MCI_ANIM_GETDEVCAPS_CAN_STRETCH = $00004007;
  2725.   MCI_ANIM_GETDEVCAPS_MAX_WINDOWS = $00004008;
  2726.  
  2727. { flags for the MCI_REALIZE command message }
  2728. const
  2729.   MCI_ANIM_REALIZE_NORM           = $00010000;
  2730.   MCI_ANIM_REALIZE_BKGD           = $00020000;
  2731.  
  2732. { flags for dwFlags parameter of MCI_WINDOW command message }
  2733. const
  2734.   MCI_ANIM_WINDOW_HWND            = $00010000;
  2735.   MCI_ANIM_WINDOW_STATE           = $00040000;
  2736.   MCI_ANIM_WINDOW_TEXT            = $00080000;
  2737.   MCI_ANIM_WINDOW_ENABLE_STRETCH  = $00100000;
  2738.   MCI_ANIM_WINDOW_DISABLE_STRETCH = $00200000;
  2739.  
  2740. { flags for hWnd field of MCI_ANIM_WINDOW_PARMS parameter block }
  2741. { MCI_WINDOW command message, (dwFlags == MCI_ANIM_WINDOW_HWND) }
  2742. const
  2743.   MCI_ANIM_WINDOW_DEFAULT         = $00000000;
  2744.  
  2745. { flags for dwFlags parameter of MCI_PUT command message }
  2746. const
  2747.   MCI_ANIM_RECT                   = $00010000;
  2748.   MCI_ANIM_PUT_SOURCE             = $00020000;
  2749.   MCI_ANIM_PUT_DESTINATION        = $00040000;
  2750.  
  2751. { flags for dwFlags parameter of MCI_WHERE command message }
  2752. const
  2753.   MCI_ANIM_WHERE_SOURCE           = $00020000;
  2754.   MCI_ANIM_WHERE_DESTINATION      = $00040000;
  2755.  
  2756. { flags for dwFlags parameter of MCI_UPDATE command message }
  2757. const
  2758.   MCI_ANIM_UPDATE_HDC             = $00020000;
  2759.  
  2760. { parameter block for MCI_OPEN command message }
  2761. type
  2762.   PMCI_Anim_Open_ParmsA = ^TMCI_Anim_Open_ParmsA;
  2763.   PMCI_Anim_Open_ParmsW = ^TMCI_Anim_Open_ParmsW;
  2764.   PMCI_Anim_Open_Parms = PMCI_Anim_Open_ParmsA;
  2765.   tagMCI_ANIM_OPEN_PARMSA = record
  2766.     dwCallback: DWORD;
  2767.     wDeviceID: MCIDEVICEID;
  2768.     lpstrDeviceType: PAnsiChar;
  2769.     lpstrElementName: PAnsiChar;
  2770.     lpstrAlias: PAnsiChar;
  2771.     dwStyle: DWORD;
  2772.     hWndParent: HWND;
  2773.   end;
  2774.   {$nonamespace tagMCI_ANIM_OPEN_PARMSA}
  2775.   TMCI_Anim_Open_ParmsA = tagMCI_ANIM_OPEN_PARMSA;
  2776.   tagMCI_ANIM_OPEN_PARMSW = record
  2777.     dwCallback: DWORD;
  2778.     wDeviceID: MCIDEVICEID;
  2779.     lpstrDeviceType: PWideChar;
  2780.     lpstrElementName: PWideChar;
  2781.     lpstrAlias: PWideChar;
  2782.     dwStyle: DWORD;
  2783.     hWndParent: HWND;
  2784.   end;
  2785.   {$nonamespace tagMCI_ANIM_OPEN_PARMSW}
  2786.   TMCI_Anim_Open_ParmsW = tagMCI_ANIM_OPEN_PARMSW;
  2787.   TMCI_Anim_Open_Parms = TMCI_Anim_Open_ParmsA;
  2788.  
  2789. { parameter block for MCI_PLAY command message }
  2790. type
  2791.   PMCI_Anim_Play_Parms = ^TMCI_Anim_Play_Parms;
  2792.   tagMCI_ANIM_PLAY_PARMS = record
  2793.     dwCallback: DWORD;
  2794.     dwFrom: DWORD;
  2795.     dwTo: DWORD;
  2796.     dwSpeed: DWORD;
  2797.   end;
  2798.   {$nonamespace tagMCI_ANIM_PLAY_PARMS}
  2799.   TMCI_Anim_Play_Parms = tagMCI_ANIM_PLAY_PARMS;
  2800.  
  2801. { parameter block for MCI_STEP command message }
  2802. type
  2803.   PMCI_Anim_Step_Parms = ^TMCI_Anim_Step_Parms;
  2804.   tagMCI_ANIM_STEP_PARMS = record
  2805.     dwCallback: DWORD;
  2806.     dwFrames: DWORD;
  2807.   end;
  2808.   {$nonamespace tagMCI_ANIM_STEP_PARMS}
  2809.   TMCI_Anim_Step_Parms = tagMCI_ANIM_STEP_PARMS;
  2810.  
  2811. { parameter block for MCI_WINDOW command message }
  2812. type
  2813.   PMCI_Anim_Window_ParmsA = ^TMCI_Anim_Window_ParmsA;
  2814.   PMCI_Anim_Window_ParmsW = ^TMCI_Anim_Window_ParmsW;
  2815.   PMCI_Anim_Window_Parms = PMCI_Anim_Window_ParmsA;
  2816.   tagMCI_ANIM_WINDOW_PARMSA = record
  2817.     dwCallback: DWORD;
  2818.     Wnd: HWND;  { formerly "hWnd" }
  2819.     nCmdShow: UINT;
  2820.     lpstrText: PAnsiChar;
  2821.   end;
  2822.   {$nonamespace tagMCI_ANIM_WINDOW_PARMSA}
  2823.   TMCI_Anim_Window_ParmsA = tagMCI_ANIM_WINDOW_PARMSA;
  2824.   tagMCI_ANIM_WINDOW_PARMSW = record
  2825.     dwCallback: DWORD;
  2826.     Wnd: HWND;  { formerly "hWnd" }
  2827.     nCmdShow: UINT;
  2828.     lpstrText: PWideChar;
  2829.   end;
  2830.   {$nonamespace tagMCI_ANIM_WINDOW_PARMSW}
  2831.   TMCI_Anim_Window_ParmsW = tagMCI_ANIM_WINDOW_PARMSW;
  2832.   TMCI_Anim_Window_Parms = TMCI_Anim_Window_ParmsA;
  2833.  
  2834. { parameter block for MCI_PUT, MCI_UPDATE, MCI_WHERE command messages }
  2835. type
  2836.   PMCI_Anim_Rect_Parms = ^ TMCI_Anim_Rect_Parms;
  2837.   tagMCI_ANIM_RECT_PARMS = record
  2838.     dwCallback: DWORD;
  2839.     rc: TRect;
  2840.   end;
  2841.   {$nonamespace tagMCI_ANIM_RECT_PARMS}
  2842.   TMCI_Anim_Rect_Parms = tagMCI_ANIM_RECT_PARMS;
  2843.  
  2844. { parameter block for MCI_UPDATE PARMS }
  2845. type
  2846.   PMCI_Anim_Update_Parms = ^TMCI_Anim_Update_Parms;
  2847.   tagMCI_ANIM_UPDATE_PARMS = record
  2848.     dwCallback: DWORD;
  2849.     rc: TRect;
  2850.     hDC: HDC;
  2851.   end;
  2852.   {$nonamespace tagMCI_ANIM_UPDATE_PARMS}
  2853.   TMCI_Anim_Update_Parms = tagMCI_ANIM_UPDATE_PARMS;
  2854.  
  2855. { MCI extensions for video overlay devices }
  2856.  
  2857. { flags for dwFlags parameter of MCI_OPEN command message }
  2858. const
  2859.   MCI_OVLY_OPEN_WS                = $00010000;
  2860.   MCI_OVLY_OPEN_PARENT            = $00020000;
  2861.  
  2862. { flags for dwFlags parameter of MCI_STATUS command message }
  2863. const
  2864.   MCI_OVLY_STATUS_HWND            = $00004001;
  2865.   MCI_OVLY_STATUS_STRETCH         = $00004002;
  2866.  
  2867. { flags for dwFlags parameter of MCI_INFO command message }
  2868. const
  2869.   MCI_OVLY_INFO_TEXT              = $00010000;
  2870.  
  2871. { flags for dwItem field of MCI_GETDEVCAPS_PARMS parameter block }
  2872. const
  2873.   MCI_OVLY_GETDEVCAPS_CAN_STRETCH = $00004001;
  2874.   MCI_OVLY_GETDEVCAPS_CAN_FREEZE  = $00004002;
  2875.   MCI_OVLY_GETDEVCAPS_MAX_WINDOWS = $00004003;
  2876.  
  2877. { flags for dwFlags parameter of MCI_WINDOW command message }
  2878. const
  2879.   MCI_OVLY_WINDOW_HWND            = $00010000;
  2880.   MCI_OVLY_WINDOW_STATE           = $00040000;
  2881.   MCI_OVLY_WINDOW_TEXT            = $00080000;
  2882.   MCI_OVLY_WINDOW_ENABLE_STRETCH  = $00100000;
  2883.   MCI_OVLY_WINDOW_DISABLE_STRETCH = $00200000;
  2884.  
  2885. { flags for hWnd parameter of MCI_OVLY_WINDOW_PARMS parameter block }
  2886. const
  2887.   MCI_OVLY_WINDOW_DEFAULT         = $00000000;
  2888.  
  2889. { flags for dwFlags parameter of MCI_PUT command message }
  2890. const
  2891.   MCI_OVLY_RECT                   = $00010000;
  2892.   MCI_OVLY_PUT_SOURCE             = $00020000;
  2893.   MCI_OVLY_PUT_DESTINATION        = $00040000;
  2894.   MCI_OVLY_PUT_FRAME              = $00080000;
  2895.   MCI_OVLY_PUT_VIDEO              = $00100000;
  2896.  
  2897. { flags for dwFlags parameter of MCI_WHERE command message }
  2898. const
  2899.   MCI_OVLY_WHERE_SOURCE           = $00020000;
  2900.   MCI_OVLY_WHERE_DESTINATION      = $00040000;
  2901.   MCI_OVLY_WHERE_FRAME            = $00080000;
  2902.   MCI_OVLY_WHERE_VIDEO            = $00100000;
  2903.  
  2904. { parameter block for MCI_OPEN command message }
  2905. type
  2906.   PMCI_Ovly_Open_ParmsA = ^TMCI_Ovly_Open_ParmsA;
  2907.   PMCI_Ovly_Open_ParmsW = ^TMCI_Ovly_Open_ParmsW;
  2908.   PMCI_Ovly_Open_Parms = PMCI_Ovly_Open_ParmsA;
  2909.   tagMCI_OVLY_OPEN_PARMSA = record
  2910.     dwCallback: DWORD;
  2911.     wDeviceID: MCIDEVICEID;
  2912.     lpstrDeviceType: PAnsiChar;
  2913.     lpstrElementName: PAnsiChar;
  2914.     lpstrAlias: PAnsiChar;
  2915.     dwStyle: DWORD;
  2916.     hWndParent: HWND;
  2917.   end;
  2918.   {$nonamespace tagMCI_OVLY_OPEN_PARMSA}
  2919.   TMCI_Ovly_Open_ParmsA = tagMCI_OVLY_OPEN_PARMSA;
  2920.   tagMCI_OVLY_OPEN_PARMSW = record
  2921.     dwCallback: DWORD;
  2922.     wDeviceID: MCIDEVICEID;
  2923.     lpstrDeviceType: PWideChar;
  2924.     lpstrElementName: PWideChar;
  2925.     lpstrAlias: PWideChar;
  2926.     dwStyle: DWORD;
  2927.     hWndParent: HWND;
  2928.   end;
  2929.   {$nonamespace tagMCI_OVLY_OPEN_PARMSW}
  2930.   TMCI_Ovly_Open_ParmsW = tagMCI_OVLY_OPEN_PARMSW;
  2931.   TMCI_Ovly_Open_Parms = TMCI_Ovly_Open_ParmsA;
  2932.  
  2933. { parameter block for MCI_WINDOW command message }
  2934. type
  2935.   PMCI_Ovly_Window_ParmsA = ^TMCI_Ovly_Window_ParmsA;
  2936.   PMCI_Ovly_Window_ParmsW = ^TMCI_Ovly_Window_ParmsW;
  2937.   PMCI_Ovly_Window_Parms = PMCI_Ovly_Window_ParmsA;
  2938.   tagMCI_OVLY_WINDOW_PARMSA = record
  2939.     dwCallback: DWORD;
  2940.     WHandle: HWND; { formerly "hWnd"}
  2941.     nCmdShow: UINT;
  2942.     lpstrText: PAnsiChar;
  2943.   end;
  2944.   {$nonamespace tagMCI_OVLY_WINDOW_PARMSA}
  2945.   TMCI_Ovly_Window_ParmsA = tagMCI_OVLY_WINDOW_PARMSA;
  2946.   tagMCI_OVLY_WINDOW_PARMSW = record
  2947.     dwCallback: DWORD;
  2948.     WHandle: HWND; { formerly "hWnd"}
  2949.     nCmdShow: UINT;
  2950.     lpstrText: PWideChar;
  2951.   end;
  2952.   {$nonamespace tagMCI_OVLY_WINDOW_PARMSW}
  2953.   TMCI_Ovly_Window_ParmsW = tagMCI_OVLY_WINDOW_PARMSW;
  2954.   TMCI_Ovly_Window_Parms = TMCI_Ovly_Window_ParmsA;
  2955.  
  2956. { parameter block for MCI_PUT, MCI_UPDATE, and MCI_WHERE command messages }
  2957. type
  2958.   PMCI_Ovly_Rect_Parms = ^ TMCI_Ovly_Rect_Parms;
  2959.   tagMCI_OVLY_RECT_PARMS = record
  2960.     dwCallback: DWORD;
  2961.     rc: TRect;
  2962.   end;
  2963.   {$nonamespace tagMCI_OVLY_RECT_PARMS}
  2964.   TMCI_Ovly_Rect_Parms = tagMCI_OVLY_RECT_PARMS;
  2965.  
  2966. { parameter block for MCI_SAVE command message }
  2967. type
  2968.   PMCI_Ovly_Save_ParmsA = ^TMCI_Ovly_Save_ParmsA;
  2969.   PMCI_Ovly_Save_ParmsW = ^TMCI_Ovly_Save_ParmsW;
  2970.   PMCI_Ovly_Save_Parms = PMCI_Ovly_Save_ParmsA;
  2971.   tagMCI_OVLY_SAVE_PARMSA = record
  2972.     dwCallback: DWORD;
  2973.     lpfilename: PAnsiChar;
  2974.     rc: TRect;
  2975.   end;
  2976.   {$nonamespace tagMCI_OVLY_SAVE_PARMSA}
  2977.   TMCI_Ovly_Save_ParmsA = tagMCI_OVLY_SAVE_PARMSA;
  2978.   tagMCI_OVLY_SAVE_PARMSW = record
  2979.     dwCallback: DWORD;
  2980.     lpfilename: PWideChar;
  2981.     rc: TRect;
  2982.   end;
  2983.   {$nonamespace tagMCI_OVLY_SAVE_PARMSW}
  2984.   TMCI_Ovly_Save_ParmsW = tagMCI_OVLY_SAVE_PARMSW;
  2985.   TMCI_Ovly_Save_Parms = TMCI_Ovly_Save_ParmsA;
  2986.  
  2987. { parameter block for MCI_LOAD command message }
  2988. type
  2989.   PMCI_Ovly_Load_ParmsA = ^TMCI_Ovly_Load_ParmsA;
  2990.   PMCI_Ovly_Load_ParmsW = ^TMCI_Ovly_Load_ParmsW;
  2991.   PMCI_Ovly_Load_Parms = PMCI_Ovly_Load_ParmsA;
  2992.   tagMCI_OVLY_LOAD_PARMSA = record
  2993.     dwCallback: DWORD;
  2994.     lpfilename: PAnsiChar;
  2995.     rc: TRect;
  2996.   end;
  2997.   {$nonamespace tagMCI_OVLY_LOAD_PARMSA}
  2998.   TMCI_Ovly_Load_ParmsA = tagMCI_OVLY_LOAD_PARMSA;
  2999.   tagMCI_OVLY_LOAD_PARMSW = record
  3000.     dwCallback: DWORD;
  3001.     lpfilename: PWideChar;
  3002.     rc: TRect;
  3003.   end;
  3004.   {$nonamespace tagMCI_OVLY_LOAD_PARMSW}
  3005.   TMCI_Ovly_Load_ParmsW = tagMCI_OVLY_LOAD_PARMSW;
  3006.   TMCI_Ovly_Load_Parms = TMCI_Ovly_Load_ParmsA;
  3007.  
  3008. {***************************************************************************
  3009.  
  3010.                         DISPLAY Driver extensions
  3011.  
  3012. ***************************************************************************}
  3013.  
  3014. const
  3015.   NEWTRANSPARENT  = 3;           { use with SetBkMode() }
  3016.   QUERYROPSUPPORT = 40;          { use to determine ROP support }
  3017.  
  3018. {***************************************************************************
  3019.  
  3020.                         DIB Driver extensions
  3021.  
  3022. ***************************************************************************}
  3023. const
  3024.   SELECTDIB       = 41;                      { DIB.DRV select dib escape }
  3025.  
  3026. function DIBIndex(N: Integer): Longint;
  3027.  
  3028. {***************************************************************************
  3029.  
  3030.                         ScreenSaver support
  3031.  
  3032.     The current application will receive a syscommand of SC_SCREENSAVE just
  3033.     before the screen saver is invoked.  If the app wishes to prevent a
  3034.     screen save, return a non-zero value, otherwise call DefWindowProc().
  3035.  
  3036. ***************************************************************************}
  3037.  
  3038. const
  3039.   SC_SCREENSAVE   = $F140;
  3040.  
  3041.   mmsyst = 'winmm.dll';
  3042.  
  3043. implementation
  3044.  
  3045. function auxGetDevCapsA; external mmsyst name 'auxGetDevCapsA';
  3046. function auxGetDevCapsW; external mmsyst name 'auxGetDevCapsW';
  3047. function auxGetDevCaps; external mmsyst name 'auxGetDevCapsA';
  3048. function auxGetNumDevs; external mmsyst name 'auxGetNumDevs';
  3049. function auxGetVolume; external mmsyst name 'auxGetVolume';
  3050. function auxOutMessage; external mmsyst name 'auxOutMessage';
  3051. function auxSetVolume; external mmsyst name 'auxSetVolume';
  3052. function CloseDriver; external mmsyst name 'CloseDriver';
  3053. function DefDriverProc; external mmsyst name 'DefDriverProc';
  3054. function DrvGetModuleHandle; external mmsyst name 'DrvGetModuleHandle';
  3055. function erMessage; external mmsyst name 'erMessage';
  3056. function GetDriverModuleHandle; external mmsyst name 'GetDriverModuleHandle';
  3057. function joyGetDevCapsA; external mmsyst name 'joyGetDevCapsA';
  3058. function joyGetDevCapsW; external mmsyst name 'joyGetDevCapsW';
  3059. function joyGetDevCaps; external mmsyst name 'joyGetDevCapsA';
  3060. function joyGetNumDevs; external mmsyst name 'joyGetNumDevs';
  3061. function joyGetPos; external mmsyst name 'joyGetPos';
  3062. function joyGetPosEx; external mmsyst name 'joyGetPosEx';
  3063. function joyGetThreshold; external mmsyst name 'joyGetThreshold';
  3064. function joyReleaseCapture; external mmsyst name 'joyReleaseCapture';
  3065. function joySetCapture; external mmsyst name 'joySetCapture';
  3066. function joySetThreshold; external mmsyst name 'joySetThreshold';
  3067. function mciExecute; external mmsyst name 'mciExecute';
  3068. function mciGetCreatorTask; external mmsyst name 'mciGetCreatorTask';
  3069. function mciGetDeviceIDA; external mmsyst name 'mciGetDeviceIDA';
  3070. function mciGetDeviceIDW; external mmsyst name 'mciGetDeviceIDW';
  3071. function mciGetDeviceID; external mmsyst name 'mciGetDeviceIDA';
  3072. function mciGetDeviceIDFromElementIDA; external mmsyst name 'mciGetDeviceIDFromElementIDA';
  3073. function mciGetDeviceIDFromElementIDW; external mmsyst name 'mciGetDeviceIDFromElementIDW';
  3074. function mciGetDeviceIDFromElementID; external mmsyst name 'mciGetDeviceIDFromElementIDA';
  3075. function mciGetErrorStringA; external mmsyst name 'mciGetErrorStringA';
  3076. function mciGetErrorStringW; external mmsyst name 'mciGetErrorStringW';
  3077. function mciGetErrorString; external mmsyst name 'mciGetErrorStringA';
  3078. function mciGetYieldProc; external mmsyst name 'mciGetYieldProc';
  3079. function mciSendCommandA; external mmsyst name 'mciSendCommandA';
  3080. function mciSendCommandW; external mmsyst name 'mciSendCommandW';
  3081. function mciSendCommand; external mmsyst name 'mciSendCommandA';
  3082. function mciSendStringA; external mmsyst name 'mciSendStringA';
  3083. function mciSendStringW; external mmsyst name 'mciSendStringW';
  3084. function mciSendString; external mmsyst name 'mciSendStringA';
  3085. function mciSetYieldProc; external mmsyst name 'mciSetYieldProc';
  3086. function midiConnect; external mmsyst name 'midiConnect';
  3087. function midiDisconnect; external mmsyst name 'midiDisconnect';
  3088. function midiInAddBuffer; external mmsyst name 'midiInAddBuffer';
  3089. function midiInClose; external mmsyst name 'midiInClose';
  3090. function midiInGetDevCapsA; external mmsyst name 'midiInGetDevCapsA';
  3091. function midiInGetDevCapsW; external mmsyst name 'midiInGetDevCapsW';
  3092. function midiInGetDevCaps; external mmsyst name 'midiInGetDevCapsA';
  3093. function midiInGetErrorTextA; external mmsyst name 'midiInGetErrorTextA';
  3094. function midiInGetErrorTextW; external mmsyst name 'midiInGetErrorTextW';
  3095. function midiInGetErrorText; external mmsyst name 'midiInGetErrorTextA';
  3096. function midiInGetID; external mmsyst name 'midiInGetID';
  3097. function midiInGetNumDevs; external mmsyst name 'midiInGetNumDevs';
  3098. function midiInMessage; external mmsyst name 'midiInMessage';
  3099. function midiInOpen; external mmsyst name 'midiInOpen';
  3100. function midiInPrepareHeader; external mmsyst name 'midiInPrepareHeader';
  3101. function midiInReset; external mmsyst name 'midiInReset';
  3102. function midiInStart; external mmsyst name 'midiInStart';
  3103. function midiInStop; external mmsyst name 'midiInStop';
  3104. function midiInUnprepareHeader; external mmsyst name 'midiInUnprepareHeader';
  3105. function midiOutCacheDrumPatches; external mmsyst name 'midiOutCacheDrumPatches';
  3106. function midiOutCachePatches; external mmsyst name 'midiOutCachePatches';
  3107. function midiOutClose; external mmsyst name 'midiOutClose';
  3108. function midiOutGetDevCapsA; external mmsyst name 'midiOutGetDevCapsA';
  3109. function midiOutGetDevCapsW; external mmsyst name 'midiOutGetDevCapsW';
  3110. function midiOutGetDevCaps; external mmsyst name 'midiOutGetDevCapsA';
  3111. function midiOutGetErrorTextA; external mmsyst name 'midiOutGetErrorTextA';
  3112. function midiOutGetErrorTextW; external mmsyst name 'midiOutGetErrorTextW';
  3113. function midiOutGetErrorText; external mmsyst name 'midiOutGetErrorTextA';
  3114. function midiOutGetID; external mmsyst name 'midiOutGetID';
  3115. function midiOutGetNumDevs; external mmsyst name 'midiOutGetNumDevs';
  3116. function midiOutGetVolume; external mmsyst name 'midiOutGetVolume';
  3117. function midiOutLongMsg; external mmsyst name 'midiOutLongMsg';
  3118. function midiOutMessage; external mmsyst name 'midiOutMessage';
  3119. function midiOutOpen; external mmsyst name 'midiOutOpen';
  3120. function midiOutPrepareHeader; external mmsyst name 'midiOutPrepareHeader';
  3121. function midiOutReset; external mmsyst name 'midiOutReset';
  3122. function midiOutSetVolume; external mmsyst name 'midiOutSetVolume';
  3123. function midiOutShortMsg; external mmsyst name 'midiOutShortMsg';
  3124. function midiOutUnprepareHeader; external mmsyst name 'midiOutUnprepareHeader';
  3125. function midiStreamClose; external mmsyst name 'midiStreamClose';
  3126. function midiStreamOpen; external mmsyst name 'midiStreamOpen';
  3127. function midiStreamOut; external mmsyst name 'midiStreamOut';
  3128. function midiStreamPause; external mmsyst name 'midiStreamPause';
  3129. function midiStreamPosition; external mmsyst name 'midiStreamPosition';
  3130. function midiStreamProperty; external mmsyst name 'midiStreamProperty';
  3131. function midiStreamRestart; external mmsyst name 'midiStreamRestart';
  3132. function midiStreamStop; external mmsyst name 'midiStreamStop';
  3133. function mixerClose; external mmsyst name 'mixerClose';
  3134. function mixerGetControlDetailsA; external mmsyst name 'mixerGetControlDetailsA';
  3135. function mixerGetControlDetailsW; external mmsyst name 'mixerGetControlDetailsW';
  3136. function mixerGetControlDetails; external mmsyst name 'mixerGetControlDetailsA';
  3137. function mixerGetDevCapsA; external mmsyst name 'mixerGetDevCapsA';
  3138. function mixerGetDevCapsW; external mmsyst name 'mixerGetDevCapsW';
  3139. function mixerGetDevCaps; external mmsyst name 'mixerGetDevCapsA';
  3140. function mixerGetID; external mmsyst name 'mixerGetID';
  3141. function mixerGetLineControlsA; external mmsyst name 'mixerGetLineControlsA';
  3142. function mixerGetLineControlsW; external mmsyst name 'mixerGetLineControlsW';
  3143. function mixerGetLineControls; external mmsyst name 'mixerGetLineControlsA';
  3144. function mixerGetLineInfoA; external mmsyst name 'mixerGetLineInfoA';
  3145. function mixerGetLineInfoW; external mmsyst name 'mixerGetLineInfoW';
  3146. function mixerGetLineInfo; external mmsyst name 'mixerGetLineInfoA';
  3147. function mixerGetNumDevs; external mmsyst name 'mixerGetNumDevs';
  3148. function mixerOpen; external mmsyst name 'mixerOpen';
  3149. function mixerSetControlDetails; external mmsyst name 'mixerSetControlDetails';
  3150. function mmioAdvance; external mmsyst name 'mmioAdvance';
  3151. function mmioAscend; external mmsyst name 'mmioAscend';
  3152. function mmioClose; external mmsyst name 'mmioClose';
  3153. function mmioCreateChunk; external mmsyst name 'mmioCreateChunk';
  3154. function mmioDescend; external mmsyst name 'mmioDescend';
  3155. function mmioFlush; external mmsyst name 'mmioFlush';
  3156. function mmioGetInfo; external mmsyst name 'mmioGetInfo';
  3157. function mmioInstallIOProcA; external mmsyst name 'mmioInstallIOProcA';
  3158. function mmioInstallIOProcW; external mmsyst name 'mmioInstallIOProcW';
  3159. function mmioInstallIOProc; external mmsyst name 'mmioInstallIOProcA';
  3160. function mmioOpenA; external mmsyst name 'mmioOpenA';
  3161. function mmioOpenW; external mmsyst name 'mmioOpenW';
  3162. function mmioOpen; external mmsyst name 'mmioOpenA';
  3163. function mmioRead; external mmsyst name 'mmioRead';
  3164. function mmioRenameA; external mmsyst name 'mmioRenameA';
  3165. function mmioRenameW; external mmsyst name 'mmioRenameW';
  3166. function mmioRename; external mmsyst name 'mmioRenameA';
  3167. function mmioSeek; external mmsyst name 'mmioSeek';
  3168. function mmioSendMessage; external mmsyst name 'mmioSendMessage';
  3169. function mmioSetBuffer; external mmsyst name 'mmioSetBuffer';
  3170. function mmioSetInfo; external mmsyst name 'mmioSetInfo';
  3171. function mmioStringToFOURCCA; external mmsyst name 'mmioStringToFOURCCA';
  3172. function mmioStringToFOURCCW; external mmsyst name 'mmioStringToFOURCCW';
  3173. function mmioStringToFOURCC; external mmsyst name 'mmioStringToFOURCCA';
  3174. function mmioWrite; external mmsyst name 'mmioWrite';
  3175. function mmsystemGetVersion; external mmsyst name 'mmsystemGetVersion';
  3176. function OpenDriver; external mmsyst name 'OpenDriver';
  3177. function PlaySoundA; external mmsyst name 'PlaySoundA';
  3178. function PlaySoundW; external mmsyst name 'PlaySoundW';
  3179. function PlaySound; external mmsyst name 'PlaySoundA';
  3180. function SendDriverMessage; external mmsyst name 'SendDriverMessage';
  3181. function sndPlaySoundA; external mmsyst name 'sndPlaySoundA';
  3182. function sndPlaySoundW; external mmsyst name 'sndPlaySoundW';
  3183. function sndPlaySound; external mmsyst name 'sndPlaySoundA';
  3184. function timeBeginPeriod; external mmsyst name 'timeBeginPeriod';
  3185. function timeEndPeriod; external mmsyst name 'timeEndPeriod';
  3186. function timeGetDevCaps; external mmsyst name 'timeGetDevCaps';
  3187. function timeGetSystemTime; external mmsyst name 'timeGetSystemTime';
  3188. function timeGetTime; external mmsyst name 'timeGetTime';
  3189. function timeKillEvent; external mmsyst name 'timeKillEvent';
  3190. function timeSetEvent; external mmsyst name 'timeSetEvent';
  3191. function waveInAddBuffer; external mmsyst name 'waveInAddBuffer';
  3192. function waveInClose; external mmsyst name 'waveInClose';
  3193. function waveInGetDevCapsA; external mmsyst name 'waveInGetDevCapsA';
  3194. function waveInGetDevCapsW; external mmsyst name 'waveInGetDevCapsW';
  3195. function waveInGetDevCaps; external mmsyst name 'waveInGetDevCapsA';
  3196. function waveInGetErrorTextA; external mmsyst name 'waveInGetErrorTextA';
  3197. function waveInGetErrorTextW; external mmsyst name 'waveInGetErrorTextW';
  3198. function waveInGetErrorText; external mmsyst name 'waveInGetErrorTextA';
  3199. function waveInGetID; external mmsyst name 'waveInGetID';
  3200. function waveInGetNumDevs; external mmsyst name 'waveInGetNumDevs';
  3201. function waveInGetPosition; external mmsyst name 'waveInGetPosition';
  3202. function waveInMessage; external mmsyst name 'waveInMessage';
  3203. function waveInOpen; external mmsyst name 'waveInOpen';
  3204. function waveInPrepareHeader; external mmsyst name 'waveInPrepareHeader';
  3205. function waveInReset; external mmsyst name 'waveInReset';
  3206. function waveInStart; external mmsyst name 'waveInStart';
  3207. function waveInStop; external mmsyst name 'waveInStop';
  3208. function waveInUnprepareHeader; external mmsyst name 'waveInUnprepareHeader';
  3209. function waveOutBreakLoop; external mmsyst name 'waveOutBreakLoop';
  3210. function waveOutClose; external mmsyst name 'waveOutClose';
  3211. function waveOutGetDevCapsA; external mmsyst name 'waveOutGetDevCapsA';
  3212. function waveOutGetDevCapsW; external mmsyst name 'waveOutGetDevCapsW';
  3213. function waveOutGetDevCaps; external mmsyst name 'waveOutGetDevCapsA';
  3214. function waveOutGetErrorTextA; external mmsyst name 'waveOutGetErrorTextA';
  3215. function waveOutGetErrorTextW; external mmsyst name 'waveOutGetErrorTextW';
  3216. function waveOutGetErrorText; external mmsyst name 'waveOutGetErrorTextA';
  3217. function waveOutGetID; external mmsyst name 'waveOutGetID';
  3218. function waveOutGetNumDevs; external mmsyst name 'waveOutGetNumDevs';
  3219. function waveOutGetPitch; external mmsyst name 'waveOutGetPitch';
  3220. function waveOutGetPlaybackRate; external mmsyst name 'waveOutGetPlaybackRate';
  3221. function waveOutGetPosition; external mmsyst name 'waveOutGetPosition';
  3222. function waveOutGetVolume; external mmsyst name 'waveOutGetVolume';
  3223. function waveOutMessage; external mmsyst name 'waveOutMessage';
  3224. function waveOutOpen; external mmsyst name 'waveOutOpen';
  3225. function waveOutPause; external mmsyst name 'waveOutPause';
  3226. function waveOutPrepareHeader; external mmsyst name 'waveOutPrepareHeader';
  3227. function waveOutReset; external mmsyst name 'waveOutReset';
  3228. function waveOutRestart; external mmsyst name 'waveOutRestart';
  3229. function waveOutSetPitch; external mmsyst name 'waveOutSetPitch';
  3230. function waveOutSetPlaybackRate; external mmsyst name 'waveOutSetPlaybackRate';
  3231. function waveOutSetVolume; external mmsyst name 'waveOutSetVolume';
  3232. function waveOutUnprepareHeader; external mmsyst name 'waveOutUnprepareHeader';
  3233. function waveOutWrite; external mmsyst name 'waveOutWrite';
  3234.  
  3235. function mci_MSF_Minute(msf: Longint): Byte;
  3236. begin
  3237.   Result := LoByte(LoWord(msf));
  3238. end;
  3239.  
  3240. function mci_MSF_Second(msf: Longint): Byte;
  3241. begin
  3242.   Result := HiByte(LoWord(msf));
  3243. end;
  3244.  
  3245. function mci_MSF_Frame(msf: Longint): Byte;
  3246. begin
  3247.   Result := LoByte(HiWord(msf));
  3248. end;
  3249.  
  3250. function mci_Make_MSF(m, s, f: Byte): Longint;
  3251. begin
  3252.   Result := Longint(m or (s shl 8) or (f shl 16));
  3253. end;
  3254.  
  3255. function mci_TMSF_Track(tmsf: Longint): Byte;
  3256. begin
  3257.   Result := LoByte(LoWord(tmsf));
  3258. end;
  3259.  
  3260. function mci_TMSF_Minute(tmsf: Longint): Byte;
  3261. begin
  3262.   Result := HiByte(LoWord(tmsf));
  3263. end;
  3264.  
  3265. function mci_TMSF_Second(tmsf: Longint): Byte;
  3266. begin
  3267.   Result := LoByte(HiWord(tmsf));
  3268. end;
  3269.  
  3270. function mci_TMSF_Frame(tmsf: Longint): Byte;
  3271. begin
  3272.   Result := HiByte(HiWord(tmsf));
  3273. end;
  3274.  
  3275. function mci_Make_TMSF(t, m, s, f: Byte): Longint;
  3276. begin
  3277.   Result := Longint(t or (m shl 8) or (s shl 16) or (f shl 24));
  3278. end;
  3279.  
  3280. function mci_HMS_Hour(hms: Longint): Byte;
  3281. begin
  3282.   Result := LoByte(LoWord(hms));
  3283. end;
  3284.  
  3285. function mci_HMS_Minute(hms: Longint): Byte;
  3286. begin
  3287.   Result := HiByte(LoWord(hms));
  3288. end;
  3289.  
  3290. function mci_HMS_Second(hms: Longint): Byte;
  3291. begin
  3292.   Result := LoByte(HiWord(hms));
  3293. end;
  3294.  
  3295. function mci_Make_HMS(h, m, s: Byte): Longint;
  3296. begin
  3297.   Result := Longint(h or (m shl 8) or (s shl 16));
  3298. end;
  3299.  
  3300. function DIBIndex(N: Integer): Longint;
  3301. begin
  3302.   Result := MakeLong(N, $10FF);
  3303. end;
  3304.  
  3305. end.
  3306.