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; }
int OpenMixer_Win_DirectSound(px_mixer *Px, int index) { DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_DATA desc; HMODULE hDsound = INVALID_HANDLE_VALUE; GCO DllGetClassObject; IClassFactory *pcf = NULL; IKsPropertySet *pps = NULL; HRESULT hr; ULONG bytes; LPGUID guidIn; LPGUID guidOut; UINT deviceIn = -1; UINT deviceOut = -1; guidIn = PaWinDS_GetStreamInputGUID(Px->pa_stream); guidOut = PaWinDS_GetStreamOutputGUID(Px->pa_stream); do { hDsound = LoadLibrary("dsound.dll"); if (hDsound == NULL) { break; } DllGetClassObject = (GCO) GetProcAddress(hDsound, "DllGetClassObject"); if (DllGetClassObject == NULL) { break; } hr = DllGetClassObject(&CLSID_DirectSoundPrivate, &IID_IClassFactory, (void **)(&pcf)); if (hr || pcf == NULL) { break; } hr = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet, (void **)(&pps)); if (hr || pps == NULL) { break; } if (guidIn) { memcpy(&desc.DeviceId, guidIn, sizeof(desc.DeviceId)); desc.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE; hr = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION, NULL, 0, &desc, sizeof(desc), &bytes); if (FAILED(hr)) { break; } deviceIn = desc.WaveDeviceId; } if (guidOut) { memcpy(&desc.DeviceId, guidOut, sizeof(desc.DeviceId)); desc.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; hr = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION, NULL, 0, &desc, sizeof(desc), &bytes); if (FAILED(hr)) { break; } deviceOut = desc.WaveDeviceId; } if (open_mixers(Px, deviceIn, deviceOut)) { return TRUE; } } while( FALSE ); if (pps) { IUnknown_Release(pps); } if (pcf) { IUnknown_Release(pcf); } if (hDsound != INVALID_HANDLE_VALUE) { FreeLibrary(hDsound); } return FALSE; }