示例#1
0
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;
}
示例#2
0
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;
}