audio_controller.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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/audio_controller.h"
  5. #include "core/hle/service/cmif_serialization.h"
  6. #include "core/hle/service/ipc_helpers.h"
  7. #include "core/hle/service/set/system_settings_server.h"
  8. #include "core/hle/service/sm/sm.h"
  9. namespace Service::Audio {
  10. IAudioController::IAudioController(Core::System& system_)
  11. : ServiceFramework{system_, "audctl"}, service_context{system, "audctl"} {
  12. // clang-format off
  13. static const FunctionInfo functions[] = {
  14. {0, nullptr, "GetTargetVolume"},
  15. {1, nullptr, "SetTargetVolume"},
  16. {2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"},
  17. {3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"},
  18. {4, nullptr, "IsTargetMute"},
  19. {5, nullptr, "SetTargetMute"},
  20. {6, nullptr, "IsTargetConnected"},
  21. {7, nullptr, "SetDefaultTarget"},
  22. {8, nullptr, "GetDefaultTarget"},
  23. {9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"},
  24. {10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"},
  25. {11, nullptr, "SetForceMutePolicy"},
  26. {12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"},
  27. {13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"},
  28. {14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"},
  29. {15, nullptr, "SetOutputTarget"},
  30. {16, nullptr, "SetInputTargetForceEnabled"},
  31. {17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"},
  32. {18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"},
  33. {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
  34. {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
  35. {21, nullptr, "GetAudioOutputTargetForPlayReport"},
  36. {22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"},
  37. {23, nullptr, "SetSystemOutputMasterVolume"},
  38. {24, nullptr, "GetSystemOutputMasterVolume"},
  39. {25, nullptr, "GetAudioVolumeDataForPlayReport"},
  40. {26, nullptr, "UpdateHeadphoneSettings"},
  41. {27, nullptr, "SetVolumeMappingTableForDev"},
  42. {28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
  43. {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
  44. {30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"},
  45. {31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"},
  46. {32, nullptr, "GetActiveOutputTarget"},
  47. {33, nullptr, "GetTargetDeviceInfo"},
  48. {34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"},
  49. {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
  50. {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
  51. {37, nullptr, "SetHearingProtectionSafeguardEnabled"},
  52. {38, nullptr, "IsHearingProtectionSafeguardEnabled"},
  53. {39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"},
  54. {40, nullptr, "GetSystemInformationForDebug"},
  55. {41, nullptr, "SetVolumeButtonLongPressTime"},
  56. {42, nullptr, "SetNativeVolumeForDebug"},
  57. {10000, nullptr, "NotifyAudioOutputTargetForPlayReport"},
  58. {10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"},
  59. {10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"},
  60. {10100, nullptr, "GetAudioVolumeDataForPlayReport"},
  61. {10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"},
  62. {10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"},
  63. {10103, nullptr, "GetAudioOutputTargetForPlayReport"},
  64. {10104, nullptr, "GetAudioOutputChannelCountForPlayReport"},
  65. {10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
  66. {10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport"},
  67. {50000, nullptr, "SetAnalogInputBoostGainForPrototyping"},
  68. };
  69. // clang-format on
  70. RegisterHandlers(functions);
  71. m_set_sys =
  72. system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
  73. notification_event = service_context.CreateEvent("IAudioController:NotificationEvent");
  74. }
  75. IAudioController::~IAudioController() {
  76. service_context.CloseEvent(notification_event);
  77. };
  78. Result IAudioController::GetTargetVolumeMin(Out<s32> out_target_min_volume) {
  79. LOG_DEBUG(Audio, "called.");
  80. // This service function is currently hardcoded on the
  81. // actual console to this value (as of 8.0.0).
  82. *out_target_min_volume = 0;
  83. R_SUCCEED();
  84. }
  85. Result IAudioController::GetTargetVolumeMax(Out<s32> out_target_max_volume) {
  86. LOG_DEBUG(Audio, "called.");
  87. // This service function is currently hardcoded on the
  88. // actual console to this value (as of 8.0.0).
  89. *out_target_max_volume = 15;
  90. R_SUCCEED();
  91. }
  92. Result IAudioController::GetAudioOutputMode(Out<Set::AudioOutputMode> out_output_mode,
  93. Set::AudioOutputModeTarget target) {
  94. const auto result = m_set_sys->GetAudioOutputMode(out_output_mode, target);
  95. LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, *out_output_mode);
  96. R_RETURN(result);
  97. }
  98. Result IAudioController::SetAudioOutputMode(Set::AudioOutputModeTarget target,
  99. Set::AudioOutputMode output_mode) {
  100. LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
  101. R_RETURN(m_set_sys->SetAudioOutputMode(target, output_mode));
  102. }
  103. Result IAudioController::GetForceMutePolicy(Out<ForceMutePolicy> out_mute_policy) {
  104. LOG_WARNING(Audio, "(STUBBED) called");
  105. // Removed on FW 13.2.1+
  106. *out_mute_policy = ForceMutePolicy::Disable;
  107. R_SUCCEED();
  108. }
  109. Result IAudioController::GetOutputModeSetting(Out<Set::AudioOutputMode> out_output_mode,
  110. Set::AudioOutputModeTarget target) {
  111. LOG_WARNING(Audio, "(STUBBED) called, target={}", target);
  112. *out_output_mode = Set::AudioOutputMode::ch_7_1;
  113. R_SUCCEED();
  114. }
  115. Result IAudioController::SetOutputModeSetting(Set::AudioOutputModeTarget target,
  116. Set::AudioOutputMode output_mode) {
  117. LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
  118. R_SUCCEED();
  119. }
  120. Result IAudioController::SetHeadphoneOutputLevelMode(HeadphoneOutputLevelMode output_level_mode) {
  121. LOG_WARNING(Audio, "(STUBBED) called, output_level_mode={}", output_level_mode);
  122. R_SUCCEED();
  123. }
  124. Result IAudioController::GetHeadphoneOutputLevelMode(
  125. Out<HeadphoneOutputLevelMode> out_output_level_mode) {
  126. LOG_INFO(Audio, "called");
  127. *out_output_level_mode = HeadphoneOutputLevelMode::Normal;
  128. R_SUCCEED();
  129. }
  130. Result IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent() {
  131. LOG_WARNING(Service_Audio, "(STUBBED) called");
  132. R_SUCCEED();
  133. }
  134. Result IAudioController::SetSpeakerAutoMuteEnabled(bool is_speaker_auto_mute_enabled) {
  135. LOG_INFO(Audio, "called, is_speaker_auto_mute_enabled={}", is_speaker_auto_mute_enabled);
  136. R_RETURN(m_set_sys->SetSpeakerAutoMuteFlag(is_speaker_auto_mute_enabled));
  137. }
  138. Result IAudioController::IsSpeakerAutoMuteEnabled(Out<bool> out_is_speaker_auto_mute_enabled) {
  139. const auto result = m_set_sys->GetSpeakerAutoMuteFlag(out_is_speaker_auto_mute_enabled);
  140. LOG_INFO(Audio, "called, is_speaker_auto_mute_enabled={}", *out_is_speaker_auto_mute_enabled);
  141. R_RETURN(result);
  142. }
  143. Result IAudioController::AcquireTargetNotification(
  144. OutCopyHandle<Kernel::KReadableEvent> out_notification_event) {
  145. LOG_WARNING(Service_AM, "(STUBBED) called");
  146. *out_notification_event = &notification_event->GetReadableEvent();
  147. R_SUCCEED();
  148. }
  149. } // namespace Service::Audio