Difference between revisions of "Audio services"

From Nintendo Switch Brew
Jump to navigation Jump to search
Line 1,420: Line 1,420:
 
| u8 array of channel mappings
 
| u8 array of channel mappings
 
|}
 
|}
 +
 +
= Notes =
 +
Once nnMain finishes running, it calls a func which handles ADSP Aborts. This waits on an event, calls a func, then Aborts with Result 0xC0899.
 +
 +
That func just calls another func, which:
 +
* Calls various AGIC funcs for this IRQ, etc.
 +
* Copies data from devicemem+0x608C (the 0x7000-byte devicemem "shared memory segment") to a stack struct.
 +
* A funcptr is called if set with the above struct, then this returns.
 +
 +
That funcptr, besides other func-calls, will log an [[Error_Report_services|erpt]] using the input struct when set with the "AdspException*" fields.
 +
 +
This is triggered by AGIC IRQ adsp_wdresetreq, "ADSP Watchdog Timer Reset Request". The ADSP updates the watchdog from a thread, so normally the watchdog only expires when the ADSP configures it to trigger immediately.
 +
 +
When handling an assert/exception, the ADSP:
 +
* Logs exception info in text form into devicemem.
 +
* Logs the binary form of the exception into devicemem (offset above).
 +
* Eventually configures the watchdog to trigger immediately, prints "HALT: spinning forever...\n", then enters a loop using instruction "wfe".
  
 
[[Category:Services]]
 
[[Category:Services]]

Revision as of 15:01, 24 April 2024

audout:u

This is "nn::audio::detail::IAudioOutManager".

Cmd Name
0 ListAudioOuts
1 OpenAudioOut
2 [3.0.0+] ListAudioOutsAuto
3 [3.0.0+] OpenAudioOutAuto

ListAudioOuts

Takes a type-0x6 output buffer containing an array of #AudioOutInfo. Returns an u32 Count.

OpenAudioOut

Takes a PID-descriptor, a type-0x5 input buffer NameIn, a type-0x6 output buffer NameOut, an input #AudioOutParameter, an input Process handle and an input AppletResourceUserId. Returns an #IAudioOut and an output #AudioOutParameterInternal.

ListAudioOutsAuto

Same as #ListAudioOuts, but takes a type-0x22 output buffer instead.

OpenAudioOutAuto

Same as #OpenAudioOut, but takes a type-0x21 input buffer and a type-0x22 output buffer instead.

IAudioOut

This is "nn::audio::detail::IAudioOut".

Cmd Name
0 GetAudioOutState
1 Start
2 Stop
3 AppendAudioOutBuffer
4 RegisterBufferEvent
5 GetReleasedAudioOutBuffers
6 ContainsAudioOutBuffer
7 [3.0.0+] AppendAudioOutBufferAuto
8 [3.0.0+] GetReleasedAudioOutBuffersAuto
9 [4.0.0+] GetAudioOutBufferCount
10 [4.0.0+] GetAudioOutPlayedSampleCount
11 [4.0.0+] FlushAudioOutBuffers
12 [6.0.0+] SetAudioOutVolume
13 [6.0.0+] GetAudioOutVolume

GetAudioOutState

No input. Returns an output #AudioOutState.

Start

No input/output.

Starts audio playback using data from appended buffers.

Stop

No input/output.

Stops audio playback. This waits for audio playback to finish before returning.

AppendAudioOutBuffer

Takes a type-0x5 input buffer containing an #AudioOutBuffer and an input u64 BufferClientPtr. No output.

RegisterBufferEvent

No input. Returns an output Event handle.

The event is signalled when a buffer is released.

GetReleasedAudioOutBuffers

Takes a type-0x6 output buffer AudioBuffer. Returns an output u32 Count.

AudioBuffer will be filled with the identifiers from #AppendAudioOutBuffer of audio buffers that have been released.

ContainsAudioOutBuffer

Takes an input u64 AudioBufferPointer. Returns an output bool Contains.

AppendAudioOutBufferAuto

Same as #AppendAudioOutBuffer, but takes a type-0x21 buffer instead.

GetReleasedAudioOutBuffersAuto

Same as #GetReleasedAudioOutBuffer, but takes a type-0x22 buffer instead.

