Esempio n. 1
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;
}