private void OnDeviceStateCallBack(AudioDeviceChangeData audioDeviceData) { switch (audioDeviceData.DeviceState) { case AudioDeviceState.DEVICE_STATE_ACTIVE: case AudioDeviceState.DEVICE_STATE_NOTPRESENT: case AudioDeviceState.DEVICE_STATE_DISABLED: case AudioDeviceState.DEVICE_STATE_UNPLUGGED: UnInitializeAudioDevice(); InitializeAudioDevice(); break; default: break; } }
/// <summary> /// The Audio Device Change event and collect audio data to client /// </summary> /// <param name="deviceId"></param> /// <param name="newState"></param> private void OnAudioDeviceChange(string deviceId, Enums.AudioDeviceState newState) { System.Threading.Tasks.Task.Factory.StartNew(() => { int propCnt = -1; AudioDeviceChangeData audioData = new AudioDeviceChangeData() { DeviceState = newState }; PropertyKey proKey; PropVariant proVar; COMResult comRev; comRev = _deviceEnumerator.GetDevice(deviceId, out IMMDevice device); comRev = device.OpenPropertyStore(Enums.StorageAccessMode.STGM_READ, out IPropertyStore ppp); comRev = ppp.GetCount(out propCnt); for (int j = 0; j < propCnt; j++) { try { //Get values //TODO:use keys get you want data comRev = ppp.GetAt(j, out proKey); comRev = ppp.GetValue(ref proKey, out proVar); if (proVar.DataType == System.Runtime.InteropServices.VarEnum.VT_LPWSTR || proVar.DataType == System.Runtime.InteropServices.VarEnum.VT_LPSTR) { #if DEBUG if (proVar.Value != null) { //OmenCommonLib.Utilities.OMENEventSource.Log.Info("OnAudioDeviceChange: " + proKey.formatId.ToString() + "[" + proKey.propertyId + "]=" + proVar.Value.ToString()); } #endif if (proKey.formatId.ToString().Equals(PKEY_AUDIOENDPOINT_JACKSUBTYPE.formatId.ToString()) && proKey.propertyId == PKEY_AUDIOENDPOINT_JACKSUBTYPE.propertyId) { audioData.PKEY_AudioEndpoint_JackSubType = proVar.Value.ToString(); } if (proKey.formatId.ToString().Equals(PKEY_AUDIOENDPOINT_INTERFACE.formatId.ToString()) && proKey.propertyId == PKEY_AUDIOENDPOINT_INTERFACE.propertyId) { audioData.PKEY_AudioEndPoint_Interface = proVar.Value.ToString(); } if (proKey.formatId.ToString().Equals(PKEY_AUDIOENDPOINT_NAME.formatId.ToString()) && proKey.propertyId == PKEY_AUDIOENDPOINT_NAME.propertyId) { audioData.PKEY_AudioEndpoint_Name = proVar.Value.ToString(); } if (proKey.formatId.ToString().Equals(PKEY_AUDIOENDPOINT_HWID.formatId.ToString()) && proKey.propertyId == PKEY_AUDIOENDPOINT_HWID.propertyId) { audioData.PKEY_AudioEndpoint_HWID = proVar.Value.ToString(); } if (proKey.formatId.ToString().Equals(PKEY_AUDIOENDPOINT_INFO.formatId.ToString()) && proKey.propertyId == PKEY_AUDIOENDPOINT_INFO.propertyId) { audioData.PKEY_AudioEndpoint_Info = proVar.Value.ToString(); } if (proKey.formatId.ToString().Equals(PKEY_AUDIOENDPOINT_FULL_NAME.formatId.ToString()) && proKey.propertyId == PKEY_AUDIOENDPOINT_FULL_NAME.propertyId) { audioData.PKEY_audioendpoint_full_name = proVar.Value.ToString(); _deviceChangeCallBack?.Invoke(audioData); break; } } } catch (Exception) { //Some reason Microphone will occur exception. } } }); }