home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Game Programming Gurus / Tricks_of_the_Game_Programming_Gurus_SAMS_Publishing_1994.iso / digipak / theaudio / digpkapi.doc < prev    next >
Text File  |  1994-01-03  |  23KB  |  570 lines

  1.  
  2.              Version 3.4 DigPak
  3.  
  4.                  written by
  5.  
  6.               John W. Ratcliff
  7.  
  8.              Copyright (c) 1994
  9.  
  10.             The Audio Solution, Inc.
  11.  
  12. Includes one set of sources that works in all memory models.  Full
  13. MIDPAK compatible support.  Also supports protected mode interface
  14. through 32 bit register passing.  Even though all DIGPAK drivers
  15. execute in real-mode, they work in flat-model throught the DIGPLAY
  16. linkable interface layer.
  17.  
  18. Not all DIGPAK sound drivers are at the 3.4 level yet.    Ones not
  19. converted yet are, SoundBlaster 16, Gravis Ultrasound, and Turtle
  20. Beach Multisound.
  21.  
  22. The set of digitized sound drivers hook into user interrupt vector 66h
  23. to provide a clean clear programmers interface. This document describes
  24. the two ways you can access the digitized sound package.  The first is
  25. the interrupt level interface.    The second is a link library interface
  26. that provides a set of C or assembly language callable functions to
  27. access not only the digitized sound drivers but also provides usefull
  28. support routines.  These glue code functions are located in the source
  29. file DIGPLAY.ASM.
  30.  
  31. ***********************************************************************
  32. *************** INT 66h Interface Specification ***********************
  33. ***********************************************************************
  34.  
  35. When invoking digplay functions to play sound you pass the address of
  36. a sound structure (SNDSTRUC) that contains the basic information
  37. describing the sound effect you wish to play.
  38.  
  39.  
  40. *** REAL MODE:
  41.  
  42. typedef struct
  43. {
  44.     unsigned char far *sound; // Far address of audio data.
  45.     unsigned short     sndlen;  // Length of audio sample.
  46.     short far *IsPlaying;        // Address of play status flag.
  47.     short      frequency;        // Playback frequency.
  48. } SNDSTRUC;
  49.  
  50. *** PROTECTED MODE:
  51.  
  52. typedef struct
  53. {
  54.     unsigned char *sound;    // MUST BE OFFSET SEGMENT IN 1MB ADRESS SPACE!
  55.     unsigned short sndlen;    // Length of audio sample. < 64k
  56.     short *IsPlaying;    // Address of play status flag. REAL PTR OFFSET:SEGMENT!!
  57.     short    frequency;    // Playback frequency.
  58. } SNDSTRUC;
  59.  
  60. ********* DIGPAK functions ************************************
  61.  
  62. Function #1: DigPlay, Play an 8 bit digitized sound.
  63.  
  64.     INPUT:    AX = 688h    Command number.
  65.  
  66.         DS:SI         *REAL* Point to a sound structure that
  67.                  describes the sound effect to be played.
  68.  
  69.         ESI         *FLAT* If using 32 bit interface passing, ESI
  70.                  points to flat-model address in the first
  71.                  1mb of address space to the sound structure.
  72.                  Will get converted into a valid segment offset
  73.                  by DIGPAK driver.
  74.  
  75. Function #2: SoundStatus, Check current status of sound driver.
  76.           and report VERSION number of the driver, 3.1 and later.
  77.  
  78.     INPUT:    AX = 689h
  79.     OUTPUT: AX = 0         No sound is playing.
  80.            = 1         Sound effect currently playing.
  81.         DX = 0         No sound is looping.
  82.            = 1         A sound effect is looping.
  83.         BX = version Starting with version 3.1, the BX register
  84.                  of the SoundStatus call will return the
  85.                  version number.  The version number is in
  86.                  decimal, and multiplied times 100.  Meaning
  87.                  a return of 310, is equal to version 3.10.
  88.                  Versions before 3.1, did not set the BX
  89.                  register to anything, so you should zero
  90.                  out the BX register before you check the
  91.                  version number.  If the BX register is still
  92.                  zero, then the DigPak driver loaded is less
  93.                  than 3.1.
  94.  
  95.  
  96. Function #3: MassageAudio, Preformat audio data into ouptut hardware format.
  97.  
  98.     INPUT:    AX = 68Ah
  99.  
  100.         DS:SI         *REAL* Point to a sound structure that
  101.                  describes the sound effect to be played.
  102.  
  103.         ESI         *FLAT* If using 32 bit interface passing, ESI
  104.                  points to flat-model address in the first
  105.                  1mb of address space to the sound structure.
  106.                  Will get converted into a valid segment offset
  107.                  by DIGPAK driver.
  108.  
  109.  
  110. Function #4: DigPlay2, Play preformatted audio data.
  111.  
  112.     INPUT:    AX = 68Bh
  113.  
  114.         DS:SI         *REAL* Point to a sound structure that
  115.                  describes the sound effect to be played.
  116.  
  117.         ESI         *FLAT* If using 32 bit interface passing, ESI
  118.                  points to flat-model address in the first
  119.                  1mb of address space to the sound structure.
  120.                  Will get converted into a valid segment offset
  121.                  by DIGPAK driver.
  122.  
  123.  
  124. Function #5: AudioCapabilities, Report capabilities of hardware device.
  125.  
  126.     INPUT:    AX = 68Ch
  127.     OUTPU:    AX = Bit 0 -> On, supports background playback.
  128.                   Off, driver only plays as a foreground process.
  129.              Bit 1 -> On, source data is reformatted for output device.
  130.                    Off, device handles raw 8 bit unsigned audio.
  131.              Bit 2 -> On, Device plays back at a fixed frequency, but
  132.                   the audio driver will downsample input data
  133.                   to fit.
  134.                   Off, device plays back at user specified frequency.
  135.                   (NOTE: You can still playback an audio sample at
  136.                      whatever frequency you wish.  The driver
  137.                      will simply downsample the data to fit
  138.                      the output hardware.  Currently it does
  139.                      not support upsampling though.)
  140.              Bit 3 -> On, this device uses the timer interrupt vector
  141.                   during sound playback.
  142.              Bit 4 -> Driver supports timer sharing. (not
  143.                   available in flat model)
  144.              Bit 5 -> Supports looped sounds and pending.
  145.              Bit 6 -> Supports stereo panning.
  146.              Bit 7 -> Supports 8 bit PCM stereo playback.
  147.              Bit 8 -> Supports audio recording.
  148.              Bit 9 -> supports DMA backfilling.
  149.  
  150.         DX = If this device plays back at a fixed frequency the DX
  151.              register will contain that fixed frequency playback rate.
  152.  
  153. Function #6: OBSOLETE FUNCTION
  154.  
  155.  
  156. Function #7: OBSOLETE FUNCTION
  157.  
  158. Function #8: StopSound, stop currently playing sound.
  159.  
  160.     INPUT: AX = 68Fh
  161.     OUTPUT: None.
  162.  
  163.           Will cause any currently playing sound effect to be
  164.           terminated.
  165.  
  166. Function #9: OBSOLETE FUNCTION
  167.  
  168. FUNCTION #10: OBSOLETE FUNCTION
  169.  
  170. FUNCTION #11: OBSOLETE FUNCTION
  171.  
  172. FUNCTION #12: SetTimerDivsorRate (not valid in protected mode)
  173.  
  174.     INPUT: AX = 693h
  175.            DX = Countdown timer divisor rate, so that timer based
  176.             drivers can service application timer interrupts
  177.             at their previous rate.  Service rate will be an
  178.             aproximation, that is fairly close.  To reset timer
  179.             divisor to default of 18.2 pass a 0 in the DX register.
  180.             WARNING!!! If you make use of timer sharing, be sure
  181.             to reset it back to the normal 18.2 time per second
  182.             rate when you exit.
  183.  
  184. FUNCTION #13: OBSOLETE FUNCTION
  185.  
  186. FUNCTION #14: PostAudioPending
  187.  
  188.     INPUT: AX = 695h
  189.  
  190.         DS:SI         *REAL* Pointer to a sound structure that
  191.                  describes the sound effect to be played.
  192.  
  193.         ESI         *FLAT* If using 32 bit interface passing, ESI
  194.                  points to flat-model address in the first
  195.                  1mb of address space to the sound structure.
  196.                  Will get converted into a valid segment offset
  197.                  by DIGPAK driver.
  198.  
  199.     OUTPUT: AX = 0    Sound was started playing.
  200.         AX = 1    Sound was posted as pending to play.
  201.         AX = 2    Already a sound effect pending, this one not posted.
  202.  
  203. FUNCTION #15: AudioPendingStatus
  204.  
  205.     INPUT:    AX = 696h
  206.  
  207.     OUTPUT: AX = 0 No sound is playing.
  208.         AX = 1 Sound playing, sound pending.
  209.         AX = 2 Sound playing, no sound pending.
  210.  
  211. FUNCTION #16: SetStereoPan
  212.  
  213.      INPUT: AX = 697h
  214.         DX = stereo pan value. 0 full volume right.
  215.                       64 full volume both.
  216.                      127 full volume left.
  217.        OUTPUT: AX = 0 command ignored, driver doesn't support stereo panning.
  218.            AX = 1 pan set.
  219.  
  220.  
  221.  FUNCTION #17: SetPlayMode
  222.  
  223.      INPUT: AX = 698h
  224.         DX = Play Mode function.
  225.             DX = 0 -> 8 bit PCM
  226.                = 1 -> 8 bit Stereo PCM (left/right)
  227.                = 2 -> 16 bit PCM
  228.                = 3 -> 16 bit PCM stereo
  229.  
  230.         Once the play mode has been changed, all DigPak functions
  231.         work exactly the same as before but expect data passed as
  232.         specified by this play mode.  8 bit PCM Stereo has left/right
  233.         channel pairs.    Supported by Stereo FX card and Sound Blaster
  234.         Pro.
  235.  
  236.        OUTPUT: AX = 1 -> mode set.
  237.            AX = 0 -> mode not supported by this driver.
  238.  
  239. FUNCTION #18:    Report Pending Status Flag adddress and Semaphore address.
  240.  
  241.     int far *ReportPendingAddress(void);
  242.  
  243.     Reports the far address of the pending flag.  If this memory location
  244.     pointed to by this address is 1 that means a pending sound effect is
  245.     still pending.    When this becomes zero, then your application software
  246.     can post the next piece of audio to play.  It is preferable to use this
  247.     semaphore to know when to post the next buffer rather than to use the
  248.     AudioPendingStatus call.
  249.  
  250.     int far *ReportSemaphoreAddress(void);
  251.  
  252.     Report the address of the DigPak semaphore.  This returns a far
  253.     address to a word location inside DigPak.  When this is true,
  254.     then DigPak is currently active, and you shouldn't invoke any
  255.     DigPak function from a hardware interrupt at this time.
  256.  
  257.     INPUT: AX=699h
  258.     OUTPUT: AX:DX -> form far Address of Pending status flag.
  259.         BX:DX -> form far address of digpak semaphore
  260.         (when using DIGPLAY.ASM in flat-model, this address
  261.          returned will be converted into a valid flat-model
  262.          address.)
  263.  
  264.  FUNCTION #19: Set audio recording mode.
  265.  
  266.      INPUT: AX = 69Ah
  267.         DX = 0 turn audio recording ON.
  268.            = 1 turn audio recording OFF.
  269.  
  270.        OUTPUT: AX = 0 sound driver doesn't support audio recording.
  271.            AX = 1 audio recording mode is set.
  272.  
  273. FUNCTION #20:    OBSOLETE FUNCTION
  274.  
  275.  FUNCTION #21: Set DMA back fill mode.
  276.  
  277.      INPUT: AX = 69Ch
  278.         DX = backfill mode 0 means turn it off.
  279.              and a 1 means to turn it off.
  280.  
  281.      OUTPUT: AX = 1 -> back fill mode set.
  282.               0 -> driver doesn't support DMA backfill.
  283.  
  284.  
  285.  FUNCTION #22: Report current DMAC count.
  286.  
  287.      INPUT: AX = 69Dh
  288.  
  289.      OUTPUT: AX = Current DMAC count. (counts down, not up)
  290.  
  291.  
  292.  FUNCTION #23: Verify DMA block, check to see if it crosses a 64k page
  293.            boundary for the user.
  294.  
  295.      INPUT: AX = 69Eh
  296.         ES:BX -> *REAL*address of sound.
  297.         EBX   -> *FLAT* 32 bit flat model address in the first
  298.              1mb of address space. DIGPAK will convert it
  299.              into a valid offset:segment.
  300.         CX    -> length of sound effect.
  301.  
  302.      OUTPUT: AX = 1 Block is ok, DOESN'T cross 64k bounadary.
  303.          AX = 0 block failed, DOES cross 64k boundary.
  304.  
  305.  FUNCTION #24: Set PCM volume.
  306.  
  307.      INPUT: AX = 69Fh
  308.         BX = Left channel volume (or both if mono) 0-100
  309.         CX = Right channel volume (or both if mono) 0-100
  310.  
  311.      OUTPUT: AX = 1 Volume set
  312.          AX = 0 Device doesn't support volume setting.
  313.  
  314. FUNCTION #25: SetDPMIMode : Set 32 bit register addressing mode on/off
  315.  
  316.      INPUT; AX = 6A0h
  317.         DX = mode on/off 1/0
  318.  
  319.      OUTPUT: none.
  320.  
  321.  
  322. ***********************************************************************
  323. ** DigPlay, linkable interface to the Digitized Sound Package.      *****
  324. ***********************************************************************
  325.  
  326. ***********************************************************************
  327. ** REAL MODE DIGPLAY.H linkable interface layer, all procedures are
  328. **               prototyped and use segment names such that
  329. **               they will link in any memory model.
  330. ***********************************************************************
  331.  
  332.  
  333. #ifndef LOADABLE_DRIVERS
  334. #define LOADABLE_DRIVERS 1 // Conditional compilation, set to true if
  335. #endif
  336.  
  337. /* Bit flags to denote audio driver capabilities. */
  338. /* returned by the AudioCapabilities call.                */
  339. #define PLAYBACK 1    // Bit zero true if can play audio in the background.
  340. #define MASSAGE  2    // Bit one is true if data is massaged.
  341. #define FIXEDFREQ 4   // Bit two is true if driver plays at fixed frequency.
  342. #define USESTIMER 8   // Bit three is true, if driver uses timer.
  343. #define SHARESTIMER 16 // Bit 4, timer can be shared (BETA!!!!!)
  344. #define LOOPEND 32        // bit 5, support looped samples, and pending sounds (BETA!!!)
  345. #define STEREOPAN 64    // Bit 6, supports stereo panning.
  346. #define STEREOPLAY 128 // Bit 7, supports 8 bit PCM stereo playback.
  347. #define AUDIORECORD 256 // Bit 8, supports audio recording!
  348. #define DMABACKFILL 512  // Bit 9, support DMA backfilling.
  349. #define PCM16 1024            // Bit 10, supports 16 bit digital audio.
  350. #define PCM16STEREO 2048
  351.  
  352. typedef struct
  353. {
  354.   char far *sound;     // address of audio data.
  355.   unsigned short sndlen; // Length of audio sample.
  356.   short far  *IsPlaying; // Address of play status flag.
  357.   short      frequency;  // Playback frequency.
  358. } SNDSTRUC;
  359.  
  360. extern short  far cdecl DigPlay(SNDSTRUC far *sndplay); // 688h -> Play 8 bit digitized sound.
  361. extern short  far cdecl SoundStatus(void);  // 689h -> Report sound driver status.
  362. extern void far cdecl MassageAudio(SNDSTRUC far *sndplay); // 68Ah -> Preformat 8 bit digitized sound.
  363. extern void far cdecl DigPlay2(SNDSTRUC far *sndplay); // 68Bh -> Play preformatted data.
  364. extern short  far cdecl AudioCapabilities(void); // 68Ch -> Report audio driver capabilities.
  365. extern short  far cdecl DigPakIdentityString(char far *str); // 68Ch -> reports ID string of
  366.                           // sound driver. returns string length.
  367. extern void far cdecl StopSound(void); // 68Fh -> Stop current sound from playing.
  368. extern short  far cdecl PostAudioPending(SNDSTRUC far *sndplay);
  369.  
  370. #define NOTPLAYING 0  // No sound is playing.
  371. #define PLAYINGNOTPENDING 1 // Playing a sound, but no sound is pending.
  372. #define PENDINGSOUND 2            // Playing, and a sound is pending.
  373. extern short  far cdecl AudioPendingStatus(void);
  374.  
  375. #define FULLRIGHT 0
  376. #define FULLLEFT 127
  377. #define FRONTANDCENTER 64
  378. extern short far cdecl SetStereoPan(short panvalue); // 0-127, 0 full right.
  379.  
  380. #define PCM_8_MONO 0
  381. #define PCM_8_STEREO 1
  382. #define PCM_16_MONO 2
  383. #define PCM_16_STEREO 3
  384. extern short far cdecl SetPlayMode(short playmode);
  385. // Return 0 if mode not available, 1 if mode set.
  386.  
  387. extern short far cdecl SetRecordMode(short mode); // Set audio recording mode.
  388.  
  389. extern short far * far cdecl PendingAddress(void); // Reports the far address of the pending
  390. // flag.    If this memory location pointed to by this address is 1 that means
  391. // a pending sound effect is still pending.  When this becomes zero, then your
  392. // application software can post the next piece of audio to play.  It is
  393. // preferable to use this semaphore to know when to post the next buffer
  394. // rather than to use the AudioPendingStatus call.
  395.  
  396. extern short far * cdecl ReportSemaphoreAddress(void); // Reports the far address of the DigPak
  397. // semaphore.  If this semaphore is true, then DigPak is currently active
  398. // and you shouldn't post any DigPak calls.  This is EXTREMELY important if
  399. // you are trying to invoke DigPak functions via a hardware interrupt, where
  400. // you could potentially have interrupted DigPak itself.
  401.  
  402. extern void far cdecl SetTimerDivisorRate(short rate); // Set the 8253 timer divisor rate.
  403. // If your program, has reprogrammed the 8253 timer to another rate, then
  404. // you must be sure to tell DigPak what that reprogrammed rate it.  Be
  405. // sure to set this BACK to zero when your program exits!!!
  406.  
  407. extern short far cdecl ReportVersionNumber(void); // Report the DigPak version number.
  408. // Return code is times 100, meaning that version 3.1 would be returned
  409. // as the decimal number 310.  This function wasn't supported prior to
  410. // version 3.1 release, so it will be returned as 0, for versions prior
  411. // to 3.1.
  412.  
  413. extern short far cdecl SetBackFillMode(short mode); // Turn DMA backfill mode on/off, return code
  414. // of 1 means mode was set.  Return code of 0 means driver doesn't support
  415. // DMA backfill.
  416.  
  417. extern unsigned short far cdecl ReportDMAC(void); // Report current DMA counter.
  418.  
  419. extern short far cdecl VerifyDMA(char far *data,short length); // Verify this buffer block
  420. // doesn't cross a 64k boundary.  Return code of 1 means the block is OK.
  421. // return code of 0 means the block can't be used, try another.
  422.  
  423. extern void far cdecl NullSound(char far *sound,short sndlen,short null);
  424.  
  425. /* Support routines */
  426. extern void far cdecl WaitSound(void); // Wait until sound playback completed.
  427. extern short  far cdecl CheckIn(void);     // Is sound driver available? 0 no, 1 yes.
  428.  
  429. /******************************************************************************/
  430. /* Warning, it you enable LOADABLE_DRIVERS you must prodivde memory allocation*/
  431. /* functions, and access to DOSCALLS.OBJ.                      */
  432. /******************************************************************************/
  433. extern short  far cdecl InitDP(short segment);    // initialize digpak driver.
  434. extern void far cdecl DeInitDP(short segment); // uninitialize digpak driver.
  435.  
  436.  
  437. ***********************************************************************
  438. ** FLAT MODEL DIGPLAY.H linkable interface layer, all procedures are
  439. **            prototyped and use segment names such that
  440. **            they will link in any memory model.
  441. ***********************************************************************
  442.  
  443. /* Bit flags to denote audio driver capabilities. */
  444. /* returned by the AudioCapabilities call.                */
  445. #define PLAYBACK 1    // Bit zero true if can play audio in the background.
  446. #define MASSAGE  2    // Bit one is true if data is massaged.
  447. #define FIXEDFREQ 4   // Bit two is true if driver plays at fixed frequency.
  448. #define USESTIMER 8   // Bit three is true, if driver uses timer.
  449. #define SHARESTIMER 16 // Bit 4, timer can be shared (BETA!!!!!)
  450. #define LOOPEND 32        // bit 5, support looped samples, and pending sounds (BETA!!!)
  451. #define STEREOPAN 64    // Bit 6, supports stereo panning.
  452. #define STEREOPLAY 128 // Bit 7, supports 8 bit PCM stereo playback.
  453. #define AUDIORECORD 256 // Bit 8, supports audio recording!
  454. #define DMABACKFILL 512  // Bit 9, support DMA backfilling.
  455. #define PCM16 1024            // Bit 10, supports 16 bit digital audio.
  456. #define PCM16STEREO 2048
  457.  
  458. typedef struct
  459. {
  460.   char *sound;           // address of audio data.
  461.   unsigned short sndlen; // Length of audio sample.
  462.   short *IsPlaying; // Address of play status flag.
  463.   short frequency;      // Playback frequency.
  464. } SNDSTRUC;
  465.  
  466. extern short      cdecl DigPlay(SNDSTRUC *sndplay); // 688h -> Play 8 bit digitized sound.
  467. extern short      cdecl SoundStatus(void);      // 689h -> Report sound driver status.
  468. extern void cdecl MassageAudio(SNDSTRUC *sndplay); // 68Ah -> Preformat 8 bit digitized sound.
  469. extern void cdecl DigPlay2(SNDSTRUC *sndplay); // 68Bh -> Play preformatted data.
  470. extern short      cdecl AudioCapabilities(void); // 68Ch -> Report audio driver capabilities.
  471. extern void cdecl StopSound(void); // 68Fh -> Stop current sound from playing.
  472. extern short      cdecl PostAudioPending(SNDSTRUC *sndplay);
  473.  
  474. #define NOTPLAYING 0  // No sound is playing.
  475. #define PLAYINGNOTPENDING 1 // Playing a sound, but no sound is pending.
  476. #define PENDINGSOUND 2            // Playing, and a sound is pending.
  477. extern short      cdecl AudioPendingStatus(void);
  478.  
  479. #define FULLRIGHT 0
  480. #define FULLLEFT 127
  481. #define FRONTANDCENTER 64
  482. extern short      cdecl SetStereoPan(short panvalue); // 0-127, 0 full right.
  483.                                                                 //             64 full volume both.
  484. #define PCM_8_MONO 0
  485. #define PCM_8_STEREO 1
  486. #define PCM_16_MONO 2
  487. #define PCM_16_STEREO 3
  488. extern short cdecl SetPlayMode(short playmode);
  489. // Return 0 if mode not available, 1 if mode set.
  490.  
  491. extern short cdecl SetRecordMode(short mode); // Set audio recording mode.
  492.  
  493. extern short * cdecl PendingAddress(void); // Reports the far address of the pending
  494. // flag.    If this memory location pointed to by this address is 1 that means
  495. // a pending sound effect is still pending.  When this becomes zero, then your
  496. // application software can post the next piece of audio to play.  It is
  497. // preferable to use this semaphore to know when to post the next buffer
  498. // rather than to use the AudioPendingStatus call.
  499.  
  500. extern short * cdecl ReportSemaphoreAddress(void); // Reports the far address of the DigPak
  501. // semaphore.  If this semaphore is true, then DigPak is currently active
  502. // and you shouldn't post any DigPak calls.  This is EXTREMELY important if
  503. // you are trying to invoke DigPak functions via a hardware interrupt, where
  504. // you could potentially have interrupted DigPak itself.
  505.  
  506. extern short cdecl ReportVersionNumber(void); // Report the DigPak version number.
  507. // Return code is times 100, meaning that version 3.1 would be returned
  508. // as the decimal number 310.  This function wasn't supported prior to
  509. // version 3.1 release, so it will be returned as 0, for versions prior
  510. // to 3.1.
  511.  
  512. extern short cdecl SetBackFillMode(short mode); // Turn DMA backfill mode on/off, return code
  513. // of 1 means mode was set.  Return code of 0 means driver doesn't support
  514. // DMA backfill.
  515.  
  516. extern unsigned short cdecl ReportDMAC(void); // Report current DMA counter.
  517.  
  518. extern short cdecl VerifyDMA(char *data,short length); // Verify this buffer block
  519. // doesn't cross a 64k boundary.  Return code of 1 means the block is OK.
  520. // return code of 0 means the block can't be used, try another.
  521.  
  522. extern void cdecl NullSound(char *sound,short sndlen,short null);
  523.  
  524. /* Support routines */
  525. extern void cdecl WaitSound(void); // Wait until sound playback completed.
  526. extern short      cdecl CheckIn(void);       // Is sound driver available? 0 no, 1 yes.
  527.  
  528. extern void cdecl SetDPMIMode(short mode); // Set DPMI addressing mode for DIGPAK
  529.  
  530. extern void cdecl DigPakIdentityString(char *str);
  531.  
  532. extern short      cdecl InitDP(char *digpak); // Bootstrap hardware.
  533. extern void cdecl DeInitDP(char *digpak); // Uninitialize DIGPAK
  534.  
  535.  
  536. ***************************************************************************
  537.  
  538.           Written by John W. Ratcliff (c) 1994
  539.                Compuserve: 70253,3237
  540.                Genie: J.RATCLIFF3
  541.                BBS: 1-314-939-0200
  542.                Addresss:
  543.               747 Napa Lane
  544.               St. Charles, MO 63304
  545.  
  546. A $500 per product license fee applies to all commercial software
  547. products distributed with ANY DIGPAK drivers.
  548.  
  549. To pay a license, simply write a check for $500 payable to The Audio
  550. Solution, 747 Napa Lane, St. Charles, MO 63304 with a copy of your
  551. commerical product.  You will receive a signed license agreement from
  552. The Audio Solution shortly thereafter. This license fee applies
  553. specifically to the inclusion with your distribution disk any of the
  554. DIGPAK drivers from The Audio Solution These drivers are copyrighted
  555. works, created by me, to enhance the use of sound and music in DOS based
  556. commercial software.  The license fees collected are used to maintain
  557. the drivers and keep the BBS running.  There is a seperate license fee
  558. for the use and distribution of MIDPAK drivers.
  559.  
  560. See accompaning documentation regarding license fees for MIDPAK
  561. distribution.  You would be ill-advised to distribute a commercial
  562. product containing either DIGPAK and/or MIDPAK drivers without having
  563. paid the distribution license fee.  Since your product would contain
  564. unlicensed copyrighted software from The Audio Solution, your product
  565. could be required to be immediately removed from retail distribution.  I
  566. doubt this is going to be a problem.  Clearly if your product is
  567. enhanced by the use of these drivers, your company can easily afford a
  568. nominal license fee of $500 in exchange for getting the use of several
  569. man-years of software engineering resources.
  570.