home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 September (IDG) / Sep99.iso / Shareware World / Info / For Developers / PlayerPRO 5.2 Dev.Kit Mac / MADH Library 5.2 / MADLibrary Source / Win-WaveDriver.c < prev   
Encoding:
Text File  |  1998-12-27  |  6.3 KB  |  285 lines  |  [TEXT/CWIE]

  1. /********************                        ***********************/
  2. //
  3. //    Player PRO 5.0 - DRIVER SOURCE CODE -
  4. //
  5. //    Library Version 5.0
  6. //
  7. //    To use with MAD Library for Mac: Symantec, CodeWarrior and MPW
  8. //
  9. //    Antoine ROSSET
  10. //    16 Tranchees
  11. //    1206 GENEVA
  12. //    SWITZERLAND
  13. //
  14. //    COPYRIGHT ANTOINE ROSSET 1996, 1997, 1998
  15. //
  16. //    Thank you for your interest in PlayerPRO !
  17. //
  18. //    FAX:                (+41 22) 346 11 97
  19. //    PHONE:             (+41 79) 203 74 62
  20. //    Internet:     RossetAntoine@bluewin.ch
  21. //
  22. /********************                        ***********************/
  23.  
  24. #include <stdio.h>
  25.  
  26. #include <windows.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <math.h>
  30. //#include "mmreg.h"
  31. #include "mmsystem.h"
  32.  
  33. #include "RDriver.h"
  34. #include "RDriverInt.h"
  35.  
  36. ////////////
  37.  
  38. #define MICROBUF        10L
  39.  
  40.  
  41. static    char*            myerr;
  42. //static     MADDriverRec    *WinMADDriver;
  43.  
  44. ////////////
  45.  
  46. static WAVEOUTCAPS     woc;
  47. static HWAVEOUT         hWaveOut;
  48. static LPVOID             mydata;
  49. static HGLOBAL             hglobal;
  50. static WAVEHDR             WaveOutHdr;
  51. static UINT                 gwID;
  52. static char                 *mydma;
  53. static Boolean             OnOff;
  54. static long                 WIN95BUFFERSIZE;
  55. static long                    MICROBUFState;
  56.  
  57.  
  58. void W95_PlayStop( MADDriverRec*);
  59.  
  60. BOOL W95_IsThere(void)
  61. {
  62.     UINT numdevs = waveOutGetNumDevs();
  63.     
  64.     return numdevs>0;
  65. }
  66.  
  67. void W95_Exit( MADDriverRec *WinMADDriver)
  68. {
  69.     W95_PlayStop( WinMADDriver);
  70.  
  71.     while(waveOutClose(hWaveOut)==WAVERR_STILLPLAYING) Sleep(20);
  72.     GlobalUnlock(hglobal);
  73.     GlobalFree(hglobal);
  74. }
  75.  
  76. ULONG GetPos(void)
  77. {
  78.     MMTIME mmt;
  79.     mmt.wType = TIME_BYTES;
  80.     
  81.     waveOutGetPosition( hWaveOut, &mmt,sizeof(MMTIME));
  82.     
  83.     return( mmt.u.cb & 0xfffffff0);        // A cause du 16 bits??
  84. }
  85.  
  86. //static Ptr         currentBuf, currentBuf2;
  87. //static long        currentBufPos, currentBufSize;
  88. //static Boolean    currentBuf2Ready;
  89.  
  90. /*void CALLBACK TimeProc(
  91.      UINT  IDEvent,                    // identifies timer event 
  92.      UINT  uReserved,                // not used 
  93.      DWORD  dwUser,                    // application-defined instance data 
  94.      DWORD  dwReserved1,        // not used 
  95.      DWORD  dwReserved2            // not used 
  96. )
  97. {
  98.     long todo, pos, i;
  99.     static volatile int timersema=0;
  100.     
  101.     if(++timersema==1)
  102.     {
  103.         pos = GetPos() % WIN95BUFFERSIZE;
  104.         
  105.         if(pos > WIN95BUFFERSIZE/2 && OnOff == true)
  106.         {
  107.             OnOff = false;
  108.             
  109.             if( !DirectSave( mydma, &WinMADDriver->DriverSettings, WinMADDriver))
  110.             {
  111.                 for( i = 0; i < WIN95BUFFERSIZE/2; i++) mydma[ i] = 0;
  112.             }
  113.         }
  114.         else if( OnOff == false && (pos < WIN95BUFFERSIZE/2))
  115.         {
  116.             OnOff = true;
  117.             
  118.             if( !DirectSave( mydma + WIN95BUFFERSIZE/2, &WinMADDriver->DriverSettings, WinMADDriver))
  119.             {
  120.                 for( i = 0; i < WIN95BUFFERSIZE/2; i++) mydma[ i] = 0;
  121.             }
  122.         }
  123.     }
  124.     timersema--;
  125. }*/
  126.  
  127. void CALLBACK TimeProc(
  128.      UINT  IDEvent,
  129.      UINT  uReserved,
  130.      DWORD  dwUser,
  131.      DWORD  dwReserved1,
  132.      DWORD  dwReserved2
  133. )
  134. {
  135.     char    *dmaDst;
  136.     long    todo, pos, i;
  137.     static volatile int timersema=0;
  138.  
  139.     /* use semaphore to prevent entering
  140.         the mixing routines twice.. do we need this ? */
  141.  
  142.     if(++timersema==1)
  143.     {
  144.         MADDriverRec    *WinMADDriver = (MADDriverRec*) dwUser;
  145.         
  146.         pos = GetPos() % WIN95BUFFERSIZE;
  147.         
  148.         if(pos > WIN95BUFFERSIZE/2L && OnOff == true)
  149.         {
  150.             if( MICROBUFState < MICROBUF)
  151.             {
  152.                 dmaDst = mydma + MICROBUFState*WinMADDriver->BufSize;
  153.                 
  154.                 if( !DirectSave( dmaDst, &WinMADDriver->DriverSettings, WinMADDriver))
  155.                 {
  156.                     for( i = 0; i < WinMADDriver->BufSize; i++) dmaDst[ i] = 0;
  157.                 }
  158.                 
  159.                 MICROBUFState++;
  160.             }
  161.             else
  162.             {
  163.                 OnOff = false;
  164.                 MICROBUFState = 0;
  165.             }
  166.         }
  167.         else if( OnOff == false && (pos < WIN95BUFFERSIZE/2L))
  168.         {
  169.             if( MICROBUFState < MICROBUF)
  170.             {
  171.                 dmaDst = mydma + WIN95BUFFERSIZE/2L + MICROBUFState*WinMADDriver->BufSize;
  172.                 
  173.                 if( !DirectSave( dmaDst, &WinMADDriver->DriverSettings, WinMADDriver))
  174.                 {
  175.                     for( i = 0; i < WinMADDriver->BufSize; i++) dmaDst[ i] = 0;
  176.                 }
  177.                 
  178.                 MICROBUFState++;
  179.             }
  180.             else
  181.             {
  182.                 OnOff = true;
  183.                 MICROBUFState = 0;
  184.             }
  185.         }
  186.     }
  187.     timersema--;
  188. }
  189.  
  190. void W95_PlayStart( MADDriverRec *WinMADDriver)
  191. {
  192.     waveOutSetVolume(0,0xffffffff);
  193.     
  194.     WaveOutHdr.lpData= (char*) mydata;
  195.     WaveOutHdr.dwBufferLength=WIN95BUFFERSIZE;
  196.     WaveOutHdr.dwFlags=WHDR_BEGINLOOP|WHDR_ENDLOOP;
  197.     WaveOutHdr.dwLoops=0xffffffff;
  198.     WaveOutHdr.dwUser=0;
  199.     waveOutPrepareHeader(hWaveOut,&WaveOutHdr,sizeof(WAVEHDR));
  200.     waveOutWrite(hWaveOut,&WaveOutHdr,sizeof(WAVEHDR));
  201.     mydma= (char*) mydata;
  202.     
  203.     MICROBUFState = 0;
  204.     
  205.     timeBeginPeriod( 20);      /* set the minimum resolution */
  206.     
  207.     gwID = timeSetEvent(      40,                                               /* how often                 */
  208.                               40,                                                                   /* timer resolution          */
  209.                               TimeProc,                                                          /* callback function         */
  210.                              (unsigned long)  WinMADDriver,                /* info to pass to callback  */
  211.                               TIME_PERIODIC);                                             /* oneshot or periodic?      */
  212.                               
  213.                               
  214.     //////
  215. }
  216.  
  217. void W95_PlayStop( MADDriverRec *WinMADDriver)
  218. {
  219.     WinMADDriver->Reading = false;
  220.     MADStopDriver( WinMADDriver);
  221.     
  222.     
  223.     /* stop the timer */
  224.     timeKillEvent(gwID);
  225.     timeEndPeriod(20);
  226.     /* stop playing the wave */
  227.     waveOutReset(hWaveOut);
  228.     waveOutUnprepareHeader(hWaveOut,&WaveOutHdr,sizeof(WAVEHDR));
  229. //    VC_PlayStop();
  230. }
  231.  
  232.     #define DMODE_STEREO    1
  233.     #define DMODE_16BITS    2
  234.     #define DMODE_INTERP    4
  235.  
  236.  
  237. Boolean W95_Init( MADDriverRec *WinMADDriver)
  238. {
  239.     MMRESULT err;
  240.     PCMWAVEFORMAT wf;
  241.     long    i;
  242.     
  243.     WIN95BUFFERSIZE = WinMADDriver->BufSize;
  244.     WIN95BUFFERSIZE *= 2L;                                // double buffer system
  245.     WIN95BUFFERSIZE *= MICROBUF;                    // multi internal buffer system
  246.     
  247.     MICROBUFState = 0;
  248.     
  249.     if( WIN95BUFFERSIZE < 0) return false;
  250.     
  251.     hglobal= GlobalAlloc( GMEM_FIXED, WIN95BUFFERSIZE);    //GMEM_MOVEABLE | GMEM_SHARE
  252.     if( hglobal == NULL) return false;
  253.     
  254.     mydata = GlobalLock(hglobal);
  255.     
  256.     /* get audio device name and put it into the driver structure: */
  257.     waveOutGetDevCaps( 0, &woc, sizeof(WAVEOUTCAPS));
  258.     
  259.     wf.wf.wFormatTag        =WAVE_FORMAT_PCM;
  260.     wf.wf.nChannels = 2;
  261.     wf.wf.nSamplesPerSec    = WinMADDriver->DriverSettings.outPutRate >> 16L;
  262.     wf.wBitsPerSample        = WinMADDriver->DriverSettings.outPutBits;
  263.     wf.wf.nBlockAlign        = wf.wf.nChannels * (wf.wBitsPerSample/8);
  264.     wf.wf.nAvgBytesPerSec    = wf.wf.nSamplesPerSec * wf.wf.nBlockAlign;
  265.     
  266.     err=waveOutOpen( &hWaveOut, 0, (LPCWAVEFORMATEX)&wf, (unsigned long) 0, (unsigned long) NULL,0L);
  267.     
  268.     if(err)
  269.     {
  270.         if(err==WAVERR_BADFORMAT)
  271.             myerr="This output format is not supported (Try another sampling rate?)";
  272.         else if(err==MMSYSERR_ALLOCATED)
  273.             myerr="Audio device already in use";
  274.         else
  275.             myerr="Can't open audio device";
  276.         GlobalUnlock(hglobal);
  277.         GlobalFree(hglobal);
  278.         return false;
  279.     }
  280.     
  281.     W95_PlayStart( WinMADDriver);
  282.     
  283.     return true;
  284. }
  285.