Changes

no edit summary
Line 332: Line 332:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || EnableDspUsageMeasurement
+
| 0 || [17.0.0+] GetDspStatistics ([6.0.0-16.1.0] EnableDspUsageMeasurement)
 
|-
 
|-
| 1 || DisableDspUsageMeasurement
+
| 1 || [6.0.0-16.1.0] DisableDspUsageMeasurement
 
|-
 
|-
| 6 || GetDspUsage
+
| 6 || [6.0.0-16.1.0] GetDspUsage
 
|}
 
|}
   Line 390: Line 390:  
|-
 
|-
 
| 11 || [3.0.0+] ExecuteAudioRendererRendering
 
| 11 || [3.0.0+] ExecuteAudioRendererRendering
 +
|-
 +
| 12 || [15.0.0+] SetVoiceDropParameter
 +
|-
 +
| 13 || [15.0.0+] GetVoiceDropParameter
 
|}
 
|}
   Line 441: Line 445:  
| 12 || [3.0.0+] QueryAudioDeviceOutputEvent
 
| 12 || [3.0.0+] QueryAudioDeviceOutputEvent
 
|-
 
|-
| 13 || [5.0.0+] GetAudioSystemMasterVolumeSetting
+
| 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
 
|}
 
|}
   Line 461: Line 479:  
=== GetAudioDeviceOutputVolumeAuto ===
 
=== GetAudioDeviceOutputVolumeAuto ===
 
Takes a type-0x21 input buffer containing the '''DeviceName'''. Returns an output float.
 
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 =
 
= audout:a =
Line 587: Line 611:  
| 5 || SetTargetMute
 
| 5 || SetTargetMute
 
|-
 
|-
| 6 || IsTargetConnected
+
| 6 || [1.0.0-17.0.1] IsTargetConnected
 
|-
 
|-
 
| 7 || SetDefaultTarget
 
| 7 || SetDefaultTarget
Line 597: Line 621:  
| 10 || SetAudioOutputMode
 
| 10 || SetAudioOutputMode
 
|-
 
|-
| 11 || SetForceMutePolicy
+
| 11 || [1.0.0-13.2.1] SetForceMutePolicy
 
|-
 
|-
| 12 || GetForceMutePolicy
+
| 12 || [1.0.0-13.2.1] GetForceMutePolicy
 
|-
 
|-
 
| 13 || GetOutputModeSetting
 
| 13 || GetOutputModeSetting
Line 613: Line 637:  
| 18 || [3.0.0+] GetHeadphoneOutputLevelMode
 
| 18 || [3.0.0+] GetHeadphoneOutputLevelMode
 
|-
 
|-
| 19 || [3.0.0+] AcquireAudioVolumeUpdateEventForPlayReport
+
| 19 || [17.0.0+] SetForceMonauralOutputModeEnabled ([3.0.0-13.2.1] AcquireAudioVolumeUpdateEventForPlayReport)
 
|-
 
|-
| 20 || [3.0.0+] AcquireAudioOutputDeviceUpdateEventForPlayReport
+
| 20 || [17.0.0+] IsForceMonauralOutputModeEnabled ([3.0.0-13.2.1] AcquireAudioOutputDeviceUpdateEventForPlayReport)
 
|-
 
|-
| 21 || [3.0.0+] GetAudioOutputTargetForPlayReport
+
| 21 || [3.0.0-13.2.1] GetAudioOutputTargetForPlayReport
 
|-
 
|-
 
| 22 || [3.0.0+] NotifyHeadphoneVolumeWarningDisplayedEvent
 
| 22 || [3.0.0+] NotifyHeadphoneVolumeWarningDisplayedEvent
Line 625: Line 649:  
| 24 || [4.0.0+] GetSystemOutputMasterVolume
 
| 24 || [4.0.0+] GetSystemOutputMasterVolume
 
|-
 
|-
| 25 || [4.0.0+] GetAudioVolumeDataForPlayReport
+
| 25 || [4.0.0-13.2.1] [[#GetAudioVolumeDataForPlayReport]]
 
|-
 
|-
| 26 || [4.0.0+] [[#UpdateHeadphoneSettings]]
+
| 26 || [4.0.0-14.1.2] [[#UpdateHeadphoneSettings]]
 
|-
 
|-
| 27 || [7.0.0+] SetVolumeMappingTableForDev
+
| 27 || [7.0.0-16.1.0] SetVolumeMappingTableForDev
 
|-
 
|-
| 28 || [10.0.0+] GetAudioOutputChannelCountForPlayReport
+
| 28 || [10.0.0-13.2.1] GetAudioOutputChannelCountForPlayReport
 
|-
 
|-
| 29 || [10.0.0+] BindAudioOutputChannelCountUpdateEventForPlayReport
+
| 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
 
|}
 
|}
   −
=== UpdateHeadphoneSettings ===
+
== 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.
 
Takes one input bool. No output.
NS calls this with the result of IParentalControlService::IsRestrictionEnabled[https://switchbrew.org/wiki/Parental_Control_services#IParentalControlService].
+
NS calls this with the result of [[Parental_Control_services#IParentalControlService|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 =
 
= codecctl =
Line 729: Line 813:  
|-
 
|-
 
| 3 || [3.0.0+] [[#GetWorkBufferSizeForMultiStream]]
 
| 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 via "nn::codec::HardwareOpus*" (separate from the former).
+
Official sw can use either software libopus, or hwopus (libopus running on the ADSP) via "nn::codec::HardwareOpus*" (separate from the former).
    
== OpenHardwareOpusDecoder ==
 
== OpenHardwareOpusDecoder ==
Line 742: Line 838:  
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.
 
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 [[#MultiStreamParameters]] 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.
+
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 ==
 
== 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.
 
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 [[#MultiStreamParameters]] struct.
+
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 ==
 
== IHardwareOpusDecoder ==
Line 863: Line 977:  
|-
 
|-
 
| 9 || SetAudioOutputProcessRecordVolume
 
| 9 || SetAudioOutputProcessRecordVolume
 +
|-
 +
| 10 || [18.0.0+] GetAppletStateSummaries
 
|}
 
|}
   Line 1,217: Line 1,333:  
|}
 
|}
   −
= MultiStreamParameters =
+
= 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"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 1,244: Line 1,384:  
| u8 array of channel mappings
 
| 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
 +
|}
 +
 +
= 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]]