@ -17,7 +17,7 @@ constexpr u64 audio_ticks{static_cast<u64>(CoreTiming::BASE_CLOCK_RATE / 200)};
class IAudioRenderer final : public ServiceFramework < IAudioRenderer > {
class IAudioRenderer final : public ServiceFramework < IAudioRenderer > {
public :
public :
IAudioRenderer ( AudioRendererParameter s audren_params )
IAudioRenderer ( AudioRendererParameter audren_params )
: ServiceFramework ( " IAudioRenderer " ) , worker_params ( audren_params ) {
: ServiceFramework ( " IAudioRenderer " ) , worker_params ( audren_params ) {
static const FunctionInfo functions [ ] = {
static const FunctionInfo functions [ ] = {
{ 0 , nullptr , " GetAudioRendererSampleRate " } ,
{ 0 , nullptr , " GetAudioRendererSampleRate " } ,
@ -58,22 +58,22 @@ private:
}
}
void RequestUpdateAudioRenderer ( Kernel : : HLERequestContext & ctx ) {
void RequestUpdateAudioRenderer ( Kernel : : HLERequestContext & ctx ) {
AudioRendererConfig config ;
UpdateDataHeader config { } ;
auto buf = ctx . ReadBuffer ( ) ;
auto buf = ctx . ReadBuffer ( ) ;
std : : memcpy ( & config , buf . data ( ) , sizeof ( AudioRendererConfig ) ) ;
std : : memcpy ( & config , buf . data ( ) , sizeof ( UpdateDataHeader ) ) ;
u32 memory_pool_count = worker_params . effect_count + ( worker_params . voice_count * 4 ) ;
u32 memory_pool_count = worker_params . effect_count + ( worker_params . voice_count * 4 ) ;
std : : vector < MemoryPoolInfo > mem_pool_info ( memory_pool_count ) ;
std : : vector < MemoryPoolInfo > mem_pool_info ( memory_pool_count ) ;
std : : memcpy ( mem_pool_info . data ( ) ,
std : : memcpy ( mem_pool_info . data ( ) ,
buf . data ( ) + sizeof ( AudioRendererConfig ) + config . behavior_size ,
buf . data ( ) + sizeof ( UpdateDataHeader ) + config . behavior_size ,
memory_pool_count * sizeof ( MemoryPoolInfo ) ) ;
memory_pool_count * sizeof ( MemoryPoolInfo ) ) ;
AudioRendererResponse response_data { worker_params } ;
UpdateDataHeader response_data { worker_params } ;
ASSERT ( ctx . GetWriteBufferSize ( ) = = response_data . total_size ) ;
ASSERT ( ctx . GetWriteBufferSize ( ) = = response_data . total_size ) ;
std : : vector < u8 > output ( response_data . total_size ) ;
std : : vector < u8 > output ( response_data . total_size ) ;
std : : memcpy ( output . data ( ) , & response_data , sizeof ( AudioRendererResponse ) ) ;
std : : memcpy ( output . data ( ) , & response_data , sizeof ( UpdateDataHeader ) ) ;
std : : vector < MemoryPoolEntry > memory_pool ( memory_pool_count ) ;
std : : vector < MemoryPoolEntry > memory_pool ( memory_pool_count ) ;
for ( unsigned i = 0 ; i < memory_pool . size ( ) ; i + + ) {
for ( unsigned i = 0 ; i < memory_pool . size ( ) ; i + + ) {
if ( mem_pool_info [ i ] . pool_state = = MemoryPoolStates : : RequestAttach )
if ( mem_pool_info [ i ] . pool_state = = MemoryPoolStates : : RequestAttach )
@ -83,7 +83,7 @@ private:
else
else
memory_pool [ i ] . state = mem_pool_info [ i ] . pool_state ;
memory_pool [ i ] . state = mem_pool_info [ i ] . pool_state ;
}
}
std : : memcpy ( output . data ( ) + sizeof ( AudioRendererResponse ) , memory_pool . data ( ) ,
std : : memcpy ( output . data ( ) + sizeof ( UpdateDataHeader ) , memory_pool . data ( ) ,
response_data . memory_pools_size ) ;
response_data . memory_pools_size ) ;
ctx . WriteBuffer ( output ) ;
ctx . WriteBuffer ( output ) ;
@ -146,53 +146,40 @@ private:
} ;
} ;
static_assert ( sizeof ( MemoryPoolInfo ) = = 0x20 , " MemoryPoolInfo has wrong size " ) ;
static_assert ( sizeof ( MemoryPoolInfo ) = = 0x20 , " MemoryPoolInfo has wrong size " ) ;
struct AudioRendererConfig {
struct UpdateDataHeader {
u32 revision ;
UpdateDataHeader ( ) { }
u32 behavior_size ;
u32 memory_pools_size ;
u32 voices_size ;
u32 voice_resource_size ;
u32 effects_size ;
u32 mixes_size ;
u32 sinks_size ;
u32 performance_buffer_size ;
INSERT_PADDING_WORDS ( 6 ) ;
u32 total_size ;
} ;
static_assert ( sizeof ( AudioRendererConfig ) = = 0x40 , " AudioRendererConfig has wrong size " ) ;
struct AudioRendererResponse {
UpdateDataHeader ( const AudioRendererParameter & config ) {
AudioRendererResponse ( const AudioRendererParameters & config ) {
revision = config . revision ;
revision = config . revision ;
error_info _size = 0xb0 ;
behavior_size = 0xb0 ;
memory_pools_size = ( config . effect_count + ( config . voice_count * 4 ) ) * 0x10 ;
memory_pools_size = ( config . effect_count + ( config . voice_count * 4 ) ) * 0x10 ;
voices_size = config . voice_count * 0x10 ;
voices_size = config . voice_count * 0x10 ;
effects_size = config . effect_count * 0x10 ;
effects_size = config . effect_count * 0x10 ;
sinks_size = config . sink_count * 0x20 ;
sinks_size = config . sink_count * 0x20 ;
performance_manager_size = 0x10 ;
performance_manager_size = 0x10 ;
total_size = sizeof ( AudioRendererResponse) + error_info _size + memory_pools_size +
total_size = sizeof ( UpdateDataHeader ) + behavior_size + memory_pools_size +
voices_size + effects_size + sinks_size + performance_manager_size ;
voices_size + effects_size + sinks_size + performance_manager_size ;
}
}
u32_le revision ;
u32_le revision ;
u32_le error_info _size;
u32_le behavior _size;
u32_le memory_pools_size ;
u32_le memory_pools_size ;
u32_le voices_size ;
u32_le voices_size ;
u32_le unknown_10 ;
u32_le voice_resource_size ;
u32_le effects_size ;
u32_le effects_size ;
u32_le unknown_18 ;
u32_le mixes_size ;
u32_le sinks_size ;
u32_le sinks_size ;
u32_le performance_manager_size ;
u32_le performance_manager_size ;
INSERT_PADDING_WORDS ( 6 ) ;
INSERT_PADDING_WORDS ( 6 ) ;
u32_le total_size ;
u32_le total_size ;
} ;
} ;
static_assert ( sizeof ( AudioRendererResponse) = = 0x40 , " AudioRendererResponse has wrong size" ) ;
static_assert ( sizeof ( UpdateDataHeader) = = 0x40 , " UpdateDataHeader has wrong size" ) ;
/// This is used to trigger the audio event callback.
/// This is used to trigger the audio event callback.
CoreTiming : : EventType * audio_event ;
CoreTiming : : EventType * audio_event ;
Kernel : : SharedPtr < Kernel : : Event > system_event ;
Kernel : : SharedPtr < Kernel : : Event > system_event ;
AudioRendererParameter s worker_params ;
AudioRendererParameter worker_params ;
} ;
} ;
class IAudioDevice final : public ServiceFramework < IAudioDevice > {
class IAudioDevice final : public ServiceFramework < IAudioDevice > {
@ -291,7 +278,7 @@ AudRenU::AudRenU() : ServiceFramework("audren:u") {
void AudRenU : : OpenAudioRenderer ( Kernel : : HLERequestContext & ctx ) {
void AudRenU : : OpenAudioRenderer ( Kernel : : HLERequestContext & ctx ) {
IPC : : RequestParser rp { ctx } ;
IPC : : RequestParser rp { ctx } ;
auto params = rp . PopRaw < AudioRendererParameter s > ( ) ;
auto params = rp . PopRaw < AudioRendererParameter > ( ) ;
IPC : : ResponseBuilder rb { ctx , 2 , 0 , 1 } ;
IPC : : ResponseBuilder rb { ctx , 2 , 0 , 1 } ;
rb . Push ( RESULT_SUCCESS ) ;
rb . Push ( RESULT_SUCCESS ) ;
@ -302,7 +289,7 @@ void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) {
void AudRenU : : GetAudioRendererWorkBufferSize ( Kernel : : HLERequestContext & ctx ) {
void AudRenU : : GetAudioRendererWorkBufferSize ( Kernel : : HLERequestContext & ctx ) {
IPC : : RequestParser rp { ctx } ;
IPC : : RequestParser rp { ctx } ;
auto params = rp . PopRaw < AudioRendererParameter s > ( ) ;
auto params = rp . PopRaw < AudioRendererParameter > ( ) ;
u64 buffer_sz = Common : : AlignUp ( 4 * params . unknown_8 , 0x40 ) ;
u64 buffer_sz = Common : : AlignUp ( 4 * params . unknown_8 , 0x40 ) ;
buffer_sz + = params . unknown_c * 1024 ;
buffer_sz + = params . unknown_c * 1024 ;