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; }
//------------------------------------------------------------------------------ // 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; }