Audio services: Difference between revisions

 
(6 intermediate revisions by the same user not shown)
Line 343: Line 343:
|}
|}


= audren:u =
= (S2) auddev:s =
This is "nn::audio::detail::IAudioRendererManager".
This is "nn::audio::sysdev::ISessionManager".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 350: Line 350:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || OpenAudioRenderer
| 0 ||  
|-
|-
| 1 || GetWorkBufferSize
| 1 ||  
|-
| 2 || [[#GetAudioDeviceService]]
|-
| 3 || [3.0.0+] OpenAudioRendererForManualExecution
|-
| 4 || [4.0.0+] GetAudioDeviceServiceWithRevisionInfo
|}
|}


=== GetAudioDeviceService ===
== Cmd0 ==
Takes an input u64 [[AM_services#AppletResourceUserId|AppletResourceUserId]], returns an output [[#IAudioDevice]].
No input, returns an [[#IAdspShellSession|IAdspShellSession]].
 
== Cmd1 ==
No input, returns an [[#IClientManager|IClientManager]].


== IAudioRenderer ==
== IAdspShellSession ==
This is "nn::audio::detail::IAudioRenderer".
This is "nn::audio::adspshell::IAdspShellSession".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 371: Line 368:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetSampleRate|GetSampleRate]]
| 0 || SendKernelDebugCommand
|-
|-
| 1 || [[#GetSampleCount|GetSampleCount]]
| 1 || SendFatalErrorCommand
|-
|-
| 2 || [[#GetMixBufferCount|GetMixBufferCount]]
| 2 || SendReadMemoryCommand
|-
|-
| 3 || [[#GetState|GetState]]
| 3 || SendStressTestCommand
|-
|}
| 4 || [[#RequestUpdate|RequestUpdate]]
 
== IClientManager ==
This is "nn::audio::dpm::IClientManager".
 
{| class="wikitable" border="1"
|-
|-
| 5 || [[#Start|Start]]
! Cmd || Name
|-
|-
| 6 || [[#Stop|Stop]]
| 0 ||  
|}
 
=== Cmd0 ===
No input, returns an [[#IClientSession|IClientSession]].
 
=== IClientSession ===
This is "nn::audio::dpm::IClientSession".
 
{| class="wikitable" border="1"
|-
|-
| 7 || [[#QuerySystemEvent|QuerySystemEvent]]
! Cmd || Name
|-
|-
| 8 || [[#SetRenderingTimeLimit|SetRenderingTimeLimit]]
| 0 || CreateProcess
|-
|-
| 9 || [[#GetRenderingTimeLimit|GetRenderingTimeLimit]]
| 1 || WaitProcess
|-
|-
| 10 || [3.0.0+] [[#RequestUpdateAuto|RequestUpdateAuto]]
| 2 || TerminateProcess
|-
| 11 || [3.0.0+] ExecuteAudioRendererRendering
|-
| 12 || [15.0.0+] SetVoiceDropParameter
|-
| 13 || [15.0.0+] GetVoiceDropParameter
|}
|}


=== GetSampleRate ===
= audren:u =
No input. Returns an u32 '''SampleRate'''.
This is "nn::audio::detail::IAudioRendererManager".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || OpenAudioRenderer
|-
| 1 || GetWorkBufferSize
|-
| 2 || [[#GetAudioDeviceService]]
|-
| 3 || [3.0.0+] OpenAudioRendererForManualExecution
|-
| 4 || [4.0.0+] GetAudioDeviceServiceWithRevisionInfo
|}


=== GetSampleCount ===
=== GetAudioDeviceService ===
No input. Returns an u32 '''SampleCount'''.
Takes an input u64 [[AM_services#AppletResourceUserId|AppletResourceUserId]], returns an output [[#IAudioDevice]].


=== GetMixBufferCount ===
== IAudioRenderer ==
No input. Returns an u32 '''MixBufferCount'''.
This is "nn::audio::detail::IAudioRenderer".


=== GetState ===
{| class="wikitable" border="1"
No input. Returns an u32 '''State''' (0=Started, 1=Stopped).
|-
 
! Cmd || Name
The output is determined using the flag updated by [[#Start|Start]]/[[#Stop|Stop]].
|-
 
| 0 || [[#GetSampleRate|GetSampleRate]]
=== RequestUpdate ===
|-
Takes two type-0x6 output buffers and a type-0x5 input buffer.
| 1 || [[#GetSampleCount|GetSampleCount]]
 
|-
=== Start ===
| 2 || [[#GetMixBufferCount|GetMixBufferCount]]
No input/output.
|-
 
| 3 || [[#GetState|GetState]]
Besides logging, this calls a func which essentially clears a state field and sets a flag, and also calls a func.
|-
 
| 4 || [[#RequestUpdate|RequestUpdate]]
The thread which handles generating/sending ADSP commands will only do so when the above flag indicates the state is Started.
|-
| 5 || [[#Start|Start]]
|-
| 6 || [[#Stop|Stop]]
|-
| 7 || [[#QuerySystemEvent|QuerySystemEvent]]
|-
| 8 || [[#SetRenderingTimeLimit|SetRenderingTimeLimit]]
|-
| 9 || [[#GetRenderingTimeLimit|GetRenderingTimeLimit]]
|-
| 10 || [3.0.0+] [[#RequestUpdateAuto|RequestUpdateAuto]]
|-
| 11 || [3.0.0+] ExecuteAudioRendererRendering
|-
| 12 || [15.0.0+] SetVoiceDropParameter
|-
| 13 || [15.0.0+] GetVoiceDropParameter
|}


=== Stop ===
=== GetSampleRate ===
No input/output.
No input. Returns an u32 '''SampleRate'''.


After logging, this calls a func which essentially returns when the flag from [[#Start|Start]] is not set. Various funcs are called, then the flag is cleared. If needed, this waits on an event, then this returns.
=== GetSampleCount ===
No input. Returns an u32 '''SampleCount'''.
 
=== GetMixBufferCount ===
No input. Returns an u32 '''MixBufferCount'''.
 
=== GetState ===
No input. Returns an u32 '''State''' (0=Started, 1=Stopped).
 
The output is determined using the flag updated by [[#Start|Start]]/[[#Stop|Stop]].
 
=== RequestUpdate ===
Takes two type-0x6 output buffers and a type-0x5 input buffer.
 
=== Start ===
No input/output.
 
Besides logging, this calls a func which essentially clears a state field and sets a flag, and also calls a func.
 
The thread which handles generating/sending ADSP commands will only do so when the above flag indicates the state is Started.
 
=== Stop ===
No input/output.
 
After logging, this calls a func which essentially returns when the flag from [[#Start|Start]] is not set. Various funcs are called, then the flag is cleared. If needed, this waits on an event, then this returns.


=== QuerySystemEvent ===
=== QuerySystemEvent ===
Line 490: Line 551:
| 20 || [18.0.0+] IsAudioDeviceOutputVolumeAutoTuneEnabled
| 20 || [18.0.0+] IsAudioDeviceOutputVolumeAutoTuneEnabled
|-
|-
| 21 || [21.0.0+] IsActiveOutputDeviceEstimatedLowLatency
| 21 || [21.0.0+] [[#IsActiveOutputDeviceEstimatedLowLatency|IsActiveOutputDeviceEstimatedLowLatency]]
|}
|}


Line 536: Line 597:


On NX this just returns an error.
On NX this just returns an error.
=== IsActiveOutputDeviceEstimatedLowLatency ===
No input, returns an output bool.
The output bool is set to global_state_field == 0x4.


= audout:a =
= audout:a =
Line 901: Line 967:
|-
|-
| 9 || [16.0.0+] GetWorkBufferSizeForMultiStreamExEx
| 9 || [16.0.0+] GetWorkBufferSizeForMultiStreamExEx
|-
| 100 || [S2]
|}
|}


Line 938: Line 1,006:


The input buffer is a [[#OpusMultiStreamParametersEx]] struct.
The input buffer is a [[#OpusMultiStreamParametersEx]] struct.
== Cmd100 ==
No input, returns an [[#IClientSession_2|IClientSession]].


== IHardwareOpusDecoder ==
== IHardwareOpusDecoder ==
Line 1,006: Line 1,077:


The bool flag indicates whether or not a reset of the decoder context is being requested.
The bool flag indicates whether or not a reset of the decoder context is being requested.
== IClientSession ==
This is "nn::codec::hwacod::IClientSession".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|-
| 1 ||
|-
| 10 ||
|}
=== Cmd10 ===
Takes {...}, returns an [[#IHardwareAudioCodecManagerSession|IHardwareAudioCodecManagerSession]].
=== IHardwareAudioCodecManagerSession ===
This is "nn::codec::hwacod::IHardwareAudioCodecManagerSession".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|-
| 1 ||
|-
| 10 ||
|}


= auddebug =
= auddebug =
Line 1,169: Line 1,271:
|}
|}


= (S2) audsmx:u =
= (S2) auddmg:s =
This is "nn::audio::sysmix::IUserSessionManager".
This is "nn::audio::devmgr::ISystemSessionManager".
 
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,180: Line 1,282:


== Cmd0 ==
== Cmd0 ==
Takes a PID, a Process handle, an u32, an u64 pid_reserved, returns an output [[#IUserSession_2|IUserSession]].
Takes a PID, an u32, an u64 pid_reserved, returns an output [[#ISystemSession|ISystemSession]].


=== IUserSession ===
== ISystemSession ==
This is "nn::audio::sysmix::IUserSession".
This is "nn::audio::devmgr::ISystemSession".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,189: Line 1,291:
! Cmd || Name
! Cmd || Name
|-
|-
| 1 ||  
| 0 || ListPhysicalDeviceNames
|-
|-
| 2 ||  
| 1 || EnableSoundDriver
|-
|-
| 3 ||  
| 2 || DisableSoundDriver
|}
 
==== Cmd1 ====
Takes a type-0x5 input buffer, two input u32s, 3 u64s, returns an output [[#IExternalStreamSession|IExternalStreamSession]].
 
==== Cmd2 ====
Takes a type-0x5 input buffer, no output.
 
==== Cmd3 ====
Takes a type-0x5 input buffer, no output.
 
==== IExternalStreamSession ====
This is "nn::audio::sysmix::IExternalStreamSession".
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 3 || IsSoundDriverEnabled
|-
|-
| 0 ||  
| 4 || ListPhysicalDeviceIds
|-
|-
| 1 ||  
| 5 || GetPhysicalDeviceId
|-
| 6 || GetPhysicalDeviceProfile
|-
|-
| 2 ||  
| 7 || MapRawInputDevice
|-
|-
| 3 ||  
| 8 || MapAndBindPhysicalDevice
|-
|-
| 4 ||  
| 9 || UnmapPhysicalDevice
|-
|-
| 5 ||  
| 10 || GetBoundPhysicalDeviceProfile
|-
|-
| 6 ||  
| 11 || GetRawInputPhysicalDeviceProfile
|-
|-
| 7 ||  
| 12 || SetVirtualDeviceGain
|-
|-
| 8 ||  
| 13 || GetVirtualDeviceGain
|-
|-
| 9 ||  
| 14 || SetAppletVirtualDeviceGain
|-
|-
| 10 ||  
| 15 || GetAppletVirtualDeviceGain
|-
|-
| 11 ||  
| 16 || SetAppletCaptureDeviceGain
|-
|-
| 12 ||  
| 17 || GetAppletCaptureDeviceGain
|}
 
= SampleFormat =
This is "nn::audio::SampleFormat".
 
{| class="wikitable" border="1"
|-
|-
! Value || Name
| 18 || SetAppletBiquadFilterMode
|-
|-
| 0 || Invalid
| 19 || SetAppletBiquadFilterParameters
|-
|-
| 1 || PcmInt8
| 20 || GetAppletBiquadFilterParameters
|-
|-
| 2 || PcmInt16
| 21 || SuspendAppletVirtualDevice
|-
|-
| 3 || PcmInt24
| 22 || ResumeAppletVirtualDevice
|-
|-
| 4 || PcmInt32
| 23 || SetPhysicalDeviceGain
|-
|-
| 5 || PcmFloat
| 24 || GetPhysicalDeviceGain
|-
|-
| 6 || Adpcm
| 25 || SetPhysicalDeviceFeature
|}
 
= AudioOutState =
This is "nn::audio::AudioOutState".
 
{| class="wikitable" border="1"
|-
|-
! Value || Name
| 26 || GetPhysicalDeviceFeature
|-
|-
| 0 || Started
| 27 || SetGlobalPhysicalDeviceFeature
|-
|-
| 1 || Stopped
| 28 || GetGlobalPhysicalDeviceFeature
|}
 
= AudioInState =
This is "nn::audio::AudioInState".
 
{| class="wikitable" border="1"
|-
|-
! Value || Name
| 29 || AcquireGlobalPhysicalDeviceEvent
|-
|-
| 0 || Started
| 30 || ReleaseGlobalPhysicalDeviceEvent
|-
|-
| 1 || Stopped
| 31 || BindPhysicalDevice
|}
 
= FinalOutputRecorderState =
This is "nn::audio::FinalOutputRecorderState".
 
{| class="wikitable" border="1"
|-
|-
! Value || Name
| 32 || SetMonauralDownmixMode
|-
|-
| 0 || Started
| 33 || SetControl
|-
| 34 || GetMonauralDownmixMode
|-
| 35 || GetControl
|-
| 36 || ShellCommand
|-
| 37 || SetAppletVirtualDeviceLoudnessNormalization
|-
| 38 || GetAppletVirtualDeviceLoudnessNormalization
|-
| 39 || SetLoudnessNormalizationParameters
|-
| 40 || GetLoudnessNormalizationParameters
|-
| 41 || GetLoudnessNormalizationStatistics
|-
| 42 || SetAppletVirtualDeviceLoudnessNormalizationBiasParameters
|-
| 43 || GetAppletVirtualDeviceLoudnessNormalizationBiasParameters
|-
| 44 || SetAppletVirtualDevicePostGain
|-
| 45 || GetAppletVirtualDevicePostGain
|-
|-
| 1 || Stopped
| 46 || UnbindVirtualDevice
|}
|}


= AudioOutInfo =
= (S2) audsmx:u =
This is "nn::audio::AudioOutInfo".
This is "nn::audio::sysmix::IUserSessionManager".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Cmd || Name
! Size
! Description
|-
|-
| 0x0
| 0 ||  
| 0x100
| Name
|}
|}


= AudioInInfo =
== Cmd0 ==
This is "nn::audio::AudioInInfo".
Takes a PID, a Process handle, an u32, an u64 pid_reserved, returns an output [[#IUserSession_2|IUserSession]].
 
Official sw uses hard-coded value 0x1 for the u32.
 
An error is returned when there's already an [[#IUserSession|IUserSession]] open with the same PID.
 
=== IUserSession ===
This is "nn::audio::sysmix::IUserSession".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Cmd || Name
! Size
|-
! Description
| 1 ||
|-
| 2 ||
|-
|-
| 0x0
| 3 ||  
| 0x100
| Name
|}
|}


= AudioOutParameter =
==== Cmd1 ====
This is "nn::audio::AudioOutParameter".
Takes a type-0x5 input buffer, two input u32s, 3 u64s, returns an output [[#IExternalStreamSession|IExternalStreamSession]].
 
==== Cmd2 ====
Takes a type-0x5 input buffer, no output.
 
==== Cmd3 ====
Takes a type-0x5 input buffer, no output.
 
==== IExternalStreamSession ====
This is "nn::audio::sysmix::IExternalStreamSession".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Cmd || Name
! Size
|-
! Description
| 0 ||
|-
|-
| 0x0
| 1 ||  
| 0x4
| SampleRate
|-
|-
| 0x4
| 2 ||  
| 0x2
| ChannelCount
|-
|-
| 0x6
| 3 ||
| 0x2
|-
| Reserved
| 4 ||
|-
| 5 ||
|-
| 6 ||
|-
| 7 ||
|-
| 8 ||
|-
| 9 ||
|-
| 10 ||
|-
| 11 ||
|-
| 12 ||
|}
|}


= AudioInParameter =
= SampleFormat =
This is "nn::audio::AudioInParameter".
This is "nn::audio::SampleFormat".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value || Name
! Size
! Description
|-
|-
| 0x0
| 0 || Invalid
| 0x4
|-
| SampleRate
| 1 || PcmInt8
|-
| 2 || PcmInt16
|-
| 3 || PcmInt24
|-
| 4 || PcmInt32
|-
|-
| 0x4
| 5 || PcmFloat
| 0x2
| ChannelCount
|-
|-
| 0x6
| 6 || Adpcm
| 0x2
| Reserved
|}
|}


= AudioOutParameterInternal =
= AudioOutState =
This is "nn::audio::detail::AudioOutParameterInternal".
This is "nn::audio::AudioOutState".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value || Name
! Size
! Description
|-
|-
| 0x0
| 0 || Started
| 0x4
| SampleRate
|-
|-
| 0x4
| 1 || Stopped
| 0x4
| ChannelCount
|-
| 0x8
| 0x4
| SampleFormat
|-
| 0xC
| 0x4
| State
|}
|}


= AudioInParameterInternal =
= AudioInState =
This is "nn::audio::detail::AudioInParameterInternal".
This is "nn::audio::AudioInState".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value || Name
! Size
! Description
|-
|-
| 0x0
| 0 || Started
| 0x4
| SampleRate
|-
|-
| 0x4
| 1 || Stopped
| 0x4
| ChannelCount
|-
| 0x8
| 0x4
| SampleFormat
|-
| 0xC
| 0x4
| State
|}
|}


= AudioOutBuffer =
= FinalOutputRecorderState =
This is "nn::audio::AudioOutBuffer".
This is "nn::audio::FinalOutputRecorderState".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value || Name
! Size
! Description
|-
|-
| 0x0
| 0 || Started
| 0x8
| Pointer to next buffer (unused)
|-
|-
| 0x8
| 1 || Stopped
| 0x8
| Pointer to sample buffer
|-
| 0x10
| 0x8
| Capacity of sample buffer
|-
| 0x18
| 0x8
| Size of data in the sample buffer
|-
| 0x20
| 0x8
| Offset of data in the sample buffer (unused/ignored?)
|}
|}


= AudioInBuffer =
= AudioOutInfo =
This is "nn::audio::AudioInBuffer".
This is "nn::audio::AudioOutInfo".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,461: Line 1,528:
|-
|-
| 0x0
| 0x0
| 0x8
| 0x100
| Pointer to next buffer (unused)
| Name
|-
| 0x8
| 0x8
| Pointer to sample buffer
|-
| 0x10
| 0x8
| Capacity of sample buffer
|-
| 0x18
| 0x8
| Size of data in the sample buffer
|-
| 0x20
| 0x8
| Offset of data in the sample buffer (unused/ignored?)
|}
|}


= FinalOutputRecorderBuffer =
= AudioInInfo =
This is "nn::audio::FinalOutputRecorderBuffer".
This is "nn::audio::AudioInInfo".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,491: Line 1,542:
|-
|-
| 0x0
| 0x0
| 0x8
| 0x100
| Released
| Name
|-
|}
| 0x8
| 0x8
| Pointer to next buffer (unused)
|-
| 0x10
| 0x8
| Pointer to sample buffer
|-
| 0x18
| 0x8
| Capacity of sample buffer
|-
| 0x20
| 0x8
| Size of data in the sample buffer
|-
| 0x28
| 0x8
| Offset of data in the sample buffer (unused/ignored?)
|}


= FinalOutputRecorderParameter =
= AudioOutParameter =
This is "nn::audio::FinalOutputRecorderParameter".
This is "nn::audio::AudioOutParameter".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,527: Line 1,558:
| 0x4
| 0x4
| SampleRate
| SampleRate
|}
|-
| 0x4
| 0x2
| ChannelCount
|-
| 0x6
| 0x2
| Reserved
|}


= FinalOutputRecorderParameterInternal =
= AudioInParameter =
This is "nn::audio::detail::FinalOutputRecorderParameterInternal".
This is "nn::audio::AudioInParameter".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,543: Line 1,582:
|-
|-
| 0x4
| 0x4
| 0x4
| 0x2
| ChannelCount
| ChannelCount
|-
|-
| 0x8
| 0x6
| 0x4
| 0x2
| SampleFormat
| Reserved
|-
| 0xC
| 0x4
| State
|}
|}


= FinalOutputRecorderWorkBufferParameterInternal =
= AudioOutParameterInternal =
This is "nn::audio::detail::FinalOutputRecorderWorkBufferParameterInternal".
This is "nn::audio::detail::AudioOutParameterInternal".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,565: Line 1,600:
|-
|-
| 0x0
| 0x0
| 0x8
| 0x4
|  
| SampleRate
|-
| 0x4
| 0x4
| ChannelCount
|-
|-
| 0x8
| 0x8
| 0x8
| 0x4
|  
| SampleFormat
|-
|-
| 0x10
| 0xC
| 0x8
| 0x4
|  
| State
|}
|}


= OpusParametersEx =
= AudioInParameterInternal =
This is "nn::audio::detail::AudioInParameterInternal".
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,594: Line 1,635:
| 0x8
| 0x8
| 0x4
| 0x4
| UseLargeFrameSize
| SampleFormat
|-
|-
| 0xC
| 0xC
| 0x4
| 0x4
| Padding
| State
|}
|}


= OpusMultiStreamParameters =
= AudioOutBuffer =
This is "nn::audio::AudioOutBuffer".
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,609: Line 1,652:
|-
|-
| 0x0
| 0x0
| 0x4
| 0x8
| SampleRate
| Pointer to next buffer (unused)
|-
|-
| 0x4
| 0x8
| 0x4
| 0x8
| ChannelCount
| Pointer to sample buffer
|-
|-
| 0x10
| 0x8
| 0x8
| 0x4
| Capacity of sample buffer
| Number of streams
|-
|-
| 0xC
| 0x18
| 0x4
| 0x8
| Number of stereo streams
| Size of data in the sample buffer
|-
|-
| 0x10
| 0x20
| 0x100
| 0x8
| u8 array of channel mappings
| Offset of data in the sample buffer (unused/ignored?)
|}
|}


= OpusMultiStreamParametersEx =
= AudioInBuffer =
This is "nn::audio::AudioInBuffer".
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,637: Line 1,682:
|-
|-
| 0x0
| 0x0
| 0x4
| 0x8
| SampleRate
| Pointer to next buffer (unused)
|-
|-
| 0x4
| 0x8
| 0x4
| 0x8
| ChannelCount
| Pointer to sample buffer
|-
|-
| 0x10
| 0x8
| 0x8
| 0x4
| Capacity of sample buffer
| Number of streams
|-
|-
| 0xC
| 0x18
| 0x4
| 0x8
| Number of stereo streams
| Size of data in the sample buffer
|-
|-
| 0x10
| 0x20
| 0x4
| 0x8
| UseLargeFrameSize
| Offset of data in the sample buffer (unused/ignored?)
|-
| 0x14
| 0x4
| Padding
|-
| 0x18
| 0x100
| u8 array of channel mappings
|}
|}


= BehaviorInfo Revision =
= FinalOutputRecorderBuffer =
This is the revision field used with audren. This controls which format is used for the data used with [[#IAudioRenderer|IAudioRenderer]] RequestUpdate*, etc.
This is "nn::audio::FinalOutputRecorderBuffer".
 
Bitmask 0xFFFFFF == 0x564552 (REV) is used for determining whether the user-process is using NX-platform. On Ounce, the revision value is identical except that bitmask 0xFFFFFF is 0x764552 (REv).


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! System Version
! Offset
! Value
! Size
! Required by
! Description
|-
|-
| [1.0.0+]
| 0x0
| 0x31564552 (REV1)
| 0x8
| IsAudioRenererProcessingTimeLimit70PercentSupported
| Released
|-
|-
| [2.0.0+]
| 0x8
| 0x32564552 (REV2)
| 0x8
| IsAdpcmLoopContextBugFixed, IsSplitterSupported
| Pointer to next buffer (unused)
|-
|-
| [3.0.0+]
| 0x10
| 0x33564552 (REV3)
| 0x8
| IsLongSizePreDelaySupported
| Pointer to sample buffer
|-
|-
| [4.0.0+]
| 0x18
| 0x34564552 (REV4)
| 0x8
| IsAudioRenererProcessingTimeLimit75PercentSupported
| Capacity of sample buffer
|-
|-
| [6.0.0+]
| 0x20
| 0x35564552 (REV5)
| 0x8
|
| Size of data in the sample buffer
* IsAudioRenererProcessingTimeLimit80PercentSupported
* IsCommandProcessingTimeEstimatorVersion2Supported
* IsVariadicCommandBufferSizeSupported
* IsFlushVoiceWaveBuffersSupported
* IsSplitterBugFixed
* IsElapsedFrameCountSupported
* IsPerformanceMetricsDataFormatVersion2Supported
* GetPerformanceMetricsDataFormat
* IsVoicePitchAndSrcSkippedSupported
* IsVoicePlayedSampleCountResetAtLoopPointSupported
|-
|-
| [6.1.0+]
| 0x28
| 0x36564552 (REV6)
| 0x8
| IsBiquadFilterEffectStateClaerBugFixed
| Offset of data in the sample buffer (unused/ignored?)
|-
|}
| [7.0.0+]
 
| 0x37564552 (REV7)
= FinalOutputRecorderParameter =
|
This is "nn::audio::FinalOutputRecorderParameter".
* IsVolumeMixParameterPrecisionQ23Supported
 
* UseBiquadFilterFloatProcessing
{| class="wikitable" border="1"
* IsMixInParameterDirtyOnlyUpdateSupported
|-
|-
| [9.0.0+]
! Offset
| 0x38564552 (REV8)
! Size
|
! Description
* IsWaveBufferVer2Supported
* IsCommandProcessingTimeEstimatorVersion3Supported
|-
|-
| [12.0.0+]
| 0x0
| 0x39564552 (REV9)
| 0x4
| IsEffectInfoVersion2Supported
| SampleRate
|}
 
= FinalOutputRecorderParameterInternal =
This is "nn::audio::detail::FinalOutputRecorderParameterInternal".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| SampleRate
|-
| 0x4
| 0x4
| ChannelCount
|-
|-
| [13.0.0+]
| 0x8
| 0x3A564552
| 0x4
| SampleFormat
|-
| 0xC
| 0x4
| State
|}
 
= FinalOutputRecorderWorkBufferParameterInternal =
This is "nn::audio::detail::FinalOutputRecorderWorkBufferParameterInternal".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
|
|-
| 0x8
| 0x8
|
|-
| 0x10
| 0x8
|
|}
 
= OpusParametersEx =
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| SampleRate
|-
| 0x4
| 0x4
| ChannelCount
|-
| 0x8
| 0x4
| UseLargeFrameSize
|-
| 0xC
| 0x4
| Padding
|}
 
= OpusMultiStreamParameters =
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| SampleRate
|-
| 0x4
| 0x4
| ChannelCount
|-
| 0x8
| 0x4
| Number of streams
|-
| 0xC
| 0x4
| Number of stereo streams
|-
| 0x10
| 0x100
| u8 array of channel mappings
|}
 
= OpusMultiStreamParametersEx =
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| SampleRate
|-
| 0x4
| 0x4
| ChannelCount
|-
| 0x8
| 0x4
| Number of streams
|-
| 0xC
| 0x4
| Number of stereo streams
|-
| 0x10
| 0x4
| UseLargeFrameSize
|-
| 0x14
| 0x4
| Padding
|-
| 0x18
| 0x100
| u8 array of channel mappings
|}
 
= BehaviorInfo Revision =
This is the revision field used with audren. This controls which format is used for the data used with [[#IAudioRenderer|IAudioRenderer]] RequestUpdate*, etc.
 
Bitmask 0xFFFFFF == 0x564552 (REV) is used for determining whether the user-process is using NX-platform. On Ounce, the revision value is identical except that bitmask 0xFFFFFF is 0x764552 (REv). The latter is only supported on S2.
 
GetWorkBufferSize/OpenAudioRenderer validate the revision, with an error being thrown if invalid (unrecognized top-byte / low-bitmask is unrecognized).
 
{| class="wikitable" border="1"
|-
! System Version
! Value
! Required by
|-
| [1.0.0+]
| 0x31564552 (REV1)
| IsAudioRenererProcessingTimeLimit70PercentSupported
|-
| [2.0.0+]
| 0x32564552 (REV2)
| IsAdpcmLoopContextBugFixed, IsSplitterSupported
|-
| [3.0.0+]
| 0x33564552 (REV3)
| IsLongSizePreDelaySupported
|-
| [4.0.0+]
| 0x34564552 (REV4)
| IsAudioRenererProcessingTimeLimit75PercentSupported
|-
| [6.0.0+]
| 0x35564552 (REV5)
|
|
* UseMultiTapBiquadFilterProcessing
* IsAudioRenererProcessingTimeLimit80PercentSupported
* IsCommandProcessingTimeEstimatorVersion4Supported
* IsCommandProcessingTimeEstimatorVersion2Supported
* IsDeviceApiVersion2Supported
* IsVariadicCommandBufferSizeSupported
|-
* IsFlushVoiceWaveBuffersSupported
| [14.0.0+]
* IsSplitterBugFixed
| 0x3B564552
* IsElapsedFrameCountSupported
|
* IsPerformanceMetricsDataFormatVersion2Supported
* IsDelayChannelMappingChanged
* GetPerformanceMetricsDataFormat
* IsReverbChannelMappingChanged
* IsVoicePitchAndSrcSkippedSupported
* IsI3dl2ReverbChannelMappingChanged
* IsVoicePlayedSampleCountResetAtLoopPointSupported
* IsCommandProcessingTimeEstimatorVersion5Supported
|-
|-
| [6.1.0+]
| [17.0.0+]
| 0x36564552 (REV6)
| 0x3C564552
| IsBiquadFilterEffectStateClaerBugFixed
| IsBiquadFilterParameterForSplitterEnabled
|-
| [7.0.0+]
| 0x37564552 (REV7)
|
* IsVolumeMixParameterPrecisionQ23Supported
* UseBiquadFilterFloatProcessing
* IsMixInParameterDirtyOnlyUpdateSupported
|-
| [9.0.0+]
| 0x38564552 (REV8)
|
* IsWaveBufferVer2Supported
* IsCommandProcessingTimeEstimatorVersion3Supported
|-
| [12.0.0+]
| 0x39564552 (REV9)
| IsEffectInfoVersion2Supported
|-
| [13.0.0+]
| 0x3A564552
|
* UseMultiTapBiquadFilterProcessing
* IsCommandProcessingTimeEstimatorVersion4Supported
* IsDeviceApiVersion2Supported
|-
| [14.0.0+]
| 0x3B564552
|
* IsDelayChannelMappingChanged
* IsReverbChannelMappingChanged
* IsI3dl2ReverbChannelMappingChanged
* IsCommandProcessingTimeEstimatorVersion5Supported
|-
| [17.0.0+]
| 0x3C564552
| IsBiquadFilterParameterForSplitterEnabled
|-
| [18.0.0+]
| 0x3D564552
| IsSplitterPrevVolumeResetSupported
|-
|
| 0x3E564552
| IsSplitterDepopBugFixEnabled
|-
| [19.0.0+]
| 0x3F564552
| IsBiquadFilterParameterFloatSupported
|-
|-
| [18.0.0+]
| [22.0.0+]
| 0x3D564552
| 0x40564552
| IsSplitterPrevVolumeResetSupported
| IsVoiceBiquadFilterCrossFadeCurveEnabled
|-
|
| 0x3E564552
| IsSplitterDepopBugFixEnabled
|-
| [19.0.0+]
| 0x3F564552
| IsBiquadFilterParameterFloatSupported
|}
|}