Ignore:
Timestamp:
Feb 22, 2010, 2:44:21 PM (16 years ago)
Author:
rlwalsh
Message:

add FlashWaveOut class to winmm - see Ticket #2

File:
1 edited

Legend:

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

    r9979 r21358  
    1212 */
    1313
    14 
    15 /****************************************************************************
    16  * Includes                                                                 *
    17  ****************************************************************************/
    18 
    19 
     14/******************************************************************************/
     15// Includes
     16/******************************************************************************/
    2017
    2118#define  INCL_BASE
     
    5754                  : WaveOut(pwfx, fdwOpen, nCallback, dwInstance)
    5855{
     56    hSem = 0;
     57    hDAudioDrv = 0;
     58    hThread = 0;
     59    dwThreadID = 0;
     60    bytesReturned = 0;
     61    fUnderrun = 0;
     62}
     63/******************************************************************************/
     64/******************************************************************************/
     65DAudioWaveOut::~DAudioWaveOut()
     66{
     67    DAUDIO_CMD cmd;
     68
     69    if(hThread)
     70        callback(WOM_CLOSE, 0, 0);
     71
     72    if(hDAudioDrv) {
     73        cmd.Thread.hSemaphore = hSem;
     74        sendIOCTL(DAUDIO_DEREGISTER_THREAD, &cmd);
     75        sendIOCTL(DAUDIO_CLOSE, &cmd);
     76        DosClose(hDAudioDrv);
     77        hDAudioDrv = 0;
     78    }
     79    if(hSem) {
     80        DosPostEventSem(hSem);
     81        DosCloseEventSem(hSem);
     82    }
     83}
     84/******************************************************************************/
     85/******************************************************************************/
     86MMRESULT DAudioWaveOut::open()
     87{
    5988    APIRET          rc;
    6089    ULONG           action;
     
    6493    ULONG           ParmLength = 0, DataLength;
    6594
    66     fUnderrun = FALSE;
    67     hSem      = 0;
    68 
    69     dprintf(("DAudioWaveOut::DAudioWaveOut"));
     95    dprintf(("DAudioWaveOut::open"));
    7096
    7197    rc = DosOpen(szPDDName, &hDAudioDrv, &action, 0,
     
    75101    if(rc) {
    76102        dprintf(("DosOpen failed with error %d\n", rc));
    77         ulError = MMSYSERR_NODRIVER;
    78         goto fail;
     103        return MMSYSERR_NODRIVER;
    79104    }
    80105
    81106    DataLength = sizeof(init);
    82107
    83     init.lSRate         = pwfx->nSamplesPerSec;
    84     init.lBitsPerSRate  = pwfx->wBitsPerSample;
    85     init.sChannels      = pwfx->nChannels;
     108    init.lSRate         = SampleRate;
     109    init.lBitsPerSRate  = BitsPerSample;
     110    init.sChannels      = nChannels;
    86111    init.sMode          = PCM;  //todo!!
    87112
     
    90115    if(rc) {
    91116        dprintf(("DosDevIOCtl failed with error %d\n", rc));
    92         ulError = MMSYSERR_NODRIVER;
    93         goto fail;
     117        return MMSYSERR_NODRIVER;
    94118    }
    95119    if(init.sReturnCode != 0) {
    96120        dprintf(("init.sReturnCode = %d\n", init.sReturnCode));
    97         ulError = MMSYSERR_NODRIVER;
    98         goto fail;
     121        return MMSYSERR_NODRIVER;
    99122    }
    100123
     
    102125    if(rc) {
    103126        dprintf(("DosCreateEventSem failed with error %d\n", rc));
    104         ulError = MMSYSERR_NODRIVER;
    105         goto fail;
     127        return MMSYSERR_NODRIVER;
    106128    }
    107129    cmd.Thread.hSemaphore = hSem;
     
    110132    if(rc) {
    111133        dprintf(("DosDevIOCtl failed with error %d\n", rc));
    112         ulError = MMSYSERR_NODRIVER;
    113         goto fail;
     134        return MMSYSERR_NODRIVER;
    114135    }
    115136
    116137    hThread = CreateThread(NULL, 0x4000, (LPTHREAD_START_ROUTINE)DAudioThreadHandler,
    117138                           (LPVOID)this, 0, &dwThreadID);
     139    if (!hThread) {
     140        dprintf(("CreateThread failed\n"));
     141        return MMSYSERR_NODRIVER;
     142    }
    118143
    119144    setVolume(volume);
    120 
    121     if(!ulError)
    122         callback(WOM_OPEN, 0, 0);
    123 
    124 fail:
    125     return;
    126 }
    127 /******************************************************************************/
    128 /******************************************************************************/
    129 DAudioWaveOut::~DAudioWaveOut()
    130 {
    131     DAUDIO_CMD cmd;
    132 
    133     if(!ulError)
    134         callback(WOM_CLOSE, 0, 0);
    135 
    136     if(hDAudioDrv) {
    137         cmd.Thread.hSemaphore = hSem;
    138         sendIOCTL(DAUDIO_DEREGISTER_THREAD, &cmd);
    139         sendIOCTL(DAUDIO_CLOSE, &cmd);
    140         DosClose(hDAudioDrv);
    141         hDAudioDrv = 0;
    142     }
    143     if(hSem) {
    144         DosPostEventSem(hSem);
    145         DosCloseEventSem(hSem);
    146     }
     145    callback(WOM_OPEN, 0, 0);
     146
     147    return(MMSYSERR_NOERROR);
    147148}
    148149/******************************************************************************/
     
    235236    fUnderrun = FALSE;
    236237
    237     bytesPlayed = bytesCopied = bytesReturned = 0;
     238    bytesReturned = 0;
    238239
    239240    return rc;
     
    271272    fUnderrun = FALSE;
    272273
    273     bytesPlayed = bytesCopied = bytesReturned = 0;
     274    bytesReturned = 0;
    274275    queuedbuffers = 0;
    275276
     
    409410 LPWAVEHDR whdr = wavehdr;
    410411
    411     dprintf2(("WINMM: handler buf %X done (play %d/%d, cop %d, ret %d)", whdr, bytesPlayed, getPosition(), bytesCopied, bytesReturned));
     412    dprintf2(("WINMM: handler buf %X done (play %d, ret %d)", whdr, getPosition(), bytesReturned));
    412413
    413414    if(State != STATE_PLAYING || whdr == NULL)
Note: See TracChangeset for help on using the changeset viewer.