| 1 | //----------------------------------------------------------------------------- | 
|---|
| 2 | // Freeware.  This file may be used freely to promote the ioctl90 mixer API. | 
|---|
| 3 | // | 
|---|
| 4 | //----------------------------------------------------------------------------- | 
|---|
| 5 | // File: ioctl90.h                                      Date Created: 10/14/98 | 
|---|
| 6 | // Description: prototypes for cat 90 mixer IOCTLs      Last Update : 11/16/99 | 
|---|
| 7 | //----------------------------------------------------------------------------- | 
|---|
| 8 | // | 
|---|
| 9 | // Crystal Semiconductor defined category 0x90 OS/2 mixer IOCTLS. | 
|---|
| 10 | // | 
|---|
| 11 | // STATUS: (Drivers known to implement this API) | 
|---|
| 12 | //    Crystal Semiconductor ISA Mode 3 driver version 2.08. | 
|---|
| 13 | //    Crystal Semiconductor PCI driver version 3.02. | 
|---|
| 14 | // | 
|---|
| 15 | //----------------------------------------------------------------------------- | 
|---|
| 16 | // | 
|---|
| 17 | // This header file contains application usable defines for calls to | 
|---|
| 18 | // Crystal Semiconductor device driver to manage hardware mixer. | 
|---|
| 19 | // It is primarily used to adjust the listening level of | 
|---|
| 20 | // mixer inputs (CD-ROM, Aux, Line, Phone...).  The API also allows | 
|---|
| 21 | // adjustment to the record gain as an override to MMPM/2 stream | 
|---|
| 22 | // specific API. | 
|---|
| 23 | // | 
|---|
| 24 | // API is modeled off of AC97 mixer.  This does not mean that the device | 
|---|
| 25 | // uses an AC97 mixer.  Being a relatively low-function device, the model | 
|---|
| 26 | // should be usable on most hardware architectures. | 
|---|
| 27 | // | 
|---|
| 28 | // For information on AC97 hardware architecuture, consult data book | 
|---|
| 29 | // for the CS4297 databook: | 
|---|
| 30 | //    Crystal Clear(tm) SoundFusion(tm) Audio Codec '97 (CS4297) | 
|---|
| 31 | // Available from http://www.cirrus.com/ | 
|---|
| 32 | // | 
|---|
| 33 | // | 
|---|
| 34 | // API DEFINITION | 
|---|
| 35 | // -------------- | 
|---|
| 36 | // | 
|---|
| 37 | // Architecture notes: | 
|---|
| 38 | // - All volumes sent to the device driver are range 0..100. | 
|---|
| 39 | // - Mute is a boolean stored in a ULONG (range 0..1) | 
|---|
| 40 | // - All APIs effect the device on GLOBAL basis (not per-stream). | 
|---|
| 41 | // - API does not control master volume or per-stream volume. | 
|---|
| 42 | //   These are controlled by MMPM/2 MCI and AUDIODD IOCTLS (category 0x80). | 
|---|
| 43 | // - API does permit override of MMPM/2 record gain.  The value sent is | 
|---|
| 44 | //   global and will only be used by the device driver if the master | 
|---|
| 45 | //   gain is set via this API.  Once set, the global value will be used | 
|---|
| 46 | //   in preference to the MMPM/2 per-stream setting, until next reboot. | 
|---|
| 47 | // | 
|---|
| 48 | // IOCTL Category 0x90, functions: | 
|---|
| 49 | // 40 - MonoInSet        60 - MonoInQuery | 
|---|
| 50 | // 41 - PhoneSet         61 - PhoneQuery | 
|---|
| 51 | // 42 - MicSet           62 - MicQuery | 
|---|
| 52 | // 43 - LineSet          63 - LineQuery | 
|---|
| 53 | // 44 - CDSet            64 - CDQuery | 
|---|
| 54 | // 45 - VideoSet         65 - VideoQuery | 
|---|
| 55 | // 46 - AuxSet           66 - AuxQuery | 
|---|
| 56 | // 4C - ThreeDSet        6C - ThreeDQuery | 
|---|
| 57 | // 4D - StreamVolSet     6D - StreamVolQuery | 
|---|
| 58 | // 4E - RecordSrcSet     6E - RecordSrcQuery | 
|---|
| 59 | // 4F - RecordGainSet    6F - RecordGainQuery | 
|---|
| 60 | // 80 - ApiLevelQuery | 
|---|
| 61 | // 81 - GetApiMap | 
|---|
| 62 | // 82 - CallbackReg | 
|---|
| 63 | // | 
|---|
| 64 | // Application passes a structure (ioctl data buffer) | 
|---|
| 65 | // which contains: | 
|---|
| 66 | // ULONG Mute;     // UnMute==0, Mute==1 | 
|---|
| 67 | // ULONG ulVolL;   // Left volume in percent 0..100 | 
|---|
| 68 | // ULONG ulVolR;   // Right volume in percent 0..100 | 
|---|
| 69 | // | 
|---|
| 70 | // With the exception of the record gain APIs, these APIs effect | 
|---|
| 71 | // what you hear (output bus connections). | 
|---|
| 72 | // | 
|---|
| 73 | //----------------------------------------------------------------------------- | 
|---|
| 74 | // | 
|---|
| 75 | // Calling code should query the device driver name by calling | 
|---|
| 76 | // MMPM/2 MCI APIs to get the PDD name for the "WaveAudio" MCI device. | 
|---|
| 77 | // Application should then issue DosOpen on the device followed | 
|---|
| 78 | // by DosDevIOCTLs to perform operations. | 
|---|
| 79 | // | 
|---|
| 80 | // Here is sample code for DosOpen and DosDevIOCTL | 
|---|
| 81 | // | 
|---|
| 82 | // Driver name in call to the open function should include "\\DEV\\" | 
|---|
| 83 | //    Example: hPdd = DevOpen ("\\DEV\\BSAUD1$"); or | 
|---|
| 84 | //    Example: hPdd = DevOpen ("\\DEV\\CWCAUD1$"); | 
|---|
| 85 | // | 
|---|
| 86 | // HFILE DevOpen (char *ddName) | 
|---|
| 87 | // { | 
|---|
| 88 | //    ULONG ulRC; | 
|---|
| 89 | //    ULONG OpenFlags; | 
|---|
| 90 | //    ULONG OpenMode; | 
|---|
| 91 | //    ULONG ulFileSize      = 0; | 
|---|
| 92 | //    ULONG ulFileAttribute = 0; | 
|---|
| 93 | //    ULONG ulActionTaken   = 0; | 
|---|
| 94 | //    HFILE hPdd            = NULL; | 
|---|
| 95 | // | 
|---|
| 96 | //    OpenFlags = OPEN_ACTION_OPEN_IF_EXISTS;   // Do not create file | 
|---|
| 97 | // | 
|---|
| 98 | //    OpenMode  = OPEN_ACCESS_READWRITE +       // Read/Write file | 
|---|
| 99 | //                OPEN_SHARE_DENYNONE +         // Non-exclusive access | 
|---|
| 100 | //                OPEN_FLAGS_FAIL_ON_ERROR;     // No system popups on errors | 
|---|
| 101 | // | 
|---|
| 102 | //    ulRC = DosOpen (ddName,          // in | 
|---|
| 103 | //                    &hPdd,           //    out (handle) | 
|---|
| 104 | //                    &ulActionTaken,  //    out | 
|---|
| 105 | //                    ulFileSize,      // in | 
|---|
| 106 | //                    ulFileAttribute, // in | 
|---|
| 107 | //                    OpenFlags,       // in | 
|---|
| 108 | //                    OpenMode,        // in | 
|---|
| 109 | //                    NULL);           // in | 
|---|
| 110 | // | 
|---|
| 111 | //    printf ("DosOpen RC = %x\n", ulRC); | 
|---|
| 112 | // | 
|---|
| 113 | //    if (ulRC != 0) | 
|---|
| 114 | //       hPdd = NULL; | 
|---|
| 115 | // | 
|---|
| 116 | //    return (hPdd); | 
|---|
| 117 | // } | 
|---|
| 118 | // | 
|---|
| 119 | // ULONG SendIOCTL (HFILE hPdd, ULONG ulFunc, PMIXSTRUCT pMix) | 
|---|
| 120 | // { | 
|---|
| 121 | //    ULONG     ulRC; | 
|---|
| 122 | //    ULONG     ulSizeOfStruct =  = sizeof (MixStruct); | 
|---|
| 123 | // | 
|---|
| 124 | //    ulRC = DosDevIOCtl | 
|---|
| 125 | //       (hPdd,               // Device Handle | 
|---|
| 126 | //        0x90,               // Category (user defined >= 0x80) | 
|---|
| 127 | //        ulFunc,             // Function Use defines in this .H file | 
|---|
| 128 | //        NULL,               // in      Address of parm data (not used) | 
|---|
| 129 | //        0,                  // in      Max size of parm data structure | 
|---|
| 130 | //        NULL,               // in out  Actual size of parm data structure | 
|---|
| 131 | //        pMix,               // in      Address of command data | 
|---|
| 132 | //        ulSizeOfStruct,     // in      Maximum size of command data | 
|---|
| 133 | //        &ulSizeOfStruct);   // in out  Size of command data | 
|---|
| 134 | // | 
|---|
| 135 | //    printf ("DosDevIOCtl ulRC = %d\n", ulRC); | 
|---|
| 136 | // | 
|---|
| 137 | //    return (ulRC); | 
|---|
| 138 | // } | 
|---|
| 139 | // | 
|---|
| 140 | // MODIFICATION HISTORY | 
|---|
| 141 | // 14-Oct-98 Joe Nord   Create (Crystal Semiconductor, Inc). | 
|---|
| 142 | // 05-Mar-99 Joe Nord   Added version query and API map query ioctls (80, 81) | 
|---|
| 143 | //                      First release, Crystal PCI 3.02 | 
|---|
| 144 | // 13-Apr-99 Joe Nord   Added support for global record gain set and query | 
|---|
| 145 | // 15-Jul-99 Joe Nord   Add callback semaphore support | 
|---|
| 146 | // 10-Nov-99 Joe Nord   Added support for 3D sound effect set and query | 
|---|
| 147 | // 15-Nov-99 Joe Nord   Added support for stream volume override | 
|---|
| 148 | // 16-Nov-99 Joe Nord   Added support for message buffer return | 
|---|
| 149 | //----------------------------------------------------------------------------- | 
|---|
| 150 |  | 
|---|
| 151 | // This prototype is used in the device driver only (common header) | 
|---|
| 152 | //USHORT ioctlmixMain (USHORT Function, | 
|---|
| 153 | //                     USHORT SysFileNum, | 
|---|
| 154 | //                     ULONG  ulpvData, | 
|---|
| 155 | //                     USHORT usDLength); | 
|---|
| 156 |  | 
|---|
| 157 | // This structure is passed to the device driver using DosDevIOCTL. | 
|---|
| 158 | typedef struct | 
|---|
| 159 | { | 
|---|
| 160 | ULONG Mute;                  // UnMute==0, Mute==1 | 
|---|
| 161 | ULONG VolumeL;               // 0..100 percent | 
|---|
| 162 | ULONG VolumeR;               // 0..100 percent | 
|---|
| 163 | } MIXSTRUCT, *PMIXSTRUCT; | 
|---|
| 164 |  | 
|---|
| 165 | typedef struct | 
|---|
| 166 | { | 
|---|
| 167 | ULONG pBuffer;     // Application linear address to message buffer (in) | 
|---|
| 168 | ULONG ulSize;      // Size of buffer (in).  Count of chars (out). | 
|---|
| 169 | ULONG fClear;      // PDD should clear buffer after copy (in) | 
|---|
| 170 | ULONG fError;      // Message buffer includes error message (out) | 
|---|
| 171 | ULONG fNewInfo;    // Message buffer has new text since last read (out) | 
|---|
| 172 | ULONG ulCharsLost; // Messages lost - circular queue wrap around (out) | 
|---|
| 173 | } MIXMSGBUF, *PMIXMSGBUF; | 
|---|
| 174 |  | 
|---|
| 175 |  | 
|---|
| 176 | // | 
|---|
| 177 | // Defines for use by applications | 
|---|
| 178 | // | 
|---|
| 179 | #define MONOINSET       0x40    // SET functions in the 0x40 range | 
|---|
| 180 | #define PHONESET        0x41 | 
|---|
| 181 | #define MICSET          0x42 | 
|---|
| 182 | #define LINESET         0x43 | 
|---|
| 183 | #define CDSET           0x44 | 
|---|
| 184 | #define VIDEOSET        0x45 | 
|---|
| 185 | #define AUXSET          0x46 | 
|---|
| 186 | #define BASSTREBLESET   0x4B | 
|---|
| 187 | #define THREEDSET       0x4C | 
|---|
| 188 | #define STREAMVOLSET    0x4D | 
|---|
| 189 | #define RECORDSRCSET    0x4E | 
|---|
| 190 | #define RECORDGAINSET   0x4F | 
|---|
| 191 |  | 
|---|
| 192 | #define MONOINQUERY     0x60    // Query functions in the 0x60 range | 
|---|
| 193 | #define PHONEQUERY      0x61 | 
|---|
| 194 | #define MICQUERY        0x62 | 
|---|
| 195 | #define LINEQUERY       0x63 | 
|---|
| 196 | #define CDQUERY         0x64 | 
|---|
| 197 | #define VIDEOQUERY      0x65 | 
|---|
| 198 | #define AUXQUERY        0x66 | 
|---|
| 199 | #define BASSTREBLEQUERY 0x6B | 
|---|
| 200 | #define THREEDQUERY     0x6C | 
|---|
| 201 | #define STREAMVOLQUERY  0x6D | 
|---|
| 202 | #define RECORDSRCQUERY  0x6E | 
|---|
| 203 | #define RECORDGAINQUERY 0x6F | 
|---|
| 204 |  | 
|---|
| 205 | #define APILEVELQUERY   0x80 | 
|---|
| 206 | #define GETAPIMAP       0x81    // Get 256 byte BOOL list of supported IOCTLs | 
|---|
| 207 | #define CALLBACKREG     0x82    // Provide HEV for mixer change callbacks | 
|---|
| 208 | #define MSGBUF          0x83    // Get PDD error log message buffer | 
|---|
| 209 |  | 
|---|
| 210 | // RECORDSRCSET | 
|---|
| 211 | // Support mixer application override of record gain values. | 
|---|
| 212 | // Only use the global values when a mixer app has instructed to do so. | 
|---|
| 213 | // This allows override of settings from MMPM/2 applications. | 
|---|
| 214 |  | 
|---|
| 215 | #define I90SRC_BASE     0x00000010      // 0..F are reserved (MMPM/2 space) | 
|---|
| 216 | #define I90SRC_MIC      0x00000010 | 
|---|
| 217 | #define I90SRC_CD       0x00000020 | 
|---|
| 218 | #define I90SRC_VIDEO    0x00000040 | 
|---|
| 219 | #define I90SRC_AUX      0x00000080 | 
|---|
| 220 | #define I90SRC_LINE     0x00000100 | 
|---|
| 221 | #define I90SRC_RES5     0x00000200 | 
|---|
| 222 | #define I90SRC_RES6     0x00000400 | 
|---|
| 223 | #define I90SRC_PHONE    0x00000800 | 
|---|
| 224 |  | 
|---|
| 225 |  | 
|---|
| 226 | // In first release, the APILEVELQUERY function returns a ULONG, 0x01. | 
|---|
| 227 | // As significant changes are made to the ioctlmix API, the return value | 
|---|
| 228 | // of this function will be incremented. | 
|---|
| 229 |  | 
|---|
| 230 | // GETAPIMAP | 
|---|
| 231 | // To help an application know what APIs are supported by this device driver, | 
|---|
| 232 | // return an array of booleans (BYTES).  TRUE => Supported. | 
|---|
| 233 | // The array must be declared as 256 bytes.  This is larger than necessary as | 
|---|
| 234 | // the first 64 entries, range 0x00..0x39, are guaranteed to be zero. | 
|---|
| 235 | // The extra bytes allows the array to be indexed using the IOCTL function | 
|---|
| 236 | // defines in this file. | 
|---|
| 237 | // | 
|---|
| 238 | // Notice that a FALSE value in an array position (for example "video set") | 
|---|
| 239 | // can be used to inform the mixer application that this device driver does | 
|---|
| 240 | // not support a "video" connection to the audio device. | 
|---|
| 241 | // Where a device driver is called for an input that it does not support, the | 
|---|
| 242 | // DosDevIOCTL will fail with return code RPGENFAIL. | 
|---|
| 243 |  | 
|---|