Ignore:
Timestamp:
Mar 19, 2001, 8:28:39 PM (24 years ago)
Author:
sandervl
Message:

many wave playback & recording fixes

File:
1 edited

Legend:

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

    r5272 r5334  
    1 /* $Id: dwavein.cpp,v 1.1 2001-02-27 21:13:59 sandervl Exp $ */
     1/* $Id: dwavein.cpp,v 1.2 2001-03-19 19:28:38 sandervl Exp $ */
    22
    33/*
     
    5454/******************************************************************************/
    5555/******************************************************************************/
    56 DartWaveIn::DartWaveIn(LPWAVEFORMATEX pwfx, ULONG nCallback, ULONG dwInstance, USHORT usSel)
     56DartWaveIn::DartWaveIn(LPWAVEFORMATEX pwfx, ULONG nCallback, ULONG dwInstance)
    5757{
    5858   Init(pwfx);
    5959
    6060   mthdCallback     = (LPDRVCALLBACK)nCallback; // callback function
    61    selCallback      = usSel;                    // callback win32 tib selector
    6261   this->dwInstance = dwInstance;
    6362   fOverrun        = FALSE;
     
    8281{
    8382  USHORT selTIB = GetFS(); // save current FS selector
     83  USHORT selCallback;
    8484
    8585    dprintf(("WINMM:DartWaveIn::callback(HDRVR h=%08xh, UINT uMessage=%08xh, DWORD dwUser=%08xh, DWORD dw1=%08xh, DWORD dw2=%08xh)\n",
    8686              h, uMessage, dwUser, dw1, dw2));
    8787
    88     if (selCallback != 0)
    89         SetFS(selCallback);      // switch to callback win32 tib selector (stored in waveInOpen)
    90     else
    91         dprintf(("WINMM:DartWaveIn::callback - selCallback is invalid"));
    92 
    93     //@@@PH 1999/12/28 Shockwave Flashes seem to make assumptions on a
    94     // specific stack layout. Do we have the correct calling convention here?
    95     mthdCallback(h,uMessage,dwUser,dw1,dw2);
    96     SetFS(selTIB);           // switch back to the saved FS selector
     88    selCallback = GetProcessTIBSel();
     89
     90    //TODO: may not be very safe. perhaps we should allocate a new TIB for the DART thread or let another thread do the actual callback
     91    if(selCallback)
     92    {
     93        SetFS(selCallback);      // switch to callback win32 tib selector (stored in waveOutOpen)
     94
     95        //@@@PH 1999/12/28 Shockwave Flashes seem to make assumptions on a
     96        // specific stack layout. Do we have the correct calling convention here?
     97        mthdCallback(h,uMessage,dwUser,dw1,dw2);
     98        SetFS(selTIB);           // switch back to the saved FS selector
     99    }
     100    else {
     101        dprintf(("WARNING: no valid selector of main thread available (process exiting); skipping waveout notify"));
     102    }
     103    dprintf(("WINMM:DartWaveOut::callback returned"));
    97104}
    98105/******************************************************************************/
     
    109116   mthdCallback  = NULL;
    110117   hwndCallback  = 0;
    111    selCallback   = 0;
    112118   dwInstance    = 0;
    113119   ulError       = 0;
    114    selCallback   = 0;
    115120   State         = STATE_STOPPED;
    116121
     
    450455{
    451456 MCI_GENERIC_PARMS Params;
    452 
    453   dprintf(("DartWaveIn::reset %s", (State == STATE_RECORDING) ? "recording" : "stopped"));
    454   if(State != STATE_RECORDING)
     457 LPWAVEHDR tmpwavehdr;
     458
     459    dprintf(("DartWaveIn::reset %s", (State == STATE_RECORDING) ? "recording" : "stopped"));
     460    if(State != STATE_RECORDING)
    455461        return(MMSYSERR_HANDLEBUSY);
    456462
    457   memset(&Params, 0, sizeof(Params));
    458 
    459   // Stop recording
    460   mciSendCommand(DeviceId, MCI_STOP, MCI_WAIT, (PVOID)&Params, 0);
    461 
    462   dprintf(("Nr of threads blocked on mutex = %d\n", wmutex->getNrBlocked()));
    463 
    464   wmutex->enter(VMUTEX_WAIT_FOREVER);
    465   while(wavehdr)
    466   {
     463    memset(&Params, 0, sizeof(Params));
     464
     465    // Stop recording
     466    mciSendCommand(DeviceId, MCI_STOP, MCI_WAIT, (PVOID)&Params, 0);
     467
     468    dprintf(("Nr of threads blocked on mutex = %d\n", wmutex->getNrBlocked()));
     469
     470    wmutex->enter(VMUTEX_WAIT_FOREVER);
     471    while(wavehdr)
     472    {
    467473        wavehdr->dwFlags |= WHDR_DONE;
    468474        wavehdr->dwFlags &= ~WHDR_INQUEUE;
    469         wavehdr = wavehdr->lpNext;
    470         wavehdr->lpNext = NULL;
     475        tmpwavehdr         = wavehdr;
     476        wavehdr            = wavehdr->lpNext;
     477        tmpwavehdr->lpNext = NULL;
    471478
    472479        wmutex->leave();
    473480        if(mthdCallback) {
    474             callback((ULONG)this, WIM_DATA, dwInstance, (ULONG)wavehdr, 0);
     481            callback((ULONG)this, WIM_DATA, dwInstance, (ULONG)tmpwavehdr, 0);
    475482        }
    476483        else
    477484        if(hwndCallback) {
    478485            dprintf(("Callback (msg) for buffer %x", wavehdr));
    479             PostMessageA(hwndCallback, WIM_DATA, (WPARAM)this, (ULONG)wavehdr);
     486            PostMessageA(hwndCallback, WIM_DATA, (WPARAM)this, (ULONG)tmpwavehdr);
    480487        }
    481488        wmutex->enter(VMUTEX_WAIT_FOREVER);
    482   }
    483   wavehdr   = NULL;
    484   State     = STATE_STOPPED;
    485   fOverrun = FALSE;
    486 
    487   wmutex->leave();
    488   return(MMSYSERR_NOERROR);
     489    }
     490    wavehdr   = NULL;
     491    State     = STATE_STOPPED;
     492    fOverrun = FALSE;
     493
     494    wmutex->leave();
     495    return(MMSYSERR_NOERROR);
    489496}
    490497/******************************************************************************/
     
    495502
    496503    wmutex->enter(VMUTEX_WAIT_FOREVER);
    497     pwh->lpNext   = NULL;
     504    pwh->lpNext          = NULL;
    498505    pwh->dwBytesRecorded = 0;
    499506    if(wavehdr) {
     
    585592{
    586593#ifdef DEBUG
    587  char szError[256] = "";
    588 
    589   mciGetErrorString(ulError, szError, sizeof(szError));
    590   dprintf(("WINMM: DartWaveIn: %s\n", szError));
     594    char szError[256] = "";
     595
     596    mciGetErrorString(ulError, szError, sizeof(szError));
     597    dprintf(("WINMM: DartWaveIn: %s\n", szError));
    591598#endif
    592599}
     
    595602BOOL DartWaveIn::find(DartWaveIn *dwave)
    596603{
    597  DartWaveIn *curwave = wavein;
    598 
    599   while(curwave) {
    600     if(dwave == curwave) {
    601         return(TRUE);
    602     }
    603     curwave = curwave->next;
    604   }
    605 
    606 #ifdef DEBUG
    607 //  WriteLog("WINMM:DartWaveIn not found!\n");
    608 #endif
    609   return(FALSE);
     604    DartWaveIn *curwave = wavein;
     605
     606    while(curwave) {
     607        if(dwave == curwave) {
     608            return(TRUE);
     609        }
     610        curwave = curwave->next;
     611    }
     612
     613    dprintf2(("WINMM:DartWaveIn not found!"));
     614    return(FALSE);
    610615}
    611616/******************************************************************************/
     
    619624 WAVEHDR *whdr, *prevhdr = NULL;
    620625
    621 #ifdef DEBUG1
    622     dprintf(("WINMM: DartWaveIn handler %x\n", pBuffer));
    623 #endif
     626    dprintf2(("WINMM: DartWaveIn handler %x\n", pBuffer));
    624627    if(ulFlags == MIX_STREAM_ERROR) {
    625628        if(ulStatus == ERROR_DEVICE_OVERRUN) {
     
    627630            if(State == STATE_RECORDING) {
    628631                fOverrun = TRUE;
    629                 stop();    //out of buffers, so pause playback
     632                stop();    //out of buffers, so stop playback
    630633            }
    631634            return;
     
    644647        return;
    645648    }
    646 
    647 #ifdef DEBUG1
    648     dprintf(("WINMM: DartWaveIn handler cur (%d,%d), fill (%d,%d)\n", curPlayBuf, curPlayPos, curFillBuf, curFillPos));
    649 #endif
    650649
    651650    buflength = pBuffer->ulBufferLength;
     
    663662            buflength                -= bytestocopy;
    664663
    665             if(wavehdr->dwBytesRecorded == wavehdr->dwBufferLength) {
    666 #ifdef DEBUG1
    667                 dprintf(("WINMM: DartWaveIn handler buf %X done\n", whdr));
    668 #endif
     664            if(wavehdr->dwBytesRecorded == wavehdr->dwBufferLength)
     665            {
     666                dprintf2(("WINMM: DartWaveIn handler buf %X done\n", whdr));
    669667                whdr->dwFlags |= WHDR_DONE;
    670668                whdr->dwFlags &= ~WHDR_INQUEUE;
     
    675673
    676674                if(mthdCallback) {
    677                     callback((ULONG)this, WIM_DATA, dwInstance, (ULONG)whdr, 0);
     675                    callback((ULONG)this, WIM_DATA, dwInstance, (ULONG)whdr, whdr->dwBytesRecorded);
    678676                }
    679677                else
    680678                if(hwndCallback) {
    681                         dprintf(("Callback (msg) for buffer %x", whdr));
    682                     PostMessageA(hwndCallback, WIM_DATA, (WPARAM)this, (ULONG)whdr);
    683                 }
     679                    dprintf(("Callback (msg) for buffer %x", whdr));
     680                    PostMessageA(hwndCallback, WIM_DATA, (WPARAM)this, (ULONG)whdr);
     681                }
    684682                wmutex->enter(VMUTEX_WAIT_FOREVER);
    685683            }
     
    701699                            ULONG ulFlags)
    702700{
    703     // PTIB ptib;
    704     // PPIB ppib;
    705     // DosGetInfoBlocks(&ptib, &ppib);
    706     // dprintf(("WaveInHandler: thread %d prio %X", ptib->tib_ptib2->tib2_ultid, ptib->tib_ptib2->tib2_ulpri));
    707 
    708701    DartWaveIn *dwave;
    709702
Note: See TracChangeset for help on using the changeset viewer.