GetAudioOutBufferCount

No input. Returns an output u32 AudioOutBufferCount.

GetAudioOutPlayedSampleCount

No input. Returns an output u64 AudioOutPlayedSampleCount.

FlushAudioOutBuffers

No input. Returns an output bool Pending.

SetAudioOutVolume

Takes an input float AudioOutVolume. No output.

GetAudioOutVolume

No input. Returns an output float AudioOutVolume.

audin:u

This is "nn::audio::detail::IAudioInManager".

Cmd Name
0 ListAudioIns
1 OpenAudioIn
2 [3.0.0+] ListAudioInsAuto
3 [3.0.0+] OpenAudioInAuto
4 [3.0.0+] ListAudioInsAutoFiltered
5 [5.0.0+] OpenAudioInProtocolSpecified

ListAudioIns

Takes a type-0x6 output buffer containing an array of #AudioInInfo. Returns an u32 Count.

OpenAudioIn

Takes a PID-descriptor, a type-0x5 input buffer NameIn, a type-0x6 output buffer NameOut, an input #AudioInParameter, an input Process handle and an input AppletResourceUserId. Returns an #IAudioIn and an an output #AudioInParameterInternal.

ListAudioInsAuto

Same as #ListAudioIns, but takes a type-0x22 output buffer instead.

OpenAudioInAuto

Same as #OpenAudioIn, but takes a type-0x21 input buffer and a type-0x22 output buffer instead.

ListAudioInsAutoFiltered

Same as #ListAudioInsAuto.

OpenAudioInProtocolSpecified

Same as #OpenAudioIn, but takes an additional input u64 Protocol.

IAudioIn

This is "nn::audio::detail::IAudioIn".

Cmd Name
0 GetAudioInState
1 Start
2 Stop
3 AppendAudioInBuffer
4 RegisterBufferEvent
5 GetReleasedAudioInBuffers
6 ContainsAudioInBuffer
7 [3.0.0+] AppendUacInBuffer
8 [3.0.0+] AppendAudioInBufferAuto
9 [3.0.0+] GetReleasedAudioInBuffersAuto
10 [3.0.0+] AppendUacInBufferAuto
11 [4.0.0+] GetAudioInBufferCount
12 [4.0.0+] SetDeviceGain
13 [4.0.0+] GetDeviceGain
14 [6.0.0+] FlushAudioInBuffers

GetAudioInState

No input. Returns an output #AudioInState.

Start

No input/output.

Stop

No input/output.

AppendAudioInBuffer

Takes a type-0x5 input buffer containing an #AudioInBuffer and an input u64 BufferClientPtr. No output.

RegisterBufferEvent

No input. Returns an output Event handle.

The event is signalled when a buffer is released.

GetReleasedAudioInBuffers

Takes a type-0x6 output buffer AudioBuffer. Returns an output u32 Count.

AudioBuffer will be filled with the identifiers from #AppendAudioInBuffer of audio buffers that have been released.

ContainsAudioInBuffer

Takes an input u64 AudioBufferPointer. Returns an output bool Contains.

AppendUacInBuffer

Takes a type-0x5 input buffer containing an UacInBuffer, an input u64 BufferClientPtr and an input Event handle. No output.

AppendAudioInBufferAuto

Same as #AppendAudioInBuffer, but takes a type-0x21 buffer instead.

GetReleasedAudioInBuffersAuto

Same as #GetReleasedAudioInBuffer, but takes a type-0x22 buffer instead.

AppendUacInBufferAuto

Same as #AppendUacInBuffer, but takes a type-0x21 buffer instead.

GetAudioInBufferCount

No input. Returns an output u32 AudioInBufferCount.

SetDeviceGain

Takes an input float DeviceGain. No output.

GetDeviceGain

No input. Returns an output float DeviceGain.

FlushAudioInBuffers

No input. Returns an output bool Pending.

audrec:u

This is "nn::audio::detail::IFinalOutputRecorderManager".

Cmd Name
0 #OpenFinalOutputRecorder

OpenFinalOutputRecorder

Takes an input #FinalOutputRecorderParameter, an input Process handle and an input AppletResourceUserId. Returns an #IFinalOutputRecorder and an output #FinalOutputRecorderParameterInternal.

