diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 679299f68..8b12b8201 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "audio_core/audio_renderer.h" #include "common/alignment.h" @@ -160,7 +161,7 @@ private: class IAudioDevice final : public ServiceFramework { public: - IAudioDevice() : ServiceFramework("IAudioDevice") { + explicit IAudioDevice() : ServiceFramework("IAudioDevice") { static const FunctionInfo functions[] = { {0, &IAudioDevice::ListAudioDeviceName, "ListAudioDeviceName"}, {1, &IAudioDevice::SetAudioDeviceOutputVolume, "SetAudioDeviceOutputVolume"}, @@ -189,15 +190,32 @@ public: } private: + using AudioDeviceName = std::array; + static constexpr std::array audio_device_names{{ + "AudioStereoJackOutput", + "AudioBuiltInSpeakerOutput", + "AudioTvOutput", + "AudioUsbDeviceOutput", + }}; + void ListAudioDeviceName(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_Audio, "(STUBBED) called"); - constexpr std::array audio_interface{{"AudioInterface"}}; - ctx.WriteBuffer(audio_interface); + const std::size_t num_names_requested = ctx.GetWriteBufferSize() / sizeof(AudioDeviceName); + const std::size_t num_to_copy = std::min(num_names_requested, audio_device_names.size()); + std::vector name_buffer(num_to_copy); + + for (std::size_t i = 0; i < num_to_copy; i++) { + const auto& device_name = audio_device_names[i]; + + device_name.copy(name_buffer[i].data(), device_name.size()); + } + + ctx.WriteBuffer(name_buffer); IPC::ResponseBuilder rb{ctx, 3}; rb.Push(RESULT_SUCCESS); - rb.Push(1); + rb.Push(static_cast(num_to_copy)); } void SetAudioDeviceOutputVolume(Kernel::HLERequestContext& ctx) { @@ -216,8 +234,13 @@ private: void GetActiveAudioDeviceName(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_Audio, "(STUBBED) called"); - constexpr std::array audio_interface{{"AudioDevice"}}; - ctx.WriteBuffer(audio_interface); + // Currently set to always be TV audio output. + const auto& device_name = audio_device_names[2]; + + AudioDeviceName out_device_name{}; + device_name.copy(out_device_name.data(), device_name.size()); + + ctx.WriteBuffer(out_device_name); IPC::ResponseBuilder rb{ctx, 3}; rb.Push(RESULT_SUCCESS);