2020-04-19 23:04:05 +02:00
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
2020-03-27 20:36:02 +01:00
|
|
|
// Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/)
|
2023-03-15 18:49:17 +01:00
|
|
|
// Copyright © 2022 yuzu Emulator Project (https://github.com/yuzu-emu/)
|
2020-03-27 20:36:02 +01:00
|
|
|
|
2023-03-15 18:49:17 +01:00
|
|
|
#include <audio_core/common/audio_renderer_parameter.h>
|
|
|
|
#include <audio_core/audio_render_manager.h>
|
|
|
|
#include <common/utils.h>
|
|
|
|
#include <audio.h>
|
|
|
|
#include "IAudioRenderer.h"
|
2020-07-09 15:48:14 +02:00
|
|
|
#include "IAudioDevice.h"
|
2020-02-17 20:11:59 +01:00
|
|
|
#include "IAudioRendererManager.h"
|
2020-01-24 23:04:16 +01:00
|
|
|
|
2020-02-17 20:11:59 +01:00
|
|
|
namespace skyline::service::audio {
|
2023-03-15 18:49:17 +01:00
|
|
|
IAudioRendererManager::IAudioRendererManager(const DeviceState &state, ServiceManager &manager)
|
|
|
|
: BaseService(state, manager) {}
|
2020-01-24 23:04:16 +01:00
|
|
|
|
2020-09-03 20:43:52 +02:00
|
|
|
Result IAudioRendererManager::OpenAudioRenderer(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
|
2023-03-15 18:49:17 +01:00
|
|
|
const auto ¶ms{request.Pop<AudioCore::AudioRendererParameterInternal>()};
|
|
|
|
u64 transferMemorySize{request.Pop<u64>()};
|
|
|
|
u64 appletResourceUserId{request.Pop<u64>()};
|
|
|
|
auto transferMemoryHandle{request.copyHandles.at(0)};
|
|
|
|
auto processHandle{request.copyHandles.at(1)};
|
|
|
|
|
|
|
|
i32 sessionId{state.audio->audioRendererManager->GetSessionId()};
|
|
|
|
if (sessionId == -1) {
|
|
|
|
Logger::Warn("Out of audio renderer sessions!");
|
|
|
|
return Result{Service::Audio::ResultOutOfSessions};
|
|
|
|
}
|
2020-01-24 23:04:16 +01:00
|
|
|
|
2023-03-15 18:49:17 +01:00
|
|
|
manager.RegisterService(std::make_shared<IAudioRenderer>(state, manager,
|
|
|
|
*state.audio->audioRendererManager,
|
|
|
|
params,
|
|
|
|
transferMemorySize, processHandle, appletResourceUserId, sessionId),
|
|
|
|
session, response);
|
2020-09-03 20:43:52 +02:00
|
|
|
|
|
|
|
return {};
|
2020-01-24 23:04:16 +01:00
|
|
|
}
|
|
|
|
|
2023-03-15 18:49:17 +01:00
|
|
|
Result IAudioRendererManager::GetWorkBufferSize(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
|
|
|
|
const auto ¶ms{request.Pop<AudioCore::AudioRendererParameterInternal>()};
|
2020-01-24 23:04:16 +01:00
|
|
|
|
2023-03-15 18:49:17 +01:00
|
|
|
u64 size{};
|
|
|
|
auto err{state.audio->audioRendererManager->GetWorkBufferSize(params, size)};
|
|
|
|
if (err.IsError())
|
|
|
|
Logger::Warn("Failed to calculate work buffer size");
|
2020-04-17 23:23:38 +02:00
|
|
|
|
2023-03-15 18:49:17 +01:00
|
|
|
response.Push<u64>(size);
|
2020-01-24 23:04:16 +01:00
|
|
|
|
2023-03-15 18:49:17 +01:00
|
|
|
return Result{err};
|
|
|
|
}
|
2020-01-24 23:04:16 +01:00
|
|
|
|
2023-03-15 18:49:17 +01:00
|
|
|
Result IAudioRendererManager::GetAudioDeviceService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
|
|
|
|
u64 appletResourceUserId{request.Pop<u64>()};
|
|
|
|
manager.RegisterService(std::make_shared<IAudioDevice>(state, manager, appletResourceUserId, util::MakeMagic<u32>("REV1")), session, response);
|
2020-09-03 20:43:52 +02:00
|
|
|
return {};
|
2020-01-24 23:04:16 +01:00
|
|
|
}
|
2020-07-09 15:48:14 +02:00
|
|
|
|
2023-03-15 18:49:17 +01:00
|
|
|
Result IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
|
|
|
|
u32 revision{request.Pop<u32>()};
|
|
|
|
u64 appletResourceUserId{request.Pop<u64>()};
|
|
|
|
manager.RegisterService(std::make_shared<IAudioDevice>(state, manager, appletResourceUserId, revision), session, response);
|
2020-09-03 20:43:52 +02:00
|
|
|
return {};
|
2020-07-09 15:48:14 +02:00
|
|
|
}
|
2023-03-15 18:49:17 +01:00
|
|
|
|
2020-01-24 23:04:16 +01:00
|
|
|
}
|