IFinalOutputRecorder

This is "nn::audio::detail::IFinalOutputRecorder".

Cmd Name
0 GetFinalOutputRecorderState
1 Start
2 Stop
3 AppendFinalOutputRecorderBuffer
4 RegisterBufferEvent
5 GetReleasedFinalOutputRecorderBuffers
6 ContainsFinalOutputRecorderBuffer
7 GetFinalOutputRecorderBufferEndTime
8 [3.0.0+] AppendFinalOutputRecorderBufferAuto
9 [3.0.0+] GetReleasedFinalOutputRecorderBuffersAuto
10 [6.0.0+] FlushFinalOutputRecorderBuffers
11 [9.0.0+] AttachWorkBuffer

GetFinalOutputRecorderState

No input. Returns an output #FinalOutputRecorderState.

Start

No input/output.

Stop

No input/output.

AppendFinalOutputRecorderBuffer

Takes a type-0x5 input buffer containing an #FinalOutputRecorderBuffer and an input u64 BufferClientPtr. No output.

RegisterBufferEvent

No input. Returns an output Event handle.

The event is signalled when a buffer is released.

GetReleasedFinalOutputRecorderBuffers

Takes a type-0x6 output buffer FinalOutputRecorderBuffer. Returns two output u64s Count and Released.

FinalOutputRecorderBuffer will be filled with the identifiers from #AppendFinalOutputRecorderBuffer of recorder buffers that have been released.

ContainsFinalOutputRecorderBuffer

Takes an input u64 FinalOutputRecorderBufferPointer. Returns an output bool Contains.

GetFinalOutputRecorderBufferEndTime

Takes an input u64 FinalOutputRecorderBufferPointer. Returns an output u64 Released.

AppendFinalOutputRecorderBufferAuto

Same as #AppendFinalOutputRecorderBuffer, but takes a type-0x21 buffer instead.

GetReleasedFinalOutputRecorderBuffersAuto

Same as #GetReleasedFinalOutputRecorderBuffers, but takes a type-0x22 buffer instead.

FlushFinalOutputRecorderBuffers

No input. Returns an output bool Pending.

AttachWorkBuffer

Takes an input #FinalOutputRecorderWorkBufferParameterInternal. No output.

auddev

This is "nn::audio::detail::IAudioSnoopManager".

This was added with [6.0.0+].

Cmd Name
0 [17.0.0+] GetDspStatistics ([6.0.0-16.1.0] EnableDspUsageMeasurement)
1 [6.0.0-16.1.0] DisableDspUsageMeasurement
6 [6.0.0-16.1.0] GetDspUsage

audren:u

This is "nn::audio::detail::IAudioRendererManager".

Cmd Name
0 OpenAudioRenderer
1 GetWorkBufferSize
2 #GetAudioDeviceService
3 [3.0.0+] OpenAudioRendererForManualExecution
4 [4.0.0+] GetAudioDeviceServiceWithRevisionInfo

GetAudioDeviceService

Takes an input u64 AppletResourceUserId, returns an output #IAudioDevice.

IAudioRenderer

This is "nn::audio::detail::IAudioRenderer".

Cmd Name
0 #GetSampleRate
1 #GetSampleCount
2 #GetMixBufferCount
3 #GetState
4 RequestUpdate
5 Start
6 Stop
7 QuerySystemEvent
8 #SetRenderingTimeLimit
9 #GetRenderingTimeLimit
10 [3.0.0+] RequestUpdateAuto
11 [3.0.0+] ExecuteAudioRendererRendering
12 [15.0.0+] SetVoiceDropParameter
13 [15.0.0+] GetVoiceDropParameter

GetSampleRate

No input. Returns an u32 SampleRate.

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).

SetRenderingTimeLimit

Takes an u32 RenderingTimeLimit. No output.

GetRenderingTimeLimit

No input. Returns an u32 RenderingTimeLimit.

IAudioDevice

This is "nn::audio::detail::IAudioDevice".

