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 / OutPut8.c < prev    next >
Encoding:
Text File  |  1999-04-29  |  7.4 KB  |  280 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 "RDriver.h"
  25. #include "RDriverInt.h"
  26.  
  27. void Sampler8in8AddPolyStereo( Channel *curVoice, register Ptr    ASCBuffer, short chanNo, MADDriverRec *intDriver)
  28. {
  29.     char             *SndBuffer;
  30.     long             i = intDriver->ASCBUFFER, volChn;
  31.     short            temp;
  32.     Boolean            killSample = false;
  33.     
  34.     ///
  35.     long                aDD, aCC = curVoice->lAC, off;
  36.     
  37.     #if defined(powerc) || defined (__powerc)
  38.     {
  39.     long double        temp = ((long double)AMIGA_CLOCKFREQ2) / (long double) (curVoice->period * (intDriver->DriverSettings.outPutRate>>16) * intDriver->DriverSettings.oversampling);
  40.     aDD = temp * ( 1 << BYTEDIV);
  41.     }
  42.     #else
  43.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / (curVoice->period * (intDriver->DriverSettings.outPutRate>>16) * intDriver->DriverSettings.oversampling);
  44.     #endif
  45.     
  46.     ///
  47.     
  48.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  49.     
  50.     SndBuffer        = (char*)     curVoice->curPtr;
  51.     volChn            = DoVolPanning256( 3, curVoice, intDriver);
  52.     
  53.     while( i-- > 0)
  54.     {
  55.         off = 2*(aCC>>BYTEDIV);
  56.         if( (Ptr) SndBuffer + off >= curVoice->maxPtr)
  57.         {
  58.             if( curVoice->loopSize > 0) 
  59.             {
  60.                 SndBuffer -= curVoice->loopSize;
  61.                 if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  62.             }
  63.             else
  64.             {
  65.                 killSample = true;
  66.                 break;
  67.             }
  68.         }
  69.         temp = (volChn * *(SndBuffer + off)) >> 8;
  70.         off++;
  71.         temp += (volChn * *(SndBuffer + off)) >> 8;
  72.         temp /= 2;
  73.         
  74.         *ASCBuffer    += temp;             aCC += aDD;
  75.         ASCBuffer    += chanNo;
  76.     }
  77.     
  78.     if( !killSample) curVoice->curPtr = (Ptr) (SndBuffer + (long) 2*(aCC>>BYTEDIV));
  79.     else
  80.     {
  81.         curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  82.     }
  83.     
  84.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  85. }
  86.  
  87.  
  88. void Sampler8in8AddPoly( Channel *curVoice, register Ptr    ASCBuffer, short chanNo, MADDriverRec *intDriver)
  89. {
  90.     char             *SndBuffer;
  91.     long             i = intDriver->ASCBUFFER, volChn;
  92.     Boolean            killSample = false;
  93.     ///
  94.     long                aDD, aCC = curVoice->lAC, off;
  95.     
  96.     #if defined(powerc) || defined (__powerc)
  97.     {
  98.     long double        temp = ((long double)AMIGA_CLOCKFREQ2) / (long double) (curVoice->period * (intDriver->DriverSettings.outPutRate>>16) * intDriver->DriverSettings.oversampling);
  99.     aDD = temp * ( 1 << BYTEDIV);
  100.     }
  101.     #else
  102.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / (curVoice->period * (intDriver->DriverSettings.outPutRate>>16) * intDriver->DriverSettings.oversampling);
  103.     #endif
  104.     ///
  105.     
  106.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  107.     
  108.     SndBuffer        = (char*)     curVoice->curPtr;
  109.     volChn            = DoVolPanning256( 3, curVoice, intDriver);
  110.     
  111.         while( i-- > 0)
  112.         {
  113.             off = (aCC>>BYTEDIV);
  114.             if( (Ptr) SndBuffer + off >= curVoice->maxPtr)
  115.             {
  116.                 if( curVoice->loopSize > 0) 
  117.                 {
  118.                     SndBuffer -= curVoice->loopSize;
  119.                     if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  120.                 }
  121.                 else
  122.                 {
  123.                     killSample = true;
  124.                     break;
  125.                 }
  126.             }
  127.             *ASCBuffer    += (volChn * *(SndBuffer + off)) >> 8;             aCC += aDD;
  128.             ASCBuffer    += chanNo;
  129.         }
  130.         
  131.         if( !killSample) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  132.         else
  133.         {
  134.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  135.         }
  136.  
  137.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  138. }
  139.  
  140. void Sampler16in8AddPolyStereo( Channel *curVoice, register Ptr    ASCBuffer, short chanNo, MADDriverRec *intDriver)
  141. {
  142.     char             *SndBuffer;
  143.     long             i = intDriver->ASCBUFFER, volChn;
  144.     short            temp;
  145.     Boolean            killSample = false;
  146.     
  147.     ///
  148.     long                aDD, aCC = curVoice->lAC, off;
  149.     
  150.     #if defined(powerc) || defined (__powerc)
  151.     {
  152.     long double        temp = ((long double)AMIGA_CLOCKFREQ2) / (long double) (curVoice->period * (intDriver->DriverSettings.outPutRate>>16) * intDriver->DriverSettings.oversampling);
  153.     aDD = temp * ( 1 << BYTEDIV);
  154.     }
  155.     #else
  156.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / (curVoice->period * (intDriver->DriverSettings.outPutRate>>16) * intDriver->DriverSettings.oversampling);
  157.     #endif
  158.     
  159.     ///
  160.     
  161.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  162.     
  163.     SndBuffer        = (char*)     curVoice->curPtr;
  164.     volChn            = DoVolPanning256( 3, curVoice, intDriver);
  165.     
  166.     while( i-- > 0)
  167.     {
  168.         off = 4*(aCC>>BYTEDIV);
  169.         if( (Ptr) SndBuffer + off >= curVoice->maxPtr)
  170.         {
  171.             if( curVoice->loopSize > 0) 
  172.             {
  173.                 SndBuffer -= curVoice->loopSize;
  174.                 if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  175.             }
  176.             else
  177.             {
  178.                 killSample = true;
  179.                 break;
  180.             }
  181.         }
  182.         temp = (volChn * *(SndBuffer + off)) >> 8;
  183.         off+=2;
  184.         temp += (volChn * *(SndBuffer + off)) >> 8;
  185.         temp /= 2;
  186.         
  187.         *ASCBuffer    += temp;             aCC += aDD;
  188.         ASCBuffer    += chanNo;
  189.     }
  190.     
  191.     if( !killSample) curVoice->curPtr = (Ptr) (SndBuffer + (long) 4*(aCC>>BYTEDIV));
  192.     else
  193.     {
  194.         curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  195.     }
  196.     
  197.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  198. }
  199.  
  200.  
  201. void Sampler16in8AddPoly( Channel *curVoice, register Ptr    ASCBuffer, short chanNo, MADDriverRec *intDriver)
  202. {
  203.     char             *SndBuffer;
  204.     long             i = intDriver->ASCBUFFER, volChn;
  205.     Boolean            killSample = false;
  206.     ///
  207.     long                aDD, aCC = curVoice->lAC, off;
  208.     
  209.     #if defined(powerc) || defined (__powerc)
  210.     {
  211.     long double        temp = ((long double)AMIGA_CLOCKFREQ2) / (long double) (curVoice->period * (intDriver->DriverSettings.outPutRate>>16) * intDriver->DriverSettings.oversampling);
  212.     aDD = temp * ( 1 << BYTEDIV);
  213.     }
  214.     #else
  215.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / (curVoice->period * (intDriver->DriverSettings.outPutRate>>16) * intDriver->DriverSettings.oversampling);
  216.     #endif
  217.     ///
  218.     
  219.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  220.     
  221.     SndBuffer        = (char*)     curVoice->curPtr;
  222.     volChn            = DoVolPanning256( 3, curVoice, intDriver);
  223.     
  224.         while( i-- > 0)
  225.         {
  226.             off = 2*(aCC>>BYTEDIV);
  227.             if( (Ptr) SndBuffer + off >= curVoice->maxPtr)
  228.             {
  229.                 if( curVoice->loopSize > 0) 
  230.                 {
  231.                     SndBuffer -= curVoice->loopSize;
  232.                     if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  233.                 }
  234.                 else
  235.                 {
  236.                     killSample = true;
  237.                     break;
  238.                 }
  239.             }
  240.             *ASCBuffer    += (volChn * *(SndBuffer + off)) >> 8;             aCC += aDD;
  241.             ASCBuffer    += chanNo;
  242.         }
  243.         
  244.         if( !killSample) curVoice->curPtr = (Ptr) (SndBuffer + (long) 2*(aCC>>BYTEDIV));
  245.         else
  246.         {
  247.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  248.         }
  249.  
  250.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  251. }
  252.  
  253. void Sample8BufferAddPoly( Channel *curVoice, register Ptr ASCBuffer, short chanNo, MADDriverRec *intDriver)
  254. {
  255.     if( curVoice->stereo)
  256.     {
  257.         if( curVoice->amp == 8) Sampler8in8AddPolyStereo( curVoice, ASCBuffer, chanNo, intDriver);
  258.         else Sampler16in8AddPolyStereo( curVoice, ASCBuffer, chanNo, intDriver);
  259.     }
  260.     else
  261.     {
  262.         if( curVoice->amp == 8) Sampler8in8AddPoly( curVoice, ASCBuffer, chanNo, intDriver);
  263.         else Sampler16in8AddPoly( curVoice, ASCBuffer, chanNo, intDriver);
  264.     }
  265. }
  266.  
  267. void Play8PolyPhonic( MADDriverRec *intDriver)
  268. {
  269. long    i, x;
  270. Byte    *alpha = (Byte*) intDriver->IntDataPtr;
  271.  
  272.     x = intDriver->ASCBUFFER * intDriver->DriverSettings.numChn;
  273.     while( x-- > 0) *alpha++ = 0x80;
  274.     
  275.     for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
  276.     {
  277.         Sample8BufferAddPoly( &intDriver->chan[ i], intDriver->IntDataPtr + i, intDriver->DriverSettings.numChn, intDriver);
  278.     }
  279. }
  280.