audctl.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "common/logging/log.h"
  4. #include "core/hle/service/audio/audctl.h"
  5. #include "core/hle/service/ipc_helpers.h"
  6. #include "core/hle/service/set/system_settings_server.h"
  7. #include "core/hle/service/sm/sm.h"
  8. namespace Service::Audio {
  9. AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} {
  10. // clang-format off
  11. static const FunctionInfo functions[] = {
  12. {0, nullptr, "GetTargetVolume"},
  13. {1, nullptr, "SetTargetVolume"},
  14. {2, &AudCtl::GetTargetVolumeMin, "GetTargetVolumeMin"},
  15. {3, &AudCtl::GetTargetVolumeMax, "GetTargetVolumeMax"},
  16. {4, nullptr, "IsTargetMute"},
  17. {5, nullptr, "SetTargetMute"},
  18. {6, nullptr, "IsTargetConnected"},
  19. {7, nullptr, "SetDefaultTarget"},
  20. {8, nullptr, "GetDefaultTarget"},
  21. {9, &AudCtl::GetAudioOutputMode, "GetAudioOutputMode"},
  22. {10, &AudCtl::SetAudioOutputMode, "SetAudioOutputMode"},
  23. {11, nullptr, "SetForceMutePolicy"},
  24. {12, &AudCtl::GetForceMutePolicy, "GetForceMutePolicy"},
  25. {13, &AudCtl::GetOutputModeSetting, "GetOutputModeSetting"},
  26. {14, &AudCtl::SetOutputModeSetting, "SetOutputModeSetting"},
  27. {15, nullptr, "SetOutputTarget"},
  28. {16, nullptr, "SetInputTargetForceEnabled"},
  29. {17, &AudCtl::SetHeadphoneOutputLevelMode, "SetHeadphoneOutputLevelMode"},
  30. {18, &AudCtl::GetHeadphoneOutputLevelMode, "GetHeadphoneOutputLevelMode"},
  31. {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
  32. {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
  33. {21, nullptr, "GetAudioOutputTargetForPlayReport"},
  34. {22, nullptr, "NotifyHeadphoneVolumeWarningDisplayedEvent"},
  35. {23, nullptr, "SetSystemOutputMasterVolume"},
  36. {24, nullptr, "GetSystemOutputMasterVolume"},
  37. {25, nullptr, "GetAudioVolumeDataForPlayReport"},
  38. {26, nullptr, "UpdateHeadphoneSettings"},
  39. {27, nullptr, "SetVolumeMappingTableForDev"},
  40. {28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
  41. {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
  42. {30, &AudCtl::SetSpeakerAutoMuteEnabled, "SetSpeakerAutoMuteEnabled"},
  43. {31, &AudCtl::IsSpeakerAutoMuteEnabled, "IsSpeakerAutoMuteEnabled"},
  44. {32, nullptr, "GetActiveOutputTarget"},
  45. {33, nullptr, "GetTargetDeviceInfo"},
  46. {34, nullptr, "AcquireTargetNotification"},
  47. {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
  48. {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
  49. {37, nullptr, "SetHearingProtectionSafeguardEnabled"},
  50. {38, nullptr, "IsHearingProtectionSafeguardEnabled"},
  51. {39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"},
  52. {40, nullptr, "GetSystemInformationForDebug"},
  53. {41, nullptr, "SetVolumeButtonLongPressTime"},
  54. {42, nullptr, "SetNativeVolumeForDebug"},
  55. {10000, nullptr, "NotifyAudioOutputTargetForPlayReport"},
  56. {10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"},
  57. {10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"},
  58. {10100, nullptr, "GetAudioVolumeDataForPlayReport"},
  59. {10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"},
  60. {10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"},
  61. {10103, nullptr, "GetAudioOutputTargetForPlayReport"},
  62. {10104, nullptr, "GetAudioOutputChannelCountForPlayReport"},
  63. {10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
  64. {10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport"},
  65. {50000, nullptr, "SetAnalogInputBoostGainForPrototyping"},
  66. };
  67. // clang-format on
  68. RegisterHandlers(functions);
  69. m_set_sys =
  70. system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
  71. }
  72. AudCtl::~AudCtl() = default;
  73. void AudCtl::GetTargetVolumeMin(HLERequestContext& ctx) {
  74. LOG_DEBUG(Audio, "called.");
  75. // This service function is currently hardcoded on the
  76. // actual console to this value (as of 8.0.0).
  77. constexpr s32 target_min_volume = 0;
  78. IPC::ResponseBuilder rb{ctx, 3};
  79. rb.Push(ResultSuccess);
  80. rb.Push(target_min_volume);
  81. }
  82. void AudCtl::GetTargetVolumeMax(HLERequestContext& ctx) {
  83. LOG_DEBUG(Audio, "called.");
  84. // This service function is currently hardcoded on the
  85. // actual console to this value (as of 8.0.0).
  86. constexpr s32 target_max_volume = 15;
  87. IPC::ResponseBuilder rb{ctx, 3};
  88. rb.Push(ResultSuccess);
  89. rb.Push(target_max_volume);
  90. }
  91. void AudCtl::GetAudioOutputMode(HLERequestContext& ctx) {
  92. IPC::RequestParser rp{ctx};
  93. const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()};
  94. Set::AudioOutputMode output_mode{};
  95. const auto result = m_set_sys->GetAudioOutputMode(output_mode, target);
  96. LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
  97. IPC::ResponseBuilder rb{ctx, 3};
  98. rb.Push(result);
  99. rb.PushEnum(output_mode);
  100. }
  101. void AudCtl::SetAudioOutputMode(HLERequestContext& ctx) {
  102. IPC::RequestParser rp{ctx};
  103. const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()};
  104. const auto output_mode{rp.PopEnum<Set::AudioOutputMode>()};
  105. const auto result = m_set_sys->SetAudioOutputMode(target, output_mode);
  106. LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
  107. IPC::ResponseBuilder rb{ctx, 2};
  108. rb.Push(result);
  109. }
  110. void AudCtl::GetForceMutePolicy(HLERequestContext& ctx) {
  111. LOG_WARNING(Audio, "(STUBBED) called");
  112. IPC::ResponseBuilder rb{ctx, 3};
  113. rb.Push(ResultSuccess);
  114. rb.PushEnum(ForceMutePolicy::Disable);
  115. }
  116. void AudCtl::GetOutputModeSetting(HLERequestContext& ctx) {
  117. IPC::RequestParser rp{ctx};
  118. const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()};
  119. LOG_WARNING(Audio, "(STUBBED) called, target={}", target);
  120. IPC::ResponseBuilder rb{ctx, 3};
  121. rb.Push(ResultSuccess);
  122. rb.PushEnum(Set::AudioOutputMode::ch_7_1);
  123. }
  124. void AudCtl::SetOutputModeSetting(HLERequestContext& ctx) {
  125. IPC::RequestParser rp{ctx};
  126. const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()};
  127. const auto output_mode{rp.PopEnum<Set::AudioOutputMode>()};
  128. LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
  129. IPC::ResponseBuilder rb{ctx, 2};
  130. rb.Push(ResultSuccess);
  131. }
  132. void AudCtl::SetHeadphoneOutputLevelMode(HLERequestContext& ctx) {
  133. LOG_WARNING(Audio, "(STUBBED) called");
  134. IPC::ResponseBuilder rb{ctx, 2};
  135. rb.Push(ResultSuccess);
  136. }
  137. void AudCtl::GetHeadphoneOutputLevelMode(HLERequestContext& ctx) {
  138. LOG_WARNING(Audio, "(STUBBED) called");
  139. IPC::ResponseBuilder rb{ctx, 3};
  140. rb.Push(ResultSuccess);
  141. rb.PushEnum(HeadphoneOutputLevelMode::Normal);
  142. }
  143. void AudCtl::SetSpeakerAutoMuteEnabled(HLERequestContext& ctx) {
  144. IPC::RequestParser rp{ctx};
  145. const auto is_speaker_auto_mute_enabled{rp.Pop<bool>()};
  146. LOG_WARNING(Audio, "(STUBBED) called, is_speaker_auto_mute_enabled={}",
  147. is_speaker_auto_mute_enabled);
  148. const auto result = m_set_sys->SetSpeakerAutoMuteFlag(is_speaker_auto_mute_enabled);
  149. IPC::ResponseBuilder rb{ctx, 2};
  150. rb.Push(result);
  151. }
  152. void AudCtl::IsSpeakerAutoMuteEnabled(HLERequestContext& ctx) {
  153. bool is_speaker_auto_mute_enabled{};
  154. const auto result = m_set_sys->GetSpeakerAutoMuteFlag(is_speaker_auto_mute_enabled);
  155. LOG_WARNING(Audio, "(STUBBED) called, is_speaker_auto_mute_enabled={}",
  156. is_speaker_auto_mute_enabled);
  157. IPC::ResponseBuilder rb{ctx, 3};
  158. rb.Push(result);
  159. rb.Push<u8>(is_speaker_auto_mute_enabled);
  160. }
  161. } // namespace Service::Audio