AudioOutManager.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Ryujinx.Audio;
  2. using Ryujinx.Audio.Common;
  3. using Ryujinx.Audio.Output;
  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 AudioOutManager : IAudioOutManager
  13. {
  14. private readonly AudioOutputManager _impl;
  15. public AudioOutManager(AudioOutputManager impl)
  16. {
  17. _impl = impl;
  18. }
  19. [CmifCommand(0)]
  20. public Result ListAudioOuts(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<DeviceName> names)
  21. {
  22. string[] deviceNames = _impl.ListAudioOuts();
  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 OpenAudioOut(
  36. out AudioOutputConfiguration outputConfig,
  37. out IAudioOut audioOut,
  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.OpenAudioOut(
  47. out string outputDeviceName,
  48. out outputConfig,
  49. out AudioOutputSystem outSystem,
  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. audioOut = new AudioOut(outSystem, processHandle);
  59. return new Result((int)rc);
  60. }
  61. [CmifCommand(2)] // 3.0.0+
  62. public Result ListAudioOutsAuto(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.AutoSelect)] Span<DeviceName> names)
  63. {
  64. return ListAudioOuts(out count, names);
  65. }
  66. [CmifCommand(3)] // 3.0.0+
  67. public Result OpenAudioOutAuto(
  68. out AudioOutputConfiguration outputConfig,
  69. out IAudioOut audioOut,
  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 OpenAudioOut(out outputConfig, out audioOut, outName, parameter, appletResourceId, processHandle, name, pid);
  78. }
  79. }
  80. }