Changeset 5348


Ignore:
Timestamp:
Mar 21, 2001, 1:33:22 PM (24 years ago)
Author:
sandervl
Message:

underrun changes (pause & restart properly)

Location:
trunk/src/winmm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/winmm/dwaveout.cpp

    r5334 r5348  
    1 /* $Id: dwaveout.cpp,v 1.32 2001-03-19 19:28:38 sandervl Exp $ */
     1/* $Id: dwaveout.cpp,v 1.33 2001-03-21 12:33:22 sandervl Exp $ */
    22
    33/*
     
    118118
    119119    curPlayBuf = curFillBuf = curFillPos = curPlayPos = 0;
    120     readPos = writePos = 0;
     120    bytesPlayed = bytesCopied = bytesReturned = 0;
    121121
    122122    fMixerSetup   = FALSE;
     
    130130    volume        = defvolume;
    131131    State         = STATE_STOPPED;
     132    queuedbuffers = 0;
    132133
    133134    MixBuffer     = (MCI_MIX_BUFFER *)malloc(PREFILLBUF_DART*sizeof(MCI_MIX_BUFFER));
     
    301302    int i, buflength;
    302303
     304    queuedbuffers++;
    303305    if(fMixerSetup == FALSE)
    304306    {
     
    383385
    384386        curPlayBuf = curFillBuf = curFillPos = curPlayPos = 0;
    385         readPos = writePos = 0;
     387        bytesPlayed = bytesCopied = bytesReturned = 0;
    386388
    387389        for(i=0;i<PREFILLBUF_DART;i++) {
     
    433435
    434436        writeBuffer();  //must be called before (re)starting playback
    435 
    436437        wmutex->leave();
     438
    437439        if(State == STATE_STOPPED) {//continue playback
    438440            restart();
    439441        }
     442        else
     443        if(fUnderrun) {
     444            dprintf(("Resume playback after underrun"));
     445            fUnderrun = FALSE;
     446            State = STATE_PLAYING;
     447
     448            memset(&GenericParms, 0, sizeof(GenericParms));
     449
     450            // Resume the playback.
     451            mciSendCommand(DeviceId, MCI_RESUME, MCI_WAIT, (PVOID)&GenericParms, 0);
     452
     453            //write buffers to DART; starts playback
     454            // MCI_MIXSETUP_PARMS->pMixWrite does alter FS: selector!
     455            USHORT selTIB = GetFS(); // save current FS selector
     456
     457            MixSetupParms->pmixWrite(MixSetupParms->ulMixHandle, &MixBuffer[curPlayBuf], 1);
     458
     459            SetFS(selTIB);           // switch back to the saved FS selector
     460        }
    440461    }
    441462    return(MMSYSERR_NOERROR);
     
    446467{
    447468 MCI_GENERIC_PARMS Params;
     469
     470    dprintf(("WINMM: DartWaveOut::pause"));
    448471
    449472    wmutex->enter(VMUTEX_WAIT_FOREVER);
     
    459482    memset(&Params, 0, sizeof(Params));
    460483
    461     // Stop the playback.
     484    // Pause the playback.
    462485    mciSendCommand(DeviceId, MCI_PAUSE, MCI_WAIT, (PVOID)&Params, 0);
    463486
     
    483506
    484507    curPlayBuf = curFillBuf = curFillPos = curPlayPos = 0;
    485     readPos = writePos = 0;
     508    bytesPlayed = bytesCopied = bytesReturned = 0;
    486509
    487510    return(MMSYSERR_NOERROR);
     
    510533        wavehdr->dwFlags  |= WHDR_DONE;
    511534        wavehdr->dwFlags  &= ~WHDR_INQUEUE;
     535        wavehdr->reserved  = 0;
    512536        tmpwavehdr         = wavehdr;
    513537        wavehdr            = wavehdr->lpNext;
     
    530554
    531555    curPlayBuf = curFillBuf = curFillPos = curPlayPos = 0;
    532     readPos = writePos = 0;
     556    bytesPlayed = bytesCopied = bytesReturned = 0;
     557    queuedbuffers = 0;
    533558
    534559    wmutex->leave();
     
    567592        SetFS(selTIB);           // switch back to the saved FS selector
    568593    }
     594
    569595    return(MMSYSERR_NOERROR);
    570596}
     
    674700 WAVEHDR *whdr, *prevhdr = NULL;
    675701
    676     dprintf2(("WINMM: handler %d\n", curPlayBuf));
     702    dprintf2(("WINMM: handler %d; buffers left %d", curPlayBuf, queuedbuffers));
    677703    if(ulFlags == MIX_STREAM_ERROR) {
    678704        if(ulStatus == ERROR_DEVICE_UNDERRUN) {
     
    693719    wmutex->enter(VMUTEX_WAIT_FOREVER);
    694720
    695     readPos += MixBuffer[curPlayBuf].ulBufferLength;
     721    bytesPlayed += MixBuffer[curPlayBuf].ulBufferLength;
    696722
    697723    if(curPlayBuf == PREFILLBUF_DART-1)
     
    699725    else curPlayBuf++;
    700726
     727    fUnderrun = FALSE;
     728
    701729    whdr = wavehdr;
    702     if(whdr == NULL) {
    703         //last buffer played -> no new ones -> silence buffer & continue
    704         dprintf(("WINMM: WaveOut handler LAST BUFFER PLAYED! state %s", (State == STATE_PLAYING) ? "playing" : "stopped"));
    705         if(State == STATE_PLAYING) {
    706             fUnderrun = TRUE;
    707 ////            memset(MixBuffer[curPlayBuf].pBuffer, 0, MixBuffer[curPlayBuf].ulBufferLength);
    708             goto sendbuffer;
    709         }
    710         wmutex->leave();
    711         return;
    712     }
    713     fUnderrun = FALSE;
    714730    while(whdr) {
    715731        if(whdr->reserved == WHDR_DONE)
    716732        {
    717             if(readPos < writePos + whdr->dwBufferLength) {
    718                 dprintf2(("Buffer marked done, but not yet played completely (%d,%d)", readPos, writePos));
     733            if(bytesPlayed < bytesReturned + whdr->dwBufferLength) {
     734                dprintf2(("Buffer marked done, but not yet played completely (play %d/%d, cop %d, ret %d)", bytesPlayed, getPosition(), bytesCopied, bytesReturned));
    719735                break;  //not yet done
    720736            }
    721737
    722             dprintf2(("WINMM: handler buf %X done (read %d, write %d)", whdr, readPos, writePos));
    723             whdr->dwFlags &= ~WHDR_INQUEUE;
    724             whdr->dwFlags |= WHDR_DONE;
     738            dprintf2(("WINMM: handler buf %X done (play %d/%d, cop %d, ret %d)", whdr, bytesPlayed, getPosition(), bytesCopied, bytesReturned));
     739            queuedbuffers--;
     740
     741            whdr->dwFlags  &= ~WHDR_INQUEUE;
     742            whdr->dwFlags  |= WHDR_DONE;
     743            whdr->reserved  = 0;
    725744
    726745            if(prevhdr == NULL)
     
    730749            whdr->lpNext = NULL;
    731750
    732             writePos += whdr->dwBufferLength;
     751            bytesReturned += whdr->dwBufferLength;
    733752            wmutex->leave();
    734753
     
    750769    }
    751770
     771    if(wavehdr == NULL) {
     772        //last buffer played -> no new ones -> silence buffer & continue
     773        dprintf(("WINMM: WaveOut handler LAST BUFFER PLAYED! state %s (play %d (%d), cop %d, ret %d)", (State == STATE_PLAYING) ? "playing" : "stopped", bytesPlayed, getPosition(), bytesCopied, bytesReturned));
     774        if(State == STATE_PLAYING) {
     775            fUnderrun = TRUE;
     776            pause();
     777////            memset(MixBuffer[curPlayBuf].pBuffer, 0, MixBuffer[curPlayBuf].ulBufferLength);
     778////            goto sendbuffer;
     779        }
     780        wmutex->leave();
     781        return;
     782    }
     783
    752784    writeBuffer();
    753785
     
    760792    MixSetupParms->pmixWrite(MixSetupParms->ulMixHandle, &MixBuffer[curPlayBuf], 1);
    761793    SetFS(selTIB);           // switch back to the saved FS selector
     794
     795    dprintf2(("WINMM: handler DONE"));
    762796}
    763797/******************************************************************************/
     
    792826        memcpy((char *)MixBuffer[curFillBuf].pBuffer + curPlayPos,
    793827               curhdr->lpData + curFillPos,  buflength);
    794         curPlayPos += buflength;
    795         curFillPos += buflength;
    796 
     828        curPlayPos  += buflength;
     829        curFillPos  += buflength;
     830        bytesCopied += buflength;
    797831
    798832        if(curFillPos == curhdr->dwBufferLength) {
    799             dprintf2(("Buffer %d done (%x)", curFillBuf, curhdr));
     833            dprintf2(("Buffer %d done ptr %x size %d %x %x %x %x %x %x", curFillBuf, curhdr->lpData, curhdr->dwBufferLength, curhdr->dwBytesRecorded, curhdr->dwUser, curhdr->dwFlags, curhdr->dwLoops, curhdr->lpNext, curhdr->reserved));
     834
    800835            curFillPos = 0;
    801836            curhdr->reserved = WHDR_DONE;
  • TabularUnified trunk/src/winmm/dwaveout.h

    r5334 r5348  
    1 /* $Id: dwaveout.h,v 1.11 2001-03-19 19:28:38 sandervl Exp $ */
     1/* $Id: dwaveout.h,v 1.12 2001-03-21 12:33:22 sandervl Exp $ */
    22
    33/*
     
    8585    int   curPlayBuf, curFillBuf;
    8686    ULONG curFillPos, curPlayPos; //fillpos == pos in os2 mix buffer, bufpos == pos in win buffer
    87     ULONG readPos, writePos;
     87    ULONG bytesPlayed, bytesCopied, bytesReturned;
     88    int   queuedbuffers;
    8889
    8990    // callback interface
  • TabularUnified trunk/src/winmm/time.cpp

    r2812 r5348  
    1 /* $Id: time.cpp,v 1.9 2000-02-17 14:09:32 sandervl Exp $ */
     1/* $Id: time.cpp,v 1.10 2001-03-21 12:33:22 sandervl Exp $ */
    22
    33/*
     
    223223              UINT,     arg2)
    224224{
     225  dprintf2(("timeGetSystemTime %x %d", arg1, arg2));
    225226  return O32_timeGetSystemTime(arg1, arg2);
    226227}
     
    241242DWORD WIN32API timeGetTime()
    242243{
    243   return O32_timeGetTime();
    244 }
    245 
     244 DWORD time;
     245#if 0
     246 LARGE_INTEGER lint;
     247 static LARGE_INTEGER freq;
     248 static BOOL fInit = FALSE;
     249
     250  if(fInit == FALSE) {
     251     QueryPerformanceFrequency(&freq);
     252     freq.LowPart /= 1000;
     253     fInit = TRUE;
     254  }
     255  QueryPerformanceCounter(&lint);
     256  time = lint.LowPart/freq.LowPart;
     257  dprintf2(("timeGetTime %x (%x:%x)", time, lint.LowPart, lint.HighPart));
     258#else
     259  //SvL: TODO: Inaccurate
     260  time = O32_timeGetTime();
     261  dprintf2(("timeGetTime %x", time));
     262#endif
     263  return time;
     264}
     265
  • TabularUnified trunk/src/winmm/waveout.cpp

    r5334 r5348  
    1 /* $Id: waveout.cpp,v 1.18 2001-03-19 19:28:39 sandervl Exp $ */
     1/* $Id: waveout.cpp,v 1.19 2001-03-21 12:33:22 sandervl Exp $ */
    22//#undef DEBUG
    33/*
     
    108108        pwh->dwFlags &= ~WHDR_DONE;
    109109
    110         dprintf(("waveOutWrite %x %d %x", pwh->lpData, pwh->dwBufferLength, pwh->dwFlags));
     110        dprintf(("waveOutWrite ptr %x size %d %x %x %x %x %x %x", pwh->lpData, pwh->dwBufferLength, pwh->dwBytesRecorded, pwh->dwUser, pwh->dwFlags, pwh->dwLoops, pwh->lpNext, pwh->reserved));
    111111        return(dwave->write(pwh, cbwh));
    112112  }
Note: See TracChangeset for help on using the changeset viewer.