Ignore:
Timestamp:
Apr 8, 2000, 11:16:54 AM (25 years ago)
Author:
sandervl
Message:

restart, pause & underrun fixes

File:
1 edited

Legend:

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

    r3338 r3348  
    1 /* $Id: dwaveout.cpp,v 1.22 2000-04-07 10:01:59 sandervl Exp $ */
     1/* $Id: dwaveout.cpp,v 1.23 2000-04-08 09:16:53 sandervl Exp $ */
    22
    33/*
     
    5757   Init(pwfx);
    5858
    59    mthdCallback         = (LPDRVCALLBACK)nCallback; // callback function
    60    selCallback          = usSel;                    // callback win32 tib selector
     59   mthdCallback     = (LPDRVCALLBACK)nCallback; // callback function
     60   selCallback      = usSel;                    // callback win32 tib selector
    6161   this->dwInstance = dwInstance;
     62   fUnderrun        = FALSE;
    6263
    6364   if(!ulError)
     
    381382        curhdr      = pwh;
    382383        pwh->lpNext = NULL;
     384
     385        if(State != STATE_STOPPED) {//don't start playback if paused
     386                wmutex->leave();
     387                return(MMSYSERR_NOERROR);
     388        }
    383389
    384390        while(TRUE) {
     
    410416        }
    411417        dprintf(("MixSetupParms = %X\n", MixSetupParms));
    412         State = STATE_PLAYING;
     418        State     = STATE_PLAYING;
     419        fUnderrun = FALSE;
    413420        wmutex->leave();
    414421
     
    431438        else    wavehdr = pwh;
    432439        wmutex->leave();
    433         if(State != STATE_PLAYING) {//continue playback
     440        if(State == STATE_STOPPED) {//continue playback
    434441            restart();
    435442        }
     
    444451 MCI_GENERIC_PARMS Params;
    445452
    446   if(State != STATE_PLAYING)
     453  wmutex->enter(VMUTEX_WAIT_FOREVER);
     454  if(State != STATE_PLAYING) {
     455        State = STATE_PAUSED;
     456        wmutex->leave();
    447457        return(MMSYSERR_NOERROR);
    448 
    449   wmutex->enter(VMUTEX_WAIT_FOREVER);
     458  }
     459
    450460  State = STATE_PAUSED;
    451461  wmutex->leave();
     
    490500        wavehdr = wavehdr->lpNext;
    491501  }
    492   wavehdr = NULL;
    493   State = STATE_STOPPED;
     502  wavehdr   = NULL;
     503  State     = STATE_STOPPED;
     504  fUnderrun = FALSE;
    494505
    495506  wmutex->leave();
     
    507518    }
    508519    wmutex->enter(VMUTEX_WAIT_FOREVER);
    509     State = STATE_PLAYING;
     520    State     = STATE_PLAYING;
     521    fUnderrun = FALSE;
    510522    wmutex->leave();
    511523    curbuf = curPlayBuf;
     
    625637{
    626638 ULONG    buflength;
    627  WAVEHDR *whdr = wavehdr, *prevhdr = NULL;
     639 WAVEHDR *whdr, *prevhdr = NULL;
    628640
    629641#ifdef DEBUG1
     
    633645    if(ulStatus == ERROR_DEVICE_UNDERRUN) {
    634646        dprintf(("WINMM: WaveOut handler UNDERRUN!\n"));
     647        fUnderrun = TRUE;
    635648        pause();    //out of buffers, so pause playback
    636649        return;
     
    641654  wmutex->enter(VMUTEX_WAIT_FOREVER);
    642655
     656  whdr = wavehdr;
     657  if(whdr == NULL) {
     658        wmutex->leave();
     659        //last buffer played -> no new ones -> underrun; pause playback
     660        dprintf(("WINMM: WaveOut handler UNDERRUN!\n"));
     661        fUnderrun = TRUE;
     662        pause();    //out of buffers, so pause playback
     663        return;
     664  }
    643665  while(whdr) {
    644666    if(whdr->dwFlags & WHDR_DONE) {
     
    649671
    650672        if(prevhdr == NULL)
    651             wavehdr = whdr->lpNext;
     673                wavehdr = whdr->lpNext;
    652674        else    prevhdr->lpNext = whdr->lpNext;
    653675
Note: See TracChangeset for help on using the changeset viewer.