Ignore:
Timestamp:
Apr 3, 2003, 4:04:50 PM (22 years ago)
Author:
sandervl
Message:

Waveout (DART): handle underrun properly (next buffer write and position after continueing)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/winmm/waveoutdart.cpp

    r9979 r9982  
    1 /* $Id: waveoutdart.cpp,v 1.21 2003-04-03 13:07:03 sandervl Exp $ */
     1/* $Id: waveoutdart.cpp,v 1.22 2003-04-03 14:04:50 sandervl Exp $ */
    22
    33/*
     
    9393    fMixerSetup   = FALSE;
    9494    fUnderrun     = FALSE;
     95    ulUnderrunBase= 0;
    9596
    9697    ulBufSize     = DART_BUFSIZE;
     
    464465
    465466    wmutex.enter();
    466     State     = STATE_STOPPED;
     467    State = STATE_STOPPED;
    467468    wmutex.leave();
    468469
     
    484485        wmutex.enter();
    485486    }
    486     wavehdr   = NULL;
    487     fUnderrun = FALSE;
    488 
    489     curPlayBuf = curFillBuf = curFillPos = curPlayPos = 0;
    490     bytesPlayed = bytesCopied = bytesReturned = 0;
    491     queuedbuffers = 0;
     487    wavehdr        = NULL;
     488    fUnderrun      = FALSE;
     489    ulUnderrunBase = 0;
     490
     491    curPlayBuf     = curFillBuf = curFillPos = curPlayPos = 0;
     492    bytesPlayed    = bytesCopied = bytesReturned = 0;
     493    queuedbuffers  = 0;
    492494
    493495    wmutex.leave();
     
    503505    if(State == STATE_STOPPED) {
    504506        dprintf(("Not playing; return 0 position"));
    505         return 0;
     507        return ulUnderrunBase;
    506508    }
    507509
     
    510512    if((rc & 0xFFFF) == MCIERR_SUCCESS) {
    511513        nrbytes = (ULONG)(((double)mciStatus.ulReturn * (double)getAvgBytesPerSecond())/1000.0);
    512         return nrbytes;;
     514        return ulUnderrunBase+nrbytes;
    513515    }
    514516    mciError(rc);
     
    594596            if(State == STATE_PLAYING) {
    595597                fUnderrun = TRUE;
     598                //save current position for when we continue later
     599                ulUnderrunBase = bytesPlayed;
    596600                stop();    //out of buffers, so stop playback
    597601            }
     
    654658        //last buffer played -> no new ones -> return now
    655659        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));
     660        if(getPosition() > bytesPlayed) {
     661            dprintf(("WINMM: WaveOut handler UNDERRUN! state %s", (State == STATE_PLAYING) ? "playing" : "stopped"));
     662            //save current position for when we continue later
     663            ulUnderrunBase = bytesPlayed;
     664            fUnderrun = TRUE;
     665            stop();    //out of buffers, so stop playback
     666        }
    656667        wmutex.leave();
    657668        return;
     
    677688    ULONG buflength;
    678689
    679     if(!fUnderrun && State == STATE_PLAYING && curFillBuf == curPlayBuf) {
     690    if(!fUnderrun && State == STATE_PLAYING && wavehdr == NULL && curFillBuf == curPlayBuf) {
    680691        dprintf2(("writeBuffer: no more room for more audio data"));
    681692        return; //no room left
Note: See TracChangeset for help on using the changeset viewer.