home *** CD-ROM | disk | FTP | other *** search
/ C++ Games Programming / CPPGAMES.ISO / digmid / real / pend.c < prev    next >
C/C++ Source or Header  |  1994-03-25  |  5KB  |  210 lines

  1. /*****************************************************************************/
  2. /* PEND.C -> Plays a digital sound effect using the PostAudioPending calls.  */
  3. /* Written by John W. Ratcliff, September 1992, needs to link to                         */
  4. /* DIGPLAY.OBJ, DOSCALLS.OBJ.                                                                                              */
  5. /*****************************************************************************/
  6. #include <conio.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <alloc.h>
  11.  
  12. #include "digplay.h"    // Include DIGPLAY header.
  13. #include "doscalls.h"   // Include DOS tools header.
  14. #include "video.h"      // Include header for VGA graphics tools.
  15. #include "loader.h"      // Include header for VGA graphics tools.
  16.  
  17. // Define memory allocation functions.    If using DOS memory allocation
  18. // functions, provided through DOSCALLS, then set the conditional compilation
  19. // 'DOSALLOC' to true.  If using C compiler library function memory allocation
  20. // set 'DOSALLOC' to zero.
  21.  
  22. #define DOSALLOC 0
  23. // Redirect memory allocation to either DOS memory allocate functions located
  24. // in DOSCALLS or to C library far memory allocation functions.
  25. unsigned char far * far memalloc(long int siz)
  26. {
  27.     #if DOSALLOC
  28.         return(fmalloc(siz));  // DOS far memory allocation functions
  29.     #else
  30.         return(farmalloc(siz)); // C's far memory allocation functions.
  31.     #endif
  32. }
  33.  
  34. void far memfree(char far *memory)
  35. {
  36.     #if DOSALLOC
  37.         ffree(memory);
  38.     #else
  39.         farfree(memory);
  40.     #endif
  41. }
  42.  
  43. unsigned char far * far memalloc(long int siz); // Our application provided memory allocation functions.
  44. void far memfree(char far *memory); // Application provided free memory allocate function.
  45.  
  46. int PendingStatus(void);
  47. void PostPending(SNDSTRUC far *snd);
  48.  
  49. #define SWID 320    // Width of sound data.
  50.  
  51. char save[SWID];
  52. char buffer[SWID*2];
  53. char far *currentbuffer;
  54. int AUTOINITDMA;
  55. int DMALOAD;
  56.  
  57. void main(int argc,char **argv)
  58. {
  59.     char far *effect;
  60.     char far *sound;
  61.   long int siz;
  62.     int soundsize;
  63.     int xcon=0;
  64.     SNDSTRUC snd;
  65.  
  66.     if ( argc != 2 )
  67.     {
  68.         printf("Usage: PEND <filename>\n");
  69.         exit(1);
  70.     }
  71.  
  72.  
  73.     effect = fload(argv[1], &siz);
  74.     if ( !effect )
  75.     {
  76.         printf("File '%s' not found, or too large to play.\n",argv[1]);
  77.         exit(1);
  78.     }
  79.  
  80.  
  81.     if ( !LoadDigPak("SOUNDRV.COM") )
  82.     {
  83.         printf("Failed to load sound driver.\n");
  84.         exit(1);
  85.     }
  86.  
  87.     if ( !InitDigPak() )
  88.     {
  89.         UnLoadDigPak();
  90.         printf("Failed to initialize sound driver.\n");
  91.         exit(1);
  92.     }
  93.  
  94.     AUTOINITDMA = 0; // off by default.
  95.  
  96.  
  97.     sound = effect;
  98.     currentbuffer = buffer;
  99.     snd.sndlen = SWID;
  100.     snd.frequency = 11025;
  101.     soundsize = siz;
  102.  
  103.     if ( AudioCapabilities()&DMABACKFILL )
  104.     {
  105.         if ( VerifyDMA(buffer,SWID*2) )
  106.         {
  107.             AUTOINITDMA = 1;
  108.             DMALOAD = SWID; // First load time.
  109.             NullSound(buffer,SWID*2,0x80);
  110.             farmov(buffer,sound,SWID*2);
  111.             snd.sound = buffer;
  112.             snd.sndlen = SWID*2;
  113.             snd.frequency = 11025;
  114.             SetBackFillMode(1);
  115.             sound += SWID*2;
  116.             siz -= SWID*2;
  117.             DigPlay(&snd);    // Start auto-init dma backfill...
  118.         }
  119.         else
  120.         {
  121.             printf("DMA buffer crosses segment boundary\n");
  122.             exit(1);
  123.         }
  124.     }
  125.  
  126.     VidOn();
  127.  
  128.     do
  129.     {
  130.         if (PendingStatus() != PENDINGSOUND)
  131.         {
  132.             farmov(currentbuffer,sound,SWID); // Move into buffer area the audio data.
  133.             snd.sound = currentbuffer; // Set address of play sound location.
  134.             MassageAudio(&snd);
  135.             PostPending(&snd);
  136.  
  137.             DrawSound(save,320,0); // Erase previous.
  138.             DrawSound(currentbuffer,320,15); // draw the new one.
  139.             farmov(save,currentbuffer,320);
  140.  
  141.             if ( currentbuffer == buffer ) // Perform flip-flop
  142.                 currentbuffer = buffer+SWID;
  143.             else
  144.                 currentbuffer = buffer;
  145.             sound+=SWID;    // Advance source sound effect address.
  146.             siz-=SWID;    // Decrement size left to processs.
  147.             if (siz < SWID)
  148.                 xcon = 1;
  149.         }
  150.         if (keystat())
  151.             xcon = 1;
  152.     } while (!xcon);
  153.  
  154.     if (AUTOINITDMA)
  155.     {
  156.         SetBackFillMode(0);  // Turn DMA back fill mode off!
  157.         StopSound();
  158.     }
  159.  
  160.     VidOff();
  161.  
  162.     if ( AUTOINITDMA )
  163.         printf("The current driver played this effect IN DMABACKFILL mode.\n");
  164.     else
  165.         printf("Current sound driver NOT in DMABACKFILL mode.\n");
  166.     printf("Now playing sound effect one more time, NOT in DMA mode.\n");
  167.     snd.sndlen = soundsize;
  168.     snd.sound = effect;
  169.     DigPlay(&snd); // Replay sound effect.
  170.  
  171.     WaitSound();
  172.     UnLoadDigPak();
  173.  
  174. }
  175.  
  176.  
  177. void PostPending(SNDSTRUC far *snd)
  178. {
  179.     if ( AUTOINITDMA==0 ) PostAudioPending(snd);
  180. }
  181.  
  182. int PendingStatus(void)
  183. {
  184.     int pend;
  185.     int count;
  186.  
  187.     if (AUTOINITDMA)
  188.     {
  189.         pend = PENDINGSOUND;
  190.         count = ReportDMAC();
  191.         if ( DMALOAD && count < DMALOAD)
  192.         {
  193.             pend = PLAYINGNOTPENDING;
  194.             DMALOAD = 0;
  195.         }
  196.         else
  197.         {
  198.             if (!DMALOAD && count >= SWID )
  199.             {
  200.                 pend = PLAYINGNOTPENDING;
  201.                 DMALOAD = SWID;
  202.             }
  203.         }
  204.     }
  205.     else
  206.         pend = AudioPendingStatus();
  207.  
  208.     return(pend);
  209. }
  210.