Esempio n. 1
0
BOOL HandleWaveMessage(PMMDRV_MESSAGE_PARAMS pParams, DWORD *pdwResult)
{
    //  set the error code to be no error first
    SetLastError(MMSYSERR_NOERROR);

    UINT uMsg = pParams->uMsg;
    UINT uDeviceId = pParams->uDeviceId;
    DWORD dwParam1 = pParams->dwParam1;
    DWORD dwParam2 = pParams->dwParam2;
    DWORD dwUser   = pParams->dwUser;
    StreamContext *pStreamContext = (StreamContext *)dwUser;

    DWORD dwRet;

    g_pHWContext->Lock();

    _try
    {
        switch (uMsg)
        {
        case WODM_GETNUMDEVS:
            {
                dwRet = g_pHWContext->GetNumOutputDevices();
                break;
            }

        case WIDM_GETNUMDEVS:
            {
                dwRet = g_pHWContext->GetNumInputDevices();
                break;
            }

        case WODM_GETDEVCAPS:
            {
                DeviceContext *pDeviceContext;
                UINT NumDevs = g_pHWContext->GetNumOutputDevices();

                if (pStreamContext)
                {
                    pDeviceContext=pStreamContext->GetDeviceContext();
                }
                else
                {
                    pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);
                }

                dwRet = pDeviceContext->GetDevCaps((PVOID)dwParam1,dwParam2);
                break;
            }


        case WIDM_GETDEVCAPS:
            {
                DeviceContext *pDeviceContext;
                UINT NumDevs = g_pHWContext->GetNumInputDevices();

                if (pStreamContext)
                {
                    pDeviceContext=pStreamContext->GetDeviceContext();
                }
                else
                {
                    pDeviceContext = g_pHWContext->GetInputDeviceContext(uDeviceId);
                }

                dwRet = pDeviceContext->GetDevCaps((PVOID)dwParam1,dwParam2);
                break;
            }

        case WODM_GETEXTDEVCAPS:
            {
                DeviceContext *pDeviceContext;
                UINT NumDevs = g_pHWContext->GetNumOutputDevices();

                if (pStreamContext)
                {
                    pDeviceContext=pStreamContext->GetDeviceContext();
                }
                else
                {
                    pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);
                }

                dwRet = pDeviceContext->GetExtDevCaps((PVOID)dwParam1,dwParam2);
                break;
            }

        case WODM_OPEN:
            {
                DEBUGMSG(ZONE_WODM, (TEXT("WODM_OPEN\r\n")));
                DeviceContext *pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);
                dwRet = pDeviceContext->OpenStream((LPWAVEOPENDESC)dwParam1, dwParam2, (StreamContext **)dwUser);
                break;
            }

        case WIDM_OPEN:
            {
                DEBUGMSG(ZONE_WIDM, (TEXT("WIDM_OPEN\r\n")));
                DeviceContext *pDeviceContext = g_pHWContext->GetInputDeviceContext(uDeviceId);
                dwRet = pDeviceContext->OpenStream((LPWAVEOPENDESC)dwParam1, dwParam2, (StreamContext **)dwUser);
                break;
            }

        case WODM_CLOSE:
        case WIDM_CLOSE:
            {
                DEBUGMSG(ZONE_WIDM, (TEXT("WIDM_CLOSE/WODM_CLOSE\r\n")));
                dwRet = pStreamContext->Close();

                // Release stream context here, rather than inside StreamContext::Close, so that if someone
                // (like CMidiStream) has subclassed Close there's no chance that the object will get released
                // out from under them.
                if (dwRet==MMSYSERR_NOERROR)
                {
                    pStreamContext->Release();
                }
                break;
            }

        case WODM_RESTART:
        case WIDM_START:
            {
                dwRet = pStreamContext->Run();
                break;
            }

        case WODM_PAUSE:
        case WIDM_STOP:
            {
                dwRet = pStreamContext->Stop();
                break;
            }

        case WODM_GETPOS:
        case WIDM_GETPOS:
            {
                dwRet = pStreamContext->GetPos((PMMTIME)dwParam1);
                break;
            }

        case WODM_RESET:
        case WIDM_RESET:
            {
                dwRet = pStreamContext->Reset();
                break;
            }

        case WODM_WRITE:
        case WIDM_ADDBUFFER:
            {
                DEBUGMSG(ZONE_WIDM, (TEXT("WODM_WRITE/WIDM_ADDBUFFER, Buffer=0x%x\r\n"),dwParam1));
                dwRet = pStreamContext->QueueBuffer((LPWAVEHDR)dwParam1);
                break;
            }

        case WODM_GETVOLUME:
            {
                PULONG pdwGain = (PULONG)dwParam1;
                UINT NumDevs = g_pHWContext->GetNumOutputDevices();

                if (pStreamContext)
                {
                    *pdwGain = pStreamContext->GetGain();
                }
                else
                {
                    DeviceContext *pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);
                    *pdwGain = pDeviceContext->GetGain();
                }
                dwRet = MMSYSERR_NOERROR;
                break;
            }

        case WODM_SETVOLUME:
            {
                UINT NumDevs = g_pHWContext->GetNumOutputDevices();
                LONG dwGain = dwParam1;
                if (pStreamContext)
                {
                    dwRet = pStreamContext->SetGain(dwGain);
                }
                else
                {
                    DeviceContext *pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);
                    dwRet = pDeviceContext->SetGain(dwGain);
                }
                break;
            }

        case WODM_BREAKLOOP:
            {
                dwRet = pStreamContext->BreakLoop();
                break;
            }

        case WODM_SETPLAYBACKRATE:
            {
                WaveStreamContext *pWaveStream = (WaveStreamContext *)dwUser;
                dwRet = pWaveStream->SetRate(dwParam1);
                break;
            }

        case WODM_GETPLAYBACKRATE:
            {
                WaveStreamContext *pWaveStream = (WaveStreamContext *)dwUser;
                dwRet = pWaveStream->GetRate((DWORD *)dwParam1);
                break;
            }

        case MM_WOM_SETSECONDARYGAINCLASS:
            {
                if (pStreamContext)
                {
                    dwRet = pStreamContext->SetSecondaryGainClass(dwParam1);
                }
                else
                {
                    dwRet = MMSYSERR_INVALPARAM;
                }
                break;
            }

        case MM_WOM_SETSECONDARYGAINLIMIT:
            {
                DeviceContext *pDeviceContext;
                if (pStreamContext)
                {
                    pDeviceContext = pStreamContext->GetDeviceContext();
                }
                else
                {
                    pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);
                }
                dwRet = pDeviceContext->SetSecondaryGainLimit(dwParam1,dwParam2);
                break;
            }

        case MM_MOM_MIDIMESSAGE:
            {
                CMidiStream *pMidiStream = (CMidiStream *)dwUser;
                dwRet = pMidiStream->MidiMessage(dwParam1);
                break;
            }
    // unsupported messages
        case WODM_GETPITCH:
        case WODM_SETPITCH:
        case WODM_PREPARE:
        case WODM_UNPREPARE:
        case WIDM_PREPARE:
        case WIDM_UNPREPARE:
            default:
            dwRet  = MMSYSERR_NOTSUPPORTED;
        }
    }
    _except (EXCEPTION_EXECUTE_HANDLER)
    {
        dwRet  = MMSYSERR_INVALPARAM;
    }

    g_pHWContext->Unlock();

    // Pass the return code back via pBufOut
    if (pdwResult)
    {
        *pdwResult = dwRet;
    }

    return TRUE;
}
Esempio n. 2
0
//------------------------------------------------------------------------------
// process_MiscellaneousMessage, all messages not handled by the other message
//  handlers
//
BOOL
CAudioManager::process_AudioStreamMessage(
    PMMDRV_MESSAGE_PARAMS pParams,
    DWORD *pdwResult
)
{
    DEBUGMSG(ZONE_FUNCTION,
             (L"WAV:+process_AudioStreamMessage(uMsg=%d)\r\n", pParams->uMsg)
            );

    //  set the error code to be no error first
    SetLastError(MMSYSERR_NOERROR);

    CStreamManager *pStreamManager;
    WaveStreamContext *pWaveStream;


    PDWORD pdwGain;
    UINT uMsg = pParams->uMsg;
    UINT uDeviceId = pParams->uDeviceId;
    DWORD dwParam1 = pParams->dwParam1;
    DWORD dwParam2 = pParams->dwParam2;
    DWORD dwUser   = pParams->dwUser;
    StreamContext *pStreamContext = (StreamContext *)dwUser;
    DWORD dwRet=MMSYSERR_NOTSUPPORTED;

    switch (uMsg)
    {
    case WODM_SETVOLUME:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_SETVOLUME\r\n"));
        dwRet = (pStreamContext) ? pStreamContext->SetGain(dwParam1) :
                put_OutputGain(dwParam1);
        break;

    case WODM_RESTART:
    case WIDM_START:
        DEBUGMSG(ZONE_WODM|ZONE_WIDM, (L"WAV:WODM_RESTART/WIDM_START\r\n"));
        dwRet = pStreamContext->Run();
        break;

    case WODM_PAUSE:
    case WIDM_STOP:
        DEBUGMSG(ZONE_WODM|ZONE_WIDM, (L"WAV:WODM_PAUSE/WIDM_STOP\r\n"));
        dwRet = pStreamContext->Stop();
        break;

    case WODM_GETPOS:
    case WIDM_GETPOS:
        DEBUGMSG(ZONE_WODM|ZONE_WIDM, (L"WAV:WODM_GETPOS/WIDM_GETPOS\r\n"));
        dwRet = pStreamContext->GetPos((PMMTIME)dwParam1);
        break;

    case WODM_RESET:
    case WIDM_RESET:
        DEBUGMSG(ZONE_WODM|ZONE_WIDM, (L"WAV:WODM_RESET/WIDM_RESET\r\n"));
        dwRet = pStreamContext->Reset();
        break;

    case WODM_WRITE:
    case WIDM_ADDBUFFER:
        DEBUGMSG(ZONE_WODM|ZONE_WIDM,
                 (L"WAV:WODM_WRITE/WIDM_ADDBUFFER\r\n")
                );

        if(m_bSuspend==TRUE)
            dwRet=MMSYSERR_NOERROR;
        else
            dwRet = pStreamContext->QueueBuffer((LPWAVEHDR)dwParam1);

        break;

    case WODM_GETVOLUME:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_GETVOLUME\r\n"));
        pdwGain = (PDWORD)dwParam1;
        *pdwGain = (pStreamContext) ? pStreamContext->GetGain() :
                   get_OutputGain();

        dwRet = MMSYSERR_NOERROR;
        break;

    case WODM_BREAKLOOP:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_BREAKLOOP\r\n"));
        dwRet = pStreamContext->BreakLoop();
        break;

    case WODM_SETPLAYBACKRATE:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_SETPLAYBACKRATE\r\n"));
        pWaveStream = (WaveStreamContext *)dwUser;
        dwRet = pWaveStream->SetRate(dwParam1);
        break;

    case WODM_GETPLAYBACKRATE:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_GETPLAYBACKRATE\r\n"));
        pWaveStream = (WaveStreamContext *)dwUser;
        dwRet = pWaveStream->GetRate((DWORD *)dwParam1);
        break;

    case MM_WOM_FORCEQUALITY:
        DEBUGMSG(ZONE_WODM, (L"WAV:MM_WOM_FORCEQUALITY\r\n"));
        if (pStreamContext)
        {
            dwRet = pStreamContext->ForceQuality((BOOL)dwParam1);
        }
        else
        {
            dwRet = get_HardwareAudioBridge()->enable_WideBand(
                        (BOOL)dwParam1
                    );
        }
        break;

    case WODM_BT_SCO_AUDIO_CONTROL:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_BT_SCO_AUDIO_CONTROL\r\n"));
        get_HardwareAudioBridge()->notify_BTHeadsetAttached(
            pParams->dwParam2
        );
        dwRet = MMSYSERR_NOERROR;
        break;

    case WODM_CLOSE:
    case WIDM_CLOSE:
        DEBUGMSG(ZONE_WODM|ZONE_WIDM, (L"WAV:WIDM_CLOSE/WODM_CLOSE\r\n"));

        // Release stream context here, rather than inside
        // StreamContext::Close, so that if someone
        // has subclassed Close there's no chance that the object
        // will get released out from under them.
        //
        dwRet = pStreamContext->Close();
        if (dwRet == MMSYSERR_NOERROR)
        {
            pStreamContext->Release();
        }
        break;

    case WODM_OPEN:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_OPEN\r\n"));
        pStreamManager = get_OutputStreamManager(uDeviceId);
        dwRet = pStreamManager->open_Stream((LPWAVEOPENDESC)dwParam1,
                                            dwParam2, (StreamContext **)dwUser
                                           );
        break;

    case WIDM_OPEN:
        DEBUGMSG(ZONE_WODM, (L"WAV:WIDM_OPEN\r\n"));
        pStreamManager = get_InputStreamManager(uDeviceId);
        dwRet = pStreamManager->open_Stream((LPWAVEOPENDESC)dwParam1,
                                            dwParam2, (StreamContext **)dwUser
                                           );
        break;

    case WODM_GETDEVCAPS:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_GETDEVCAPS\r\n"));
        pStreamManager = (pStreamContext) ?
                         pStreamContext->GetStreamManager() :
                         get_OutputStreamManager(uDeviceId);

        dwRet = pStreamManager->get_DevCaps((PVOID)dwParam1, dwParam2);
        break;

    case WIDM_GETDEVCAPS:
        DEBUGMSG(ZONE_WIDM, (L"WAV:WIDM_GETDEVCAPS\r\n"));
        pStreamManager = (pStreamContext) ?
                         pStreamContext->GetStreamManager() :
                         get_InputStreamManager(uDeviceId);

        dwRet = pStreamManager->get_DevCaps((PVOID)dwParam1, dwParam2);
        break;

    case WODM_GETEXTDEVCAPS:
        DEBUGMSG(ZONE_WODM, (L"WAV:WODM_GETEXTDEVCAPS\r\n"));

        pStreamManager = (pStreamContext) ?
                         pStreamContext->GetStreamManager() :
                         get_OutputStreamManager(uDeviceId);

        dwRet = pStreamManager->get_ExtDevCaps((PVOID)dwParam1, dwParam2);
        break;

    case WIDM_GETNUMDEVS:
        DEBUGMSG(ZONE_WODM, (L"WAV:WIDM_GETNUMDEVS\r\n"));
        dwRet = get_InputDeviceCount();
        break;

    case WODM_GETNUMDEVS:
        DEBUGMSG(ZONE_WIDM, (L"WAV:WODM_GETNUMDEVS\r\n"));
        dwRet = get_OutputDeviceCount();
        break;

    case WODM_GETPROP:
    {
        // DEBUGMSG(ZONE_WODM, (TEXT("WODM_GETPROP\r\n")));

        PWAVEPROPINFO pPropInfo = (PWAVEPROPINFO) dwParam1;
        if (pStreamContext)
        {
            dwRet = pStreamContext->GetProperty(pPropInfo);
        }
        else
        {
            pStreamManager = get_OutputStreamManager(uDeviceId);
            dwRet = pStreamManager->GetProperty(pPropInfo);
        }
        break;
    }

    case WIDM_GETPROP:
    {
        // DEBUGMSG(ZONE_WODM, (TEXT("WIDM_GETPROP\r\n")));

        PWAVEPROPINFO pPropInfo = (PWAVEPROPINFO) dwParam1;
        if (pStreamContext)
        {
            dwRet = pStreamContext->GetProperty(pPropInfo);
        }
        else
        {
            pStreamManager = get_InputStreamManager(uDeviceId);
            dwRet = pStreamManager->GetProperty(pPropInfo);
        }
        break;
    }

    case WODM_SETPROP:
    {
        // DEBUGMSG(ZONE_WODM, (TEXT("WODM_SETPROP\r\n")));

        PWAVEPROPINFO pPropInfo = (PWAVEPROPINFO) dwParam1;
        if (pStreamContext)
        {
            dwRet = pStreamContext->SetProperty(pPropInfo);
        }
        else
        {
            pStreamManager = get_OutputStreamManager(uDeviceId);
            dwRet = pStreamManager->SetProperty(pPropInfo);
        }
        break;
    }

    case WIDM_SETPROP:
    {
        // DEBUGMSG(ZONE_WODM, (TEXT("WIDM_SETPROP\r\n")));

        PWAVEPROPINFO pPropInfo = (PWAVEPROPINFO) dwParam1;
        if (pStreamContext)
        {
            dwRet = pStreamContext->SetProperty(pPropInfo);
        }
        else
        {
            pStreamManager = get_InputStreamManager(uDeviceId);
            dwRet = pStreamManager->SetProperty(pPropInfo);
        }
        break;
    }

    case WODM_GETPITCH:
    case WODM_SETPITCH:
    case WODM_PREPARE:
    case WODM_UNPREPARE:
    case WIDM_PREPARE:
    case WIDM_UNPREPARE:
    default:
        dwRet  = MMSYSERR_NOTSUPPORTED;
    }

    if (pdwResult)
    {
        *pdwResult = dwRet;
    }

    DEBUGMSG(ZONE_FUNCTION,
             (L"WAV:-process_AudioStreamMessage(bResult=%d)\r\n", TRUE)
            );

    return TRUE;
}