home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 4 Drivers / 04-Drivers.zip / cs0929a.zip / audiohw.lst < prev    next >
File List  |  1999-09-29  |  11KB  |  280 lines

  1.  
  2. Module: D:\dev\csrc\os2dd\scd\audiohw.c
  3. Group: 'DGROUP' CONST,CONST2,_DATA,_BSS
  4.  
  5. Segment: _TEXT  PARA   000000c5 bytes  
  6.  
  7. //
  8. // audiohw.c
  9. // 27-Jan-99
  10. //
  11. //
  12. // USHORT hwGetType(USHORT dataType, USHORT opType, USHORT lDev);
  13. // USHORT hwSetType(USHORT devType, USHORT dataType, USHORT opType, USHORT lDev);
  14.  
  15. #include "cs40.h"
  16.  
  17. // datatype/optype to device list
  18.  
  19. AUDIOHW_T2DLIST t2dList[] = {
  20.  {AUDIOHW_WAVE_PLAY,0,DATATYPE_WAVEFORM,OPERATION_PLAY},
  21.  {AUDIOHW_WAVE_PLAY,0,PCM,OPERATION_PLAY},
  22.  {AUDIOHW_WAVE_PLAY,0,DATATYPE_ALAW,OPERATION_PLAY},
  23.  {AUDIOHW_WAVE_PLAY,0,DATATYPE_RIFF_ALAW,OPERATION_PLAY},
  24.  {AUDIOHW_WAVE_PLAY,0,A_LAW,OPERATION_PLAY},
  25.  {AUDIOHW_WAVE_PLAY,0,DATATYPE_MULAW,OPERATION_PLAY},
  26.  {AUDIOHW_WAVE_PLAY,0,DATATYPE_RIFF_MULAW,OPERATION_PLAY},
  27.  {AUDIOHW_WAVE_PLAY,0,MU_LAW,OPERATION_PLAY},
  28.  {AUDIOHW_WAVE_CAPTURE,0,DATATYPE_WAVEFORM,OPERATION_RECORD},
  29.  {AUDIOHW_WAVE_CAPTURE,0,PCM,OPERATION_RECORD},
  30.  {AUDIOHW_WAVE_CAPTURE,0,DATATYPE_ALAW,OPERATION_RECORD},
  31.  {AUDIOHW_WAVE_CAPTURE,0,DATATYPE_RIFF_ALAW,OPERATION_RECORD},
  32.  {AUDIOHW_WAVE_CAPTURE,0,A_LAW,OPERATION_RECORD},
  33.  {AUDIOHW_WAVE_CAPTURE,0,DATATYPE_MULAW,OPERATION_RECORD},
  34.  {AUDIOHW_WAVE_CAPTURE,0,DATATYPE_RIFF_MULAW,OPERATION_RECORD},
  35.  {AUDIOHW_WAVE_CAPTURE,0,MU_LAW,OPERATION_RECORD},
  36.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  37.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  38.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  39.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  40.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  41.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  42.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  43.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  44.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  45.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  46.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  47.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  48.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  49.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  50.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},
  51.  {AUDIOHW_INVALID_DEVICE,-1,-1,-1},  // last device is a no-device, always AUDIOHW_INVALID_DEVICE
  52. };
  53.  
  54. #define MAX_T2D_ENTRIES ((sizeof(t2dList) / sizeof(AUDIOHW_T2DLIST)) -1) // -1 to leave last untouched
  55.  
  56.  
  57. // ----------------------------------
  58. // in: dataType |
  59. //     opType   | to match
  60. //     lDev     |
  61. //out: devType of matching entry
  62. //nts: original had devType as ULONG all around, I use USHORT
  63. //     devType == 0 is a valid type (AUDIOHW_READ_DEVICE) though not used here, so -1 is rc on error
  64.  
  65. USHORT hwGetType(USHORT dataType, USHORT opType, USHORT lDev) {
  66.  
  67.  USHORT i;
  68.  0000  51                hwGetType_      push    cx
  69.  0001  56                                push    si
  70.  0002  89 c6                             mov     si,ax
  71.  0004  89 d1                             mov     cx,dx
  72.  0006  89 da                             mov     dx,bx
  73.  
  74.  USHORT devType = AUDIOHW_INVALID_DEVICE;
  75.  
  76.  // allow invalid device to be mixed in t2dList, so check all 32 entries in t2d
  77.  // though that is not a useful condition since that data/op type can just not be entered in list
  78.  
  79.  0008  b8 ff ff                          mov     ax,0ffffH
  80.  
  81.  for (i=0; i < MAX_T2D_ENTRIES; i++) {
  82.  
  83.  000b  31 db                             xor     bx,bx
  84.  
  85.     if (t2dList[i].devType != AUDIOHW_INVALID_DEVICE  &&
  86.         t2dList[i].dataType == dataType  &&
  87.         t2dList[i].opType == opType      &&
  88.         t2dList[i].lDev == lDev) {
  89.  
  90.  000d  83 bf 00 00 ff    L1              cmp     word ptr [bx+_t2dList],0ffffH
  91.  0012  74 16                             je      L2
  92.  0014  3b b7 04 00                       cmp     si,[bx+_t2dList+4H]
  93.  0018  75 10                             jne     L2
  94.  001a  3b 8f 06 00                       cmp     cx,[bx+_t2dList+6H]
  95.  001e  75 0a                             jne     L2
  96.  0020  3b 97 02 00                       cmp     dx,[bx+_t2dList+2H]
  97.  0024  75 04                             jne     L2
  98.  
  99.        devType = t2dList[i].devType;
  100.     }
  101.  0026  8b 87 00 00                       mov     ax,[bx+_t2dList]
  102.  
  103.  }
  104.  
  105.  return devType;
  106.  002a  83 c3 08          L2              add     bx,0008H
  107.  002d  81 fb f8 00                       cmp     bx,00f8H
  108.  0031  75 da                             jne     L1
  109.  
  110. }
  111.  
  112. // ----------------------------------
  113. // in: devType  |
  114. //     dataType |
  115. //     opType   | to match or add
  116. //     lDev     |
  117. //out: 0 if okay, else 87
  118. //nts: sets matching record, or if no exact match adds entry (if room)
  119.  
  120.  0033  5e                                pop     si
  121.  0034  59                                pop     cx
  122.  0035  c3                                ret     
  123.  0036  89 c0                             mov     ax,ax
  124.  
  125. USHORT hwSetType(USHORT devType, USHORT dataType, USHORT opType, USHORT lDev) {
  126.  
  127.  USHORT i;
  128.  USHORT rc = 0;
  129.  0038  56                hwSetType_      push    si
  130.  0039  57                                push    di
  131.  003a  55                                push    bp
  132.  003b  89 e5                             mov     bp,sp
  133.  003d  83 ec 08                          sub     sp,0008H
  134.  0040  89 46 f8                          mov     [bp-8H],ax
  135.  0043  89 56 fc                          mov     [bp-4H],dx
  136.  0046  89 de                             mov     si,bx
  137.  
  138.  0048  bb ff ff                          mov     bx,0ffffH
  139.  
  140.  USHORT match = 0xFFFF, firstAvail = 0xFFFF;
  141.  
  142.  // check if matches current entry
  143.  
  144.  004b  31 d2                             xor     dx,dx
  145.  
  146.  for (i=0; i < MAX_T2D_ENTRIES; i++) {
  147.  
  148.  004d  31 c0                             xor     ax,ax
  149.  004f  89 56 fa                          mov     [bp-6H],dx
  150.  0052  89 5e fe                          mov     [bp-2H],bx
  151.  0055  89 da                             mov     dx,bx
  152.  0057  31 db                             xor     bx,bx
  153.  
  154.     if (t2dList[i].devType != AUDIOHW_INVALID_DEVICE) {
  155.  0059  8b bf 00 00       L3              mov     di,[bx+_t2dList]
  156.  005d  83 ff ff                          cmp     di,0ffffH
  157.  0060  74 1a                             je      L4
  158.  
  159.        if (t2dList[i].dataType==dataType && t2dList[i].opType==opType && t2dList[i].lDev==lDev) {
  160.  0062  8b bf 04 00                       mov     di,[bx+_t2dList+4H]
  161.  0066  3b 7e fc                          cmp     di,[bp-4H]
  162.  0069  75 17                             jne     L5
  163.  006b  3b b7 06 00                       cmp     si,[bx+_t2dList+6H]
  164.  006f  75 11                             jne     L5
  165.  0071  3b 8f 02 00                       cmp     cx,[bx+_t2dList+2H]
  166.  0075  75 0b                             jne     L5
  167.  
  168.           match = i;
  169.  0077  89 46 fe                          mov     [bp-2H],ax
  170.  
  171.        }
  172.     }
  173.     else {
  174.  007a  eb 06                             jmp     L5
  175.  
  176.        if (firstAvail == 0xFFFF) firstAvail = i;  // track first open slot in case need to insert
  177.  007c  39 fa             L4              cmp     dx,di
  178.  007e  75 02                             jne     L5
  179.  0080  89 c2                             mov     dx,ax
  180.  
  181.     }
  182.  0082  40                L5              inc     ax
  183.  
  184.  }
  185.  
  186.  // check if no match, and if not, check if room available
  187.  
  188.  0083  83 c3 08                          add     bx,0008H
  189.  0086  3d 1f 00                          cmp     ax,001fH
  190.  0089  72 ce                             jb      L3
  191.  
  192.  if (match == 0xFFFF) {
  193.  008b  83 7e fe ff                       cmp     word ptr [bp-2H],0ffffH
  194.  008f  75 0a                             jne     L6
  195.  
  196.     if (firstAvail >= MAX_T2D_ENTRIES) rc = 68; // CP error, "Too Many Names" (close enough)
  197.  }
  198.  
  199.  // update or insert entry
  200.  
  201.  0091  83 fa 1f                          cmp     dx,001fH
  202.  0094  72 05                             jb      L6
  203.  0096  c7 46 fa 44 00                    mov     word ptr [bp-6H],0044H
  204.  
  205.  if (rc == 0) {
  206.  009b  83 7e fa 00       L6              cmp     word ptr [bp-6H],0000H
  207.  009f  75 1b                             jne     L7
  208.  
  209.     t2dList[i].devType = devType;
  210.     t2dList[i].dataType = dataType;
  211.  00a1  89 c3                             mov     bx,ax
  212.  00a3  c1 e3 03                          shl     bx,03H
  213.  00a6  8b 46 f8                          mov     ax,[bp-8H]
  214.  00a9  89 87 00 00                       mov     [bx+_t2dList],ax
  215.  
  216.     t2dList[i].opType = opType;
  217.  00ad  89 b7 06 00                       mov     [bx+_t2dList+6H],si
  218.  
  219.     t2dList[i].lDev = lDev;
  220.  }
  221.  
  222.  return rc;
  223.  00b1  89 8f 02 00                       mov     [bx+_t2dList+2H],cx
  224.  00b5  8b 46 fc                          mov     ax,[bp-4H]
  225.  00b8  89 87 04 00                       mov     [bx+_t2dList+4H],ax
  226.  
  227. }
  228.  
  229.  
  230.  00bc  8b 46 fa          L7              mov     ax,[bp-6H]
  231.  00bf  89 ec                             mov     sp,bp
  232.  00c1  5d                                pop     bp
  233.  00c2  5f                                pop     di
  234.  00c3  5e                                pop     si
  235.  00c4  c3                                ret     
  236.  
  237. No disassembly errors
  238.  
  239. List of external symbols
  240.  
  241. Symbol
  242. ----------------
  243. _t2dList         000000ba 000000b3 000000af 000000ab 00000073 0000006d 00000064 0000005b 00000028 00000022
  244.                  0000001c 00000016 0000000f
  245. ------------------------------------------------------------
  246.  
  247. Segment: _DATA  WORD   00000100 bytes  
  248.  0000  11 00 00 00 01 00 01 00 _t2dList        - ........
  249.  0008  11 00 00 00 02 00 01 00                 - ........
  250.  0010  11 00 00 00 02 01 01 00                 - ........
  251.  0018  11 00 00 00 06 00 01 00                 - ........
  252.  0020  11 00 00 00 05 00 01 00                 - ........
  253.  0028  11 00 00 00 01 01 01 00                 - ........
  254.  0030  11 00 00 00 07 00 01 00                 - ........
  255.  0038  11 00 00 00 03 00 01 00                 - ........
  256.  0040  10 00 00 00 01 00 02 00                 - ........
  257.  0048  10 00 00 00 02 00 02 00                 - ........
  258.  0050  10 00 00 00 02 01 02 00                 - ........
  259.  0058  10 00 00 00 06 00 02 00                 - ........
  260.  0060  10 00 00 00 05 00 02 00                 - ........
  261.  0068  10 00 00 00 01 01 02 00                 - ........
  262.  0070  10 00 00 00 07 00 02 00                 - ........
  263.  0078  10 00 00 00 03 00 02 00                 - ........
  264.  0080  ff ff ff ff ff ff ff ff                 - ........
  265.        --- Above line repeats 15 time(s) --- 
  266.  
  267. No disassembly errors
  268.  
  269. ------------------------------------------------------------
  270. List of public symbols
  271.  
  272. SYMBOL          GROUP           SEGMENT          ADDRESS
  273. ---------------------------------------------------------
  274. _t2dList        DGROUP          _DATA            00000000
  275. hwGetType_                      _TEXT            00000000
  276. hwSetType_                      _TEXT            00000038
  277.  
  278. ------------------------------------------------------------
  279.  
  280.