Cmd Name
0 #ListAudioDeviceName
1 #SetAudioDeviceOutputVolume
2 #GetAudioDeviceOutputVolume
3 GetActiveAudioDeviceName
4 QueryAudioDeviceSystemEvent
5 GetActiveChannelCount
6 [3.0.0+] #ListAudioDeviceNameAuto
7 [3.0.0+] #SetAudioDeviceOutputVolumeAuto
8 [3.0.0+] #GetAudioDeviceOutputVolumeAuto
10 [3.0.0+] GetActiveAudioDeviceNameAuto
11 [3.0.0+] QueryAudioDeviceInputEvent
12 [3.0.0+] QueryAudioDeviceOutputEvent
13 [13.0.0+] #GetActiveAudioOutputDeviceName ([5.0.0-12.1.0] #GetAudioSystemMasterVolumeSetting)
14 [13.0.0+] ListAudioOutputDeviceName
15 [17.0.0+] AcquireAudioInputDeviceNotification
16 [17.0.0+] ReleaseAudioInputDeviceNotification
17 [17.0.0+] AcquireAudioOutputDeviceNotification
18 [17.0.0+] ReleaseAudioOutputDeviceNotification
19 [18.0.0+] SetAudioDeviceOutputVolumeAutoTuneEnabled
20 [18.0.0+] IsAudioDeviceOutputVolumeAutoTuneEnabled

ListAudioDeviceName

Takes a type-0x6 output buffer containing an array of DeviceName. Returns an output s32 for total number of output entries.

SetAudioDeviceOutputVolume

Takes a type-0x5 input buffer containing the DeviceName and a float. No output.

GetAudioDeviceOutputVolume

Takes a type-0x5 input buffer containing the DeviceName. Returns an output float.

ListAudioDeviceNameAuto

Takes a type-0x22 output buffer containing an array of DeviceName. Returns an output s32 for total number of output entries.

SetAudioDeviceOutputVolumeAuto

Takes a type-0x21 input buffer containing the DeviceName and a float. No output.

GetAudioDeviceOutputVolumeAuto

Takes a type-0x21 input buffer containing the DeviceName. Returns an output float.

GetAudioSystemMasterVolumeSetting

Takes a type-0x5 input buffer, returns 4-bytes of output.

GetActiveAudioOutputDeviceName

Takes a type-0x6 output buffer, returns no output.

audout:a

This is "nn::audio::detail::IAudioOutManagerForApplet".

This was removed with [11.0.0+].

Cmd Name
0 RequestSuspend
1 RequestResume
2 GetProcessMasterVolume
3 SetProcessMasterVolume
4 [4.0.0+] GetProcessRecordVolume
5 [4.0.0+] SetProcessRecordVolume

[4.0.0+] RequestSuspend/RequestResume no longer returns an output handle.

audin:a

This is "nn::audio::detail::IAudioInManagerForApplet".

This was removed with [11.0.0+].

Cmd Name
0 RequestSuspend
1 RequestResume
2 GetProcessMasterVolume
3 SetProcessMasterVolume

[4.0.0+] RequestSuspend/RequestResume no longer returns an output handle.

audrec:a

This is "nn::audio::detail::IFinalOutputRecorderManagerForApplet".

Cmd Name
0 RequestSuspend
1 RequestResume

[4.0.0+] RequestSuspend/RequestResume no longer returns an output handle.

audren:a

This is "nn::audio::detail::IAudioRendererManagerForApplet".

This was removed with [11.0.0+].

Cmd Name
0 RequestSuspend
1 RequestResume
2 GetProcessMasterVolume
3 SetProcessMasterVolume
4 RegisterAppletResourceUserId
5 UnregisterAppletResourceUserId
6 [4.0.0+] GetProcessRecordVolume
7 [4.0.0+] SetProcessRecordVolume

[4.0.0+] RequestSuspend/RequestResume no longer returns an output handle.

audout:d, audin:d, audrec:d, audren:d

This is "nn::audio::detail::IAudioOutManagerForDebugger", "nn::audio::detail::IAudioInManagerForDebugger", "nn::audio::detail::IFinalOutputRecorderManagerForDebugger", "nn::audio::detail::IAudioRendererManagerForDebugger".

These were removed with [11.0.0+].

Cmd Name
0 #RequestSuspend
1 #RequestResume

RequestSuspend

Takes an u64 AppletResourceUserId.

RequestResume

Takes an u64 AppletResourceUserId.

audctl

This is "nn::audioctrl::detail::IAudioController".

