Changeset 3073 for trunk/src


Ignore:
Timestamp:
Mar 10, 2000, 4:19:48 PM (25 years ago)
Author:
mike
Message:

Changed buffer size calculation

Location:
trunk/src/dsound/new
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/dsound/new/Dart.h

    r3027 r3073  
    3030#endif
    3131
    32 #define BUFFER_SIZE 16384
    33 #define NUM_DART_BUFFS 16
     32#define BUFFER_SIZE 32768
     33
     34extern  ULONG ulNumDartBuffs;
    3435
    3536long Dart_Open_Device(USHORT *pusDeviceID, void **vpMixBuffer, void **vpMixSetup,
     
    4445long Dart_Play(USHORT usDeviceID, void *vpMixSetup, void *vpMixBuffer, long playing);
    4546long Dart_SetFormat(USHORT *pusDeviceID, void *vpMixSetup, void *vpBufferParms,
    46                     void *vpMixBuffer, LONG lBPS, LONG lSPS, LONG lChannels );
     47                    void **vpMixBuffer, LONG lBPS, LONG lSPS, LONG lChannels );
    4748
  • trunk/src/dsound/new/OS2PrimBuff.cpp

    r3044 r3073  
    466466   dprintf(("DSOUND-PrimBuff: BPS = %d, Rate = %d, Ch = %d", me->bps, me->rate, me->channels));
    467467
    468    Dart_SetFormat(&me->usDeviceID, me->vpMixSetup, me->vpBuffParms, me->vpMixBuffer, me->bps, me->rate, me->channels);
     468   Dart_SetFormat(&me->usDeviceID, me->vpMixSetup, me->vpBuffParms, &me->vpMixBuffer, me->bps, me->rate, me->channels);
    469469
    470470   return DS_OK;
  • trunk/src/dsound/new/dart.cpp

    r3044 r3073  
    2222
    2323static MCI_MIXSETUP_PARMS *MixSetup_Global;
    24 static MCI_MIX_BUFFER     *pMixBuffs;
    2524static long               lLastBuff;
    2625static char               *pDSoundBuff;
     
    2827
    2928USHORT               usDeviceID;                 /* Amp Mixer device id          */
    30 MCI_MIX_BUFFER       MixBuffers[NUM_DART_BUFFS]; /* Device buffers               */
     29
     30/* TODO: scrap this variable! */
     31MCI_MIX_BUFFER       *pMixBuffers;               /* Device buffers               */
     32
    3133MCI_MIXSETUP_PARMS   MixSetupParms;              /* Mixer parameters             */
    3234MCI_BUFFER_PARMS     BufferParms;                /* Device buffer parms          */
    33 
     35ULONG                ulNumDartBuffs;             /* # of DART buffers            */
    3436
    3537#define ULONG_LOWD(ul)  (*(USHORT *)((ULONG *)(&ul)))     /* Low  Word */
     
    3739//******************************************************************************
    3840//******************************************************************************
    39 LONG APIENTRY OS2_Dart_Update(ULONG ulStatus,PMCI_MIX_BUFFER pBuffer,ULONG ulFlags)
    40 {
    41    //MCI_STATUS_PARMS Status;
     41LONG APIENTRY OS2_Dart_Update(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer, ULONG ulFlags)
     42{
    4243   ULONG           rc;
    4344
     
    4748   {
    4849      lLastBuff++;
    49       if (lLastBuff == NUM_DART_BUFFS)
     50      if (lLastBuff == ulNumDartBuffs)
    5051         lLastBuff = 0;
    5152
    5253      /* Now mix sound from all playing secondary SoundBuffers into the primary buffer */
    53       MixCallback(BUFFER_SIZE/NUM_DART_BUFFS);
     54      MixCallback(BUFFER_SIZE/ulNumDartBuffs);
    5455
    5556      /* Fill The next buff from the DSound Buffer */
    56       memcpy( pMixBuffs[lLastBuff].pBuffer, &pDSoundBuff[lLastBuff*(BUFFER_SIZE/NUM_DART_BUFFS)], BUFFER_SIZE/NUM_DART_BUFFS );
     57      memcpy( pMixBuffers[lLastBuff].pBuffer, &pDSoundBuff[lLastBuff*(BUFFER_SIZE/ulNumDartBuffs)], BUFFER_SIZE/ulNumDartBuffs );
    5758
    5859      /* Send the NEXT Buffer to Dart for playing! */
    59       rc = MixSetup_Global->pmixWrite(MixSetup_Global->ulMixHandle, &pMixBuffs[lLastBuff], 1 );
     60      rc = MixSetup_Global->pmixWrite(MixSetup_Global->ulMixHandle, &pMixBuffers[lLastBuff], 1 );
    6061      //dprintf(("DSOUND-DART: Playing Next Buffer %d", rc));
    6162   }
     
    7071
    7172   MCI_AMP_OPEN_PARMS  AmpOpenParms;
    72    //MCI_WAVE_SET_PARMS WaveSetParms;
    7373   ULONG   rc, ulNew;
    7474   LONG    lAdd = 5;
     
    7777   dprintf(("DSOUND-DART: Dart_Open_Device"));
    7878
     79   /* TODO: remove eventually... */
    7980   DosSetRelMaxFH(&lAdd, &ulNew);
    8081
    81    *vpMixBuffer    = &MixBuffers;
     82   ulNumDartBuffs = BUFFER_SIZE * 44100 / (2 * 2 * 2048 * 22050);
     83
     84   pMixBuffers = (MCI_MIX_BUFFER*)malloc(sizeof(MCI_MIX_BUFFER) * ulNumDartBuffs);
     85
     86   *vpMixBuffer    = pMixBuffers;
    8287   *vpMixSetup     = &MixSetupParms;
    8388   *vpBuffParms    = &BufferParms;
    8489
    85    pMixBuffs = &MixBuffers[0];
    8690   lLastBuff = 0;
    8791
     
    134138   // my little brain could come up with!!
    135139
    136    MixSetupParms.ulBufferSize = BUFFER_SIZE/NUM_DART_BUFFS;
    137 
    138 //   BufferParms->ulStructLength = sizeof(MCI_BUFFER_PARMS);
    139    BufferParms.ulNumBuffers   = NUM_DART_BUFFS;
     140   MixSetupParms.ulBufferSize = BUFFER_SIZE / ulNumDartBuffs;
     141
     142   BufferParms.ulNumBuffers   = ulNumDartBuffs;
    140143   BufferParms.ulBufferSize   = MixSetupParms.ulBufferSize;
    141    BufferParms.pBufList       = MixBuffers;
     144   BufferParms.pBufList       = pMixBuffers;
    142145
    143146   rc = mciSendCommand(usDeviceID, MCI_BUFFER, MCI_WAIT | MCI_ALLOCATE_MEMORY,
     
    155158   // the buffer to 0 is a click on Dart_Play and a Clink when real sound is written
    156159   // to the buffer!
    157    for (device = 0; device < NUM_DART_BUFFS; device++) {
    158       memset(MixBuffers[device].pBuffer, 0, BUFFER_SIZE/NUM_DART_BUFFS);
     160   for (device = 0; device < ulNumDartBuffs; device++) {
     161      memset(pMixBuffers[device].pBuffer, 0, BUFFER_SIZE/ulNumDartBuffs);
    159162   }
    160163
     
    205208   dprintf(("DSOUND-DART: Dart_GetPosition"));
    206209
    207    *pulPosition = (lLastBuff * (BUFFER_SIZE/NUM_DART_BUFFS)) + (BUFFER_SIZE/NUM_DART_BUFFS);
     210   *pulPosition = (lLastBuff * (BUFFER_SIZE/ulNumDartBuffs)) + (BUFFER_SIZE/ulNumDartBuffs);
    208211   if (*pulPosition > BUFFER_SIZE)
    209212      *pulPosition = 0;
     
    214217}
    215218
    216 long Dart_SetFormat(USHORT *pusDeviceID, void *vpMixSetup, void *vpBufferParms, void *vpMixBuffer, LONG lBPS, LONG lSPS, LONG lChannels )
     219long Dart_SetFormat(USHORT *pusDeviceID, void *vpMixSetup, void *vpBufferParms, void **vpMixBuffer, LONG lBPS, LONG lSPS, LONG lChannels )
    217220{
    218221   ULONG   rc;
    219222   MCI_MIXSETUP_PARMS  *MixSetup;
    220223   MCI_BUFFER_PARMS    *BufferParms;
    221    MCI_MIX_BUFFER      *MixBuffer;
    222224   MCI_AMP_OPEN_PARMS  AmpOpenParms;
    223225   short               device = 0;
    224226
    225    MixSetup    = (MCI_MIXSETUP_PARMS*)vpMixSetup;
    226    BufferParms = (MCI_BUFFER_PARMS*)vpBufferParms;
    227    MixBuffer   = (MCI_MIX_BUFFER*)vpMixBuffer;
     227   /* Recalculate the number of DART buffers based on the new data rate      */
     228   /* Note: the factor 2048 means a 2K buffer, 1024 = 4K, 512 = 8K and so on */
     229   ulNumDartBuffs = BUFFER_SIZE * 44100 / ((lBPS / 8) * lChannels * 2048 * lSPS);
     230
     231   /* Reallocate the MCI_MIX_BUFFER array */
     232   free(pMixBuffers);
     233   pMixBuffers = (MCI_MIX_BUFFER*)malloc(sizeof(MCI_MIX_BUFFER) * ulNumDartBuffs);
     234
     235   MixSetup     = (MCI_MIXSETUP_PARMS*)vpMixSetup;
     236   BufferParms  = (MCI_BUFFER_PARMS*)vpBufferParms;
     237   *vpMixBuffer = pMixBuffers;
     238
    228239
    229240   dprintf(("DSOUND-DART: Dart_SetFormat"));
     
    280291
    281292   memset(BufferParms, 0, sizeof(MCI_BUFFER_PARMS));
    282    memset(MixBuffer,   0, sizeof(MCI_MIX_BUFFER) * NUM_DART_BUFFS);
     293   memset(pMixBuffers, 0, sizeof(MCI_MIX_BUFFER) * ulNumDartBuffs);
    283294   BufferParms->ulStructLength = sizeof(MCI_BUFFER_PARMS);
    284    BufferParms->ulNumBuffers   = NUM_DART_BUFFS;
    285    BufferParms->ulBufferSize   = BUFFER_SIZE/NUM_DART_BUFFS;
    286    BufferParms->pBufList       = MixBuffer;
    287    MixBuffer->pBuffer          = NULL;
     295   BufferParms->ulNumBuffers   = ulNumDartBuffs;
     296   BufferParms->ulBufferSize   = BUFFER_SIZE/ulNumDartBuffs;
     297   BufferParms->pBufList       = pMixBuffers;
     298   pMixBuffers->pBuffer        = NULL;
    288299
    289300   rc = mciSendCommand(*pusDeviceID, MCI_BUFFER, MCI_WAIT | MCI_ALLOCATE_MEMORY,
     
    292303      dprintf(("DSOUND-DART: MCI_BUFFER_ALLOCATE_MEMORY (SetFormat) %d", rc));
    293304      mciSendCommand(*pusDeviceID, MCI_CLOSE, MCI_WAIT, NULL, 0);
    294       memset(MixBuffer, 0, sizeof(MCI_MIX_BUFFER) * NUM_DART_BUFFS);
     305      memset(pMixBuffers, 0, sizeof(MCI_MIX_BUFFER) * ulNumDartBuffs);
    295306      return DSERR_OUTOFMEMORY;
    296307   }
     
    302313   // the buffer to 0 is a click on Dart_Play and a Clink when real sound is written
    303314   // to the buffer!
    304    for (int i=0; i<NUM_DART_BUFFS; i++) {
    305       memset(MixBuffer[i].pBuffer, 0, BUFFER_SIZE/NUM_DART_BUFFS);
     315   for (int i=0; i<ulNumDartBuffs; i++) {
     316      memset(pMixBuffers[i].pBuffer, 0, BUFFER_SIZE/ulNumDartBuffs);
    306317   }
    307318
     
    311322
    312323      /* Mix the first buffer before playing */
    313       MixCallback(BUFFER_SIZE/NUM_DART_BUFFS);
    314       memcpy(pMixBuffs[lLastBuff].pBuffer, &pDSoundBuff[lLastBuff*(BUFFER_SIZE/NUM_DART_BUFFS)], BUFFER_SIZE/NUM_DART_BUFFS);
     324      MixCallback(BUFFER_SIZE/ulNumDartBuffs);
     325      memcpy(pMixBuffers[lLastBuff].pBuffer, &pDSoundBuff[lLastBuff*(BUFFER_SIZE/ulNumDartBuffs)], BUFFER_SIZE/ulNumDartBuffs);
    315326
    316327      USHORT  sel = RestoreOS2FS();
    317328      /* Note: the call to pmixWrite trashes the FS selector, we have to save */
    318329      /* and then restore FS!!! Otherwise exception handling will be broken.  */
    319       MixSetupParms.pmixWrite(MixSetupParms.ulMixHandle, MixBuffers, 2);
     330      MixSetupParms.pmixWrite(MixSetupParms.ulMixHandle, pMixBuffers, 2);
    320331      SetFS(sel);
    321332      fIsPlaying = TRUE;
     
    366377
    367378      /* Mix the first buffer before playing */
    368       MixCallback(BUFFER_SIZE/NUM_DART_BUFFS);
    369       memcpy(pMixBuffs[lLastBuff].pBuffer, &pDSoundBuff[lLastBuff*(BUFFER_SIZE/NUM_DART_BUFFS)], BUFFER_SIZE/NUM_DART_BUFFS);
     379      MixCallback(BUFFER_SIZE/ulNumDartBuffs);
     380      memcpy(MixBuffer[lLastBuff].pBuffer, &pDSoundBuff[lLastBuff*(BUFFER_SIZE/ulNumDartBuffs)], BUFFER_SIZE/ulNumDartBuffs);
    370381
    371382      USHORT  sel = RestoreOS2FS();
    372383      /* Note: the call to pmixWrite trashes the FS selector, we have to save */
    373384      /* and then restore FS!!! Otherwise exception handling will be broken.  */
    374       MixSetupParms.pmixWrite(MixSetupParms.ulMixHandle, MixBuffers, 2);
     385      MixSetupParms.pmixWrite(MixSetupParms.ulMixHandle, MixBuffer, 2);
    375386      SetFS(sel);
    376387      fIsPlaying = TRUE;
Note: See TracChangeset for help on using the changeset viewer.