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 |
| + | |- |
| + | | 5000 || [19.0.0+] |
| + | |- |
| + | | 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-18.1.0] SetAnalogInputBoostGainForPrototyping |
| + | |- |
| + | | 50001 || [19.0.0+] OverrideDefaultTargetForDebug |
| + | |- |
| + | | 50003 || [19.0.0+] SetForceOverrideExternalDeviceNameForDebug |
| + | |- |
| + | | 50004 || [19.0.0+] ClearForceOverrideExternalDeviceNameForDebug |
| |} | | |} |
| | | |
− | === 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 737: |
Line 829: |
| |- | | |- |
| | 7 || [12.0.0+] GetWorkBufferSizeForMultiStreamEx | | | 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 750: |
Line 846: |
| 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 871: |
Line 985: |
| |- | | |- |
| | 9 || SetAudioOutputProcessRecordVolume | | | 9 || SetAudioOutputProcessRecordVolume |
| + | |- |
| + | | 10 || [18.0.0+] GetAppletStateSummaries |
| |} | | |} |
| | | |
Line 1,225: |
Line 1,341: |
| |} | | |} |
| | | |
− | = 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,252: |
Line 1,392: |
| | 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]] |