Cmd Name
0 GetTargetVolume
1 SetTargetVolume
2 GetTargetVolumeMin
3 GetTargetVolumeMax
4 IsTargetMute
5 SetTargetMute
6 [1.0.0-17.0.1] IsTargetConnected
7 SetDefaultTarget
8 GetDefaultTarget
9 GetAudioOutputMode
10 SetAudioOutputMode
11 [1.0.0-13.2.1] SetForceMutePolicy
12 [1.0.0-13.2.1] GetForceMutePolicy
13 GetOutputModeSetting
14 SetOutputModeSetting
15 SetOutputTarget
16 SetInputTargetForceEnabled
17 [3.0.0+] SetHeadphoneOutputLevelMode
18 [3.0.0+] GetHeadphoneOutputLevelMode
19 [17.0.0+] SetForceMonauralOutputModeEnabled ([3.0.0-13.2.1] AcquireAudioVolumeUpdateEventForPlayReport)
20 [17.0.0+] IsForceMonauralOutputModeEnabled ([3.0.0-13.2.1] AcquireAudioOutputDeviceUpdateEventForPlayReport)
21 [3.0.0-13.2.1] GetAudioOutputTargetForPlayReport
22 [3.0.0+] NotifyHeadphoneVolumeWarningDisplayedEvent
23 [4.0.0+] SetSystemOutputMasterVolume
24 [4.0.0+] GetSystemOutputMasterVolume
25 [4.0.0-13.2.1] #GetAudioVolumeDataForPlayReport
26 [4.0.0-14.1.2] #UpdateHeadphoneSettings
27 [7.0.0-16.1.0] SetVolumeMappingTableForDev
28 [10.0.0-13.2.1] GetAudioOutputChannelCountForPlayReport
29 [10.0.0-13.2.1] BindAudioOutputChannelCountUpdateEventForPlayReport
30 [13.0.0+] SetSpeakerAutoMuteEnabled
31 [13.0.0+] IsSpeakerAutoMuteEnabled
32 [13.0.0+] GetActiveOutputTarget
33 [13.0.0+] GetTargetDeviceInfo
34 [13.0.0+] AcquireTargetNotification
35 [14.0.0-14.1.2] SetHearingProtectionSafeguardTimerRemainingTimeForDebug
36 [14.0.0-14.1.2] GetHearingProtectionSafeguardTimerRemainingTimeForDebug
37 [14.0.0-14.1.2] SetHearingProtectionSafeguardEnabled
38 [14.0.0-14.1.2] IsHearingProtectionSafeguardEnabled
39 [14.0.0-14.1.2] IsHearingProtectionSafeguardMonitoringOutputForDebug
40 [14.0.0+] #GetSystemInformationForDebug
41 [15.0.0+] SetVolumeButtonLongPressTime
42 [15.0.0+] SetNativeVolumeForDebug
10000 [13.0.0+] NotifyAudioOutputTargetForPlayReport
10001 [13.0.0+] NotifyAudioOutputChannelCountForPlayReport
10002 [13.0.0+] NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport
10100 [14.0.0+] GetAudioVolumeDataForPlayReport
10101 [14.0.0+] BindAudioVolumeUpdateEventForPlayReport
10102 [14.0.0+] BindAudioOutputTargetUpdateEventForPlayReport
10103 [14.0.0+] GetAudioOutputTargetForPlayReport
10104 [14.0.0+] GetAudioOutputChannelCountForPlayReport
10105 [14.0.0+] BindAudioOutputChannelCountUpdateEventForPlayReport
10106 [14.0.0+] GetDefaultAudioOutputTargetForPlayReport
50000 [15.0.0+] SetAnalogInputBoostGainForPrototyping

GetAudioVolumeDataForPlayReport

No input, returns a total of 7-bytes of output.

[13.0.0+] No input, returns a total of 9-bytes of output.

UpdateHeadphoneSettings

Takes one input bool. No output. NS calls this with the result of IParentalControlService::IsRestrictionEnabled.

GetSystemInformationForDebug

Takes a type-0x1A output buffer.

[15.0.0+] Now takes a type-0x16 output buffer.

[18.0.0+] Originally the output buffer was a binary structure, now it's just a string.

codecctl

