// SPDX-License-Identifier: MPL-2.0 // Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/) #include #include "IAudioOutManager.h" #include "IAudioOut.h" namespace skyline::service::audio { IAudioOutManager::IAudioOutManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::audio_IAudioOutManager, "audio:IAudioOutManager", { {0x0, SFUNC(IAudioOutManager::ListAudioOuts)}, {0x1, SFUNC(IAudioOutManager::OpenAudioOut)} }) {} void IAudioOutManager::ListAudioOuts(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { state.process->WriteMemory(reinterpret_cast(const_cast(constant::DefaultAudioOutName.data())), request.outputBuf.at(0).address, constant::DefaultAudioOutName.size()); } void IAudioOutManager::OpenAudioOut(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { u32 sampleRate = request.Pop(); request.Pop(); // Channel count is stored in the upper half of a u32 u16 channelCount = request.Pop(); state.logger->Debug("audoutU: Opening an IAudioOut with sample rate: {}, channel count: {}", sampleRate, channelCount); sampleRate = sampleRate ? sampleRate : constant::SampleRate; channelCount = channelCount ? channelCount : static_cast(constant::ChannelCount); manager.RegisterService(std::make_shared(state, manager, channelCount, sampleRate), session, response); response.Push(sampleRate); response.Push(channelCount); response.Push(0); response.Push(static_cast(skyline::audio::AudioFormat::Int16)); response.Push(static_cast(skyline::audio::AudioOutState::Stopped)); } }