Changeset 5334 for trunk/src/winmm/dwavein.cpp
- Timestamp:
- Mar 19, 2001, 8:28:39 PM (24 years ago)
- 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:59sandervl Exp $ */1 /* $Id: dwavein.cpp,v 1.2 2001-03-19 19:28:38 sandervl Exp $ */ 2 2 3 3 /* … … 54 54 /******************************************************************************/ 55 55 /******************************************************************************/ 56 DartWaveIn::DartWaveIn(LPWAVEFORMATEX pwfx, ULONG nCallback, ULONG dwInstance , USHORT usSel)56 DartWaveIn::DartWaveIn(LPWAVEFORMATEX pwfx, ULONG nCallback, ULONG dwInstance) 57 57 { 58 58 Init(pwfx); 59 59 60 60 mthdCallback = (LPDRVCALLBACK)nCallback; // callback function 61 selCallback = usSel; // callback win32 tib selector62 61 this->dwInstance = dwInstance; 63 62 fOverrun = FALSE; … … 82 81 { 83 82 USHORT selTIB = GetFS(); // save current FS selector 83 USHORT selCallback; 84 84 85 85 dprintf(("WINMM:DartWaveIn::callback(HDRVR h=%08xh, UINT uMessage=%08xh, DWORD dwUser=%08xh, DWORD dw1=%08xh, DWORD dw2=%08xh)\n", 86 86 h, uMessage, dwUser, dw1, dw2)); 87 87 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")); 97 104 } 98 105 /******************************************************************************/ … … 109 116 mthdCallback = NULL; 110 117 hwndCallback = 0; 111 selCallback = 0;112 118 dwInstance = 0; 113 119 ulError = 0; 114 selCallback = 0;115 120 State = STATE_STOPPED; 116 121 … … 450 455 { 451 456 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) 455 461 return(MMSYSERR_HANDLEBUSY); 456 462 457 memset(&Params, 0, sizeof(Params));458 459 // Stop recording460 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 { 467 473 wavehdr->dwFlags |= WHDR_DONE; 468 474 wavehdr->dwFlags &= ~WHDR_INQUEUE; 469 wavehdr = wavehdr->lpNext; 470 wavehdr->lpNext = NULL; 475 tmpwavehdr = wavehdr; 476 wavehdr = wavehdr->lpNext; 477 tmpwavehdr->lpNext = NULL; 471 478 472 479 wmutex->leave(); 473 480 if(mthdCallback) { 474 callback((ULONG)this, WIM_DATA, dwInstance, (ULONG) wavehdr, 0);481 callback((ULONG)this, WIM_DATA, dwInstance, (ULONG)tmpwavehdr, 0); 475 482 } 476 483 else 477 484 if(hwndCallback) { 478 485 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); 480 487 } 481 488 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); 489 496 } 490 497 /******************************************************************************/ … … 495 502 496 503 wmutex->enter(VMUTEX_WAIT_FOREVER); 497 pwh->lpNext = NULL;504 pwh->lpNext = NULL; 498 505 pwh->dwBytesRecorded = 0; 499 506 if(wavehdr) { … … 585 592 { 586 593 #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)); 591 598 #endif 592 599 } … … 595 602 BOOL DartWaveIn::find(DartWaveIn *dwave) 596 603 { 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); 610 615 } 611 616 /******************************************************************************/ … … 619 624 WAVEHDR *whdr, *prevhdr = NULL; 620 625 621 #ifdef DEBUG1 622 dprintf(("WINMM: DartWaveIn handler %x\n", pBuffer)); 623 #endif 626 dprintf2(("WINMM: DartWaveIn handler %x\n", pBuffer)); 624 627 if(ulFlags == MIX_STREAM_ERROR) { 625 628 if(ulStatus == ERROR_DEVICE_OVERRUN) { … … 627 630 if(State == STATE_RECORDING) { 628 631 fOverrun = TRUE; 629 stop(); //out of buffers, so pauseplayback632 stop(); //out of buffers, so stop playback 630 633 } 631 634 return; … … 644 647 return; 645 648 } 646 647 #ifdef DEBUG1648 dprintf(("WINMM: DartWaveIn handler cur (%d,%d), fill (%d,%d)\n", curPlayBuf, curPlayPos, curFillBuf, curFillPos));649 #endif650 649 651 650 buflength = pBuffer->ulBufferLength; … … 663 662 buflength -= bytestocopy; 664 663 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)); 669 667 whdr->dwFlags |= WHDR_DONE; 670 668 whdr->dwFlags &= ~WHDR_INQUEUE; … … 675 673 676 674 if(mthdCallback) { 677 callback((ULONG)this, WIM_DATA, dwInstance, (ULONG)whdr, 0);675 callback((ULONG)this, WIM_DATA, dwInstance, (ULONG)whdr, whdr->dwBytesRecorded); 678 676 } 679 677 else 680 678 if(hwndCallback) { 681 682 683 679 dprintf(("Callback (msg) for buffer %x", whdr)); 680 PostMessageA(hwndCallback, WIM_DATA, (WPARAM)this, (ULONG)whdr); 681 } 684 682 wmutex->enter(VMUTEX_WAIT_FOREVER); 685 683 } … … 701 699 ULONG ulFlags) 702 700 { 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 708 701 DartWaveIn *dwave; 709 702
Note:
See TracChangeset
for help on using the changeset viewer.