| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
- // SPDX-License-Identifier: GPL-2.0-or-later
- #include "audio_core/audio_core.h"
- #include "common/string_util.h"
- #include "core/hle/service/audio/audio_device.h"
- #include "core/hle/service/cmif_serialization.h"
- namespace Service::Audio {
- using namespace AudioCore::Renderer;
- IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u32 revision,
- u32 device_num)
- : ServiceFramework{system_, "IAudioDevice"}, service_context{system_, "IAudioDevice"},
- impl{std::make_unique<AudioDevice>(system_, applet_resource_user_id, revision)},
- event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} {
- static const FunctionInfo functions[] = {
- {0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"},
- {1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"},
- {2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"},
- {3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"},
- {4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"},
- {5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"},
- {6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"},
- {7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"},
- {8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"},
- {10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"},
- {11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"},
- {12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"},
- {13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"},
- {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"},
- };
- RegisterHandlers(functions);
- event->Signal();
- }
- IAudioDevice::~IAudioDevice() {
- service_context.CloseEvent(event);
- }
- Result IAudioDevice::ListAudioDeviceName(
- OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_names, Out<s32> out_count) {
- R_RETURN(this->ListAudioDeviceNameAuto(out_names, out_count));
- }
- Result IAudioDevice::SetAudioDeviceOutputVolume(
- InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> name, f32 volume) {
- R_RETURN(this->SetAudioDeviceOutputVolumeAuto(name, volume));
- }
- Result IAudioDevice::GetAudioDeviceOutputVolume(
- Out<f32> out_volume, InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> name) {
- R_RETURN(this->GetAudioDeviceOutputVolumeAuto(out_volume, name));
- }
- Result IAudioDevice::GetActiveAudioDeviceName(
- OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_name) {
- R_RETURN(this->GetActiveAudioDeviceNameAuto(out_name));
- }
- Result IAudioDevice::ListAudioDeviceNameAuto(
- OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> out_names,
- Out<s32> out_count) {
- *out_count = impl->ListAudioDeviceName(out_names);
- std::string out{};
- for (s32 i = 0; i < *out_count; i++) {
- std::string a{};
- u32 j = 0;
- while (out_names[i].name[j] != '\0') {
- a += out_names[i].name[j];
- j++;
- }
- out += "\n\t" + a;
- }
- LOG_DEBUG(Service_Audio, "called.\nNames={}", out);
- R_SUCCEED();
- }
- Result IAudioDevice::SetAudioDeviceOutputVolumeAuto(
- InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> name, f32 volume) {
- R_UNLESS(!name.empty(), Audio::ResultInsufficientBuffer);
- const std::string device_name = Common::StringFromBuffer(name[0].name);
- LOG_DEBUG(Service_Audio, "called. name={}, volume={}", device_name, volume);
- if (device_name == "AudioTvOutput") {
- impl->SetDeviceVolumes(volume);
- }
- R_SUCCEED();
- }
- Result IAudioDevice::GetAudioDeviceOutputVolumeAuto(
- Out<f32> out_volume, InArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> name) {
- R_UNLESS(!name.empty(), Audio::ResultInsufficientBuffer);
- const std::string device_name = Common::StringFromBuffer(name[0].name);
- LOG_DEBUG(Service_Audio, "called. Name={}", device_name);
- *out_volume = 1.0f;
- if (device_name == "AudioTvOutput") {
- *out_volume = impl->GetDeviceVolume(device_name);
- }
- R_SUCCEED();
- }
- Result IAudioDevice::GetActiveAudioDeviceNameAuto(
- OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcAutoSelect> out_name) {
- R_UNLESS(!out_name.empty(), Audio::ResultInsufficientBuffer);
- out_name[0] = AudioDevice::AudioDeviceName("AudioTvOutput");
- LOG_DEBUG(Service_Audio, "(STUBBED) called");
- R_SUCCEED();
- }
- Result IAudioDevice::QueryAudioDeviceSystemEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_DEBUG(Service_Audio, "(STUBBED) called");
- event->Signal();
- *out_event = &event->GetReadableEvent();
- R_SUCCEED();
- }
- Result IAudioDevice::QueryAudioDeviceInputEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_DEBUG(Service_Audio, "(STUBBED) called");
- *out_event = &event->GetReadableEvent();
- R_SUCCEED();
- }
- Result IAudioDevice::QueryAudioDeviceOutputEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_DEBUG(Service_Audio, "called");
- *out_event = &event->GetReadableEvent();
- R_SUCCEED();
- }
- Result IAudioDevice::GetActiveChannelCount(Out<u32> out_active_channel_count) {
- *out_active_channel_count = system.AudioCore().GetOutputSink().GetSystemChannels();
- LOG_DEBUG(Service_Audio, "(STUBBED) called. Channels={}", *out_active_channel_count);
- R_SUCCEED();
- }
- Result IAudioDevice::ListAudioOutputDeviceName(
- OutArray<AudioDevice::AudioDeviceName, BufferAttr_HipcMapAlias> out_names, Out<s32> out_count) {
- *out_count = impl->ListAudioOutputDeviceName(out_names);
- std::string out{};
- for (s32 i = 0; i < *out_count; i++) {
- std::string a{};
- u32 j = 0;
- while (out_names[i].name[j] != '\0') {
- a += out_names[i].name[j];
- j++;
- }
- out += "\n\t" + a;
- }
- LOG_DEBUG(Service_Audio, "called.\nNames={}", out);
- R_SUCCEED();
- }
- } // namespace Service::Audio
|