This is "nn::audio::detail::ICodecController".

This service no longer exists in [3.0.0+].

Cmd Name
0 #Initialize
1 #Finalize
2 #Sleep
3 #Wake
4 #SetVolume
5 #GetVolumeMax
6 #GetVolumeMin
7 #SetActiveTarget
8 #GetActiveTarget
9 #BindHeadphoneMicJackInterrupt
10 #IsHeadphoneMicJackInserted
11 #ClearHeadphoneMicJackInterrupt
12 #IsRequested

Initialize

No input/output.

Finalize

No input/output.

Sleep

No input/output.

Wake

No input/output.

SetVolume

Takes an u32 Volume. No output.

GetVolumeMax

No input. Returns an u32 VolumeMax.

GetVolumeMin

No input. Returns an u32 VolumeMin.

SetActiveTarget

Takes an u32 Target. No output.

GetActiveTarget

No input. Returns an u32 Target.

BindHeadphoneMicJackInterrupt

No input. Returns an event handle.

IsHeadphoneMicJackInserted

No input. Returns a bool.

ClearHeadphoneMicJackInterrupt

No input/output.

IsRequested

No input. Returns a bool.

hwopus

This is "nn::codec::detail::IHardwareOpusDecoderManager".

Cmd Name
0 #OpenHardwareOpusDecoder
1 #GetWorkBufferSize
2 [3.0.0+] #OpenHardwareOpusDecoderForMultiStream
3 [3.0.0+] #GetWorkBufferSizeForMultiStream
4 [12.0.0+] OpenHardwareOpusDecoderEx
5 [12.0.0+] GetWorkBufferSizeEx
6 [12.0.0+] OpenHardwareOpusDecoderForMultiStreamEx
7 [12.0.0+] GetWorkBufferSizeForMultiStreamEx
8 [16.0.0+] GetWorkBufferSizeExEx
9 [16.0.0+] GetWorkBufferSizeForMultiStreamExEx

Official sw can use either software libopus, or hwopus (libopus running on the ADSP) via "nn::codec::HardwareOpus*" (separate from the former).

OpenHardwareOpusDecoder

Takes two s32s SampleRate and ChannelCount packed as an u64, an u32 WorkBufferSize and a TransferMemory handle for WorkBuffer. Returns an #IHardwareOpusDecoder object. The TransferMemory is created by the user-process with permissions=0.

GetWorkBufferSize

Takes two s32s SampleRate and ChannelCount packed as an u64. Returns the u32 required size for the decoder's work buffer. Official user-processes align the output size to page-alignment.

OpenHardwareOpusDecoderForMultiStream

Takes a type-0x19 input buffer, an u32 WorkBufferSize and a TransferMemory handle for WorkBuffer. Returns an #IHardwareOpusDecoder object. The TransferMemory is created by the user-process with permissions=0.

The input buffer is a #OpusMultiStreamParameters struct. The user-process initializes this struct the same way as #GetWorkBufferSizeForMultiStream, except that an u8-array specified by the user is copied to +0x10 with size ChannelCount, when ChannelCount above 0.

GetWorkBufferSizeForMultiStream

Takes a type-0x19 input buffer. Returns the u32 required size for the decoder's work buffer. Official user-processes align the output size to page-alignment.

The input buffer is a #OpusMultiStreamParameters struct.

OpenHardwareOpusDecoderEx

Takes a struct #OpusParametersEx and a u32 WorkBufferSize and a TransferMemory handle for WorkBuffer. Returns an #IHardwareOpusDecoder object. The TransferMemory is created by the user-process with permissions=0.

When UseLargeFrameSize in the parameter struct is 1 a larger output buffer that can store 120ms opus frames is used vs the default of 40ms.

GetWorkBufferSizeEx

Takes a struct #OpusParametersEx. Returns the u32 required size for the decoder's work buffer. Official user-processes align the output size to page-alignment.

OpenHardwareOpusDecoderForMultiStreamEx

Takes a type-0x19 input buffer, an u32 WorkBufferSize and a TransferMemory handle for WorkBuffer. Returns an #IHardwareOpusDecoder object. The TransferMemory is created by the user-process with permissions=0.

