// SPDX-License-Identifier: MPL-2.0 // Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/) // Copyright © 2022 yuzu Emulator Project (https://github.com/yuzu-emu/) #include #include #include #include "IAudioDevice.h" namespace skyline::service::audio { IAudioDevice::IAudioDevice(const DeviceState &state, ServiceManager &manager, u64 appletResourceUserId, u32 revision) : BaseService{state, manager}, event{std::make_shared(state, true)}, impl{state.audio->audioSystem, appletResourceUserId, revision} {} Result IAudioDevice::ListAudioDeviceName(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { span buffer{request.outputBuf.at(0)}; std::vector outputNames{}; u32 writtenCount{impl.ListAudioDeviceName(outputNames, buffer.size() / sizeof(AudioCore::AudioRenderer::AudioDevice::AudioDeviceName))}; response.Push(writtenCount); buffer.copy_from(outputNames); return {}; } Result IAudioDevice::SetAudioDeviceOutputVolume(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { float volume{request.Pop()}; auto name{request.inputBuf.at(0).as_string(true)}; if (name == "AudioTvOutput") impl.SetDeviceVolumes(volume); return {}; } Result IAudioDevice::GetAudioDeviceOutputVolume(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { auto name{request.inputBuf.at(0).as_string(true)}; response.Push(name == "AudioTvOutput" ? impl.GetDeviceVolume(name) : 1.0f); return {}; } Result IAudioDevice::GetActiveAudioDeviceName(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { std::string_view deviceName{"AudioTvOutput\0"}; if (deviceName.size() > request.outputBuf.at(0).size()) throw exception("The buffer supplied to GetActiveAudioDeviceName is too small"); request.outputBuf.at(0).copy_from(deviceName); return {}; } Result IAudioDevice::QueryAudioDeviceSystemEvent(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { auto handle{state.process->InsertItem(event)}; event->Signal(); Logger::Debug("Audio Device System Event Handle: 0x{:X}", handle); response.copyHandles.push_back(handle); return {}; } Result IAudioDevice::GetActiveChannelCount(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { response.Push(state.audio->audioSystem.AudioCore().GetOutputSink().GetDeviceChannels()); return {}; } Result IAudioDevice::QueryAudioDeviceInputEvent(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { auto handle{state.process->InsertItem(event)}; Logger::Debug("Audio Device Input Event Handle: 0x{:X}", handle); response.copyHandles.push_back(handle); return {}; } Result IAudioDevice::QueryAudioDeviceOutputEvent(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { auto handle{state.process->InsertItem(event)}; Logger::Debug("Audio Device Output Event Handle: 0x{:X}", handle); response.copyHandles.push_back(handle); return {}; } Result IAudioDevice::ListAudioOutputDeviceName(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { span buffer{request.outputBuf.at(0)}; std::vector outputNames{}; u32 writtenCount{impl.ListAudioOutputDeviceName(outputNames, buffer.size() / sizeof(AudioCore::AudioRenderer::AudioDevice::AudioDeviceName))}; response.Push(writtenCount); buffer.copy_from(outputNames); return {}; } }