mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-04 12:34:39 +08:00 
			
		
		
		
	GetAudioRendererWorkBufferSize impl (#465)
* GetAudioRendererWorkBufferSize impl Impl of GetAudioRendererWorkBufferSize based on RE, if this can be cleaned up, please contribute! * Naming conventions * Removed unneeded placeholder * lioncache changes * fixed const * switched to Common::AlignUp
This commit is contained in:
		
							parent
							
								
									aee356bd10
								
							
						
					
					
						commit
						e6df4b37db
					
				@ -2,6 +2,7 @@
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include "common/alignment.h"
 | 
			
		||||
#include "common/logging/log.h"
 | 
			
		||||
#include "core/core_timing.h"
 | 
			
		||||
#include "core/hle/ipc_helpers.h"
 | 
			
		||||
@ -256,12 +257,62 @@ void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::RequestParser rp{ctx};
 | 
			
		||||
    auto params = rp.PopRaw<WorkerBufferParameters>();
 | 
			
		||||
 | 
			
		||||
    u64 buffer_sz = Common::AlignUp(4 * params.unknown8, 0x40);
 | 
			
		||||
    buffer_sz += params.unknownC * 1024;
 | 
			
		||||
    buffer_sz += 0x940 * (params.unknownC + 1);
 | 
			
		||||
    buffer_sz += 0x3F0 * params.voice_count;
 | 
			
		||||
    buffer_sz += Common::AlignUp(8 * (params.unknownC + 1), 0x10);
 | 
			
		||||
    buffer_sz += Common::AlignUp(8 * params.voice_count, 0x10);
 | 
			
		||||
    buffer_sz +=
 | 
			
		||||
        Common::AlignUp((0x3C0 * (params.sink_count + params.unknownC) + 4 * params.sample_count) *
 | 
			
		||||
                            (params.unknown8 + 6),
 | 
			
		||||
                        0x40);
 | 
			
		||||
 | 
			
		||||
    if (IsFeatureSupported(AudioFeatures::Splitter, params.magic)) {
 | 
			
		||||
        u32 count = params.unknownC + 1;
 | 
			
		||||
        u64 node_count = Common::AlignUp(count, 0x40);
 | 
			
		||||
        u64 node_state_buffer_sz =
 | 
			
		||||
            4 * (node_count * node_count) + 0xC * node_count + 2 * (node_count / 8);
 | 
			
		||||
        u64 edge_matrix_buffer_sz = 0;
 | 
			
		||||
        node_count = Common::AlignUp(count * count, 0x40);
 | 
			
		||||
        if (node_count >> 31 != 0) {
 | 
			
		||||
            edge_matrix_buffer_sz = (node_count | 7) / 8;
 | 
			
		||||
        } else {
 | 
			
		||||
            edge_matrix_buffer_sz = node_count / 8;
 | 
			
		||||
        }
 | 
			
		||||
        buffer_sz += Common::AlignUp(node_state_buffer_sz + edge_matrix_buffer_sz, 0x10);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    buffer_sz += 0x20 * (params.effect_count + 4 * params.voice_count) + 0x50;
 | 
			
		||||
    if (IsFeatureSupported(AudioFeatures::Splitter, params.magic)) {
 | 
			
		||||
        buffer_sz += 0xE0 * params.unknown2c;
 | 
			
		||||
        buffer_sz += 0x20 * params.splitter_count;
 | 
			
		||||
        buffer_sz += Common::AlignUp(4 * params.unknown2c, 0x10);
 | 
			
		||||
    }
 | 
			
		||||
    buffer_sz = Common::AlignUp(buffer_sz, 0x40) + 0x170 * params.sink_count;
 | 
			
		||||
    u64 output_sz = buffer_sz + 0x280 * params.sink_count + 0x4B0 * params.effect_count +
 | 
			
		||||
                    ((params.voice_count * 256) | 0x40);
 | 
			
		||||
 | 
			
		||||
    if (params.unknown1c >= 1) {
 | 
			
		||||
        output_sz = Common::AlignUp(((16 * params.sink_count + 16 * params.effect_count +
 | 
			
		||||
                                      16 * params.voice_count + 16) +
 | 
			
		||||
                                     0x658) *
 | 
			
		||||
                                            (params.unknown1c + 1) +
 | 
			
		||||
                                        0xc0,
 | 
			
		||||
                                    0x40) +
 | 
			
		||||
                    output_sz;
 | 
			
		||||
    }
 | 
			
		||||
    output_sz = Common::AlignUp(output_sz + 0x1807e, 0x1000);
 | 
			
		||||
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 4};
 | 
			
		||||
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.Push<u64>(0x4000);
 | 
			
		||||
    rb.Push<u64>(output_sz);
 | 
			
		||||
 | 
			
		||||
    NGLOG_WARNING(Service_Audio, "(STUBBED) called");
 | 
			
		||||
    NGLOG_DEBUG(Service_Audio, "called, buffer_size=0x{:X}", output_sz);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AudRenU::GetAudioDevice(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
@ -273,4 +324,14 @@ void AudRenU::GetAudioDevice(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    NGLOG_DEBUG(Service_Audio, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool AudRenU::IsFeatureSupported(AudioFeatures feature, u32_le revision) const {
 | 
			
		||||
    u32_be version_num = (revision - Common::MakeMagic('R', 'E', 'V', '0')); // Byte swap
 | 
			
		||||
    switch (feature) {
 | 
			
		||||
    case AudioFeatures::Splitter:
 | 
			
		||||
        return version_num >= 2;
 | 
			
		||||
    default:
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Service::Audio
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,31 @@ private:
 | 
			
		||||
    void OpenAudioRenderer(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void GetAudioDevice(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 | 
			
		||||
    struct WorkerBufferParameters {
 | 
			
		||||
        u32_le sample_rate;
 | 
			
		||||
        u32_le sample_count;
 | 
			
		||||
        u32_le unknown8;
 | 
			
		||||
        u32_le unknownC;
 | 
			
		||||
        u32_le voice_count;
 | 
			
		||||
        u32_le sink_count;
 | 
			
		||||
        u32_le effect_count;
 | 
			
		||||
        u32_le unknown1c;
 | 
			
		||||
        u8 unknown20;
 | 
			
		||||
        u8 padding1[3];
 | 
			
		||||
        u32_le splitter_count;
 | 
			
		||||
        u32_le unknown2c;
 | 
			
		||||
        u8 padding2[4];
 | 
			
		||||
        u32_le magic;
 | 
			
		||||
    };
 | 
			
		||||
    static_assert(sizeof(WorkerBufferParameters) == 52,
 | 
			
		||||
                  "WorkerBufferParameters is an invalid size");
 | 
			
		||||
 | 
			
		||||
    enum class AudioFeatures : u32 {
 | 
			
		||||
        Splitter,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    bool IsFeatureSupported(AudioFeatures feature, u32_le revision) const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Service::Audio
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user