The input buffer is a #OpusMultiStreamParametersEx struct. When UseLargeFrameSize is 1 a larger output buffer that can store 120ms opus frames is used vs the default of 40ms.

GetWorkBufferSizeForMultiStreamEx

Takes a type-0x19 input buffer. Returns the u32 required size for the decoder's work buffer. Official user-processes align the output size to page-alignment.

The input buffer is a #OpusMultiStreamParametersEx struct.

IHardwareOpusDecoder

This is "nn::codec::detail::IHardwareOpusDecoder".

Cmd Name
0 [4.0.0+] #DecodeInterleavedOld ([1.0.0-3.0.2] DecodeInterleaved)
1 #SetContext
2 [4.0.0+] #DecodeInterleavedForMultiStreamOld ([3.0.0-3.0.2] DecodeInterleavedForMultiStream)
3 [3.0.0+] #SetContextForMultiStream
4 [6.0.0+] #DecodeInterleavedWithPerfOld ([4.0.0-5.1.0] DecodeInterleavedWithPerf)
5 [6.0.0+] #DecodeInterleavedForMultiStreamWithPerfOld ([4.0.0-5.1.0] DecodeInterleavedForMultiStreamWithPerf)
6 [6.0.0+] DecodeInterleavedWithPerfAndResetOld ([6.0.0-6.2.0] DecodeInterleaved)
7 [6.0.0+] DecodeInterleavedForMultiStreamWithPerfAndResetOld ([6.0.0-6.2.0] DecodeInterleavedForMultiStream)
8 [7.0.0+] #DecodeInterleaved
9 [7.0.0+] #DecodeInterleavedForMultiStream

DecodeInterleavedOld

Takes a type-0x5 input buffer (OpusDataIn) and a type-0x6 output buffer (PcmDataOut). Decodes the Opus source data to PCM and returns output s32 DecodedDataSize and s32 DecodedSampleCount.

Calls the same func as #DecodeInterleaved internally with flag=0 and out_u64_ptr=NULL.

SetContext

Takes a type-0x5 input buffer (DecoderContextIn). Sends the unknown context data to the hardware decoder. The input buffer is unused.

DecodeInterleavedForMultiStreamOld

Takes a type-0x5 input buffer (OpusDataIn) and a type-0x6 output buffer (PcmDataOut). Decodes the Opus source data to PCM and returns output s32 DecodedDataSize and s32 DecodedSampleCount.

Calls the same func as #DecodeInterleavedForMultiStream internally with flag=0 and out_u64_ptr=NULL.

SetContextForMultiStream

Takes a type-0x5 input buffer (DecoderContextIn). Sends the unknown context data to the hardware decoder.

DecodeInterleavedWithPerfOld

Takes a type-0x5 input buffer (OpusDataIn) and a type-0x46 output buffer (PcmDataOut). Decodes the Opus source data to PCM and returns output s32 DecodedDataSize, s32 DecodedSampleCount, and an u64.

The output u64 is ignored by official user-processes.

Calls the same func as #DecodeInterleaved internally with flag=0.

DecodeInterleavedForMultiStreamWithPerfOld

Takes a type-0x5 input buffer (OpusDataIn) and a type-0x46 output buffer (PcmDataOut). Decodes the Opus source data to PCM and returns output s32 DecodedDataSize, s32 DecodedSampleCount, and an u64.

The output u64 is ignored by official user-processes.

Calls the same func as #DecodeInterleavedForMultiStream internally with flag=0.

DecodeInterleaved

Takes an input u8 bool flag, a type-0x5 input buffer (OpusDataIn) and a type-0x46 output buffer (PcmDataOut). Decodes the Opus source data to PCM and returns output s32 DecodedDataSize, s32 DecodedSampleCount, and an u64.

The bool flag indicates whether or not a reset of the decoder context is being requested.

DecodeInterleavedForMultiStream

Takes an input u8 bool flag, a type-0x5 input buffer (OpusDataIn) and a type-0x46 output buffer (PcmDataOut). Decodes the Opus source data to PCM and returns output s32 DecodedDataSize, s32 DecodedSampleCount, and an u64.

The bool flag indicates whether or not a reset of the decoder context is being requested.

auddebug

This is "nn::audio::detail::IAudioDebugManager".

This service doesn't exist in retail units.

