MMSYSTEM.H
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:151k
源码类别:

VC书籍

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  mmsystem.h -- Include file for Multimedia API's
  4.  *
  5.  *  Version 4.00
  6.  *
  7.  *  Copyright 1992 - 1998 Microsoft Corporation.  All Rights Reserved.
  8.  *
  9.  *--------------------------------------------------------------------------
  10.  *
  11.  *  Define:         Prevent inclusion of:
  12.  *  --------------  --------------------------------------------------------
  13.  *  MMNODRV         Installable driver support
  14.  *  MMNOSOUND       Sound support
  15.  *  MMNOWAVE        Waveform support
  16.  *  MMNOMIDI        MIDI support
  17.  *  MMNOAUX         Auxiliary audio support
  18.  *  MMNOMIXER       Mixer support
  19.  *  MMNOTIMER       Timer support
  20.  *  MMNOJOY         Joystick support
  21.  *  MMNOMCI         MCI support
  22.  *  MMNOMMIO        Multimedia file I/O support
  23.  *  MMNOMMSYSTEM    General MMSYSTEM functions
  24.  *
  25.  *==========================================================================
  26.  */
  27. #ifndef _INC_MMSYSTEM
  28. #define _INC_MMSYSTEM   /* #defined if mmsystem.h has been included */
  29. #ifdef _WIN32
  30. #include <pshpack1.h>
  31. #else
  32. #ifndef RC_INVOKED
  33. #pragma pack(1)
  34. #endif
  35. #endif
  36. #ifdef __cplusplus
  37. extern "C" {            /* Assume C declarations for C++ */
  38. #endif  /* __cplusplus */
  39. #ifdef _WIN32
  40. #ifndef _WINMM_
  41. #define WINMMAPI DECLSPEC_IMPORT
  42. #else
  43. #define WINMMAPI
  44. #endif
  45. #define _loadds
  46. #define _huge
  47. #else
  48. #define WINMMAPI
  49. #endif
  50. #ifdef _WIN32_VXD
  51. #define NEAR
  52. #define FAR
  53. #define DECLARE_HANDLE(x) typedef WORD x
  54. #define WINAPI
  55. typedef DWORD LPSTR;
  56. typedef DWORD LPVOID;
  57. typedef DWORD LPCSTR;
  58. typedef DWORD LPCWSTR;
  59. typedef DWORD LRESULT;
  60. typedef DWORD LPARAM;
  61. typedef DWORD WPARAM;
  62. typedef short WCHAR;
  63. #endif
  64. /****************************************************************************
  65.     General constants and data types
  66. ****************************************************************************/
  67. /* general constants */
  68. #define MAXPNAMELEN      32     /* max product name length (including NULL) */
  69. #define MAXERRORLENGTH   256    /* max error text length (including NULL) */
  70. #define MAX_JOYSTICKOEMVXDNAME 260 /* max oem vxd name length (including NULL) */
  71. /*
  72.  *  Microsoft Manufacturer and Product ID's (these have been moved to
  73.  *  MMREG.H for Windows 4.00 and above).
  74.  */
  75. #if (WINVER <= 0x030A)
  76. #ifndef MM_MICROSOFT
  77. #define MM_MICROSOFT            1   /* Microsoft Corporation */
  78. #endif
  79. #ifndef MM_MIDI_MAPPER
  80. #define MM_MIDI_MAPPER          1   /* MIDI Mapper */
  81. #define MM_WAVE_MAPPER          2   /* Wave Mapper */
  82. #define MM_SNDBLST_MIDIOUT      3   /* Sound Blaster MIDI output port */
  83. #define MM_SNDBLST_MIDIIN       4   /* Sound Blaster MIDI input port */
  84. #define MM_SNDBLST_SYNTH        5   /* Sound Blaster internal synthesizer */
  85. #define MM_SNDBLST_WAVEOUT      6   /* Sound Blaster waveform output */
  86. #define MM_SNDBLST_WAVEIN       7   /* Sound Blaster waveform input */
  87. #define MM_ADLIB                9   /* Ad Lib-compatible synthesizer */
  88. #define MM_MPU401_MIDIOUT      10   /* MPU401-compatible MIDI output port */
  89. #define MM_MPU401_MIDIIN       11   /* MPU401-compatible MIDI input port */
  90. #define MM_PC_JOYSTICK         12   /* Joystick adapter */
  91. #endif
  92. #endif
  93. /* general data types */
  94. #ifdef _WIN32
  95. typedef UINT        MMVERSION;  /* major (high byte), minor (low byte) */
  96. #else
  97. typedef UINT        VERSION;    /* major (high byte), minor (low byte) */
  98. #endif
  99. typedef UINT        MMRESULT;   /* error return code, 0 means no error */
  100. /* call as if(err=xxxx(...)) Error(err); else */
  101. #define _MMRESULT_
  102. typedef UINT FAR   *LPUINT;
  103. /* MMTIME data structure */
  104. typedef struct mmtime_tag
  105. {
  106.     UINT            wType;      /* indicates the contents of the union */
  107.     union
  108.     {
  109. DWORD       ms;         /* milliseconds */
  110. DWORD       sample;     /* samples */
  111. DWORD       cb;         /* byte count */
  112. DWORD       ticks;      /* ticks in MIDI stream */
  113. /* SMPTE */
  114. struct
  115. {
  116.     BYTE    hour;       /* hours */
  117.     BYTE    min;        /* minutes */
  118.     BYTE    sec;        /* seconds */
  119.     BYTE    frame;      /* frames  */
  120.     BYTE    fps;        /* frames per second */
  121.     BYTE    dummy;      /* pad */
  122. #ifdef _WIN32
  123.     BYTE    pad[2];
  124. #endif
  125. } smpte;
  126. /* MIDI */
  127. struct
  128. {
  129.     DWORD songptrpos;   /* song pointer position */
  130. } midi;
  131.     } u;
  132. } MMTIME, *PMMTIME, NEAR *NPMMTIME, FAR *LPMMTIME;
  133. /* types for wType field in MMTIME struct */
  134. #define TIME_MS         0x0001  /* time in milliseconds */
  135. #define TIME_SAMPLES    0x0002  /* number of wave samples */
  136. #define TIME_BYTES      0x0004  /* current byte offset */
  137. #define TIME_SMPTE      0x0008  /* SMPTE time */
  138. #define TIME_MIDI       0x0010  /* MIDI time */
  139. #define TIME_TICKS      0x0020  /* Ticks within MIDI stream */
  140. /*
  141.  *
  142.  *
  143.  */
  144. #define MAKEFOURCC(ch0, ch1, ch2, ch3)                              
  145. ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |   
  146. ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
  147. /****************************************************************************
  148.     Multimedia Extensions Window Messages
  149. ****************************************************************************/
  150. #define MM_JOY1MOVE         0x3A0           /* joystick */
  151. #define MM_JOY2MOVE         0x3A1
  152. #define MM_JOY1ZMOVE        0x3A2
  153. #define MM_JOY2ZMOVE        0x3A3
  154. #define MM_JOY1BUTTONDOWN   0x3B5
  155. #define MM_JOY2BUTTONDOWN   0x3B6
  156. #define MM_JOY1BUTTONUP     0x3B7
  157. #define MM_JOY2BUTTONUP     0x3B8
  158. #define MM_MCINOTIFY        0x3B9           /* MCI */
  159. #define MM_WOM_OPEN         0x3BB           /* waveform output */
  160. #define MM_WOM_CLOSE        0x3BC
  161. #define MM_WOM_DONE         0x3BD
  162. #define MM_WIM_OPEN         0x3BE           /* waveform input */
  163. #define MM_WIM_CLOSE        0x3BF
  164. #define MM_WIM_DATA         0x3C0
  165. #define MM_MIM_OPEN         0x3C1           /* MIDI input */
  166. #define MM_MIM_CLOSE        0x3C2
  167. #define MM_MIM_DATA         0x3C3
  168. #define MM_MIM_LONGDATA     0x3C4
  169. #define MM_MIM_ERROR        0x3C5
  170. #define MM_MIM_LONGERROR    0x3C6
  171. #define MM_MOM_OPEN         0x3C7           /* MIDI output */
  172. #define MM_MOM_CLOSE        0x3C8
  173. #define MM_MOM_DONE         0x3C9
  174. /* these are also in msvideo.h */
  175. #ifndef MM_DRVM_OPEN
  176.  #define MM_DRVM_OPEN       0x3D0           /* installable drivers */
  177.  #define MM_DRVM_CLOSE      0x3D1
  178.  #define MM_DRVM_DATA       0x3D2
  179.  #define MM_DRVM_ERROR      0x3D3
  180. #endif
  181. /* these are used by msacm.h */
  182. #define MM_STREAM_OPEN     0x3D4
  183. #define MM_STREAM_CLOSE     0x3D5
  184. #define MM_STREAM_DONE     0x3D6
  185. #define MM_STREAM_ERROR     0x3D7
  186. #if(WINVER >= 0x0400)
  187. #define MM_MOM_POSITIONCB   0x3CA           /* Callback for MEVT_POSITIONCB */
  188. #ifndef MM_MCISIGNAL
  189.  #define MM_MCISIGNAL        0x3CB
  190. #endif
  191. #define MM_MIM_MOREDATA      0x3CC          /* MIM_DONE w/ pending events */
  192. #endif /* WINVER >= 0x0400 */
  193. #define MM_MIXM_LINE_CHANGE     0x3D0       /* mixer line change notify */
  194. #define MM_MIXM_CONTROL_CHANGE  0x3D1       /* mixer control change notify */
  195. /****************************************************************************
  196. String resource number bases (internal use)
  197. ****************************************************************************/
  198. #define MMSYSERR_BASE          0
  199. #define WAVERR_BASE            32
  200. #define MIDIERR_BASE           64
  201. #define TIMERR_BASE            96
  202. #define JOYERR_BASE            160
  203. #define MCIERR_BASE            256
  204. #define MIXERR_BASE            1024
  205. #define MCI_STRING_OFFSET      512
  206. #define MCI_VD_OFFSET          1024
  207. #define MCI_CD_OFFSET          1088
  208. #define MCI_WAVE_OFFSET        1152
  209. #define MCI_SEQ_OFFSET         1216
  210. /****************************************************************************
  211. General error return values
  212. ****************************************************************************/
  213. /* general error return values */
  214. #define MMSYSERR_NOERROR      0                    /* no error */
  215. #define MMSYSERR_ERROR        (MMSYSERR_BASE + 1)  /* unspecified error */
  216. #define MMSYSERR_BADDEVICEID  (MMSYSERR_BASE + 2)  /* device ID out of range */
  217. #define MMSYSERR_NOTENABLED   (MMSYSERR_BASE + 3)  /* driver failed enable */
  218. #define MMSYSERR_ALLOCATED    (MMSYSERR_BASE + 4)  /* device already allocated */
  219. #define MMSYSERR_INVALHANDLE  (MMSYSERR_BASE + 5)  /* device handle is invalid */
  220. #define MMSYSERR_NODRIVER     (MMSYSERR_BASE + 6)  /* no device driver present */
  221. #define MMSYSERR_NOMEM        (MMSYSERR_BASE + 7)  /* memory allocation error */
  222. #define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE + 8)  /* function isn't supported */
  223. #define MMSYSERR_BADERRNUM    (MMSYSERR_BASE + 9)  /* error value out of range */
  224. #define MMSYSERR_INVALFLAG    (MMSYSERR_BASE + 10) /* invalid flag passed */
  225. #define MMSYSERR_INVALPARAM   (MMSYSERR_BASE + 11) /* invalid parameter passed */
  226. #define MMSYSERR_HANDLEBUSY   (MMSYSERR_BASE + 12) /* handle being used */
  227.    /* simultaneously on another */
  228.    /* thread (eg callback) */
  229. #define MMSYSERR_INVALIDALIAS (MMSYSERR_BASE + 13) /* specified alias not found */
  230. #define MMSYSERR_BADDB        (MMSYSERR_BASE + 14) /* bad registry database */
  231. #define MMSYSERR_KEYNOTFOUND  (MMSYSERR_BASE + 15) /* registry key not found */
  232. #define MMSYSERR_READERROR    (MMSYSERR_BASE + 16) /* registry read error */
  233. #define MMSYSERR_WRITEERROR   (MMSYSERR_BASE + 17) /* registry write error */
  234. #define MMSYSERR_DELETEERROR  (MMSYSERR_BASE + 18) /* registry delete error */
  235. #define MMSYSERR_VALNOTFOUND  (MMSYSERR_BASE + 19) /* registry value not found */
  236. #define MMSYSERR_NODRIVERCB   (MMSYSERR_BASE + 20) /* driver does not call DriverCallback */
  237. #define MMSYSERR_LASTERROR    (MMSYSERR_BASE + 20) /* last error in range */
  238. #if (WINVER < 0x030a) || defined(_WIN32)
  239. DECLARE_HANDLE(HDRVR);
  240. #endif /* ifdef WINVER < 0x030a */
  241. #ifndef MMNODRV
  242. /****************************************************************************
  243. Installable driver support
  244. ****************************************************************************/
  245. #ifdef _WIN32
  246. typedef struct DRVCONFIGINFOEX {
  247.     DWORD   dwDCISize;
  248.     LPCWSTR  lpszDCISectionName;
  249.     LPCWSTR  lpszDCIAliasName;
  250.     DWORD    dnDevNode;
  251. } DRVCONFIGINFOEX, *PDRVCONFIGINFOEX, NEAR *NPDRVCONFIGINFOEX, FAR *LPDRVCONFIGINFOEX;
  252. #else
  253. typedef struct DRVCONFIGINFOEX {
  254.     DWORD   dwDCISize;
  255.     LPCSTR  lpszDCISectionName;
  256.     LPCSTR  lpszDCIAliasName;
  257.     DWORD    dnDevNode;
  258. } DRVCONFIGINFOEX, *PDRVCONFIGINFOEX, NEAR *NPDRVCONFIGINFOEX, FAR *LPDRVCONFIGINFOEX;
  259. #endif
  260. #if (WINVER < 0x030a) || defined(_WIN32)
  261. #ifndef DRV_LOAD
  262. /* Driver messages */
  263. #define DRV_LOAD                0x0001
  264. #define DRV_ENABLE              0x0002
  265. #define DRV_OPEN                0x0003
  266. #define DRV_CLOSE               0x0004
  267. #define DRV_DISABLE             0x0005
  268. #define DRV_FREE                0x0006
  269. #define DRV_CONFIGURE           0x0007
  270. #define DRV_QUERYCONFIGURE      0x0008
  271. #define DRV_INSTALL             0x0009
  272. #define DRV_REMOVE              0x000A
  273. #define DRV_EXITSESSION         0x000B
  274. #define DRV_POWER               0x000F
  275. #define DRV_RESERVED            0x0800
  276. #define DRV_USER                0x4000
  277. /* LPARAM of DRV_CONFIGURE message */
  278. #ifdef _WIN32
  279. typedef struct tagDRVCONFIGINFO {
  280.     DWORD   dwDCISize;
  281.     LPCWSTR  lpszDCISectionName;
  282.     LPCWSTR  lpszDCIAliasName;
  283. } DRVCONFIGINFO, *PDRVCONFIGINFO, NEAR *NPDRVCONFIGINFO, FAR *LPDRVCONFIGINFO;
  284. #else
  285. typedef struct tagDRVCONFIGINFO {
  286.     DWORD   dwDCISize;
  287.     LPCSTR  lpszDCISectionName;
  288.     LPCSTR  lpszDCIAliasName;
  289. } DRVCONFIGINFO, *PDRVCONFIGINFO, NEAR *NPDRVCONFIGINFO, FAR *LPDRVCONFIGINFO;
  290. #endif
  291. /* Supported return values for DRV_CONFIGURE message */
  292. #define DRVCNF_CANCEL           0x0000
  293. #define DRVCNF_OK               0x0001
  294. #define DRVCNF_RESTART          0x0002
  295. /* installable driver function prototypes */
  296. #ifdef _WIN32
  297.  #ifndef _WIN32_VXD
  298. typedef LRESULT (CALLBACK* DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM);
  299. WINMMAPI LRESULT   WINAPI CloseDriver(HDRVR hDriver, LONG lParam1, LONG lParam2);
  300. WINMMAPI HDRVR     WINAPI OpenDriver(LPCWSTR szDriverName, LPCWSTR szSectionName, LONG lParam2);
  301. WINMMAPI LRESULT   WINAPI SendDriverMessage(HDRVR hDriver, UINT message, LONG lParam1, LONG lParam2);
  302. WINMMAPI HMODULE   WINAPI DrvGetModuleHandle(HDRVR hDriver);
  303. WINMMAPI HMODULE   WINAPI GetDriverModuleHandle(HDRVR hDriver);
  304. WINMMAPI LRESULT   WINAPI DefDriverProc(DWORD dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
  305.  #endif /* ifndef _WIN32_VXD */
  306. #else
  307. LRESULT   WINAPI DrvClose(HDRVR hdrvr, LPARAM lParam1, LPARAM lParam2);
  308. HDRVR     WINAPI DrvOpen(LPCSTR szDriverName, LPCSTR szSectionName, LPARAM lParam2);
  309. LRESULT   WINAPI DrvSendMessage(HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
  310. HINSTANCE WINAPI DrvGetModuleHandle(HDRVR hdrvr);
  311. LRESULT   WINAPI DrvDefDriverProc(DWORD dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
  312. #define DefDriverProc DrvDefDriverProc
  313. #endif /* ifdef _WIN32 */
  314. #endif /* DRV_LOAD */
  315. #endif /* ifdef (WINVER < 0x030a) || defined(_WIN32) */
  316. #if (WINVER >= 0x030a)
  317. /* return values from DriverProc() function */
  318. #define DRV_CANCEL             DRVCNF_CANCEL
  319. #define DRV_OK                 DRVCNF_OK
  320. #define DRV_RESTART            DRVCNF_RESTART
  321. #endif /* ifdef WINVER >= 0x030a */
  322. #define DRV_MCI_FIRST          DRV_RESERVED
  323. #define DRV_MCI_LAST           (DRV_RESERVED + 0xFFF)
  324. #endif  /* ifndef MMNODRV */
  325. /****************************************************************************
  326.   Driver callback support
  327. ****************************************************************************/
  328. /* flags used with waveOutOpen(), waveInOpen(), midiInOpen(), and */
  329. /* midiOutOpen() to specify the type of the dwCallback parameter. */
  330. #define CALLBACK_TYPEMASK   0x00070000l    /* callback type mask */
  331. #define CALLBACK_NULL       0x00000000l    /* no callback */
  332. #define CALLBACK_WINDOW     0x00010000l    /* dwCallback is a HWND */
  333. #define CALLBACK_TASK       0x00020000l    /* dwCallback is a HTASK */
  334. #define CALLBACK_FUNCTION   0x00030000l    /* dwCallback is a FARPROC */
  335. #ifdef _WIN32
  336. #define CALLBACK_THREAD     (CALLBACK_TASK)/* thread ID replaces 16 bit task */
  337. #define CALLBACK_EVENT      0x00050000l    /* dwCallback is an EVENT Handle */
  338. #endif
  339. #ifndef _WIN32_VXD 
  340. typedef void (CALLBACK DRVCALLBACK)(HDRVR hdrvr, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
  341. typedef DRVCALLBACK FAR *LPDRVCALLBACK;
  342. #ifdef _WIN32
  343. typedef DRVCALLBACK     *PDRVCALLBACK;
  344. #endif
  345. #endif   /* ifndef _WIN32_VXD */ 
  346. #ifndef MMNOMMSYSTEM
  347. #ifndef _WIN32_VXD
  348. /****************************************************************************
  349.     General MMSYSTEM support
  350. ****************************************************************************/
  351. #if (WINVER <= 0x030A)
  352. WINMMAPI UINT WINAPI mmsystemGetVersion(void);
  353. #endif
  354. #ifdef _WIN32
  355. #define OutputDebugStr  OutputDebugString
  356. #else
  357. void WINAPI OutputDebugStr(LPCSTR);
  358. #endif
  359. #endif  /* ifndef _WIN32_VXD */
  360. #endif  /* ifndef MMNOMMSYSTEM */
  361. #ifndef MMNOSOUND
  362. #ifndef _WIN32_VXD
  363. /****************************************************************************
  364.     Sound support
  365. ****************************************************************************/
  366. #ifdef _WIN32
  367. WINMMAPI BOOL WINAPI sndPlaySoundA(LPCSTR pszSound, UINT fuSound);
  368. WINMMAPI BOOL WINAPI sndPlaySoundW(LPCWSTR pszSound, UINT fuSound);
  369. #ifdef UNICODE
  370. #define sndPlaySound  sndPlaySoundW
  371. #else
  372. #define sndPlaySound  sndPlaySoundA
  373. #endif // !UNICODE
  374. #else
  375. BOOL WINAPI sndPlaySound(LPCSTR pszSound, UINT fuSound);
  376. #endif
  377. /*
  378.  *  flag values for fuSound and fdwSound arguments on [snd]PlaySound
  379.  */
  380. #define SND_SYNC            0x0000  /* play synchronously (default) */
  381. #define SND_ASYNC           0x0001  /* play asynchronously */
  382. #define SND_NODEFAULT       0x0002  /* silence (!default) if sound not found */
  383. #define SND_MEMORY          0x0004  /* pszSound points to a memory file */
  384. #define SND_LOOP            0x0008  /* loop the sound until next sndPlaySound */
  385. #define SND_NOSTOP          0x0010  /* don't stop any currently playing sound */
  386. #define SND_NOWAIT 0x00002000L /* don't wait if the driver is busy */
  387. #define SND_ALIAS       0x00010000L /* name is a registry alias */
  388. #define SND_ALIAS_ID 0x00110000L /* alias is a predefined ID */
  389. #define SND_FILENAME    0x00020000L /* name is file name */
  390. #define SND_RESOURCE    0x00040004L /* name is resource name or atom */
  391. #if(WINVER >= 0x0400)
  392. #define SND_PURGE           0x0040  /* purge non-static events for task */
  393. #define SND_APPLICATION     0x0080  /* look for application specific association */
  394. #endif /* WINVER >= 0x0400 */
  395. #define SND_ALIAS_START 0           /* alias base */
  396. #ifdef _WIN32
  397. #define sndAlias(ch0, ch1) (SND_ALIAS_START + (DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8))
  398. #define SND_ALIAS_SYSTEMASTERISK        sndAlias('S', '*')
  399. #define SND_ALIAS_SYSTEMQUESTION        sndAlias('S', '?')
  400. #define SND_ALIAS_SYSTEMHAND            sndAlias('S', 'H')
  401. #define SND_ALIAS_SYSTEMEXIT            sndAlias('S', 'E')
  402. #define SND_ALIAS_SYSTEMSTART           sndAlias('S', 'S')
  403. #define SND_ALIAS_SYSTEMWELCOME         sndAlias('S', 'W')
  404. #define SND_ALIAS_SYSTEMEXCLAMATION     sndAlias('S', '!')
  405. #define SND_ALIAS_SYSTEMDEFAULT         sndAlias('S', 'D')
  406. WINMMAPI BOOL WINAPI PlaySoundA(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
  407. WINMMAPI BOOL WINAPI PlaySoundW(LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound);
  408. #ifdef UNICODE
  409. #define PlaySound  PlaySoundW
  410. #else
  411. #define PlaySound  PlaySoundA
  412. #endif // !UNICODE
  413. #else
  414. BOOL WINAPI PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
  415. #endif
  416. #endif  /* ifndef _WIN32_VXD */
  417. #endif  /* ifndef MMNOSOUND */
  418. #ifndef MMNOWAVE
  419. /****************************************************************************
  420. Waveform audio support
  421. ****************************************************************************/
  422. /* waveform audio error return values */
  423. #define WAVERR_BADFORMAT      (WAVERR_BASE + 0)    /* unsupported wave format */
  424. #define WAVERR_STILLPLAYING   (WAVERR_BASE + 1)    /* still something playing */
  425. #define WAVERR_UNPREPARED     (WAVERR_BASE + 2)    /* header not prepared */
  426. #define WAVERR_SYNC           (WAVERR_BASE + 3)    /* device is synchronous */
  427. #define WAVERR_LASTERROR      (WAVERR_BASE + 3)    /* last error in range */
  428. /* waveform audio data types */
  429. DECLARE_HANDLE(HWAVE);
  430. DECLARE_HANDLE(HWAVEIN);
  431. DECLARE_HANDLE(HWAVEOUT);
  432. #ifndef _WIN32_VXD
  433. typedef HWAVEIN FAR *LPHWAVEIN;
  434. typedef HWAVEOUT FAR *LPHWAVEOUT;
  435. typedef DRVCALLBACK WAVECALLBACK;
  436. typedef WAVECALLBACK FAR *LPWAVECALLBACK;
  437. #endif
  438. /* wave callback messages */
  439. #define WOM_OPEN        MM_WOM_OPEN
  440. #define WOM_CLOSE       MM_WOM_CLOSE
  441. #define WOM_DONE        MM_WOM_DONE
  442. #define WIM_OPEN        MM_WIM_OPEN
  443. #define WIM_CLOSE       MM_WIM_CLOSE
  444. #define WIM_DATA        MM_WIM_DATA
  445. /* device ID for wave device mapper */
  446. #define WAVE_MAPPER     ((UINT)-1)
  447. /* flags for dwFlags parameter in waveOutOpen() and waveInOpen() */
  448. #define  WAVE_FORMAT_QUERY         0x0001
  449. #define  WAVE_ALLOWSYNC            0x0002
  450. #if(WINVER >= 0x0400)
  451. #define  WAVE_MAPPED               0x0004
  452. #define  WAVE_FORMAT_DIRECT        0x0008
  453. #define  WAVE_FORMAT_DIRECT_QUERY  (WAVE_FORMAT_QUERY | WAVE_FORMAT_DIRECT)
  454. #endif /* WINVER >= 0x0400 */
  455. /* wave data block header */
  456. typedef struct wavehdr_tag {
  457.     LPSTR       lpData;                 /* pointer to locked data buffer */
  458.     DWORD       dwBufferLength;         /* length of data buffer */
  459.     DWORD       dwBytesRecorded;        /* used for input only */
  460.     DWORD       dwUser;                 /* for client's use */
  461.     DWORD       dwFlags;                /* assorted flags (see defines) */
  462.     DWORD       dwLoops;                /* loop control counter */
  463.     struct wavehdr_tag FAR *lpNext;     /* reserved for driver */
  464.     DWORD       reserved;               /* reserved for driver */
  465. } WAVEHDR, *PWAVEHDR, NEAR *NPWAVEHDR, FAR *LPWAVEHDR;
  466. /* flags for dwFlags field of WAVEHDR */
  467. #define WHDR_DONE       0x00000001  /* done bit */
  468. #define WHDR_PREPARED   0x00000002  /* set if this header has been prepared */
  469. #define WHDR_BEGINLOOP  0x00000004  /* loop start block */
  470. #define WHDR_ENDLOOP    0x00000008  /* loop end block */
  471. #define WHDR_INQUEUE    0x00000010  /* reserved for driver */
  472. /* waveform output device capabilities structure */
  473. #ifdef _WIN32
  474. typedef struct tagWAVEOUTCAPSA {
  475.     WORD    wMid;                  /* manufacturer ID */
  476.     WORD    wPid;                  /* product ID */
  477.     MMVERSION vDriverVersion;      /* version of the driver */
  478.     CHAR    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
  479.     DWORD   dwFormats;             /* formats supported */
  480.     WORD    wChannels;             /* number of sources supported */
  481.     WORD    wReserved1;            /* packing */
  482.     DWORD   dwSupport;             /* functionality supported by driver */
  483. } WAVEOUTCAPSA, *PWAVEOUTCAPSA, *NPWAVEOUTCAPSA, *LPWAVEOUTCAPSA;
  484. typedef struct tagWAVEOUTCAPSW {
  485.     WORD    wMid;                  /* manufacturer ID */
  486.     WORD    wPid;                  /* product ID */
  487.     MMVERSION vDriverVersion;      /* version of the driver */
  488.     WCHAR   szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
  489.     DWORD   dwFormats;             /* formats supported */
  490.     WORD    wChannels;             /* number of sources supported */
  491.     WORD    wReserved1;            /* packing */
  492.     DWORD   dwSupport;             /* functionality supported by driver */
  493. } WAVEOUTCAPSW, *PWAVEOUTCAPSW, *NPWAVEOUTCAPSW, *LPWAVEOUTCAPSW;
  494. #ifdef UNICODE
  495. typedef WAVEOUTCAPSW WAVEOUTCAPS;
  496. typedef PWAVEOUTCAPSW PWAVEOUTCAPS;
  497. typedef NPWAVEOUTCAPSW NPWAVEOUTCAPS;
  498. typedef LPWAVEOUTCAPSW LPWAVEOUTCAPS;
  499. #else
  500. typedef WAVEOUTCAPSA WAVEOUTCAPS;
  501. typedef PWAVEOUTCAPSA PWAVEOUTCAPS;
  502. typedef NPWAVEOUTCAPSA NPWAVEOUTCAPS;
  503. typedef LPWAVEOUTCAPSA LPWAVEOUTCAPS;
  504. #endif // UNICODE
  505. #else
  506. typedef struct waveoutcaps_tag {
  507.     WORD    wMid;                  /* manufacturer ID */
  508.     WORD    wPid;                  /* product ID */
  509.     VERSION vDriverVersion;        /* version of the driver */
  510.     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
  511.     DWORD   dwFormats;             /* formats supported */
  512.     WORD    wChannels;             /* number of sources supported */
  513.     DWORD   dwSupport;             /* functionality supported by driver */
  514. } WAVEOUTCAPS, *PWAVEOUTCAPS, NEAR *NPWAVEOUTCAPS, FAR *LPWAVEOUTCAPS;
  515. #endif
  516. /* flags for dwSupport field of WAVEOUTCAPS */
  517. #define WAVECAPS_PITCH          0x0001   /* supports pitch control */
  518. #define WAVECAPS_PLAYBACKRATE   0x0002   /* supports playback rate control */
  519. #define WAVECAPS_VOLUME         0x0004   /* supports volume control */
  520. #define WAVECAPS_LRVOLUME       0x0008   /* separate left-right volume control */
  521. #define WAVECAPS_SYNC           0x0010
  522. #define WAVECAPS_SAMPLEACCURATE 0x0020
  523. #define WAVECAPS_DIRECTSOUND    0x0040
  524. /* waveform input device capabilities structure */
  525. #ifdef _WIN32
  526. typedef struct tagWAVEINCAPSA {
  527.     WORD    wMid;                    /* manufacturer ID */
  528.     WORD    wPid;                    /* product ID */
  529.     MMVERSION vDriverVersion;        /* version of the driver */
  530.     CHAR    szPname[MAXPNAMELEN];    /* product name (NULL terminated string) */
  531.     DWORD   dwFormats;               /* formats supported */
  532.     WORD    wChannels;               /* number of channels supported */
  533.     WORD    wReserved1;              /* structure packing */
  534. } WAVEINCAPSA, *PWAVEINCAPSA, *NPWAVEINCAPSA, *LPWAVEINCAPSA;
  535. typedef struct tagWAVEINCAPSW {
  536.     WORD    wMid;                    /* manufacturer ID */
  537.     WORD    wPid;                    /* product ID */
  538.     MMVERSION vDriverVersion;        /* version of the driver */
  539.     WCHAR   szPname[MAXPNAMELEN];    /* product name (NULL terminated string) */
  540.     DWORD   dwFormats;               /* formats supported */
  541.     WORD    wChannels;               /* number of channels supported */
  542.     WORD    wReserved1;              /* structure packing */
  543. } WAVEINCAPSW, *PWAVEINCAPSW, *NPWAVEINCAPSW, *LPWAVEINCAPSW;
  544. #ifdef UNICODE
  545. typedef WAVEINCAPSW WAVEINCAPS;
  546. typedef PWAVEINCAPSW PWAVEINCAPS;
  547. typedef NPWAVEINCAPSW NPWAVEINCAPS;
  548. typedef LPWAVEINCAPSW LPWAVEINCAPS;
  549. #else
  550. typedef WAVEINCAPSA WAVEINCAPS;
  551. typedef PWAVEINCAPSA PWAVEINCAPS;
  552. typedef NPWAVEINCAPSA NPWAVEINCAPS;
  553. typedef LPWAVEINCAPSA LPWAVEINCAPS;
  554. #endif // UNICODE
  555. #else
  556. typedef struct waveincaps_tag {
  557.     WORD    wMid;                    /* manufacturer ID */
  558.     WORD    wPid;                    /* product ID */
  559.     VERSION vDriverVersion;          /* version of the driver */
  560.     char    szPname[MAXPNAMELEN];    /* product name (NULL terminated string) */
  561.     DWORD   dwFormats;               /* formats supported */
  562.     WORD    wChannels;               /* number of channels supported */
  563. } WAVEINCAPS, *PWAVEINCAPS, NEAR *NPWAVEINCAPS, FAR *LPWAVEINCAPS;
  564. #endif
  565. /* defines for dwFormat field of WAVEINCAPS and WAVEOUTCAPS */
  566. #define WAVE_INVALIDFORMAT     0x00000000       /* invalid format */
  567. #define WAVE_FORMAT_1M08       0x00000001       /* 11.025 kHz, Mono,   8-bit  */
  568. #define WAVE_FORMAT_1S08       0x00000002       /* 11.025 kHz, Stereo, 8-bit  */
  569. #define WAVE_FORMAT_1M16       0x00000004       /* 11.025 kHz, Mono,   16-bit */
  570. #define WAVE_FORMAT_1S16       0x00000008       /* 11.025 kHz, Stereo, 16-bit */
  571. #define WAVE_FORMAT_2M08       0x00000010       /* 22.05  kHz, Mono,   8-bit  */
  572. #define WAVE_FORMAT_2S08       0x00000020       /* 22.05  kHz, Stereo, 8-bit  */
  573. #define WAVE_FORMAT_2M16       0x00000040       /* 22.05  kHz, Mono,   16-bit */
  574. #define WAVE_FORMAT_2S16       0x00000080       /* 22.05  kHz, Stereo, 16-bit */
  575. #define WAVE_FORMAT_4M08       0x00000100       /* 44.1   kHz, Mono,   8-bit  */
  576. #define WAVE_FORMAT_4S08       0x00000200       /* 44.1   kHz, Stereo, 8-bit  */
  577. #define WAVE_FORMAT_4M16       0x00000400       /* 44.1   kHz, Mono,   16-bit */
  578. #define WAVE_FORMAT_4S16       0x00000800       /* 44.1   kHz, Stereo, 16-bit */
  579. /* OLD general waveform format structure (information common to all formats) */
  580. typedef struct waveformat_tag {
  581.     WORD    wFormatTag;        /* format type */
  582.     WORD    nChannels;         /* number of channels (i.e. mono, stereo, etc.) */
  583.     DWORD   nSamplesPerSec;    /* sample rate */
  584.     DWORD   nAvgBytesPerSec;   /* for buffer estimation */
  585.     WORD    nBlockAlign;       /* block size of data */
  586. } WAVEFORMAT, *PWAVEFORMAT, NEAR *NPWAVEFORMAT, FAR *LPWAVEFORMAT;
  587. /* flags for wFormatTag field of WAVEFORMAT */
  588. #define WAVE_FORMAT_PCM     1
  589. /* specific waveform format structure for PCM data */
  590. typedef struct pcmwaveformat_tag {
  591.     WAVEFORMAT  wf;
  592.     WORD        wBitsPerSample;
  593. } PCMWAVEFORMAT, *PPCMWAVEFORMAT, NEAR *NPPCMWAVEFORMAT, FAR *LPPCMWAVEFORMAT;
  594. #ifndef _WAVEFORMATEX_
  595. #define _WAVEFORMATEX_
  596. /*
  597.  *  extended waveform format structure used for all non-PCM formats. this
  598.  *  structure is common to all non-PCM formats.
  599.  */
  600. typedef struct tWAVEFORMATEX
  601. {
  602.     WORD        wFormatTag;         /* format type */
  603.     WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */
  604.     DWORD       nSamplesPerSec;     /* sample rate */
  605.     DWORD       nAvgBytesPerSec;    /* for buffer estimation */
  606.     WORD        nBlockAlign;        /* block size of data */
  607.     WORD        wBitsPerSample;     /* number of bits per sample of mono data */
  608.     WORD        cbSize;             /* the count in bytes of the size of */
  609.     /* extra information (after cbSize) */
  610. } WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
  611. typedef const WAVEFORMATEX FAR *LPCWAVEFORMATEX;
  612. #endif /* _WAVEFORMATEX_ */
  613. #ifndef _WIN32_VXD
  614. /* waveform audio function prototypes */
  615. WINMMAPI UINT WINAPI waveOutGetNumDevs(void);
  616. #ifdef _WIN32
  617. WINMMAPI MMRESULT WINAPI waveOutGetDevCapsA(UINT uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc);
  618. WINMMAPI MMRESULT WINAPI waveOutGetDevCapsW(UINT uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc);
  619. #ifdef UNICODE
  620. #define waveOutGetDevCaps  waveOutGetDevCapsW
  621. #else
  622. #define waveOutGetDevCaps  waveOutGetDevCapsA
  623. #endif // !UNICODE
  624. #else
  625. WINMMAPI MMRESULT WINAPI waveOutGetDevCaps(UINT uDeviceID, LPWAVEOUTCAPS pwoc, UINT cbwoc);
  626. #endif
  627. #if (WINVER >= 0x0400)
  628. WINMMAPI MMRESULT WINAPI waveOutGetVolume(HWAVEOUT hwo, LPDWORD pdwVolume);
  629. WINMMAPI MMRESULT WINAPI waveOutSetVolume(HWAVEOUT hwo, DWORD dwVolume);
  630. #else
  631. WINMMAPI MMRESULT WINAPI waveOutGetVolume(UINT uId, LPDWORD pdwVolume);
  632. WINMMAPI MMRESULT WINAPI waveOutSetVolume(UINT uId, DWORD dwVolume);
  633. #endif
  634. #ifdef _WIN32
  635. WINMMAPI MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText);
  636. WINMMAPI MMRESULT WINAPI waveOutGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText);
  637. #ifdef UNICODE
  638. #define waveOutGetErrorText  waveOutGetErrorTextW
  639. #else
  640. #define waveOutGetErrorText  waveOutGetErrorTextA
  641. #endif // !UNICODE
  642. #else
  643. MMRESULT WINAPI waveOutGetErrorText(MMRESULT mmrError, LPSTR pszText, UINT cchText);
  644. #endif
  645. WINMMAPI MMRESULT WINAPI waveOutOpen(LPHWAVEOUT phwo, UINT uDeviceID,
  646.     LPCWAVEFORMATEX pwfx, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen);
  647. WINMMAPI MMRESULT WINAPI waveOutClose(HWAVEOUT hwo);
  648. WINMMAPI MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
  649. WINMMAPI MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
  650. WINMMAPI MMRESULT WINAPI waveOutWrite(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
  651. WINMMAPI MMRESULT WINAPI waveOutPause(HWAVEOUT hwo);
  652. WINMMAPI MMRESULT WINAPI waveOutRestart(HWAVEOUT hwo);
  653. WINMMAPI MMRESULT WINAPI waveOutReset(HWAVEOUT hwo);
  654. WINMMAPI MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT hwo);
  655. WINMMAPI MMRESULT WINAPI waveOutGetPosition(HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt);
  656. WINMMAPI MMRESULT WINAPI waveOutGetPitch(HWAVEOUT hwo, LPDWORD pdwPitch);
  657. WINMMAPI MMRESULT WINAPI waveOutSetPitch(HWAVEOUT hwo, DWORD dwPitch);
  658. WINMMAPI MMRESULT WINAPI waveOutGetPlaybackRate(HWAVEOUT hwo, LPDWORD pdwRate);
  659. WINMMAPI MMRESULT WINAPI waveOutSetPlaybackRate(HWAVEOUT hwo, DWORD dwRate);
  660. WINMMAPI MMRESULT WINAPI waveOutGetID(HWAVEOUT hwo, LPUINT puDeviceID);
  661. #if (WINVER >= 0x030a)
  662. #ifdef _WIN32
  663. WINMMAPI MMRESULT WINAPI waveOutMessage(HWAVEOUT hwo, UINT uMsg, DWORD dw1, DWORD dw2);
  664. #else
  665. DWORD WINAPI waveOutMessage(HWAVEOUT hwo, UINT uMsg, DWORD dw1, DWORD dw2);
  666. #endif
  667. #endif /* ifdef WINVER >= 0x030a */
  668. WINMMAPI UINT WINAPI waveInGetNumDevs(void);
  669. #ifdef _WIN32
  670. WINMMAPI MMRESULT WINAPI waveInGetDevCapsA(UINT uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic);
  671. WINMMAPI MMRESULT WINAPI waveInGetDevCapsW(UINT uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic);
  672. #ifdef UNICODE
  673. #define waveInGetDevCaps  waveInGetDevCapsW
  674. #else
  675. #define waveInGetDevCaps  waveInGetDevCapsA
  676. #endif // !UNICODE
  677. #else
  678. MMRESULT WINAPI waveInGetDevCaps(UINT uDeviceID, LPWAVEINCAPS pwic, UINT cbwic);
  679. #endif
  680. #ifdef _WIN32
  681. WINMMAPI MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText);
  682. WINMMAPI MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText);
  683. #ifdef UNICODE
  684. #define waveInGetErrorText  waveInGetErrorTextW
  685. #else
  686. #define waveInGetErrorText  waveInGetErrorTextA
  687. #endif // !UNICODE
  688. #else
  689. MMRESULT WINAPI waveInGetErrorText(MMRESULT mmrError, LPSTR pszText, UINT cchText);
  690. #endif
  691. WINMMAPI MMRESULT WINAPI waveInOpen(LPHWAVEIN phwi, UINT uDeviceID,
  692.     LPCWAVEFORMATEX pwfx, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen);
  693. WINMMAPI MMRESULT WINAPI waveInClose(HWAVEIN hwi);
  694. WINMMAPI MMRESULT WINAPI waveInPrepareHeader(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
  695. WINMMAPI MMRESULT WINAPI waveInUnprepareHeader(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
  696. WINMMAPI MMRESULT WINAPI waveInAddBuffer(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
  697. WINMMAPI MMRESULT WINAPI waveInStart(HWAVEIN hwi);
  698. WINMMAPI MMRESULT WINAPI waveInStop(HWAVEIN hwi);
  699. WINMMAPI MMRESULT WINAPI waveInReset(HWAVEIN hwi);
  700. WINMMAPI MMRESULT WINAPI waveInGetPosition(HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt);
  701. WINMMAPI MMRESULT WINAPI waveInGetID(HWAVEIN hwi, LPUINT puDeviceID);
  702. #if (WINVER >= 0x030a)
  703. #ifdef _WIN32
  704. WINMMAPI MMRESULT WINAPI waveInMessage(HWAVEIN hwi, UINT uMsg, DWORD dw1, DWORD dw2);
  705. #else
  706. DWORD WINAPI waveInMessage(HWAVEIN hwi, UINT uMsg, DWORD dw1, DWORD dw2);
  707. #endif
  708. #endif /* ifdef WINVER >= 0x030a */
  709. #endif /* ifndef _WIN32_VXD */
  710. #endif  /* ifndef MMNOWAVE */
  711. #ifndef MMNOMIDI
  712. /****************************************************************************
  713.     MIDI audio support
  714. ****************************************************************************/
  715. /* MIDI error return values */
  716. #define MIDIERR_UNPREPARED    (MIDIERR_BASE + 0)   /* header not prepared */
  717. #define MIDIERR_STILLPLAYING  (MIDIERR_BASE + 1)   /* still something playing */
  718. #define MIDIERR_NOMAP         (MIDIERR_BASE + 2)   /* no configured instruments */
  719. #define MIDIERR_NOTREADY      (MIDIERR_BASE + 3)   /* hardware is still busy */
  720. #define MIDIERR_NODEVICE      (MIDIERR_BASE + 4)   /* port no longer connected */
  721. #define MIDIERR_INVALIDSETUP  (MIDIERR_BASE + 5)   /* invalid MIF */
  722. #define MIDIERR_BADOPENMODE   (MIDIERR_BASE + 6)   /* operation unsupported w/ open mode */
  723. #define MIDIERR_DONT_CONTINUE (MIDIERR_BASE + 7)   /* thru device 'eating' a message */
  724. #define MIDIERR_LASTERROR     (MIDIERR_BASE + 7)   /* last error in range */
  725. /* MIDI audio data types */
  726. DECLARE_HANDLE(HMIDI);
  727. DECLARE_HANDLE(HMIDIIN);
  728. DECLARE_HANDLE(HMIDIOUT);
  729. DECLARE_HANDLE(HMIDISTRM);
  730. #ifndef _WIN32_VXD
  731. typedef HMIDI FAR *LPHMIDI;
  732. typedef HMIDIIN FAR *LPHMIDIIN;
  733. typedef HMIDIOUT FAR *LPHMIDIOUT;
  734. typedef HMIDISTRM FAR *LPHMIDISTRM;
  735. typedef DRVCALLBACK MIDICALLBACK;
  736. typedef MIDICALLBACK FAR *LPMIDICALLBACK;
  737. #define MIDIPATCHSIZE   128
  738. typedef WORD PATCHARRAY[MIDIPATCHSIZE];
  739. typedef WORD FAR *LPPATCHARRAY;
  740. typedef WORD KEYARRAY[MIDIPATCHSIZE];
  741. typedef WORD FAR *LPKEYARRAY;
  742. #endif  /* ifndef _WIN32_VXD */
  743. /* MIDI callback messages */
  744. #define MIM_OPEN        MM_MIM_OPEN
  745. #define MIM_CLOSE       MM_MIM_CLOSE
  746. #define MIM_DATA        MM_MIM_DATA
  747. #define MIM_LONGDATA    MM_MIM_LONGDATA
  748. #define MIM_ERROR       MM_MIM_ERROR
  749. #define MIM_LONGERROR   MM_MIM_LONGERROR
  750. #define MOM_OPEN        MM_MOM_OPEN
  751. #define MOM_CLOSE       MM_MOM_CLOSE
  752. #define MOM_DONE        MM_MOM_DONE
  753. #if(WINVER >= 0x0400)
  754. #define MIM_MOREDATA      MM_MIM_MOREDATA
  755. #define MOM_POSITIONCB    MM_MOM_POSITIONCB
  756. #endif /* WINVER >= 0x0400 */
  757. /* device ID for MIDI mapper */
  758. #define MIDIMAPPER     ((UINT)-1)
  759. #define MIDI_MAPPER    ((UINT)-1)
  760. #if(WINVER >= 0x0400)
  761. /* flags for dwFlags parm of midiInOpen() */
  762. #define MIDI_IO_STATUS      0x00000020L
  763. #endif /* WINVER >= 0x0400 */
  764. /* flags for wFlags parm of midiOutCachePatches(), midiOutCacheDrumPatches() */
  765. #define MIDI_CACHE_ALL      1
  766. #define MIDI_CACHE_BESTFIT  2
  767. #define MIDI_CACHE_QUERY    3
  768. #define MIDI_UNCACHE        4
  769. /* MIDI output device capabilities structure */
  770. #ifdef _WIN32
  771. typedef struct tagMIDIOUTCAPSA {
  772.     WORD    wMid;                  /* manufacturer ID */
  773.     WORD    wPid;                  /* product ID */
  774.     MMVERSION vDriverVersion;      /* version of the driver */
  775.     CHAR    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
  776.     WORD    wTechnology;           /* type of device */
  777.     WORD    wVoices;               /* # of voices (internal synth only) */
  778.     WORD    wNotes;                /* max # of notes (internal synth only) */
  779.     WORD    wChannelMask;          /* channels used (internal synth only) */
  780.     DWORD   dwSupport;             /* functionality supported by driver */
  781. } MIDIOUTCAPSA, *PMIDIOUTCAPSA, *NPMIDIOUTCAPSA, *LPMIDIOUTCAPSA;
  782. typedef struct tagMIDIOUTCAPSW {
  783.     WORD    wMid;                  /* manufacturer ID */
  784.     WORD    wPid;                  /* product ID */
  785.     MMVERSION vDriverVersion;      /* version of the driver */
  786.     WCHAR   szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
  787.     WORD    wTechnology;           /* type of device */
  788.     WORD    wVoices;               /* # of voices (internal synth only) */
  789.     WORD    wNotes;                /* max # of notes (internal synth only) */
  790.     WORD    wChannelMask;          /* channels used (internal synth only) */
  791.     DWORD   dwSupport;             /* functionality supported by driver */
  792. } MIDIOUTCAPSW, *PMIDIOUTCAPSW, *NPMIDIOUTCAPSW, *LPMIDIOUTCAPSW;
  793. #ifdef UNICODE
  794. typedef MIDIOUTCAPSW MIDIOUTCAPS;
  795. typedef PMIDIOUTCAPSW PMIDIOUTCAPS;
  796. typedef NPMIDIOUTCAPSW NPMIDIOUTCAPS;
  797. typedef LPMIDIOUTCAPSW LPMIDIOUTCAPS;
  798. #else
  799. typedef MIDIOUTCAPSA MIDIOUTCAPS;
  800. typedef PMIDIOUTCAPSA PMIDIOUTCAPS;
  801. typedef NPMIDIOUTCAPSA NPMIDIOUTCAPS;
  802. typedef LPMIDIOUTCAPSA LPMIDIOUTCAPS;
  803. #endif // UNICODE
  804. #else
  805. typedef struct midioutcaps_tag {
  806.     WORD    wMid;                  /* manufacturer ID */
  807.     WORD    wPid;                  /* product ID */
  808.     VERSION vDriverVersion;        /* version of the driver */
  809.     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
  810.     WORD    wTechnology;           /* type of device */
  811.     WORD    wVoices;               /* # of voices (internal synth only) */
  812.     WORD    wNotes;                /* max # of notes (internal synth only) */
  813.     WORD    wChannelMask;          /* channels used (internal synth only) */
  814.     DWORD   dwSupport;             /* functionality supported by driver */
  815. } MIDIOUTCAPS, *PMIDIOUTCAPS, NEAR *NPMIDIOUTCAPS, FAR *LPMIDIOUTCAPS;
  816. #endif
  817. /* flags for wTechnology field of MIDIOUTCAPS structure */
  818. #define MOD_MIDIPORT    1  /* output port */
  819. #define MOD_SYNTH       2  /* generic internal synth */
  820. #define MOD_SQSYNTH     3  /* square wave internal synth */
  821. #define MOD_FMSYNTH     4  /* FM internal synth */
  822. #define MOD_MAPPER      5  /* MIDI mapper */
  823. /* flags for dwSupport field of MIDIOUTCAPS structure */
  824. #define MIDICAPS_VOLUME          0x0001  /* supports volume control */
  825. #define MIDICAPS_LRVOLUME        0x0002  /* separate left-right volume control */
  826. #define MIDICAPS_CACHE           0x0004
  827. #if(WINVER >= 0x0400)
  828. #define MIDICAPS_STREAM          0x0008  /* driver supports midiStreamOut directly */
  829. #endif /* WINVER >= 0x0400 */
  830. /* MIDI input device capabilities structure */
  831. #ifdef _WIN32
  832. typedef struct tagMIDIINCAPSA {
  833.     WORD        wMid;                   /* manufacturer ID */
  834.     WORD        wPid;                   /* product ID */
  835.     MMVERSION   vDriverVersion;         /* version of the driver */
  836.     CHAR        szPname[MAXPNAMELEN];   /* product name (NULL terminated string) */
  837. #if (WINVER >= 0x0400)
  838.     DWORD   dwSupport;             /* functionality supported by driver */
  839. #endif
  840. } MIDIINCAPSA, *PMIDIINCAPSA, *NPMIDIINCAPSA, *LPMIDIINCAPSA;
  841. typedef struct tagMIDIINCAPSW {
  842.     WORD        wMid;                   /* manufacturer ID */
  843.     WORD        wPid;                   /* product ID */
  844.     MMVERSION   vDriverVersion;         /* version of the driver */
  845.     WCHAR       szPname[MAXPNAMELEN];   /* product name (NULL terminated string) */
  846. #if (WINVER >= 0x0400)
  847.     DWORD   dwSupport;             /* functionality supported by driver */
  848. #endif
  849. } MIDIINCAPSW, *PMIDIINCAPSW, *NPMIDIINCAPSW, *LPMIDIINCAPSW;
  850. #ifdef UNICODE
  851. typedef MIDIINCAPSW MIDIINCAPS;
  852. typedef PMIDIINCAPSW PMIDIINCAPS;
  853. typedef NPMIDIINCAPSW NPMIDIINCAPS;
  854. typedef LPMIDIINCAPSW LPMIDIINCAPS;
  855. #else
  856. typedef MIDIINCAPSA MIDIINCAPS;
  857. typedef PMIDIINCAPSA PMIDIINCAPS;
  858. typedef NPMIDIINCAPSA NPMIDIINCAPS;
  859. typedef LPMIDIINCAPSA LPMIDIINCAPS;
  860. #endif // UNICODE
  861. #else
  862. typedef struct midiincaps_tag {
  863.     WORD    wMid;                  /* manufacturer ID */
  864.     WORD    wPid;                  /* product ID */
  865.     VERSION vDriverVersion;        /* version of the driver */
  866.     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
  867. #if (WINVER >= 0x0400)
  868.     DWORD   dwSupport;             /* functionality supported by driver */
  869. #endif
  870. } MIDIINCAPS, *PMIDIINCAPS, NEAR *NPMIDIINCAPS, FAR *LPMIDIINCAPS;
  871. #endif
  872. /* MIDI data block header */
  873. typedef struct midihdr_tag {
  874.     LPSTR       lpData;               /* pointer to locked data block */
  875.     DWORD       dwBufferLength;       /* length of data in data block */
  876.     DWORD       dwBytesRecorded;      /* used for input only */
  877.     DWORD       dwUser;               /* for client's use */
  878.     DWORD       dwFlags;              /* assorted flags (see defines) */
  879.     struct midihdr_tag FAR *lpNext;   /* reserved for driver */
  880.     DWORD       reserved;             /* reserved for driver */
  881. #if (WINVER >= 0x0400)
  882.     DWORD       dwOffset;             /* Callback offset into buffer */
  883.     DWORD       dwReserved[8];        /* Reserved for MMSYSTEM */
  884. #endif
  885. } MIDIHDR, *PMIDIHDR, NEAR *NPMIDIHDR, FAR *LPMIDIHDR;
  886. #if(WINVER >= 0x0400)
  887. typedef struct midievent_tag
  888. {
  889.     DWORD       dwDeltaTime;          /* Ticks since last event */
  890.     DWORD       dwStreamID;           /* Reserved; must be zero */
  891.     DWORD       dwEvent;              /* Event type and parameters */
  892.     DWORD       dwParms[1];           /* Parameters if this is a long event */
  893. } MIDIEVENT;
  894. typedef struct midistrmbuffver_tag
  895. {
  896.     DWORD       dwVersion;                  /* Stream buffer format version */
  897.     DWORD       dwMid;                      /* Manufacturer ID as defined in MMREG.H */
  898.     DWORD       dwOEMVersion;               /* Manufacturer version for custom ext */
  899. } MIDISTRMBUFFVER;
  900. #endif /* WINVER >= 0x0400 */
  901. /* flags for dwFlags field of MIDIHDR structure */
  902. #define MHDR_DONE       0x00000001       /* done bit */
  903. #define MHDR_PREPARED   0x00000002       /* set if header prepared */
  904. #define MHDR_INQUEUE    0x00000004       /* reserved for driver */
  905. #define MHDR_ISSTRM     0x00000008       /* Buffer is stream buffer */
  906. #if(WINVER >= 0x0400)
  907. /* */
  908. /* Type codes which go in the high byte of the event DWORD of a stream buffer */
  909. /* */
  910. /* Type codes 00-7F contain parameters within the low 24 bits */
  911. /* Type codes 80-FF contain a length of their parameter in the low 24 */
  912. /* bits, followed by their parameter data in the buffer. The event */
  913. /* DWORD contains the exact byte length; the parm data itself must be */
  914. /* padded to be an even multiple of 4 bytes long. */
  915. /* */
  916. #define MEVT_F_SHORT        0x00000000L
  917. #define MEVT_F_LONG         0x80000000L
  918. #define MEVT_F_CALLBACK     0x40000000L
  919. #define MEVT_EVENTTYPE(x)   ((BYTE)(((x)>>24)&0xFF))
  920. #define MEVT_EVENTPARM(x)   ((DWORD)((x)&0x00FFFFFFL))
  921. #define MEVT_SHORTMSG       ((BYTE)0x00)    /* parm = shortmsg for midiOutShortMsg */
  922. #define MEVT_TEMPO          ((BYTE)0x01)    /* parm = new tempo in microsec/qn     */
  923. #define MEVT_NOP            ((BYTE)0x02)    /* parm = unused; does nothing         */
  924. /* 0x04-0x7F reserved */
  925. #define MEVT_LONGMSG        ((BYTE)0x80)    /* parm = bytes to send verbatim       */
  926. #define MEVT_COMMENT        ((BYTE)0x82)    /* parm = comment data                 */
  927. #define MEVT_VERSION        ((BYTE)0x84)    /* parm = MIDISTRMBUFFVER struct       */
  928. /* 0x81-0xFF reserved */
  929. #define MIDISTRM_ERROR      (-2)
  930. /* */
  931. /* Structures and defines for midiStreamProperty */
  932. /* */
  933. #define MIDIPROP_SET        0x80000000L
  934. #define MIDIPROP_GET        0x40000000L
  935. /* These are intentionally both non-zero so the app cannot accidentally */
  936. /* leave the operation off and happen to appear to work due to default */
  937. /* action. */
  938. #define MIDIPROP_TIMEDIV    0x00000001L
  939. #define MIDIPROP_TEMPO      0x00000002L
  940. typedef struct midiproptimediv_tag
  941. {
  942.     DWORD       cbStruct;
  943.     DWORD       dwTimeDiv;
  944. } MIDIPROPTIMEDIV, FAR *LPMIDIPROPTIMEDIV;
  945. typedef struct midiproptempo_tag
  946. {
  947.     DWORD       cbStruct;
  948.     DWORD       dwTempo;
  949. } MIDIPROPTEMPO, FAR *LPMIDIPROPTEMPO;
  950. #endif /* WINVER >= 0x0400 */
  951. #ifndef _WIN32_VXD
  952. /* MIDI function prototypes */
  953. WINMMAPI UINT WINAPI midiOutGetNumDevs(void);
  954. #if(WINVER >= 0x0400)
  955. WINMMAPI MMRESULT WINAPI midiStreamOpen(LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen);
  956. WINMMAPI MMRESULT WINAPI midiStreamClose(HMIDISTRM hms);
  957. WINMMAPI MMRESULT WINAPI midiStreamProperty(HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty);
  958. WINMMAPI MMRESULT WINAPI midiStreamPosition(HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt);
  959. WINMMAPI MMRESULT WINAPI midiStreamOut(HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh);
  960. WINMMAPI MMRESULT WINAPI midiStreamPause(HMIDISTRM hms);
  961. WINMMAPI MMRESULT WINAPI midiStreamRestart(HMIDISTRM hms);
  962. WINMMAPI MMRESULT WINAPI midiStreamStop(HMIDISTRM hms);
  963. #ifdef _WIN32
  964. WINMMAPI MMRESULT WINAPI midiConnect(HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved);
  965. WINMMAPI MMRESULT WINAPI midiDisconnect(HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved);
  966. #endif
  967. #endif /* WINVER >= 0x0400 */
  968. #ifdef _WIN32
  969. WINMMAPI MMRESULT WINAPI midiOutGetDevCapsA(UINT uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc);
  970. WINMMAPI MMRESULT WINAPI midiOutGetDevCapsW(UINT uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc);
  971. #ifdef UNICODE
  972. #define midiOutGetDevCaps  midiOutGetDevCapsW
  973. #else
  974. #define midiOutGetDevCaps  midiOutGetDevCapsA
  975. #endif // !UNICODE
  976. #else
  977. MMRESULT WINAPI midiOutGetDevCaps(UINT uDeviceID, LPMIDIOUTCAPS pmoc, UINT cbmoc);
  978. #endif
  979. #if (WINVER >= 0x0400)
  980. WINMMAPI MMRESULT WINAPI midiOutGetVolume(HMIDIOUT hmo, LPDWORD pdwVolume);
  981. WINMMAPI MMRESULT WINAPI midiOutSetVolume(HMIDIOUT hmo, DWORD dwVolume);
  982. #else
  983. WINMMAPI MMRESULT WINAPI midiOutGetVolume(UINT uId, LPDWORD pdwVolume);
  984. WINMMAPI MMRESULT WINAPI midiOutSetVolume(UINT uId, DWORD dwVolume);
  985. #endif
  986. #ifdef _WIN32
  987. WINMMAPI MMRESULT WINAPI midiOutGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText);
  988. WINMMAPI MMRESULT WINAPI midiOutGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText);
  989. #ifdef UNICODE
  990. #define midiOutGetErrorText  midiOutGetErrorTextW
  991. #else
  992. #define midiOutGetErrorText  midiOutGetErrorTextA
  993. #endif // !UNICODE
  994. #else
  995. WINMMAPI MMRESULT WINAPI midiOutGetErrorText(MMRESULT mmrError, LPSTR pszText, UINT cchText);
  996. #endif
  997. WINMMAPI MMRESULT WINAPI midiOutOpen(LPHMIDIOUT phmo, UINT uDeviceID,
  998.     DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen);
  999. WINMMAPI MMRESULT WINAPI midiOutClose(HMIDIOUT hmo);
  1000. WINMMAPI MMRESULT WINAPI midiOutPrepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
  1001. WINMMAPI MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
  1002. WINMMAPI MMRESULT WINAPI midiOutShortMsg(HMIDIOUT hmo, DWORD dwMsg);
  1003. WINMMAPI MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
  1004. WINMMAPI MMRESULT WINAPI midiOutReset(HMIDIOUT hmo);
  1005. WINMMAPI MMRESULT WINAPI midiOutCachePatches(HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache);
  1006. WINMMAPI MMRESULT WINAPI midiOutCacheDrumPatches(HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache);
  1007. WINMMAPI MMRESULT WINAPI midiOutGetID(HMIDIOUT hmo, LPUINT puDeviceID);
  1008. #if (WINVER >= 0x030a)
  1009. #ifdef _WIN32
  1010. WINMMAPI MMRESULT WINAPI midiOutMessage(HMIDIOUT hmo, UINT uMsg, DWORD dw1, DWORD dw2);
  1011. #else
  1012. DWORD WINAPI midiOutMessage(HMIDIOUT hmo, UINT uMsg, DWORD dw1, DWORD dw2);
  1013. #endif
  1014. #endif /* ifdef WINVER >= 0x030a */
  1015. WINMMAPI UINT WINAPI midiInGetNumDevs(void);
  1016. #ifdef _WIN32
  1017. WINMMAPI MMRESULT WINAPI midiInGetDevCapsA(UINT uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic);
  1018. WINMMAPI MMRESULT WINAPI midiInGetDevCapsW(UINT uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic);
  1019. #ifdef UNICODE
  1020. #define midiInGetDevCaps  midiInGetDevCapsW
  1021. #else
  1022. #define midiInGetDevCaps  midiInGetDevCapsA
  1023. #endif // !UNICODE
  1024. WINMMAPI MMRESULT WINAPI midiInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText);
  1025. WINMMAPI MMRESULT WINAPI midiInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText);
  1026. #ifdef UNICODE
  1027. #define midiInGetErrorText  midiInGetErrorTextW
  1028. #else
  1029. #define midiInGetErrorText  midiInGetErrorTextA
  1030. #endif // !UNICODE
  1031. #else
  1032. MMRESULT WINAPI midiInGetDevCaps(UINT uDeviceID, LPMIDIINCAPS pmic, UINT cbmic);
  1033. WINMMAPI MMRESULT WINAPI midiInGetErrorText(MMRESULT mmrError, LPSTR pszText, UINT cchText);
  1034. #endif
  1035. WINMMAPI MMRESULT WINAPI midiInOpen(LPHMIDIIN phmi, UINT uDeviceID,
  1036. DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen);
  1037. WINMMAPI MMRESULT WINAPI midiInClose(HMIDIIN hmi);
  1038. WINMMAPI MMRESULT WINAPI midiInPrepareHeader(HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
  1039. WINMMAPI MMRESULT WINAPI midiInUnprepareHeader(HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
  1040. WINMMAPI MMRESULT WINAPI midiInAddBuffer(HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
  1041. WINMMAPI MMRESULT WINAPI midiInStart(HMIDIIN hmi);
  1042. WINMMAPI MMRESULT WINAPI midiInStop(HMIDIIN hmi);
  1043. WINMMAPI MMRESULT WINAPI midiInReset(HMIDIIN hmi);
  1044. WINMMAPI MMRESULT WINAPI midiInGetID(HMIDIIN hmi, LPUINT puDeviceID);
  1045. #if (WINVER >= 0x030a)
  1046. #ifdef _WIN32
  1047. WINMMAPI MMRESULT WINAPI midiInMessage(HMIDIIN hmi, UINT uMsg, DWORD dw1, DWORD dw2);
  1048. #else
  1049. DWORD WINAPI midiInMessage(HMIDIIN hmi, UINT uMsg, DWORD dw1, DWORD dw2);
  1050. #endif
  1051. #endif /* ifdef WINVER >= 0x030a */
  1052. #endif /* ifndef _WIN32_VXD */
  1053. #endif  /* ifndef MMNOMIDI */
  1054. #ifndef MMNOAUX
  1055. /****************************************************************************
  1056. Auxiliary audio support
  1057. ****************************************************************************/
  1058. /* device ID for aux device mapper */
  1059. #define AUX_MAPPER     ((UINT)-1)
  1060. /* Auxiliary audio device capabilities structure */
  1061. #ifdef _WIN32
  1062. typedef struct tagAUXCAPSA {
  1063.     WORD        wMid;                /* manufacturer ID */
  1064.     WORD        wPid;                /* product ID */
  1065.     MMVERSION   vDriverVersion;      /* version of the driver */
  1066.     CHAR        szPname[MAXPNAMELEN];/* product name (NULL terminated string) */
  1067.     WORD        wTechnology;         /* type of device */
  1068.     WORD        wReserved1;          /* padding */
  1069.     DWORD       dwSupport;           /* functionality supported by driver */
  1070. } AUXCAPSA, *PAUXCAPSA, *NPAUXCAPSA, *LPAUXCAPSA;
  1071. typedef struct tagAUXCAPSW {
  1072.     WORD        wMid;                /* manufacturer ID */
  1073.     WORD        wPid;                /* product ID */
  1074.     MMVERSION   vDriverVersion;      /* version of the driver */
  1075.     WCHAR       szPname[MAXPNAMELEN];/* product name (NULL terminated string) */
  1076.     WORD        wTechnology;         /* type of device */
  1077.     WORD        wReserved1;          /* padding */
  1078.     DWORD       dwSupport;           /* functionality supported by driver */
  1079. } AUXCAPSW, *PAUXCAPSW, *NPAUXCAPSW, *LPAUXCAPSW;
  1080. #ifdef UNICODE
  1081. typedef AUXCAPSW AUXCAPS;
  1082. typedef PAUXCAPSW PAUXCAPS;
  1083. typedef NPAUXCAPSW NPAUXCAPS;
  1084. typedef LPAUXCAPSW LPAUXCAPS;
  1085. #else
  1086. typedef AUXCAPSA AUXCAPS;
  1087. typedef PAUXCAPSA PAUXCAPS;
  1088. typedef NPAUXCAPSA NPAUXCAPS;
  1089. typedef LPAUXCAPSA LPAUXCAPS;
  1090. #endif // UNICODE
  1091. #else
  1092. typedef struct auxcaps_tag {
  1093.     WORD    wMid;                  /* manufacturer ID */
  1094.     WORD    wPid;                  /* product ID */
  1095.     VERSION vDriverVersion;        /* version of the driver */
  1096.     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
  1097.     WORD    wTechnology;           /* type of device */
  1098.     DWORD   dwSupport;             /* functionality supported by driver */
  1099. } AUXCAPS, *PAUXCAPS, NEAR *NPAUXCAPS, FAR *LPAUXCAPS;
  1100. #endif
  1101. /* flags for wTechnology field in AUXCAPS structure */
  1102. #define AUXCAPS_CDAUDIO    1       /* audio from internal CD-ROM drive */
  1103. #define AUXCAPS_AUXIN      2       /* audio from auxiliary input jacks */
  1104. /* flags for dwSupport field in AUXCAPS structure */
  1105. #define AUXCAPS_VOLUME          0x0001  /* supports volume control */
  1106. #define AUXCAPS_LRVOLUME        0x0002  /* separate left-right volume control */
  1107. #ifndef _WIN32_VXD
  1108. /* auxiliary audio function prototypes */
  1109. WINMMAPI UINT WINAPI auxGetNumDevs(void);
  1110. #ifdef _WIN32
  1111. WINMMAPI MMRESULT WINAPI auxGetDevCapsA(UINT uDeviceID, LPAUXCAPSA pac, UINT cbac);
  1112. WINMMAPI MMRESULT WINAPI auxGetDevCapsW(UINT uDeviceID, LPAUXCAPSW pac, UINT cbac);
  1113. #ifdef UNICODE
  1114. #define auxGetDevCaps  auxGetDevCapsW
  1115. #else
  1116. #define auxGetDevCaps  auxGetDevCapsA
  1117. #endif // !UNICODE
  1118. #else
  1119. MMRESULT WINAPI auxGetDevCaps(UINT uDeviceID, LPAUXCAPS pac, UINT cbac);
  1120. #endif
  1121. WINMMAPI MMRESULT WINAPI auxSetVolume(UINT uDeviceID, DWORD dwVolume);
  1122. WINMMAPI MMRESULT WINAPI auxGetVolume(UINT uDeviceID, LPDWORD pdwVolume);
  1123. #if (WINVER >= 0x030a)
  1124. #ifdef _WIN32
  1125. WINMMAPI MMRESULT WINAPI auxOutMessage(UINT uDeviceID, UINT uMsg, DWORD dw1, DWORD dw2);
  1126. #else
  1127. DWORD WINAPI auxOutMessage(UINT uDeviceID, UINT uMsg, DWORD dw1, DWORD dw2);
  1128. #endif
  1129. #endif /* ifdef WINVER >= 0x030a */
  1130. #endif /* ifndef _WIN32_VXD */
  1131. #endif  /* ifndef MMNOAUX */
  1132. #ifndef MMNOMIXER
  1133. #ifndef _WIN32_VXD
  1134. /****************************************************************************
  1135.     Mixer Support
  1136. ****************************************************************************/
  1137. DECLARE_HANDLE(HMIXEROBJ);
  1138. typedef HMIXEROBJ FAR *LPHMIXEROBJ;
  1139. DECLARE_HANDLE(HMIXER);
  1140. typedef HMIXER     FAR *LPHMIXER;
  1141. #define MIXER_SHORT_NAME_CHARS   16
  1142. #define MIXER_LONG_NAME_CHARS    64
  1143. /* */
  1144. /*  MMRESULT error return values specific to the mixer API */
  1145. /* */
  1146. /* */
  1147. #define MIXERR_INVALLINE            (MIXERR_BASE + 0)
  1148. #define MIXERR_INVALCONTROL         (MIXERR_BASE + 1)
  1149. #define MIXERR_INVALVALUE           (MIXERR_BASE + 2)
  1150. #define MIXERR_LASTERROR            (MIXERR_BASE + 2)
  1151. #define MIXER_OBJECTF_HANDLE    0x80000000L
  1152. #define MIXER_OBJECTF_MIXER     0x00000000L
  1153. #define MIXER_OBJECTF_HMIXER    (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER)
  1154. #define MIXER_OBJECTF_WAVEOUT   0x10000000L
  1155. #define MIXER_OBJECTF_HWAVEOUT  (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT)
  1156. #define MIXER_OBJECTF_WAVEIN    0x20000000L
  1157. #define MIXER_OBJECTF_HWAVEIN   (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN)
  1158. #define MIXER_OBJECTF_MIDIOUT   0x30000000L
  1159. #define MIXER_OBJECTF_HMIDIOUT  (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT)
  1160. #define MIXER_OBJECTF_MIDIIN    0x40000000L
  1161. #define MIXER_OBJECTF_HMIDIIN   (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN)
  1162. #define MIXER_OBJECTF_AUX       0x50000000L
  1163. WINMMAPI UINT WINAPI mixerGetNumDevs(void);
  1164. #ifdef _WIN32
  1165. typedef struct tagMIXERCAPSA {
  1166.     WORD            wMid;                   /* manufacturer id */
  1167.     WORD            wPid;                   /* product id */
  1168.     MMVERSION       vDriverVersion;         /* version of the driver */
  1169.     CHAR            szPname[MAXPNAMELEN];   /* product name */
  1170.     DWORD           fdwSupport;             /* misc. support bits */
  1171.     DWORD           cDestinations;          /* count of destinations */
  1172. } MIXERCAPSA, *PMIXERCAPSA, *LPMIXERCAPSA;
  1173. typedef struct tagMIXERCAPSW {
  1174.     WORD            wMid;                   /* manufacturer id */
  1175.     WORD            wPid;                   /* product id */
  1176.     MMVERSION       vDriverVersion;         /* version of the driver */
  1177.     WCHAR           szPname[MAXPNAMELEN];   /* product name */
  1178.     DWORD           fdwSupport;             /* misc. support bits */
  1179.     DWORD           cDestinations;          /* count of destinations */
  1180. } MIXERCAPSW, *PMIXERCAPSW, *LPMIXERCAPSW;
  1181. #ifdef UNICODE
  1182. typedef MIXERCAPSW MIXERCAPS;
  1183. typedef PMIXERCAPSW PMIXERCAPS;
  1184. typedef LPMIXERCAPSW LPMIXERCAPS;
  1185. #else
  1186. typedef MIXERCAPSA MIXERCAPS;
  1187. typedef PMIXERCAPSA PMIXERCAPS;
  1188. typedef LPMIXERCAPSA LPMIXERCAPS;
  1189. #endif // UNICODE
  1190. #else
  1191. typedef struct tMIXERCAPS {
  1192.     WORD            wMid;                   /* manufacturer id */
  1193.     WORD            wPid;                   /* product id */
  1194.     VERSION         vDriverVersion;         /* version of the driver */
  1195.     char            szPname[MAXPNAMELEN];   /* product name */
  1196.     DWORD           fdwSupport;             /* misc. support bits */
  1197.     DWORD           cDestinations;          /* count of destinations */
  1198. } MIXERCAPS, *PMIXERCAPS, FAR *LPMIXERCAPS;
  1199. #endif
  1200. #ifdef _WIN32
  1201. WINMMAPI MMRESULT WINAPI mixerGetDevCapsA(UINT uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps);
  1202. WINMMAPI MMRESULT WINAPI mixerGetDevCapsW(UINT uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps);
  1203. #ifdef UNICODE
  1204. #define mixerGetDevCaps  mixerGetDevCapsW
  1205. #else
  1206. #define mixerGetDevCaps  mixerGetDevCapsA
  1207. #endif // !UNICODE
  1208. #else
  1209. MMRESULT WINAPI mixerGetDevCaps(UINT uMxId, LPMIXERCAPS pmxcaps, UINT cbmxcaps);
  1210. #endif
  1211. WINMMAPI MMRESULT WINAPI mixerOpen(LPHMIXER phmx, UINT uMxId, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen);
  1212. WINMMAPI MMRESULT WINAPI mixerClose(HMIXER hmx);
  1213. WINMMAPI DWORD WINAPI mixerMessage(HMIXER hmx, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
  1214. #ifdef _WIN32
  1215. typedef struct tagMIXERLINEA {
  1216.     DWORD       cbStruct;               /* size of MIXERLINE structure */
  1217.     DWORD       dwDestination;          /* zero based destination index */
  1218.     DWORD       dwSource;               /* zero based source index (if source) */
  1219.     DWORD       dwLineID;               /* unique line id for mixer device */
  1220.     DWORD       fdwLine;                /* state/information about line */
  1221.     DWORD       dwUser;                 /* driver specific information */
  1222.     DWORD       dwComponentType;        /* component type line connects to */
  1223.     DWORD       cChannels;              /* number of channels line supports */
  1224.     DWORD       cConnections;           /* number of connections [possible] */
  1225.     DWORD       cControls;              /* number of controls at this line */
  1226.     CHAR        szShortName[MIXER_SHORT_NAME_CHARS];
  1227.     CHAR        szName[MIXER_LONG_NAME_CHARS];
  1228.     struct {
  1229. DWORD   dwType;                 /* MIXERLINE_TARGETTYPE_xxxx */
  1230. DWORD   dwDeviceID;             /* target device ID of device type */
  1231. WORD    wMid;                   /* of target device */
  1232. WORD    wPid;                   /*      " */
  1233. MMVERSION vDriverVersion;       /*      " */
  1234. CHAR    szPname[MAXPNAMELEN];   /*      " */
  1235.     } Target;
  1236. } MIXERLINEA, *PMIXERLINEA, *LPMIXERLINEA;
  1237. typedef struct tagMIXERLINEW {
  1238.     DWORD       cbStruct;               /* size of MIXERLINE structure */
  1239.     DWORD       dwDestination;          /* zero based destination index */
  1240.     DWORD       dwSource;               /* zero based source index (if source) */
  1241.     DWORD       dwLineID;               /* unique line id for mixer device */
  1242.     DWORD       fdwLine;                /* state/information about line */
  1243.     DWORD       dwUser;                 /* driver specific information */
  1244.     DWORD       dwComponentType;        /* component type line connects to */
  1245.     DWORD       cChannels;              /* number of channels line supports */
  1246.     DWORD       cConnections;           /* number of connections [possible] */
  1247.     DWORD       cControls;              /* number of controls at this line */
  1248.     WCHAR       szShortName[MIXER_SHORT_NAME_CHARS];
  1249.     WCHAR       szName[MIXER_LONG_NAME_CHARS];
  1250.     struct {
  1251. DWORD   dwType;                 /* MIXERLINE_TARGETTYPE_xxxx */
  1252. DWORD   dwDeviceID;             /* target device ID of device type */
  1253. WORD    wMid;                   /* of target device */
  1254. WORD    wPid;                   /*      " */
  1255. MMVERSION vDriverVersion;       /*      " */
  1256. WCHAR   szPname[MAXPNAMELEN];   /*      " */
  1257.     } Target;
  1258. } MIXERLINEW, *PMIXERLINEW, *LPMIXERLINEW;
  1259. #ifdef UNICODE
  1260. typedef MIXERLINEW MIXERLINE;
  1261. typedef PMIXERLINEW PMIXERLINE;
  1262. typedef LPMIXERLINEW LPMIXERLINE;
  1263. #else
  1264. typedef MIXERLINEA MIXERLINE;
  1265. typedef PMIXERLINEA PMIXERLINE;
  1266. typedef LPMIXERLINEA LPMIXERLINE;
  1267. #endif // UNICODE
  1268. #else
  1269. typedef struct tMIXERLINE {
  1270.     DWORD       cbStruct;               /* size of MIXERLINE structure */
  1271.     DWORD       dwDestination;          /* zero based destination index */
  1272.     DWORD       dwSource;               /* zero based source index (if source) */
  1273.     DWORD       dwLineID;               /* unique line id for mixer device */
  1274.     DWORD       fdwLine;                /* state/information about line */
  1275.     DWORD       dwUser;                 /* driver specific information */
  1276.     DWORD       dwComponentType;        /* component type line connects to */
  1277.     DWORD       cChannels;              /* number of channels line supports */
  1278.     DWORD       cConnections;           /* number of connections [possible] */
  1279.     DWORD       cControls;              /* number of controls at this line */
  1280.     char        szShortName[MIXER_SHORT_NAME_CHARS];
  1281.     char        szName[MIXER_LONG_NAME_CHARS];
  1282.     struct {
  1283. DWORD   dwType;                 /* MIXERLINE_TARGETTYPE_xxxx */
  1284. DWORD   dwDeviceID;             /* target device ID of device type */
  1285. WORD    wMid;                   /* of target device */
  1286. WORD    wPid;                   /*      " */
  1287. VERSION vDriverVersion;         /*      " */
  1288. char    szPname[MAXPNAMELEN];   /*      " */
  1289.     } Target;
  1290. } MIXERLINE, *PMIXERLINE, FAR *LPMIXERLINE;
  1291. #endif
  1292. /* */
  1293. /*  MIXERLINE.fdwLine */
  1294. /* */
  1295. /* */
  1296. #define MIXERLINE_LINEF_ACTIVE              0x00000001L
  1297. #define MIXERLINE_LINEF_DISCONNECTED        0x00008000L
  1298. #define MIXERLINE_LINEF_SOURCE              0x80000000L
  1299. /* */
  1300. /*  MIXERLINE.dwComponentType */
  1301. /* */
  1302. /*  component types for destinations and sources */
  1303. /* */
  1304. /* */
  1305. #define MIXERLINE_COMPONENTTYPE_DST_FIRST       0x00000000L
  1306. #define MIXERLINE_COMPONENTTYPE_DST_UNDEFINED   (MIXERLINE_COMPONENTTYPE_DST_FIRST + 0)
  1307. #define MIXERLINE_COMPONENTTYPE_DST_DIGITAL     (MIXERLINE_COMPONENTTYPE_DST_FIRST + 1)
  1308. #define MIXERLINE_COMPONENTTYPE_DST_LINE        (MIXERLINE_COMPONENTTYPE_DST_FIRST + 2)
  1309. #define MIXERLINE_COMPONENTTYPE_DST_MONITOR     (MIXERLINE_COMPONENTTYPE_DST_FIRST + 3)
  1310. #define MIXERLINE_COMPONENTTYPE_DST_SPEAKERS    (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4)
  1311. #define MIXERLINE_COMPONENTTYPE_DST_HEADPHONES  (MIXERLINE_COMPONENTTYPE_DST_FIRST + 5)
  1312. #define MIXERLINE_COMPONENTTYPE_DST_TELEPHONE   (MIXERLINE_COMPONENTTYPE_DST_FIRST + 6)
  1313. #define MIXERLINE_COMPONENTTYPE_DST_WAVEIN      (MIXERLINE_COMPONENTTYPE_DST_FIRST + 7)
  1314. #define MIXERLINE_COMPONENTTYPE_DST_VOICEIN     (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)
  1315. #define MIXERLINE_COMPONENTTYPE_DST_LAST        (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)
  1316. #define MIXERLINE_COMPONENTTYPE_SRC_FIRST       0x00001000L
  1317. #define MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED   (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0)
  1318. #define MIXERLINE_COMPONENTTYPE_SRC_DIGITAL     (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 1)
  1319. #define MIXERLINE_COMPONENTTYPE_SRC_LINE        (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2)
  1320. #define MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE  (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3)
  1321. #define MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 4)
  1322. #define MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 5)
  1323. #define MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE   (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 6)
  1324. #define MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER   (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7)
  1325. #define MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT     (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8)
  1326. #define MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY   (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9)
  1327. #define MIXERLINE_COMPONENTTYPE_SRC_ANALOG      (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10)
  1328. #define MIXERLINE_COMPONENTTYPE_SRC_LAST        (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10)
  1329. /* */
  1330. /*  MIXERLINE.Target.dwType */
  1331. /* */
  1332. /* */
  1333. #define MIXERLINE_TARGETTYPE_UNDEFINED      0
  1334. #define MIXERLINE_TARGETTYPE_WAVEOUT        1
  1335. #define MIXERLINE_TARGETTYPE_WAVEIN         2
  1336. #define MIXERLINE_TARGETTYPE_MIDIOUT        3
  1337. #define MIXERLINE_TARGETTYPE_MIDIIN         4
  1338. #define MIXERLINE_TARGETTYPE_AUX            5
  1339. #ifdef _WIN32
  1340. WINMMAPI MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo);
  1341. WINMMAPI MMRESULT WINAPI mixerGetLineInfoW(HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo);
  1342. #ifdef UNICODE
  1343. #define mixerGetLineInfo  mixerGetLineInfoW
  1344. #else
  1345. #define mixerGetLineInfo  mixerGetLineInfoA
  1346. #endif // !UNICODE
  1347. #else
  1348. MMRESULT WINAPI mixerGetLineInfo(HMIXEROBJ hmxobj, LPMIXERLINE pmxl, DWORD fdwInfo);
  1349. #endif
  1350. #define MIXER_GETLINEINFOF_DESTINATION      0x00000000L
  1351. #define MIXER_GETLINEINFOF_SOURCE           0x00000001L
  1352. #define MIXER_GETLINEINFOF_LINEID           0x00000002L
  1353. #define MIXER_GETLINEINFOF_COMPONENTTYPE    0x00000003L
  1354. #define MIXER_GETLINEINFOF_TARGETTYPE       0x00000004L
  1355. #define MIXER_GETLINEINFOF_QUERYMASK        0x0000000FL
  1356. WINMMAPI MMRESULT WINAPI mixerGetID(HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId);
  1357. /* */
  1358. /*  MIXERCONTROL */
  1359. /* */
  1360. /* */
  1361. #ifdef _WIN32
  1362. typedef struct tagMIXERCONTROLA {
  1363.     DWORD           cbStruct;           /* size in bytes of MIXERCONTROL */
  1364.     DWORD           dwControlID;        /* unique control id for mixer device */
  1365.     DWORD           dwControlType;      /* MIXERCONTROL_CONTROLTYPE_xxx */
  1366.     DWORD           fdwControl;         /* MIXERCONTROL_CONTROLF_xxx */
  1367.     DWORD           cMultipleItems;     /* if MIXERCONTROL_CONTROLF_MULTIPLE set */
  1368.     CHAR            szShortName[MIXER_SHORT_NAME_CHARS];
  1369.     CHAR            szName[MIXER_LONG_NAME_CHARS];
  1370.     union {
  1371. struct {
  1372.     LONG    lMinimum;           /* signed minimum for this control */
  1373.     LONG    lMaximum;           /* signed maximum for this control */
  1374. };
  1375. struct {
  1376.     DWORD   dwMinimum;          /* unsigned minimum for this control */
  1377.     DWORD   dwMaximum;          /* unsigned maximum for this control */
  1378. };
  1379. DWORD       dwReserved[6];
  1380.     } Bounds;
  1381.     union {
  1382. DWORD       cSteps;             /* # of steps between min & max */
  1383. DWORD       cbCustomData;       /* size in bytes of custom data */
  1384. DWORD       dwReserved[6];      /* !!! needed? we have cbStruct.... */
  1385.     } Metrics;
  1386. } MIXERCONTROLA, *PMIXERCONTROLA, *LPMIXERCONTROLA;
  1387. typedef struct tagMIXERCONTROLW {
  1388.     DWORD           cbStruct;           /* size in bytes of MIXERCONTROL */
  1389.     DWORD           dwControlID;        /* unique control id for mixer device */
  1390.     DWORD           dwControlType;      /* MIXERCONTROL_CONTROLTYPE_xxx */
  1391.     DWORD           fdwControl;         /* MIXERCONTROL_CONTROLF_xxx */
  1392.     DWORD           cMultipleItems;     /* if MIXERCONTROL_CONTROLF_MULTIPLE set */
  1393.     WCHAR           szShortName[MIXER_SHORT_NAME_CHARS];
  1394.     WCHAR           szName[MIXER_LONG_NAME_CHARS];
  1395.     union {
  1396. struct {
  1397.     LONG    lMinimum;           /* signed minimum for this control */
  1398.     LONG    lMaximum;           /* signed maximum for this control */
  1399. };
  1400. struct {
  1401.     DWORD   dwMinimum;          /* unsigned minimum for this control */
  1402.     DWORD   dwMaximum;          /* unsigned maximum for this control */
  1403. };
  1404. DWORD       dwReserved[6];
  1405.     } Bounds;
  1406.     union {
  1407. DWORD       cSteps;             /* # of steps between min & max */
  1408. DWORD       cbCustomData;       /* size in bytes of custom data */
  1409. DWORD       dwReserved[6];      /* !!! needed? we have cbStruct.... */
  1410.     } Metrics;
  1411. } MIXERCONTROLW, *PMIXERCONTROLW, *LPMIXERCONTROLW;
  1412. #ifdef UNICODE
  1413. typedef MIXERCONTROLW MIXERCONTROL;
  1414. typedef PMIXERCONTROLW PMIXERCONTROL;
  1415. typedef LPMIXERCONTROLW LPMIXERCONTROL;
  1416. #else
  1417. typedef MIXERCONTROLA MIXERCONTROL;
  1418. typedef PMIXERCONTROLA PMIXERCONTROL;
  1419. typedef LPMIXERCONTROLA LPMIXERCONTROL;
  1420. #endif // UNICODE
  1421. #else
  1422. typedef struct tMIXERCONTROL {
  1423.     DWORD           cbStruct;           /* size in bytes of MIXERCONTROL */
  1424.     DWORD           dwControlID;        /* unique control id for mixer device */
  1425.     DWORD           dwControlType;      /* MIXERCONTROL_CONTROLTYPE_xxx */
  1426.     DWORD           fdwControl;         /* MIXERCONTROL_CONTROLF_xxx */
  1427.     DWORD           cMultipleItems;     /* if MIXERCONTROL_CONTROLF_MULTIPLE set */
  1428.     char            szShortName[MIXER_SHORT_NAME_CHARS];
  1429.     char            szName[MIXER_LONG_NAME_CHARS];
  1430.     union {
  1431. struct {
  1432.     LONG    lMinimum;           /* signed minimum for this control */
  1433.     LONG    lMaximum;           /* signed maximum for this control */
  1434. };
  1435. struct {
  1436.     DWORD   dwMinimum;          /* unsigned minimum for this control */
  1437.     DWORD   dwMaximum;          /* unsigned maximum for this control */
  1438. };
  1439. DWORD       dwReserved[6];
  1440.     } Bounds;
  1441.     union {
  1442. DWORD       cSteps;             /* # of steps between min & max */
  1443. DWORD       cbCustomData;       /* size in bytes of custom data */
  1444. DWORD       dwReserved[6];      /* !!! needed? we have cbStruct.... */
  1445.     } Metrics;
  1446. } MIXERCONTROL, *PMIXERCONTROL, FAR *LPMIXERCONTROL;
  1447. #endif
  1448. /* */
  1449. /*  MIXERCONTROL.fdwControl */
  1450. /* */
  1451. /* */
  1452. #define MIXERCONTROL_CONTROLF_UNIFORM   0x00000001L
  1453. #define MIXERCONTROL_CONTROLF_MULTIPLE  0x00000002L
  1454. #define MIXERCONTROL_CONTROLF_DISABLED  0x80000000L
  1455. /* */
  1456. /*  MIXERCONTROL_CONTROLTYPE_xxx building block defines */
  1457. /* */
  1458. /* */
  1459. #define MIXERCONTROL_CT_CLASS_MASK          0xF0000000L
  1460. #define MIXERCONTROL_CT_CLASS_CUSTOM        0x00000000L
  1461. #define MIXERCONTROL_CT_CLASS_METER         0x10000000L
  1462. #define MIXERCONTROL_CT_CLASS_SWITCH        0x20000000L
  1463. #define MIXERCONTROL_CT_CLASS_NUMBER        0x30000000L
  1464. #define MIXERCONTROL_CT_CLASS_SLIDER        0x40000000L
  1465. #define MIXERCONTROL_CT_CLASS_FADER         0x50000000L
  1466. #define MIXERCONTROL_CT_CLASS_TIME          0x60000000L
  1467. #define MIXERCONTROL_CT_CLASS_LIST          0x70000000L
  1468. #define MIXERCONTROL_CT_SUBCLASS_MASK       0x0F000000L
  1469. #define MIXERCONTROL_CT_SC_SWITCH_BOOLEAN   0x00000000L
  1470. #define MIXERCONTROL_CT_SC_SWITCH_BUTTON    0x01000000L
  1471. #define MIXERCONTROL_CT_SC_METER_POLLED     0x00000000L
  1472. #define MIXERCONTROL_CT_SC_TIME_MICROSECS   0x00000000L
  1473. #define MIXERCONTROL_CT_SC_TIME_MILLISECS   0x01000000L
  1474. #define MIXERCONTROL_CT_SC_LIST_SINGLE      0x00000000L
  1475. #define MIXERCONTROL_CT_SC_LIST_MULTIPLE    0x01000000L
  1476. #define MIXERCONTROL_CT_UNITS_MASK          0x00FF0000L
  1477. #define MIXERCONTROL_CT_UNITS_CUSTOM        0x00000000L
  1478. #define MIXERCONTROL_CT_UNITS_BOOLEAN       0x00010000L
  1479. #define MIXERCONTROL_CT_UNITS_SIGNED        0x00020000L
  1480. #define MIXERCONTROL_CT_UNITS_UNSIGNED      0x00030000L
  1481. #define MIXERCONTROL_CT_UNITS_DECIBELS      0x00040000L /* in 10ths */
  1482. #define MIXERCONTROL_CT_UNITS_PERCENT       0x00050000L /* in 10ths */
  1483. /* */
  1484. /*  Commonly used control types for specifying MIXERCONTROL.dwControlType */
  1485. /* */
  1486. #define MIXERCONTROL_CONTROLTYPE_CUSTOM         (MIXERCONTROL_CT_CLASS_CUSTOM | MIXERCONTROL_CT_UNITS_CUSTOM)
  1487. #define MIXERCONTROL_CONTROLTYPE_BOOLEANMETER   (MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_BOOLEAN)
  1488. #define MIXERCONTROL_CONTROLTYPE_SIGNEDMETER    (MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_SIGNED)
  1489. #define MIXERCONTROL_CONTROLTYPE_PEAKMETER      (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER + 1)
  1490. #define MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER  (MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_UNSIGNED)
  1491. #define MIXERCONTROL_CONTROLTYPE_BOOLEAN        (MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BOOLEAN | MIXERCONTROL_CT_UNITS_BOOLEAN)
  1492. #define MIXERCONTROL_CONTROLTYPE_ONOFF          (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1)
  1493. #define MIXERCONTROL_CONTROLTYPE_MUTE           (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2)
  1494. #define MIXERCONTROL_CONTROLTYPE_MONO           (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 3)
  1495. #define MIXERCONTROL_CONTROLTYPE_LOUDNESS       (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 4)
  1496. #define MIXERCONTROL_CONTROLTYPE_STEREOENH      (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 5)
  1497. #define MIXERCONTROL_CONTROLTYPE_BUTTON         (MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BUTTON | MIXERCONTROL_CT_UNITS_BOOLEAN)
  1498. #define MIXERCONTROL_CONTROLTYPE_DECIBELS       (MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_DECIBELS)
  1499. #define MIXERCONTROL_CONTROLTYPE_SIGNED         (MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_SIGNED)
  1500. #define MIXERCONTROL_CONTROLTYPE_UNSIGNED       (MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_UNSIGNED)
  1501. #define MIXERCONTROL_CONTROLTYPE_PERCENT        (MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_PERCENT)
  1502. #define MIXERCONTROL_CONTROLTYPE_SLIDER         (MIXERCONTROL_CT_CLASS_SLIDER | MIXERCONTROL_CT_UNITS_SIGNED)
  1503. #define MIXERCONTROL_CONTROLTYPE_PAN            (MIXERCONTROL_CONTROLTYPE_SLIDER + 1)
  1504. #define MIXERCONTROL_CONTROLTYPE_QSOUNDPAN      (MIXERCONTROL_CONTROLTYPE_SLIDER + 2)
  1505. #define MIXERCONTROL_CONTROLTYPE_FADER          (MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED)
  1506. #define MIXERCONTROL_CONTROLTYPE_VOLUME         (MIXERCONTROL_CONTROLTYPE_FADER + 1)
  1507. #define MIXERCONTROL_CONTROLTYPE_BASS           (MIXERCONTROL_CONTROLTYPE_FADER + 2)
  1508. #define MIXERCONTROL_CONTROLTYPE_TREBLE         (MIXERCONTROL_CONTROLTYPE_FADER + 3)
  1509. #define MIXERCONTROL_CONTROLTYPE_EQUALIZER      (MIXERCONTROL_CONTROLTYPE_FADER + 4)
  1510. #define MIXERCONTROL_CONTROLTYPE_SINGLESELECT   (MIXERCONTROL_CT_CLASS_LIST | MIXERCONTROL_CT_SC_LIST_SINGLE | MIXERCONTROL_CT_UNITS_BOOLEAN)
  1511. #define MIXERCONTROL_CONTROLTYPE_MUX            (MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1)
  1512. #define MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT (MIXERCONTROL_CT_CLASS_LIST | MIXERCONTROL_CT_SC_LIST_MULTIPLE | MIXERCONTROL_CT_UNITS_BOOLEAN)
  1513. #define MIXERCONTROL_CONTROLTYPE_MIXER          (MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1)
  1514. #define MIXERCONTROL_CONTROLTYPE_MICROTIME      (MIXERCONTROL_CT_CLASS_TIME | MIXERCONTROL_CT_SC_TIME_MICROSECS | MIXERCONTROL_CT_UNITS_UNSIGNED)
  1515. #define MIXERCONTROL_CONTROLTYPE_MILLITIME      (MIXERCONTROL_CT_CLASS_TIME | MIXERCONTROL_CT_SC_TIME_MILLISECS | MIXERCONTROL_CT_UNITS_UNSIGNED)
  1516. /* */
  1517. /*  MIXERLINECONTROLS */
  1518. /* */
  1519. #ifdef _WIN32
  1520. typedef struct tagMIXERLINECONTROLSA {
  1521.     DWORD           cbStruct;       /* size in bytes of MIXERLINECONTROLS */
  1522.     DWORD           dwLineID;       /* line id (from MIXERLINE.dwLineID) */
  1523.     union {
  1524. DWORD       dwControlID;    /* MIXER_GETLINECONTROLSF_ONEBYID */
  1525. DWORD       dwControlType;  /* MIXER_GETLINECONTROLSF_ONEBYTYPE */
  1526.     };
  1527.     DWORD           cControls;      /* count of controls pmxctrl points to */
  1528.     DWORD           cbmxctrl;       /* size in bytes of _one_ MIXERCONTROL */
  1529.     LPMIXERCONTROLA pamxctrl;       /* pointer to first MIXERCONTROL array */
  1530. } MIXERLINECONTROLSA, *PMIXERLINECONTROLSA, *LPMIXERLINECONTROLSA;
  1531. typedef struct tagMIXERLINECONTROLSW {
  1532.     DWORD           cbStruct;       /* size in bytes of MIXERLINECONTROLS */
  1533.     DWORD           dwLineID;       /* line id (from MIXERLINE.dwLineID) */
  1534.     union {
  1535. DWORD       dwControlID;    /* MIXER_GETLINECONTROLSF_ONEBYID */
  1536. DWORD       dwControlType;  /* MIXER_GETLINECONTROLSF_ONEBYTYPE */
  1537.     };
  1538.     DWORD           cControls;      /* count of controls pmxctrl points to */
  1539.     DWORD           cbmxctrl;       /* size in bytes of _one_ MIXERCONTROL */
  1540.     LPMIXERCONTROLW pamxctrl;       /* pointer to first MIXERCONTROL array */
  1541. } MIXERLINECONTROLSW, *PMIXERLINECONTROLSW, *LPMIXERLINECONTROLSW;
  1542. #ifdef UNICODE
  1543. typedef MIXERLINECONTROLSW MIXERLINECONTROLS;
  1544. typedef PMIXERLINECONTROLSW PMIXERLINECONTROLS;
  1545. typedef LPMIXERLINECONTROLSW LPMIXERLINECONTROLS;
  1546. #else
  1547. typedef MIXERLINECONTROLSA MIXERLINECONTROLS;
  1548. typedef PMIXERLINECONTROLSA PMIXERLINECONTROLS;
  1549. typedef LPMIXERLINECONTROLSA LPMIXERLINECONTROLS;
  1550. #endif // UNICODE
  1551. #else
  1552. typedef struct tMIXERLINECONTROLS {
  1553.     DWORD           cbStruct;       /* size in bytes of MIXERLINECONTROLS */
  1554.     DWORD           dwLineID;       /* line id (from MIXERLINE.dwLineID) */
  1555.     union {
  1556. DWORD       dwControlID;    /* MIXER_GETLINECONTROLSF_ONEBYID */
  1557. DWORD       dwControlType;  /* MIXER_GETLINECONTROLSF_ONEBYTYPE */
  1558.     };
  1559.     DWORD           cControls;      /* count of controls pmxctrl points to */
  1560.     DWORD           cbmxctrl;       /* size in bytes of _one_ MIXERCONTROL */
  1561.     LPMIXERCONTROL  pamxctrl;       /* pointer to first MIXERCONTROL array */
  1562. } MIXERLINECONTROLS, *PMIXERLINECONTROLS, FAR *LPMIXERLINECONTROLS;
  1563. #endif
  1564. /* */
  1565. /* */
  1566. /* */
  1567. #ifdef _WIN32
  1568. WINMMAPI MMRESULT WINAPI mixerGetLineControlsA(HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls);
  1569. WINMMAPI MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls);
  1570. #ifdef UNICODE
  1571. #define mixerGetLineControls  mixerGetLineControlsW
  1572. #else
  1573. #define mixerGetLineControls  mixerGetLineControlsA
  1574. #endif // !UNICODE
  1575. #else
  1576. MMRESULT WINAPI mixerGetLineControls(HMIXEROBJ hmxobj, LPMIXERLINECONTROLS pmxlc, DWORD fdwControls);
  1577. #endif
  1578. #define MIXER_GETLINECONTROLSF_ALL          0x00000000L
  1579. #define MIXER_GETLINECONTROLSF_ONEBYID      0x00000001L
  1580. #define MIXER_GETLINECONTROLSF_ONEBYTYPE    0x00000002L
  1581. #define MIXER_GETLINECONTROLSF_QUERYMASK    0x0000000FL
  1582. typedef struct tMIXERCONTROLDETAILS {
  1583.     DWORD           cbStruct;       /* size in bytes of MIXERCONTROLDETAILS */
  1584.     DWORD           dwControlID;    /* control id to get/set details on */
  1585.     DWORD           cChannels;      /* number of channels in paDetails array */
  1586.     union {
  1587. HWND        hwndOwner;      /* for MIXER_SETCONTROLDETAILSF_CUSTOM */
  1588. DWORD       cMultipleItems; /* if _MULTIPLE, the number of items per channel */
  1589.     };
  1590.     DWORD           cbDetails;      /* size of _one_ details_XX struct */
  1591.     LPVOID          paDetails;      /* pointer to array of details_XX structs */
  1592. } MIXERCONTROLDETAILS, *PMIXERCONTROLDETAILS, FAR *LPMIXERCONTROLDETAILS;
  1593. /* */
  1594. /*  MIXER_GETCONTROLDETAILSF_LISTTEXT */
  1595. /* */
  1596. /* */
  1597. #ifdef _WIN32
  1598. typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA {
  1599.     DWORD           dwParam1;
  1600.     DWORD           dwParam2;
  1601.     CHAR            szName[MIXER_LONG_NAME_CHARS];