summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Liam2024-02-20 21:17:59 -0500
committerGravatar Liam2024-02-20 22:15:38 -0500
commitc575a85233cfea2e0935a5609e4e13d980a8c28f (patch)
treeebfb39a093a2042a8d15769532089a83c883d21a /src/core
parentaudio: rewrite IHardwareOpusDecoderManager (diff)
downloadyuzu-c575a85233cfea2e0935a5609e4e13d980a8c28f.tar.gz
yuzu-c575a85233cfea2e0935a5609e4e13d980a8c28f.tar.xz
yuzu-c575a85233cfea2e0935a5609e4e13d980a8c28f.zip
audio: rewrite IAudioDevice
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/audio/audio_device.cpp180
-rw-r--r--src/core/hle/service/audio/audio_device.h41
-rw-r--r--src/core/hle/service/audio/audio_in_manager.cpp3
-rw-r--r--src/core/hle/service/audio/audio_out_manager.cpp4
4 files changed, 114 insertions, 114 deletions
diff --git a/src/core/hle/service/audio/audio_device.cpp b/src/core/hle/service/audio/audio_device.cpp
index 3608d08c7..438f3cccd 100644
--- a/src/core/hle/service/audio/audio_device.cpp
+++ b/src/core/hle/service/audio/audio_device.cpp
@@ -4,7 +4,7 @@
4#include "audio_core/audio_core.h" 4#include "audio_core/audio_core.h"
5#include "common/string_util.h" 5#include "common/string_util.h"
6#include "core/hle/service/audio/audio_device.h" 6#include "core/hle/service/audio/audio_device.h"
7#include "core/hle/service/ipc_helpers.h" 7#include "core/hle/service/cmif_serialization.h"
8 8
9namespace Service::Audio { 9namespace Service::Audio {
10using namespace AudioCore::Renderer; 10using namespace AudioCore::Renderer;
@@ -15,20 +15,20 @@ IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u
15 impl{std::make_unique<AudioDevice>(system_, applet_resource_user_id, revision)}, 15 impl{std::make_unique<AudioDevice>(system_, applet_resource_user_id, revision)},
16 event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} { 16 event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} {
17 static const FunctionInfo functions[] = { 17 static const FunctionInfo functions[] = {
18 {0, &IAudioDevice::ListAudioDeviceName, "ListAudioDeviceName"}, 18 {0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"},
19 {1, &IAudioDevice::SetAudioDeviceOutputVolume, "SetAudioDeviceOutputVolume"}, 19 {1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"},
20 {2, &IAudioDevice::GetAudioDeviceOutputVolume, "GetAudioDeviceOutputVolume"}, 20 {2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"},
21 {3, &IAudioDevice::GetActiveAudioDeviceName, "GetActiveAudioDeviceName"}, 21 {3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"},
22 {4, &IAudioDevice::QueryAudioDeviceSystemEvent, "QueryAudioDeviceSystemEvent"}, 22 {4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"},
23 {5, &IAudioDevice::GetActiveChannelCount, "GetActiveChannelCount"}, 23 {5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"},
24 {6, &IAudioDevice::ListAudioDeviceName, "ListAudioDeviceNameAuto"}, 24 {6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"},
25 {7, &IAudioDevice::SetAudioDeviceOutputVolume, "SetAudioDeviceOutputVolumeAuto"}, 25 {7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"},
26 {8, &IAudioDevice::GetAudioDeviceOutputVolume, "GetAudioDeviceOutputVolumeAuto"}, 26 {8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"},
27 {10, &IAudioDevice::GetActiveAudioDeviceName, "GetActiveAudioDeviceNameAuto"}, 27 {10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"},
28 {11, &IAudioDevice::QueryAudioDeviceInputEvent, "QueryAudioDeviceInputEvent"}, 28 {11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"},
29 {12, &IAudioDevice::QueryAudioDeviceOutputEvent, "QueryAudioDeviceOutputEvent"}, 29 {12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"},
30 {13, &IAudioDevice::GetActiveAudioDeviceName, "GetActiveAudioOutputDeviceName"}, 30 {13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"},
31 {14, &IAudioDevice::ListAudioOutputDeviceName, "ListAudioOutputDeviceName"}, 31 {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"},
32 }; 32 };
33 RegisterHandlers(functions); 33 RegisterHandlers(functions);
34 34
@@ -39,15 +39,33 @@ IAudioDevice::~IAudioDevice() {
39 service_context.CloseEvent(event); 39 service_context.CloseEvent(event);
40} 40}
41 41
42void IAudioDevice::ListAudioDeviceName(HLERequestContext& ctx) { 42Result IAudioDevice::ListAudioDeviceName(
43 const size_t in_count = ctx.GetWriteBufferNumElements<AudioDevice::AudioDeviceName>(); 43 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_names, Out<s32> out_count) {
44 R_RETURN(this->ListAudioDeviceNameAuto(out_names, out_count));
45}
46
47Result IAudioDevice::SetAudioDeviceOutputVolume(
48 InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> name, f32 volume) {
49 R_RETURN(this->SetAudioDeviceOutputVolumeAuto(name, volume));
50}
51
52Result IAudioDevice::GetAudioDeviceOutputVolume(
53 Out<f32> out_volume, InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> name) {
54 R_RETURN(this->GetAudioDeviceOutputVolumeAuto(out_volume, name));
55}
44 56
45 std::vector<AudioDevice::AudioDeviceName> out_names{}; 57Result IAudioDevice::GetActiveAudioDeviceName(
58 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_name) {
59 R_RETURN(this->GetActiveAudioDeviceNameAuto(out_name));
60}
46 61
47 const u32 out_count = impl->ListAudioDeviceName(out_names, in_count); 62Result IAudioDevice::ListAudioDeviceNameAuto(
63 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> out_names,
64 Out<s32> out_count) {
65 *out_count = impl->ListAudioDeviceName(out_names);
48 66
49 std::string out{}; 67 std::string out{};
50 for (u32 i = 0; i < out_count; i++) { 68 for (s32 i = 0; i < *out_count; i++) {
51 std::string a{}; 69 std::string a{};
52 u32 j = 0; 70 u32 j = 0;
53 while (out_names[i].name[j] != '\0') { 71 while (out_names[i].name[j] != '\0') {
@@ -58,109 +76,77 @@ void IAudioDevice::ListAudioDeviceName(HLERequestContext& ctx) {
58 } 76 }
59 77
60 LOG_DEBUG(Service_Audio, "called.\nNames={}", out); 78 LOG_DEBUG(Service_Audio, "called.\nNames={}", out);
61 79 R_SUCCEED();
62 IPC::ResponseBuilder rb{ctx, 3};
63
64 ctx.WriteBuffer(out_names);
65
66 rb.Push(ResultSuccess);
67 rb.Push(out_count);
68} 80}
69 81
70void IAudioDevice::SetAudioDeviceOutputVolume(HLERequestContext& ctx) { 82Result IAudioDevice::SetAudioDeviceOutputVolumeAuto(
71 IPC::RequestParser rp{ctx}; 83 InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> name, f32 volume) {
72 const f32 volume = rp.Pop<f32>(); 84 R_UNLESS(!name.empty(), Audio::ResultInsufficientBuffer);
73
74 const auto device_name_buffer = ctx.ReadBuffer();
75 const std::string name = Common::StringFromBuffer(device_name_buffer);
76 85
77 LOG_DEBUG(Service_Audio, "called. name={}, volume={}", name, volume); 86 const std::string device_name = Common::StringFromBuffer(name[0].name);
87 LOG_DEBUG(Service_Audio, "called. name={}, volume={}", device_name, volume);
78 88
79 if (name == "AudioTvOutput") { 89 if (device_name == "AudioTvOutput") {
80 impl->SetDeviceVolumes(volume); 90 impl->SetDeviceVolumes(volume);
81 } 91 }
82 92
83 IPC::ResponseBuilder rb{ctx, 2}; 93 R_SUCCEED();
84 rb.Push(ResultSuccess);
85} 94}
86 95
87void IAudioDevice::GetAudioDeviceOutputVolume(HLERequestContext& ctx) { 96Result IAudioDevice::GetAudioDeviceOutputVolumeAuto(
88 const auto device_name_buffer = ctx.ReadBuffer(); 97 Out<f32> out_volume, InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> name) {
89 const std::string name = Common::StringFromBuffer(device_name_buffer); 98 R_UNLESS(!name.empty(), Audio::ResultInsufficientBuffer);
90 99
91 LOG_DEBUG(Service_Audio, "called. Name={}", name); 100 const std::string device_name = Common::StringFromBuffer(name[0].name);
101 LOG_DEBUG(Service_Audio, "called. Name={}", device_name);
92 102
93 f32 volume{1.0f}; 103 *out_volume = 1.0f;
94 if (name == "AudioTvOutput") { 104 if (device_name == "AudioTvOutput") {
95 volume = impl->GetDeviceVolume(name); 105 *out_volume = impl->GetDeviceVolume(device_name);
96 } 106 }
97 107
98 IPC::ResponseBuilder rb{ctx, 3}; 108 R_SUCCEED();
99 rb.Push(ResultSuccess);
100 rb.Push(volume);
101} 109}
102 110
103void IAudioDevice::GetActiveAudioDeviceName(HLERequestContext& ctx) { 111Result IAudioDevice::GetActiveAudioDeviceNameAuto(
104 const auto write_size = ctx.GetWriteBufferSize(); 112 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> out_name) {
105 std::string out_name{"AudioTvOutput"}; 113 R_UNLESS(!out_name.empty(), Audio::ResultInsufficientBuffer);
106 114 out_name[0] = AudioDevice::AudioDeviceName("AudioTvOutput");
107 LOG_DEBUG(Service_Audio, "(STUBBED) called. Name={}", out_name); 115 LOG_DEBUG(Service_Audio, "(STUBBED) called");
108 116 R_SUCCEED();
109 out_name.resize(write_size);
110
111 ctx.WriteBuffer(out_name);
112
113 IPC::ResponseBuilder rb{ctx, 2};
114 rb.Push(ResultSuccess);
115} 117}
116 118
117void IAudioDevice::QueryAudioDeviceSystemEvent(HLERequestContext& ctx) { 119Result IAudioDevice::QueryAudioDeviceSystemEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
118 LOG_DEBUG(Service_Audio, "(STUBBED) called"); 120 LOG_DEBUG(Service_Audio, "(STUBBED) called");
119
120 event->Signal(); 121 event->Signal();
121 122 *out_event = &event->GetReadableEvent();
122 IPC::ResponseBuilder rb{ctx, 2, 1}; 123 R_SUCCEED();
123 rb.Push(ResultSuccess);
124 rb.PushCopyObjects(event->GetReadableEvent());
125}
126
127void IAudioDevice::GetActiveChannelCount(HLERequestContext& ctx) {
128 const auto& sink{system.AudioCore().GetOutputSink()};
129 u32 channel_count{sink.GetSystemChannels()};
130
131 LOG_DEBUG(Service_Audio, "(STUBBED) called. Channels={}", channel_count);
132
133 IPC::ResponseBuilder rb{ctx, 3};
134
135 rb.Push(ResultSuccess);
136 rb.Push<u32>(channel_count);
137} 124}
138 125
139void IAudioDevice::QueryAudioDeviceInputEvent(HLERequestContext& ctx) { 126Result IAudioDevice::QueryAudioDeviceInputEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
140 LOG_DEBUG(Service_Audio, "(STUBBED) called"); 127 LOG_DEBUG(Service_Audio, "(STUBBED) called");
141 128 *out_event = &event->GetReadableEvent();
142 IPC::ResponseBuilder rb{ctx, 2, 1}; 129 R_SUCCEED();
143 rb.Push(ResultSuccess);
144 rb.PushCopyObjects(event->GetReadableEvent());
145} 130}
146 131
147void IAudioDevice::QueryAudioDeviceOutputEvent(HLERequestContext& ctx) { 132Result IAudioDevice::QueryAudioDeviceOutputEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
148 LOG_DEBUG(Service_Audio, "called"); 133 LOG_DEBUG(Service_Audio, "called");
149 134 *out_event = &event->GetReadableEvent();
150 IPC::ResponseBuilder rb{ctx, 2, 1}; 135 R_SUCCEED();
151 rb.Push(ResultSuccess);
152 rb.PushCopyObjects(event->GetReadableEvent());
153} 136}
154 137
155void IAudioDevice::ListAudioOutputDeviceName(HLERequestContext& ctx) { 138Result IAudioDevice::GetActiveChannelCount(Out<u32> out_active_channel_count) {
156 const size_t in_count = ctx.GetWriteBufferNumElements<AudioDevice::AudioDeviceName>(); 139 *out_active_channel_count = system.AudioCore().GetOutputSink().GetSystemChannels();
157 140 LOG_DEBUG(Service_Audio, "(STUBBED) called. Channels={}", *out_active_channel_count);
158 std::vector<AudioDevice::AudioDeviceName> out_names{}; 141 R_SUCCEED();
142}
159 143
160 const u32 out_count = impl->ListAudioOutputDeviceName(out_names, in_count); 144Result IAudioDevice::ListAudioOutputDeviceName(
145 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_names, Out<s32> out_count) {
146 *out_count = impl->ListAudioOutputDeviceName(out_names);
161 147
162 std::string out{}; 148 std::string out{};
163 for (u32 i = 0; i < out_count; i++) { 149 for (s32 i = 0; i < *out_count; i++) {
164 std::string a{}; 150 std::string a{};
165 u32 j = 0; 151 u32 j = 0;
166 while (out_names[i].name[j] != '\0') { 152 while (out_names[i].name[j] != '\0') {
@@ -171,13 +157,7 @@ void IAudioDevice::ListAudioOutputDeviceName(HLERequestContext& ctx) {
171 } 157 }
172 158
173 LOG_DEBUG(Service_Audio, "called.\nNames={}", out); 159 LOG_DEBUG(Service_Audio, "called.\nNames={}", out);
174 160 R_SUCCEED();
175 IPC::ResponseBuilder rb{ctx, 3};
176
177 ctx.WriteBuffer(out_names);
178
179 rb.Push(ResultSuccess);
180 rb.Push(out_count);
181} 161}
182 162
183} // namespace Service::Audio 163} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/audio_device.h b/src/core/hle/service/audio/audio_device.h
index 850c60051..752157272 100644
--- a/src/core/hle/service/audio/audio_device.h
+++ b/src/core/hle/service/audio/audio_device.h
@@ -4,11 +4,18 @@
4#pragma once 4#pragma once
5 5
6#include "audio_core/renderer/audio_device.h" 6#include "audio_core/renderer/audio_device.h"
7#include "core/hle/service/cmif_types.h"
7#include "core/hle/service/kernel_helpers.h" 8#include "core/hle/service/kernel_helpers.h"
8#include "core/hle/service/service.h" 9#include "core/hle/service/service.h"
9 10
11namespace Kernel {
12class KReadableEvent;
13}
14
10namespace Service::Audio { 15namespace Service::Audio {
11 16
17using AudioCore::Renderer::AudioDevice;
18
12class IAudioDevice final : public ServiceFramework<IAudioDevice> { 19class IAudioDevice final : public ServiceFramework<IAudioDevice> {
13 20
14public: 21public:
@@ -17,15 +24,31 @@ public:
17 ~IAudioDevice() override; 24 ~IAudioDevice() override;
18 25
19private: 26private:
20 void ListAudioDeviceName(HLERequestContext& ctx); 27 Result ListAudioDeviceName(
21 void SetAudioDeviceOutputVolume(HLERequestContext& ctx); 28 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_names,
22 void GetAudioDeviceOutputVolume(HLERequestContext& ctx); 29 Out<s32> out_count);
23 void GetActiveAudioDeviceName(HLERequestContext& ctx); 30 Result SetAudioDeviceOutputVolume(
24 void QueryAudioDeviceSystemEvent(HLERequestContext& ctx); 31 InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> name, f32 volume);
25 void GetActiveChannelCount(HLERequestContext& ctx); 32 Result GetAudioDeviceOutputVolume(
26 void QueryAudioDeviceInputEvent(HLERequestContext& ctx); 33 Out<f32> out_volume, InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> name);
27 void QueryAudioDeviceOutputEvent(HLERequestContext& ctx); 34 Result GetActiveAudioDeviceName(
28 void ListAudioOutputDeviceName(HLERequestContext& ctx); 35 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_name);
36 Result ListAudioDeviceNameAuto(
37 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> out_names,
38 Out<s32> out_count);
39 Result SetAudioDeviceOutputVolumeAuto(
40 InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> name, f32 volume);
41 Result GetAudioDeviceOutputVolumeAuto(
42 Out<f32> out_volume, InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> name);
43 Result GetActiveAudioDeviceNameAuto(
44 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> out_name);
45 Result QueryAudioDeviceSystemEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
46 Result QueryAudioDeviceInputEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
47 Result QueryAudioDeviceOutputEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
48 Result GetActiveChannelCount(Out<u32> out_active_channel_count);
49 Result ListAudioOutputDeviceName(
50 OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_names,
51 Out<s32> out_count);
29 52
30 KernelHelpers::ServiceContext service_context; 53 KernelHelpers::ServiceContext service_context;
31 std::unique_ptr<AudioCore::Renderer::AudioDevice> impl; 54 std::unique_ptr<AudioCore::Renderer::AudioDevice> impl;
diff --git a/src/core/hle/service/audio/audio_in_manager.cpp b/src/core/hle/service/audio/audio_in_manager.cpp
index 9b67af367..d55da17c8 100644
--- a/src/core/hle/service/audio/audio_in_manager.cpp
+++ b/src/core/hle/service/audio/audio_in_manager.cpp
@@ -96,8 +96,7 @@ Result IAudioInManager::OpenAudioInProtocolSpecified(
96 LOG_DEBUG(Service_Audio, "Opening new AudioIn, session_id={}, free sessions={}", new_session_id, 96 LOG_DEBUG(Service_Audio, "Opening new AudioIn, session_id={}, free sessions={}", new_session_id,
97 impl->num_free_sessions); 97 impl->num_free_sessions);
98 98
99 const auto name_buffer = std::span(reinterpret_cast<const u8*>(name[0].name.data()), 0x100); 99 const auto device_name = Common::StringFromBuffer(name[0].name);
100 const auto device_name = Common::StringFromBuffer(name_buffer);
101 *out_audio_in = std::make_shared<IAudioIn>(system, *impl, new_session_id, device_name, 100 *out_audio_in = std::make_shared<IAudioIn>(system, *impl, new_session_id, device_name,
102 parameter, process_handle.Get(), aruid.pid); 101 parameter, process_handle.Get(), aruid.pid);
103 impl->sessions[new_session_id] = (*out_audio_in)->GetImpl(); 102 impl->sessions[new_session_id] = (*out_audio_in)->GetImpl();
diff --git a/src/core/hle/service/audio/audio_out_manager.cpp b/src/core/hle/service/audio/audio_out_manager.cpp
index 780e1dcda..153445097 100644
--- a/src/core/hle/service/audio/audio_out_manager.cpp
+++ b/src/core/hle/service/audio/audio_out_manager.cpp
@@ -75,9 +75,7 @@ Result IAudioOutManager::OpenAudioOutAuto(
75 R_TRY(impl->LinkToManager()); 75 R_TRY(impl->LinkToManager());
76 R_TRY(impl->AcquireSessionId(new_session_id)); 76 R_TRY(impl->AcquireSessionId(new_session_id));
77 77
78 const auto name_buffer = std::span(reinterpret_cast<const u8*>(name[0].name.data()), 0x100); 78 const auto device_name = Common::StringFromBuffer(name[0].name);
79 const auto device_name = Common::StringFromBuffer(name_buffer);
80
81 LOG_DEBUG(Service_Audio, "Opening new AudioOut, sessionid={}, free sessions={}", new_session_id, 79 LOG_DEBUG(Service_Audio, "Opening new AudioOut, sessionid={}, free sessions={}", new_session_id,
82 impl->num_free_sessions); 80 impl->num_free_sessions);
83 81