DeviceService.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using NAudio.CoreAudioApi;
  2. using NT;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using Vinno.IUS.Common.Log;
  8. using Vinno.vCloud.Common.FIS.Device;
  9. using Vinno.vCloud.Push.Configuration;
  10. namespace Vinno.vCloud.FIS.Windows
  11. {
  12. class DeviceService : IDeviceService
  13. {
  14. /// <summary>
  15. /// Gets all video devices by NTSmartPublisherSDK.
  16. /// </summary>
  17. /// <returns></returns>
  18. public IEnumerable<VideoDeviceInfo> GetVideoDevices()
  19. {
  20. var cameraList = new List<VideoDeviceInfo>();
  21. try
  22. {
  23. Logger.WriteLineInfo("Begin init video devices.....");
  24. var deviceNum = 0;
  25. var ret = Environment.Is64BitProcess
  26. ? NTSmartPublisherSDK_x64.NT_PB_GetVideoCaptureDeviceNumber(ref deviceNum)
  27. : NTSmartPublisherSDK_x86.NT_PB_GetVideoCaptureDeviceNumber(ref deviceNum);
  28. if (NTBaseCodeDefine.NT_ERC_OK != ret)
  29. {
  30. Logger.WriteLineError("Get video device num failed.");
  31. }
  32. for (var i = 0; i < deviceNum; i++)
  33. {
  34. StringBuilder name = new StringBuilder(256);
  35. StringBuilder id = new StringBuilder(1024);
  36. ret = Environment.Is64BitProcess
  37. ? NTSmartPublisherSDK_x64.NT_PB_GetVideoCaptureDeviceInfo(i, name, 256, id, 1024)
  38. : NTSmartPublisherSDK_x86.NT_PB_GetVideoCaptureDeviceInfo(i, name, 256, id, 1024);
  39. if (NTBaseCodeDefine.NT_ERC_OK != ret)
  40. {
  41. Logger.WriteLineError("Get video device info failed.");
  42. }
  43. var capabilities = new List<NT_PB_VideoCaptureCapability>();
  44. var capabilityNum = 0;
  45. ret = Environment.Is64BitProcess
  46. ? NTSmartPublisherSDK_x64.NT_PB_GetVideoCaptureDeviceCapabilityNumber(
  47. id.ToString(), ref capabilityNum)
  48. : NTSmartPublisherSDK_x86.NT_PB_GetVideoCaptureDeviceCapabilityNumber(
  49. id.ToString(), ref capabilityNum);
  50. if (NTBaseCodeDefine.NT_ERC_OK != ret)
  51. {
  52. continue;
  53. }
  54. for (int j = 0; j < capabilityNum; ++j)
  55. {
  56. NT_PB_VideoCaptureCapability capability = new NT_PB_VideoCaptureCapability();
  57. ret = Environment.Is64BitProcess
  58. ? NTSmartPublisherSDK_x64.NT_PB_GetVideoCaptureDeviceCapability(
  59. id.ToString(), j, ref capability)
  60. : NTSmartPublisherSDK_x86.NT_PB_GetVideoCaptureDeviceCapability(
  61. id.ToString(), j, ref capability);
  62. if (NTBaseCodeDefine.NT_ERC_OK != ret)
  63. {
  64. break;
  65. }
  66. capabilities.Add(capability);
  67. }
  68. var deviceInfo = new VideoDeviceInfo(id.ToString(), name.ToString(), capabilities);
  69. cameraList.Add(deviceInfo);
  70. }
  71. Logger.WriteLineInfo("End init video devices.....");
  72. }
  73. catch(Exception ex)
  74. {
  75. Logger.WriteLineError($"Get video devices error {ex}");
  76. }
  77. return cameraList;
  78. }
  79. /// <summary>
  80. /// Get mic device list by NTSmartPublisherSDK
  81. /// </summary>
  82. /// <returns></returns>
  83. public IEnumerable<AudioDeviceInfo> GetMicDevices()
  84. {
  85. var micDevices = new List<AudioDeviceInfo>();
  86. var enumerator = new MMDeviceEnumerator();
  87. try
  88. {
  89. var deviceNum = 0;
  90. var ret = Environment.Is64BitProcess
  91. ? NTSmartPublisherSDK_x64.NT_PB_GetAuidoInputDeviceNumber(ref deviceNum)
  92. : NTSmartPublisherSDK_x86.NT_PB_GetAuidoInputDeviceNumber(ref deviceNum);
  93. if (NTBaseCodeDefine.NT_ERC_OK == ret)
  94. {
  95. for (int i = 0; i < deviceNum; ++i)
  96. {
  97. var deviceNameBuffer = new byte[512];
  98. var name = "";
  99. ret = Environment.Is64BitProcess
  100. ? NTSmartPublisherSDK_x64.NT_PB_GetAuidoInputDeviceName((uint)i, deviceNameBuffer, 512)
  101. : NTSmartPublisherSDK_x86.NT_PB_GetAuidoInputDeviceName((uint)i, deviceNameBuffer, 512);
  102. if (NTBaseCodeDefine.NT_ERC_OK == ret)
  103. {
  104. name = Encoding.UTF8.GetString(deviceNameBuffer).Replace("\0", string.Empty);
  105. micDevices.Add(new AudioDeviceInfo { Name = name });
  106. }
  107. }
  108. }
  109. var mics = enumerator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);
  110. foreach(var mic in micDevices)
  111. {
  112. var micItem = mics.FirstOrDefault(m => m.FriendlyName.Contains(mic.Name));
  113. if(micItem!= null)
  114. {
  115. mic.Id = micItem.ID;
  116. }
  117. }
  118. }
  119. catch (Exception e)
  120. {
  121. Logger.WriteLineError($"Get mic device error {e}");
  122. }
  123. finally
  124. {
  125. enumerator.Dispose();
  126. }
  127. return micDevices;
  128. }
  129. /// <summary>
  130. /// Gets the speaker device list.
  131. /// </summary>
  132. /// <returns></returns>
  133. public IEnumerable<AudioDeviceInfo> GetSpeakerDevices()
  134. {
  135. var speakderDevices = new List<AudioDeviceInfo>();
  136. var enumerator = new MMDeviceEnumerator();
  137. try
  138. {
  139. var speakers = enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active).ToList();
  140. speakderDevices.AddRange(speakers.Select(d => new AudioDeviceInfo { Id = d.ID, Name = d.FriendlyName }));
  141. }
  142. catch (Exception e)
  143. {
  144. Logger.WriteLineError($"Get speaker device error {e}");
  145. }
  146. finally
  147. {
  148. enumerator.Dispose();
  149. }
  150. return speakderDevices;
  151. }
  152. }
  153. }