audio_in_manager.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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_in_manager.h"
  5. #include "audio_core/audio_manager.h"
  6. #include "audio_core/in/audio_in.h"
  7. #include "audio_core/sink/sink_details.h"
  8. #include "common/settings.h"
  9. #include "core/core.h"
  10. #include "core/hle/service/audio/errors.h"
  11. namespace AudioCore::AudioIn {
  12. Manager::Manager(Core::System& system_) : system{system_} {
  13. std::iota(session_ids.begin(), session_ids.end(), 0);
  14. num_free_sessions = MaxInSessions;
  15. }
  16. Result Manager::AcquireSessionId(size_t& session_id) {
  17. if (num_free_sessions == 0) {
  18. LOG_ERROR(Service_Audio, "All 4 AudioIn sessions are in use, cannot create any more");
  19. return Service::Audio::ResultOutOfSessions;
  20. }
  21. session_id = session_ids[next_session_id];
  22. next_session_id = (next_session_id + 1) % MaxInSessions;
  23. num_free_sessions--;
  24. return ResultSuccess;
  25. }
  26. void Manager::ReleaseSessionId(const size_t session_id) {
  27. std::scoped_lock l{mutex};
  28. LOG_DEBUG(Service_Audio, "Freeing AudioIn session {}", session_id);
  29. session_ids[free_session_id] = session_id;
  30. num_free_sessions++;
  31. free_session_id = (free_session_id + 1) % MaxInSessions;
  32. sessions[session_id].reset();
  33. applet_resource_user_ids[session_id] = 0;
  34. }
  35. Result Manager::LinkToManager() {
  36. std::scoped_lock l{mutex};
  37. if (!linked_to_manager) {
  38. AudioManager& manager{system.AudioCore().GetAudioManager()};
  39. manager.SetInManager(std::bind(&Manager::BufferReleaseAndRegister, this));
  40. linked_to_manager = true;
  41. }
  42. return ResultSuccess;
  43. }
  44. void Manager::Start() {
  45. if (sessions_started) {
  46. return;
  47. }
  48. std::scoped_lock l{mutex};
  49. for (auto& session : sessions) {
  50. if (session) {
  51. session->StartSession();
  52. }
  53. }
  54. sessions_started = true;
  55. }
  56. void Manager::BufferReleaseAndRegister() {
  57. std::scoped_lock l{mutex};
  58. for (auto& session : sessions) {
  59. if (session != nullptr) {
  60. session->ReleaseAndRegisterBuffers();
  61. }
  62. }
  63. }
  64. u32 Manager::GetDeviceNames(std::vector<Renderer::AudioDevice::AudioDeviceName>& names,
  65. [[maybe_unused]] const u32 max_count,
  66. [[maybe_unused]] const bool filter) {
  67. std::scoped_lock l{mutex};
  68. LinkToManager();
  69. auto input_devices{Sink::GetDeviceListForSink(Settings::values.sink_id.GetValue(), true)};
  70. if (input_devices.size() > 1) {
  71. names.emplace_back("Uac");
  72. return 1;
  73. }
  74. return 0;
  75. }
  76. } // namespace AudioCore::AudioIn