Cmd Name
0 ProfilerStart
1 ProfilerStop
2 CpuProfilerStart
3 CpuProfilerStop

aud:a

This is "nn::audio::detail::IAudioSystemManagerForApplet".

This was added with [11.0.0+].

Cmd Name
0 RegisterAppletResourceUserId
1 UnregisterAppletResourceUserId
2 RequestSuspendAudio
3 RequestResumeAudio
4 GetAudioOutputProcessMasterVolume
5 SetAudioOutputProcessMasterVolume
6 GetAudioInputProcessMasterVolume
7 SetAudioInputProcessMasterVolume
8 GetAudioOutputProcessRecordVolume
9 SetAudioOutputProcessRecordVolume
10 [18.0.0+] GetAppletStateSummaries

aud:d

This is "nn::audio::detail::IAudioSystemManagerForDebugger".

This was added with [11.0.0+].

Cmd Name
0 RequestSuspendAudioForDebug
1 RequestResumeAudioForDebug

SampleFormat

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

Value Name
0 Invalid
1 PcmInt8
2 PcmInt16
3 PcmInt24
4 PcmInt32
5 PcmFloat
6 Adpcm

AudioOutState

This is "nn::audio::AudioOutState".

Value Name
0 Started
1 Stopped

AudioInState

This is "nn::audio::AudioInState".

Value Name
0 Started
1 Stopped

FinalOutputRecorderState

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

Value Name
0 Started
1 Stopped

AudioOutInfo

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

Offset Size Description
0x0 0x100 Name

AudioInInfo

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

Offset Size Description
0x0 0x100 Name

AudioOutParameter

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

Offset Size Description
0x0 0x4 SampleRate
0x4 0x2 ChannelCount
0x6 0x2 Reserved

AudioInParameter

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

Offset Size Description
0x0 0x4 SampleRate
0x4 0x2 ChannelCount
0x6 0x2 Reserved

AudioOutParameterInternal

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

Offset Size Description
0x0 0x4 SampleRate
0x4 0x4 ChannelCount
0x8 0x4 SampleFormat
0xC 0x4 State

AudioInParameterInternal

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

Offset Size Description
0x0 0x4 SampleRate
0x4 0x4 ChannelCount
0x8 0x4 SampleFormat
0xC 0x4 State

AudioOutBuffer

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

Offset Size Description
0x0 0x8 Pointer to next buffer (unused)
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?)

AudioInBuffer

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

Offset Size Description
0x0 0x8 Pointer to next buffer (unused)
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

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

Offset Size Description
0x0 0x8 Released
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

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

Offset Size Description
0x0 0x4 SampleRate

FinalOutputRecorderParameterInternal

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

Offset Size Description
0x0 0x4 SampleRate
0x4 0x4 ChannelCount
0x8 0x4 SampleFormat
0xC 0x4 State

FinalOutputRecorderWorkBufferParameterInternal

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

Offset Size Description
0x0 0x8
0x8 0x8
0x10 0x8

OpusParametersEx

Offset Size Description
0x0 0x4 SampleRate
0x4 0x4 ChannelCount
0x8 0x4 UseLargeFrameSize
0xC 0x4 Padding

OpusMultiStreamParameters

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

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

Notes

Once nnMain finishes running, it calls a func which handles ADSP Aborts. This waits on an event, calls a func, then Aborts with Result 0xC0899.

That func just calls another func, which:

  • Calls various AGIC funcs for this IRQ, etc.
  • Copies data from devicemem+0x608C (the 0x7000-byte devicemem "shared memory segment") to a stack struct.
  • A funcptr is called if set with the above struct, then this returns.

That funcptr, besides other func-calls, will log an erpt using the input struct when set with the "AdspException*" fields.

This is triggered by AGIC IRQ adsp_wdresetreq, "ADSP Watchdog Timer Reset Request". The ADSP updates the watchdog from a thread, so normally the watchdog only expires when the ADSP configures it to trigger immediately.

When handling an assert/exception, the ADSP:

  • Logs exception info in text form into devicemem.
  • Logs the binary form of the exception into devicemem (offset above).
  • Eventually configures the watchdog to trigger immediately, prints "HALT: spinning forever...\n", then enters a loop using instruction "wfe".