mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-29 23:06:23 -05:00
Added GetAudioRendererSampleRate, GetAudioRendererSampleCount & GetAudioRendererMixBufferCount
GetAudioRendererSampleRate is set as a "STUB" as a game could check if the sample rate it sent and the sample rate it wants don't match. Just a thought of something which could happen so keeping it as stub for the mean time
This commit is contained in:
parent
a921d22545
commit
e5ee0afe6f
3 changed files with 44 additions and 6 deletions
|
@ -26,6 +26,18 @@ AudioRenderer::AudioRenderer(AudioRendererParameter params,
|
||||||
QueueMixedBuffer(2);
|
QueueMixedBuffer(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 AudioRenderer::GetSampleRate() const {
|
||||||
|
return STREAM_SAMPLE_RATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 AudioRenderer::GetSampleCount() const {
|
||||||
|
return worker_params.sample_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 AudioRenderer::GetMixBufferCount() const {
|
||||||
|
return worker_params.mix_buffer_count;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<u8> AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_params) {
|
std::vector<u8> AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_params) {
|
||||||
// Copy UpdateDataHeader struct
|
// Copy UpdateDataHeader struct
|
||||||
UpdateDataHeader config{};
|
UpdateDataHeader config{};
|
||||||
|
|
|
@ -26,7 +26,7 @@ enum class PlayState : u8 {
|
||||||
struct AudioRendererParameter {
|
struct AudioRendererParameter {
|
||||||
u32_le sample_rate;
|
u32_le sample_rate;
|
||||||
u32_le sample_count;
|
u32_le sample_count;
|
||||||
u32_le unknown_8;
|
u32_le mix_buffer_count;
|
||||||
u32_le unknown_c;
|
u32_le unknown_c;
|
||||||
u32_le voice_count;
|
u32_le voice_count;
|
||||||
u32_le sink_count;
|
u32_le sink_count;
|
||||||
|
@ -160,6 +160,9 @@ public:
|
||||||
std::vector<u8> UpdateAudioRenderer(const std::vector<u8>& input_params);
|
std::vector<u8> UpdateAudioRenderer(const std::vector<u8>& input_params);
|
||||||
void QueueMixedBuffer(Buffer::Tag tag);
|
void QueueMixedBuffer(Buffer::Tag tag);
|
||||||
void ReleaseAndQueueBuffers();
|
void ReleaseAndQueueBuffers();
|
||||||
|
u32 GetSampleRate() const;
|
||||||
|
u32 GetSampleCount() const;
|
||||||
|
u32 GetMixBufferCount() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class VoiceState {
|
class VoiceState {
|
||||||
|
|
|
@ -20,9 +20,9 @@ public:
|
||||||
explicit IAudioRenderer(AudioCore::AudioRendererParameter audren_params)
|
explicit IAudioRenderer(AudioCore::AudioRendererParameter audren_params)
|
||||||
: ServiceFramework("IAudioRenderer") {
|
: ServiceFramework("IAudioRenderer") {
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, nullptr, "GetAudioRendererSampleRate"},
|
{0, &IAudioRenderer::GetAudioRendererSampleRate, "GetAudioRendererSampleRate"},
|
||||||
{1, nullptr, "GetAudioRendererSampleCount"},
|
{1, &IAudioRenderer::GetAudioRendererSampleCount, "GetAudioRendererSampleCount"},
|
||||||
{2, nullptr, "GetAudioRendererMixBufferCount"},
|
{2, &IAudioRenderer::GetAudioRendererMixBufferCount, "GetAudioRendererMixBufferCount"},
|
||||||
{3, nullptr, "GetAudioRendererState"},
|
{3, nullptr, "GetAudioRendererState"},
|
||||||
{4, &IAudioRenderer::RequestUpdateAudioRenderer, "RequestUpdateAudioRenderer"},
|
{4, &IAudioRenderer::RequestUpdateAudioRenderer, "RequestUpdateAudioRenderer"},
|
||||||
{5, &IAudioRenderer::StartAudioRenderer, "StartAudioRenderer"},
|
{5, &IAudioRenderer::StartAudioRenderer, "StartAudioRenderer"},
|
||||||
|
@ -45,6 +45,29 @@ private:
|
||||||
system_event->Signal();
|
system_event->Signal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetAudioRendererSampleRate(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
rb.Push<u32>(
|
||||||
|
renderer->GetSampleRate()); // Switch uses the worker_params value, but we always
|
||||||
|
// have a fixed sample rate so return that instead
|
||||||
|
LOG_WARNING(Service_Audio, "(STUBBED) called");
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetAudioRendererSampleCount(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
rb.Push<u32>(renderer->GetSampleCount());
|
||||||
|
LOG_DEBUG(Service_Audio, "called");
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetAudioRendererMixBufferCount(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
rb.Push<u32>(renderer->GetMixBufferCount());
|
||||||
|
LOG_DEBUG(Service_Audio, "called");
|
||||||
|
}
|
||||||
|
|
||||||
void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) {
|
void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) {
|
||||||
ctx.WriteBuffer(renderer->UpdateAudioRenderer(ctx.ReadBuffer()));
|
ctx.WriteBuffer(renderer->UpdateAudioRenderer(ctx.ReadBuffer()));
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
@ -189,7 +212,7 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
auto params = rp.PopRaw<AudioCore::AudioRendererParameter>();
|
auto params = rp.PopRaw<AudioCore::AudioRendererParameter>();
|
||||||
|
|
||||||
u64 buffer_sz = Common::AlignUp(4 * params.unknown_8, 0x40);
|
u64 buffer_sz = Common::AlignUp(4 * params.mix_buffer_count, 0x40);
|
||||||
buffer_sz += params.unknown_c * 1024;
|
buffer_sz += params.unknown_c * 1024;
|
||||||
buffer_sz += 0x940 * (params.unknown_c + 1);
|
buffer_sz += 0x940 * (params.unknown_c + 1);
|
||||||
buffer_sz += 0x3F0 * params.voice_count;
|
buffer_sz += 0x3F0 * params.voice_count;
|
||||||
|
@ -197,7 +220,7 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {
|
||||||
buffer_sz += Common::AlignUp(8 * params.voice_count, 0x10);
|
buffer_sz += Common::AlignUp(8 * params.voice_count, 0x10);
|
||||||
buffer_sz +=
|
buffer_sz +=
|
||||||
Common::AlignUp((0x3C0 * (params.sink_count + params.unknown_c) + 4 * params.sample_count) *
|
Common::AlignUp((0x3C0 * (params.sink_count + params.unknown_c) + 4 * params.sample_count) *
|
||||||
(params.unknown_8 + 6),
|
(params.mix_buffer_count + 6),
|
||||||
0x40);
|
0x40);
|
||||||
|
|
||||||
if (IsFeatureSupported(AudioFeatures::Splitter, params.revision)) {
|
if (IsFeatureSupported(AudioFeatures::Splitter, params.revision)) {
|
||||||
|
|
Loading…
Reference in a new issue