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