AudioInManager.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using Ryujinx.Audio;
  2. using Ryujinx.Audio.Common;
  3. using Ryujinx.Audio.Input;
  4. using Ryujinx.Horizon.Common;
  5. using Ryujinx.Horizon.Sdk.Applet;
  6. using Ryujinx.Horizon.Sdk.Sf;
  7. using Ryujinx.Horizon.Sdk.Sf.Hipc;
  8. using Ryujinx.Memory;
  9. using System;
  10. namespace Ryujinx.Horizon.Sdk.Audio.Detail
  11. {
  12. partial class AudioInManager : IAudioInManager
  13. {
  14. private readonly AudioInputManager _impl;
  15. public AudioInManager(AudioInputManager impl)
  16. {
  17. _impl = impl;
  18. }
  19. [CmifCommand(0)]
  20. public Result ListAudioIns(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<DeviceName> names)
  21. {
  22. string[] deviceNames = _impl.ListAudioIns(filtered: false);
  23. count = 0;
  24. foreach (string deviceName in deviceNames)
  25. {
  26. if (count >= names.Length)
  27. {
  28. break;
  29. }
  30. names[count++] = new DeviceName(deviceName);
  31. }
  32. return Result.Success;
  33. }
  34. [CmifCommand(1)]
  35. public Result OpenAudioIn(
  36. out AudioOutputConfiguration outputConfiguration,
  37. out IAudioIn audioIn,
  38. [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<DeviceName> outName,
  39. AudioInputConfiguration parameter,
  40. AppletResourceUserId appletResourceId,
  41. [CopyHandle] int processHandle,
  42. [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan<DeviceName> name,
  43. [ClientProcessId] ulong pid)
  44. {
  45. IVirtualMemoryManager clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle);
  46. ResultCode rc = _impl.OpenAudioIn(
  47. out string outputDeviceName,
  48. out outputConfiguration,
  49. out AudioInputSystem inSystem,
  50. clientMemoryManager,
  51. name.Length > 0 ? name[0].ToString() : string.Empty,
  52. SampleFormat.PcmInt16,
  53. ref parameter);
  54. if (rc == ResultCode.Success && outName.Length > 0)
  55. {
  56. outName[0] = new DeviceName(outputDeviceName);
  57. }
  58. audioIn = new AudioIn(inSystem, processHandle);
  59. return new Result((int)rc);
  60. }
  61. [CmifCommand(2)] // 3.0.0+
  62. public Result ListAudioInsAuto(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.AutoSelect)] Span<DeviceName> names)
  63. {
  64. return ListAudioIns(out count, names);
  65. }
  66. [CmifCommand(3)] // 3.0.0+
  67. public Result OpenAudioInAuto(
  68. out AudioOutputConfiguration outputConfig,
  69. out IAudioIn audioIn,
  70. [Buffer(HipcBufferFlags.Out | HipcBufferFlags.AutoSelect)] Span<DeviceName> outName,
  71. AudioInputConfiguration parameter,
  72. AppletResourceUserId appletResourceId,
  73. [CopyHandle] int processHandle,
  74. [Buffer(HipcBufferFlags.In | HipcBufferFlags.AutoSelect)] ReadOnlySpan<DeviceName> name,
  75. [ClientProcessId] ulong pid)
  76. {
  77. return OpenAudioIn(out outputConfig, out audioIn, outName, parameter, appletResourceId, processHandle, name, pid);
  78. }
  79. [CmifCommand(4)] // 3.0.0+
  80. public Result ListAudioInsAutoFiltered(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.AutoSelect)] Span<DeviceName> names)
  81. {
  82. string[] deviceNames = _impl.ListAudioIns(filtered: true);
  83. count = 0;
  84. foreach (string deviceName in deviceNames)
  85. {
  86. if (count >= names.Length)
  87. {
  88. break;
  89. }
  90. names[count++] = new DeviceName(deviceName);
  91. }
  92. return Result.Success;
  93. }
  94. [CmifCommand(5)] // 5.0.0+
  95. public Result OpenAudioInProtocolSpecified(
  96. out AudioOutputConfiguration outputConfig,
  97. out IAudioIn audioIn,
  98. [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<DeviceName> outName,
  99. AudioInProtocol protocol,
  100. AudioInputConfiguration parameter,
  101. AppletResourceUserId appletResourceId,
  102. [CopyHandle] int processHandle,
  103. [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan<DeviceName> name,
  104. [ClientProcessId] ulong pid)
  105. {
  106. // NOTE: We always assume that only the default device will be plugged (we never report any USB Audio Class type devices).
  107. return OpenAudioIn(out outputConfig, out audioIn, outName, parameter, appletResourceId, processHandle, name, pid);
  108. }
  109. }
  110. }