Changeset 8572 for trunk/src


Ignore:
Timestamp:
Jun 5, 2002, 1:05:56 PM (23 years ago)
Author:
sandervl
Message:

Postpone recording when waveInStart called without any buffers in the queue. Start in during next waveInAddBuffer call

Location:
trunk/src/winmm
Files:
2 edited

Legend:

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

    r8508 r8572  
    1 /* $Id: waveindart.cpp,v 1.4 2002-05-28 14:09:25 sandervl Exp $ */
     1/* $Id: waveindart.cpp,v 1.5 2002-06-05 11:05:56 sandervl Exp $ */
    22
    33/*
     
    7777    AmpOpenParms.pszDeviceType = ( PSZ ) MCI_DEVTYPE_AUDIO_AMPMIX;
    7878
    79     rc = mymciSendCommand(0, MCI_OPEN,
    80                        MCI_WAIT | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE,
    81                        (PVOID) &AmpOpenParms,
    82                        0);
     79    rc = mymciSendCommand(0, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE,
     80                          (PVOID) &AmpOpenParms, 0);
    8381    DeviceId = AmpOpenParms.usDeviceID;
    8482    if(rc) {
     
    144142/******************************************************************************/
    145143/******************************************************************************/
    146 /******************************************************************************/
    147 /******************************************************************************/
    148144MMRESULT DartWaveIn::start()
    149145{
    150  MCI_GENERIC_PARMS    GenericParms = {0};
    151  MCI_AMP_OPEN_PARMS   AmpOpenParms;
    152  MCI_CONNECTOR_PARMS  ConnectorParms;
    153  MCI_AMP_SET_PARMS    AmpSetParms ;
    154  APIRET rc;
    155  int i, curbuf, buflength;
     146    MCI_GENERIC_PARMS    GenericParms = {0};
     147    MCI_AMP_OPEN_PARMS   AmpOpenParms;
     148    MCI_CONNECTOR_PARMS  ConnectorParms;
     149    MCI_AMP_SET_PARMS    AmpSetParms ;
     150    APIRET rc;
     151    int i, curbuf, buflength;
    156152
    157153    dprintf(("DartWaveIn::start"));
    158154    if(State == STATE_RECORDING)
    159155        return(MMSYSERR_NOERROR);
     156
     157    //if the app hasn't yet given us any buffers, then we can't possibly determine the
     158    //right buffer size for DART recording, so postpone recording until the
     159    //first buffer has been added
     160    if(wavehdr == NULL) {
     161        wmutex.enter();
     162        State = STATE_POSTPONE_RECORDING;
     163        wmutex.leave();
     164        return MMSYSERR_NOERROR;
     165    }
    160166
    161167    if(fMixerSetup == FALSE)
     
    180186        MixSetupParms->pmixEvent    = WaveInHandler;
    181187
    182         rc = mymciSendCommand(DeviceId,
    183                             MCI_MIXSETUP,
    184                             MCI_WAIT | MCI_MIXSETUP_INIT,
    185                             (PVOID)MixSetupParms,
    186                             0);
     188        rc = mymciSendCommand(DeviceId, MCI_MIXSETUP, MCI_WAIT | MCI_MIXSETUP_INIT,
     189                              (PVOID)MixSetupParms, 0);
    187190
    188191        if ( rc != MCIERR_SUCCESS ) {
     
    208211
    209212            ulBufSize = pwh->dwBufferLength/2;
    210             if(ulBufSize < minbufsize) {
     213            if(ulBufSize > minbufsize) {
    211214                dprintf(("set buffer size to %d bytes (org size = %d)", minbufsize, pwh->dwBufferLength));
    212215                ulBufSize = minbufsize;
     
    243246        memset( &ConnectorParms, '\0', sizeof( MCI_CONNECTOR_PARMS ) );
    244247        ConnectorParms.ulConnectorType = MCI_LINE_IN_CONNECTOR;
    245         rc = mymciSendCommand( DeviceId,
    246                              MCI_CONNECTOR,
    247                              MCI_WAIT |
    248                              MCI_ENABLE_CONNECTOR |
    249                              MCI_CONNECTOR_TYPE,
    250                              ( PVOID ) &ConnectorParms,
    251                              0 );
     248        rc = mymciSendCommand(DeviceId, MCI_CONNECTOR, MCI_WAIT |
     249                              MCI_ENABLE_CONNECTOR | MCI_CONNECTOR_TYPE,
     250                              ( PVOID ) &ConnectorParms, 0 );
    252251
    253252        /* Allow the user to hear what is being recorded
     
    272271
    273272    dprintf(("MixSetupParms = %X\n", MixSetupParms));
    274     State     = STATE_RECORDING;
     273    State    = STATE_RECORDING;
    275274    fOverrun = FALSE;
    276275    wmutex.leave();
     
    279278
    280279    // Start recording.
    281     USHORT selTIB = GetFS(); // save current FS selector
    282     MixSetupParms->pmixRead( MixSetupParms->ulMixHandle,
    283                              &MixBuffer[0],
    284                              PREFILLBUF_DART_REC);
     280    USHORT selTIB = RestoreOS2FS(); // save current FS selector
     281    MixSetupParms->pmixRead(MixSetupParms->ulMixHandle, &MixBuffer[0], PREFILLBUF_DART_REC);
    285282    SetFS(selTIB);           // switch back to the saved FS selector
    286283
     
    291288MMRESULT DartWaveIn::stop()
    292289{
    293  MCI_GENERIC_PARMS Params;
     290    MCI_GENERIC_PARMS Params;
    294291
    295292    wmutex.enter();
     
    314311MMRESULT DartWaveIn::reset()
    315312{
    316  MCI_GENERIC_PARMS Params;
    317  LPWAVEHDR tmpwavehdr;
     313    MCI_GENERIC_PARMS Params;
     314    LPWAVEHDR tmpwavehdr;
    318315
    319316    dprintf(("DartWaveIn::reset %s", (State == STATE_RECORDING) ? "recording" : "stopped"));
    320     if(State != STATE_RECORDING)
     317   
     318    wmutex.enter();
     319    if(State == STATE_POSTPONE_RECORDING) {
     320        dprintf(("reset postponed recording"));
     321        State = STATE_STOPPED;
     322        wmutex.leave();
     323        return MMSYSERR_NOERROR;
     324    }
     325    if(State != STATE_RECORDING) {
     326        wmutex.leave();
    321327        return(MMSYSERR_HANDLEBUSY);
     328    }
     329    wmutex.leave();
    322330
    323331    memset(&Params, 0, sizeof(Params));
     
    352360MMRESULT DartWaveIn::addBuffer(LPWAVEHDR pwh, UINT cbwh)
    353361{
    354  int i;
     362    int i;
    355363
    356364    wmutex.enter();
     
    367375    wmutex.leave();
    368376
     377    if(State == STATE_POSTPONE_RECORDING) {
     378        //if recording was postponed due to lack of buffers, then start now
     379        start();
     380    }
    369381    return(MMSYSERR_NOERROR);
    370382}
     
    552564    //Transfer buffer to DART
    553565    // MCI_MIXSETUP_PARMS->pMixWrite does alter FS: selector!
    554     USHORT selTIB = GetFS(); // save current FS selector
     566    USHORT selTIB = RestoreOS2FS(); // save current FS selector
    555567    MixSetupParms->pmixRead(MixSetupParms->ulMixHandle, pBuffer, 1);
    556568    SetFS(selTIB);           // switch back to the saved FS selector
  • trunk/src/winmm/waveinoutbase.h

    r5358 r8572  
    1 /* $Id: waveinoutbase.h,v 1.1 2001-03-23 16:23:45 sandervl Exp $ */
     1/* $Id: waveinoutbase.h,v 1.2 2002-06-05 11:05:56 sandervl Exp $ */
    22
    33/*
     
    1111#define __WAVEINOUTBASE_H__
    1212
    13 #define STATE_STOPPED   0
    14 #define STATE_PLAYING   1
    15 #define STATE_PAUSED    2
    16 #define STATE_RECORDING 3
     13#define STATE_STOPPED               0
     14#define STATE_PLAYING               1
     15#define STATE_PAUSED                2
     16#define STATE_RECORDING             3
     17#define STATE_POSTPONE_RECORDING    4
    1718
    1819#ifdef OS2_ONLY
Note: See TracChangeset for help on using the changeset viewer.