audio_out_manager.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "audio_core/audio_core.h"
  4. #include "audio_core/audio_manager.h"
  5. #include "audio_core/audio_out_manager.h"
  6. #include "audio_core/out/audio_out.h"
  7. #include "core/core.h"
  8. #include "core/hle/kernel/k_event.h"
  9. #include "core/hle/service/audio/errors.h"
  10. namespace AudioCore::AudioOut {
  11. Manager::Manager(Core::System& system_) : system{system_} {
  12. std::iota(session_ids.begin(), session_ids.end(), 0);
  13. num_free_sessions = MaxOutSessions;
  14. }
  15. Result Manager::AcquireSessionId(size_t& session_id) {
  16. if (num_free_sessions == 0) {
  17. LOG_ERROR(Service_Audio, "All 12 Audio Out sessions are in use, cannot create any more");
  18. return Service::Audio::ERR_MAXIMUM_SESSIONS_REACHED;
  19. }
  20. session_id = session_ids[next_session_id];
  21. next_session_id = (next_session_id + 1) % MaxOutSessions;
  22. num_free_sessions--;
  23. return ResultSuccess;
  24. }
  25. void Manager::ReleaseSessionId(const size_t session_id) {
  26. std::scoped_lock l{mutex};
  27. LOG_DEBUG(Service_Audio, "Freeing AudioOut session {}", session_id);
  28. session_ids[free_session_id] = session_id;
  29. num_free_sessions++;
  30. free_session_id = (free_session_id + 1) % MaxOutSessions;
  31. sessions[session_id].reset();
  32. applet_resource_user_ids[session_id] = 0;
  33. }
  34. Result Manager::LinkToManager() {
  35. std::scoped_lock l{mutex};
  36. if (!linked_to_manager) {
  37. AudioManager& manager{system.AudioCore().GetAudioManager()};
  38. manager.SetOutManager(std::bind(&Manager::BufferReleaseAndRegister, this));
  39. linked_to_manager = true;
  40. }
  41. return ResultSuccess;
  42. }
  43. void Manager::Start() {
  44. if (sessions_started) {
  45. return;
  46. }
  47. std::scoped_lock l{mutex};
  48. for (auto& session : sessions) {
  49. if (session) {
  50. session->StartSession();
  51. }
  52. }
  53. sessions_started = true;
  54. }
  55. void Manager::BufferReleaseAndRegister() {
  56. std::scoped_lock l{mutex};
  57. for (auto& session : sessions) {
  58. if (session != nullptr) {
  59. session->ReleaseAndRegisterBuffers();
  60. }
  61. }
  62. }
  63. u32 Manager::GetAudioOutDeviceNames(
  64. std::vector<AudioRenderer::AudioDevice::AudioDeviceName>& names) const {
  65. names.emplace_back("DeviceOut");
  66. return 1;
  67. }
  68. } // namespace AudioCore::AudioOut