int OpenMixer_Win_MME(px_mixer *Px, int index) { HWAVEIN hWaveIn; HWAVEOUT hWaveOut; MMRESULT res; UINT deviceIn = UINT_MAX; UINT deviceOut = UINT_MAX; hWaveIn = PaWinMME_GetStreamInputHandle(Px->pa_stream, 0); hWaveOut = PaWinMME_GetStreamOutputHandle(Px->pa_stream, 0); if (hWaveIn) { res = mixerGetID((HMIXEROBJ) hWaveIn, &deviceIn, MIXER_OBJECTF_HWAVEIN); if (res != MMSYSERR_NOERROR) { return FALSE; } } if (hWaveOut) { res = mixerGetID((HMIXEROBJ) hWaveOut, &deviceOut, MIXER_OBJECTF_HWAVEOUT); if (res != MMSYSERR_NOERROR) { return FALSE; } } if (open_mixers(Px, deviceIn, deviceOut)) { return TRUE; } return FALSE; }
BOOL CMixOut::OpenMixer() { m_iDevNum = mixerGetNumDevs(); if (m_iDevNum == 0) { TRACE("There (is) are no device mixer.\n"); return FALSE; } WAVEFORMATEX wfx; memset( &wfx, 0, sizeof(WAVEFORMATEX) ); wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = 1; wfx.nSamplesPerSec = 8000; wfx.nAvgBytesPerSec = 1 * 8000 * 16 / 8; wfx.nBlockAlign = 16 * 1 / 8; wfx.wBitsPerSample = 16; wfx.cbSize = 0; HWAVEOUT hwaveOut; m_mmr = waveOutOpen( &hwaveOut, WAVE_MAPPER, &wfx, 0L, 0L, CALLBACK_NULL ); if ( m_mmr != MMSYSERR_NOERROR ) { return false; } else { m_mmr = mixerGetID( (HMIXEROBJ)hwaveOut, &m_uiMixerId, MIXER_OBJECTF_HWAVEOUT ); waveOutClose( hwaveOut ); if (m_mmr != MMSYSERR_NOERROR ) { return false; } } WNDCLASSEX wcx; memset( &wcx, 0, sizeof(WNDCLASSEX) ); wcx.cbSize = sizeof(WNDCLASSEX); wcx.lpszClassName = WND_CLASS_NAME; wcx.lpfnWndProc = (WNDPROC)MixerWndProc; ::RegisterClassEx(&wcx); m_hWnd = CreateWindow( WND_CLASS_NAME, WND_NAME, WS_POPUP | WS_DISABLED, 0, 0, 0, 0, NULL, NULL, NULL, NULL ); if ( !m_hWnd ) { return false; } ::ShowWindow(m_hWnd, SW_HIDE); m_mmr = mixerOpen( (LPHMIXER)&m_hMixer, m_uiMixerId, (DWORD)m_hWnd, 0L, CALLBACK_WINDOW ); if (m_mmr != MMSYSERR_NOERROR ) { ::DestroyWindow( m_hWnd ); return false; } return true; }
bool CVolumeOutMaster::Init() { if ( !mixerGetNumDevs() ) return false; // Getting Mixer ID HWAVEOUT hwaveOut; MMRESULT mmResult; WAVEFORMATEX WaveFmt; SetDeviceType( &WaveFmt ); mmResult = waveOutOpen( &hwaveOut, WAVE_MAPPER, &WaveFmt, 0L, 0L, CALLBACK_NULL ); if ( mmResult != MMSYSERR_NOERROR ) { qDebug(".MasterOutputVolume: FAILURE: Could not open WaveOut Mapper. mmResult=%d\n", mmResult ); return false; } else { mmResult = mixerGetID( (HMIXEROBJ)hwaveOut, &m_uMixerID, MIXER_OBJECTF_HWAVEOUT ); waveOutClose( hwaveOut ); if ( mmResult != MMSYSERR_NOERROR ) { qDebug(".MasterOutputVolume: FAILURE: WaveOut Mapper in Mixer is not available. mmResult=%d\n", mmResult ); return false; } } //////////////// Exposing Window to Mixer //////////////WNDCLASSEX wcx; //////////////memset( &wcx, 0, sizeof(WNDCLASSEX) ); //////////////wcx.cbSize = sizeof(WNDCLASSEX); //////////////wcx.lpszClassName = _T(WND_CLASS_NAME); //////////////wcx.lpfnWndProc = (WNDPROC)MixerWndProc; //////////////::RegisterClassEx(&wcx); //////////////m_hWnd = CreateWindow(_T(WND_CLASS_NAME), ////////////// _T(WND_NAME), ////////////// WS_POPUP | WS_DISABLED, ////////////// 0, 0, 0, 0, ////////////// NULL, NULL, NULL, NULL ); //////////////if ( !m_hWnd ) //////////////{ ////////////// qDebug(".MasterOutputVolume: FAILURE: Could not create internal window.\n" ); ////////////// return false; //////////////} //////////////::ShowWindow(m_hWnd, SW_HIDE); //////////////mmResult = mixerOpen( (LPHMIXER)&m_dwMixerHandle, m_uMixerID, (DWORD)m_hWnd, 0L, CALLBACK_WINDOW ); mmResult = mixerOpen( (LPHMIXER)&m_dwMixerHandle, m_uMixerID, NULL, 0L, CALLBACK_NULL ); if ( mmResult != MMSYSERR_NOERROR ) { qDebug(".MasterOutputVolume: FAILURE: Could not open Mixer. mmResult=%d\n", mmResult ); //////////////::DestroyWindow( m_hWnd ); return false; } return true; }
int open_mixers(px_mixer *Px, UINT deviceIn, UINT deviceOut) { PxInfo*info; MMRESULT res; OSVERSIONINFO verInfo; memset(&verInfo, 0, sizeof(verInfo)); verInfo.dwOSVersionInfoSize = sizeof(verInfo); GetVersionEx(&verInfo); if (verInfo.dwMajorVersion >= 6) { return open_ep_mixers(Px, deviceIn, deviceOut); } res = mixerGetID((HMIXEROBJ) (deviceIn == WAVE_MAPPER ? 0 : deviceIn), &deviceIn, MIXER_OBJECTF_WAVEIN); if (res != MMSYSERR_NOERROR) { return FALSE; } res = mixerGetID((HMIXEROBJ) (deviceOut == WAVE_MAPPER ? 0 : deviceOut), &deviceOut, MIXER_OBJECTF_WAVEIN); if (res != MMSYSERR_NOERROR) { return FALSE; } if (!initialize(Px)) { return FALSE; } info = (PxInfo *) Px->info; info->hInputMixer = NULL; info->hOutputMixer = NULL; info->numInputs = 0; info->muxID = 0; info->speakerID = 0; info->waveID = 0; if (deviceIn != UINT_MAX) { res = mixerOpen((LPHMIXER) &info->hInputMixer, deviceIn, 0, 0, MIXER_OBJECTF_MIXER); if (res != MMSYSERR_NOERROR) { return cleanup(Px); } info->muxID = find_ctrl(info->hInputMixer, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, MIXERCONTROL_CONTROLTYPE_MUX); if (info->muxID == -1) { info->muxID = find_ctrl(info->hInputMixer, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, MIXERCONTROL_CONTROLTYPE_MIXER); } info->numInputs = get_ctrls(info->hInputMixer, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, &info->src); if (info->numInputs == 0) { return cleanup(Px); } } if (deviceOut != UINT_MAX) { res = mixerOpen((LPHMIXER) &info->hOutputMixer, deviceOut, 0, 0, MIXER_OBJECTF_MIXER); if (res != MMSYSERR_NOERROR) { return cleanup(Px); } info->speakerID = find_ctrl(info->hOutputMixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, MIXERCONTROL_CONTROLTYPE_VOLUME); info->waveID = find_ctrl(info->hOutputMixer, MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT, MIXERCONTROL_CONTROLTYPE_VOLUME); info->numOutputs = get_ctrls(info->hOutputMixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, &info->dst); if (info->numOutputs == 0) { return cleanup(Px); } } return TRUE; }
BOOL CVolumeCtrl::EnumerateInputLines( DWORD dwDeviceID, PINPUTLINEPROC pUserCallback, DWORD dwUserValue ) { if (!pUserCallback) { return FALSE; } MMRESULT mmResult; HWAVEIN hwaveIn; WAVEFORMATEX WaveFmt; SetDeviceType( &WaveFmt ); mmResult = waveInOpen( &hwaveIn, dwDeviceID, &WaveFmt, 0L, 0L, CALLBACK_NULL ); if ( mmResult != MMSYSERR_NOERROR ) { return FALSE; } UINT uMixerID; DWORD dwMixerHandle; mmResult = mixerGetID( (HMIXEROBJ)hwaveIn, &uMixerID, MIXER_OBJECTF_HWAVEIN ); waveInClose( hwaveIn ); if ( mmResult != MMSYSERR_NOERROR ) { return FALSE; } mmResult = mixerOpen( (LPHMIXER)&dwMixerHandle, uMixerID, 0L, 0L, 0L ); if ( mmResult != MMSYSERR_NOERROR ) { mixerClose( (HMIXER)dwMixerHandle ); return FALSE; } MIXERLINE MixerLine; memset( &MixerLine, 0, sizeof(MIXERLINE) ); MixerLine.cbStruct = sizeof(MIXERLINE); MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN; mmResult = mixerGetLineInfo( (HMIXEROBJ)dwMixerHandle, &MixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE ); if ( mmResult != MMSYSERR_NOERROR ) { mixerClose( (HMIXER)dwMixerHandle ); return FALSE; } MIXERLINE Line; for ( UINT uLineIndex = 0; uLineIndex < MixerLine.cConnections; uLineIndex++ ) { memset( &Line, 0, sizeof(MIXERLINE) ); Line.cbStruct = sizeof(MIXERLINE); Line.dwDestination = MixerLine.dwDestination; Line.dwSource = uLineIndex; mmResult = mixerGetLineInfo( (HMIXEROBJ)dwMixerHandle, &Line, MIXER_GETLINEINFOF_SOURCE ); if ( mmResult != MMSYSERR_NOERROR ) { mixerClose( (HMIXER)dwMixerHandle ); return FALSE; } if ( !((*pUserCallback)( uLineIndex, &Line, dwUserValue )) ) { break; } } mixerClose( (HMIXER)dwMixerHandle ); return TRUE; }
BOOL CVolumeCtrl::Init() { if (!mixerGetNumDevs()) { return FALSE; } HWAVEIN hwaveIn; MMRESULT mmResult; WAVEFORMATEX WaveFmt; SetDeviceType( &WaveFmt ); mmResult = waveInOpen(&hwaveIn, m_dwDeviceID, &WaveFmt, 0L, 0L, CALLBACK_NULL); if (mmResult != MMSYSERR_NOERROR) { return FALSE; } else { // 得到混响器的标识号 mmResult = mixerGetID((HMIXEROBJ)hwaveIn, &m_uMixerID, MIXER_OBJECTF_HWAVEIN); waveInClose(hwaveIn); if (mmResult != MMSYSERR_NOERROR ) { return FALSE; } } // Exposing Window to Mixer WNDCLASSEX wcx; memset( &wcx, 0, sizeof(WNDCLASSEX) ); wcx.cbSize = sizeof(WNDCLASSEX); wcx.lpszClassName = WND_CLASS_NAME; wcx.lpfnWndProc = (WNDPROC)MixerWndProc; ::RegisterClassEx(&wcx); m_hWnd = CreateWindow(WND_CLASS_NAME, WND_NAME, WS_POPUP | WS_DISABLED, 0, 0, 0, 0, NULL, NULL, NULL, NULL ); if (!m_hWnd) { return FALSE; } ::ShowWindow(m_hWnd, SW_HIDE); ::UpdateWindow(m_hWnd); // // 打开混响器设备 // 参数: // m_dwMixerHandle--混响器设备的句柄 // m_uMixerID--为混响器的标识号,用于指定要打开的混响器设备 // mmResult = mixerOpen( (LPHMIXER)&m_dwMixerHandle, m_uMixerID, (DWORD)m_hWnd, 0L, CALLBACK_WINDOW ); if (mmResult != MMSYSERR_NOERROR || m_uMixerID == -1) { ::DestroyWindow( m_hWnd ); return FALSE; } return TRUE; }