Audio services: Difference between revisions
| No edit summary | |||
| (99 intermediate revisions by 8 users not shown) | |||
| Line 6: | Line 6: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[#ListAudioOuts]] | | 0 || [[#ListAudioOuts|ListAudioOuts]] | ||
| |- | |- | ||
| | 1 || [[#OpenAudioOut]] | | 1 || [[#OpenAudioOut|OpenAudioOut]] | ||
| |- | |- | ||
| | 2 || [3.0.0+] [[# | | 2 || [3.0.0+] [[#ListAudioOutsAuto|ListAudioOutsAuto]] | ||
| |- | |- | ||
| | 3 || [3.0.0+] [[# | | 3 || [3.0.0+] [[#OpenAudioOutAuto|OpenAudioOutAuto]] | ||
| |} | |} | ||
| == ListAudioOuts == | == ListAudioOuts == | ||
| Takes a type- | Takes a type-0x6 output buffer containing an array of [[#AudioOutInfo]]. Returns an u32 '''Count'''. | ||
| == OpenAudioOut == | == OpenAudioOut == | ||
| Takes a type- | 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 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an [[#IAudioOut]] and an output [[#AudioOutParameterInternal]]. | ||
| Returns an [[#IAudioOut]]  | |||
| == | == ListAudioOutsAuto == | ||
| Same as [[#ListAudioOuts]], but takes a type-0x22 output buffer instead. | Same as [[#ListAudioOuts]], but takes a type-0x22 output buffer instead. | ||
| ==  | == OpenAudioOutAuto == | ||
| Same as [[#OpenAudioOut]], but takes a type-0x21 input buffer instead. | Same as [[#OpenAudioOut]], but takes a type-0x21 input buffer and a type-0x22 output buffer instead. | ||
| == IAudioOut == | == IAudioOut == | ||
| Line 56: | Line 34: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[#GetAudioOutState]] | | 0 || [[#GetAudioOutState|GetAudioOutState]] | ||
| |- | |||
| | 1 || [[#Start|Start]] | |||
| |- | |||
| | 2 || [[#Stop|Stop]] | |||
| |- | |- | ||
| |  | | 3 || [[#AppendAudioOutBuffer|AppendAudioOutBuffer]] | ||
| |- | |- | ||
| |  | | 4 || [[#RegisterBufferEvent|RegisterBufferEvent]] | ||
| |- | |- | ||
| |  | | 5 || [[#GetReleasedAudioOutBuffers|GetReleasedAudioOutBuffers]] | ||
| |- | |- | ||
| |  | | 6 || [[#ContainsAudioOutBuffer|ContainsAudioOutBuffer]] | ||
| |- | |- | ||
| |  | | 7 || [3.0.0+] [[#AppendAudioOutBufferAuto|AppendAudioOutBufferAuto]] | ||
| |- | |- | ||
| |  | | 8 || [3.0.0+] [[#GetReleasedAudioOutBuffersAuto|GetReleasedAudioOutBuffersAuto]] | ||
| |- | |- | ||
| |  | | 9 || [4.0.0+] [[#GetAudioOutBufferCount|GetAudioOutBufferCount]] | ||
| |- | |- | ||
| |  | | 10 || [4.0.0+] [[#GetAudioOutPlayedSampleCount|GetAudioOutPlayedSampleCount]] | ||
| |- | |- | ||
| |  | | 11 || [4.0.0+] [[#FlushAudioOutBuffers|FlushAudioOutBuffers]] | ||
| |- | |- | ||
| |  | | 12 || [6.0.0+] [[#SetAudioOutVolume|SetAudioOutVolume]] | ||
| |- | |- | ||
| |  | | 13 || [6.0.0+] [[#GetAudioOutVolume|GetAudioOutVolume]] | ||
| |} | |} | ||
| === GetAudioOutState === | === GetAudioOutState === | ||
| Returns an  | No input. Returns an output [[#AudioOutState]]. | ||
| === Start === | |||
| No input/output.   | |||
| Starts audio playback using data from appended buffers. | Starts audio playback using data from appended buffers. | ||
| ===  | === Stop === | ||
| Stops audio playback. | No input/output. | ||
| Stops audio playback. This waits for audio playback to finish before returning. | |||
| === AppendAudioOutBuffer === | === AppendAudioOutBuffer === | ||
| Takes a type- | 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 === | ||
| Returns an  | 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 === | === ContainsAudioOutBuffer === | ||
| Takes an u64 ''' | 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 = | = audin:u = | ||
| This is "nn::audio::detail:: | This is "nn::audio::detail::IAudioInManager". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 132: | Line 120: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || ListAudioIns | | 0 || [[#ListAudioIns|ListAudioIns]] | ||
| |- | |||
| | 1 || [[#OpenAudioIn|OpenAudioIn]] | |||
| |- | |||
| | 2 || [3.0.0+] [[#ListAudioInsAuto|ListAudioInsAuto]] | |||
| |- | |- | ||
| |  | | 3 || [3.0.0+] [[#OpenAudioInAuto|OpenAudioInAuto]] | ||
| |- | |- | ||
| |  | | 4 || [3.0.0+] [[#ListAudioInsAutoFiltered|ListAudioInsAutoFiltered]] | ||
| |- | |- | ||
| |  | | 5 || [5.0.0+] [[#OpenAudioInProtocolSpecified|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 [[Applet_Manager_services#AppletResourceUserId|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 == | == IAudioIn == | ||
| Line 148: | Line 158: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[#GetAudioInState]] | | 0 || [[#GetAudioInState|GetAudioInState]] | ||
| |- | |||
| | 1 || [[#Start_2|Start]] | |||
| |- | |||
| | 2 || [[#Stop_2|Stop]] | |||
| |- | |||
| | 3 || [[#AppendAudioInBuffer|AppendAudioInBuffer]] | |||
| |- | |||
| | 4 || [[#RegisterBufferEvent_2|RegisterBufferEvent]] | |||
| |- | |- | ||
| |  | | 5 || [[#GetReleasedAudioInBuffers|GetReleasedAudioInBuffers]] | ||
| |- | |- | ||
| |  | | 6 || [[#ContainsAudioInBuffer|ContainsAudioInBuffer]] | ||
| |- | |- | ||
| | 3 | | | 7 || [3.0.0+] [[#AppendUacInBuffer|AppendUacInBuffer]] | ||
| |- | |- | ||
| |  | | 8 || [3.0.0+] [[#AppendAudioInBufferAuto|AppendAudioInBufferAuto]] | ||
| |- | |- | ||
| |  | | 9 || [3.0.0+] [[#GetReleasedAudioInBuffersAuto|GetReleasedAudioInBuffersAuto]] | ||
| |- | |- | ||
| |  | | 10 || [3.0.0+] [[#AppendUacInBufferAuto|AppendUacInBufferAuto]] | ||
| |- | |- | ||
| |  | | 11 || [4.0.0+] [[#GetAudioInBufferCount|GetAudioInBufferCount]] | ||
| |- | |- | ||
| |  | | 12 || [4.0.0+] [[#SetDeviceGain|SetDeviceGain]] | ||
| |- | |- | ||
| |  | | 13 || [4.0.0+] [[#GetDeviceGain|GetDeviceGain]] | ||
| |- | |- | ||
| |  | | 14 || [6.0.0+] [[#FlushAudioInBuffers|FlushAudioInBuffers]] | ||
| |} | |} | ||
| === GetAudioInState === | === 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. | |||
| Returns an  | === GetDeviceGain === | ||
| No input. Returns an output float '''DeviceGain'''. | |||
| === FlushAudioInBuffers === | |||
| No input. Returns an output bool '''Pending'''. | |||
| = audrec:u = | = audrec:u = | ||
| Line 182: | Line 245: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || OpenFinalOutputRecorder | | 0 || [[#OpenFinalOutputRecorder]] | ||
| |} | |} | ||
| == OpenFinalOutputRecorder == | |||
| Takes an input [[#FinalOutputRecorderParameter]], an input Process handle and an input [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an [[#IFinalOutputRecorder]] and an output [[#FinalOutputRecorderParameterInternal]].  | |||
| == IFinalOutputRecorder == | == IFinalOutputRecorder == | ||
| Line 192: | Line 258: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || GetFinalOutputRecorderState | | 0 || [[#GetFinalOutputRecorderState|GetFinalOutputRecorderState]] | ||
| |- | |||
| | 1 || [[#Start_3|Start]] | |||
| |- | |||
| | 2 || [[#Stop_3|Stop]] | |||
| |- | |||
| | 3 || [[#AppendFinalOutputRecorderBuffer|AppendFinalOutputRecorderBuffer]] | |||
| |- | |||
| | 4 || [[#RegisterBufferEvent_3|RegisterBufferEvent]] | |||
| |- | |||
| | 5 || [[#GetReleasedFinalOutputRecorderBuffers|GetReleasedFinalOutputRecorderBuffers]] | |||
| |- | |||
| | 6 || [[#ContainsFinalOutputRecorderBuffer|ContainsFinalOutputRecorderBuffer]] | |||
| |- | |||
| | 7 || [[#GetFinalOutputRecorderBufferEndTime|GetFinalOutputRecorderBufferEndTime]] | |||
| |- | |||
| | 8 || [3.0.0+] [[#AppendFinalOutputRecorderBufferAuto|AppendFinalOutputRecorderBufferAuto]] | |||
| |- | |||
| | 9 || [3.0.0+] [[#GetReleasedFinalOutputRecorderBuffersAuto|GetReleasedFinalOutputRecorderBuffersAuto]] | |||
| |- | |||
| | 10 || [6.0.0+] [[#FlushFinalOutputRecorderBuffers|FlushFinalOutputRecorderBuffers]] | |||
| |- | |||
| | 11 || [9.0.0+] [[#AttachWorkBuffer|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+]. | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| |  | ! Cmd || Name | ||
| |- | |- | ||
| |  | | 0 || [17.0.0+] GetDspStatistics ([6.0.0-16.1.0] EnableDspUsageMeasurement) | ||
| |- | |- | ||
| |  | | 1 || [20.0.0+] GetAppletStateSummaries ([6.0.0-16.1.0] DisableDspUsageMeasurement) | ||
| |- | |- | ||
| |  | | 2 || [20.0.0+] SetDspStatisticsParameter | ||
| |- | |- | ||
| |  | | 3 || [20.0.0+] GetDspStatisticsParameter | ||
| |- | |- | ||
| | 6 ||  | | 6 || [6.0.0-16.1.0] GetDspUsage | ||
| |} | |} | ||
| Line 216: | Line 352: | ||
| | 0 || OpenAudioRenderer | | 0 || OpenAudioRenderer | ||
| |- | |- | ||
| | 1 ||  | | 1 || GetWorkBufferSize | ||
| |- | |||
| | 2 || [[#GetAudioDeviceService]] | |||
| |- | |- | ||
| |  | | 3 || [3.0.0+] OpenAudioRendererForManualExecution | ||
| |- | |- | ||
| |  | | 4 || [4.0.0+] GetAudioDeviceServiceWithRevisionInfo | ||
| |} | |} | ||
| === GetAudioDeviceService === | |||
| Takes an input u64 [[AM_services#AppletResourceUserId|AppletResourceUserId]], returns an output [[#IAudioDevice]]. | |||
| == IAudioRenderer == | == IAudioRenderer == | ||
| Line 230: | Line 371: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[# | | 0 || [[#GetSampleRate]] | ||
| |- | |- | ||
| | 1 || [[# | | 1 || [[#GetSampleCount]] | ||
| |- | |- | ||
| | 2 || [[# | | 2 || [[#GetMixBufferCount]] | ||
| |- | |- | ||
| | 3 || [[# | | 3 || [[#GetState]] | ||
| |- | |- | ||
| | 4 ||  | | 4 || RequestUpdate | ||
| |- | |- | ||
| | 5 ||  | | 5 || Start | ||
| |- | |- | ||
| | 6 ||  | | 6 || Stop | ||
| |- | |- | ||
| | 7 || QuerySystemEvent | | 7 || QuerySystemEvent | ||
| |- | |- | ||
| | 8 || [[# | | 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". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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 === | ||
| Returns the  | 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+]. | |||
| == | {| class="wikitable" border="1" | ||
| |- | |||
| ! 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+]. | |||
| This  | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 279: | Line 526: | ||
| |- | |- | ||
| | 1 || RequestResume | | 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". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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+]. | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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 = | = 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". | 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+]. | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 288: | Line 585: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[# | | 0 || [[#RequestSuspend]] | ||
| |- | |- | ||
| | 1 || [[# | | 1 || [[#RequestResume]] | ||
| |} | |} | ||
| ==  | == RequestSuspend == | ||
| Takes an u64 [[AM_services#AppletResourceUserId|AppletResourceUserId]]. | |||
| Takes an [[AM_services#AppletResourceUserId|AppletResourceUserId]].  | == RequestResume == | ||
| Takes an u64 [[AM_services#AppletResourceUserId|AppletResourceUserId]]. | |||
| ==  | = audctl = | ||
| This is "nn::audioctrl::detail::IAudioController". | |||
| Takes an [[ | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || GetTargetVolume | |||
| |- | |||
| | 1 || SetTargetVolume | |||
| |- | |||
| | 2 || GetTargetVolumeMin | |||
| |- | |||
| | 3 || GetTargetVolumeMax | |||
| |- | |||
| | 4 || IsTargetMute | |||
| |- | |||
| | 5 || SetTargetMute | |||
| |- | |||
| | 6 || [20.0.0+] ([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 || [20.0.0+] ([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-19.0.1] SetVolumeButtonLongPressTime | |||
| |- | |||
| | 42 || [15.0.0+] SetNativeVolumeForDebug | |||
| |- | |||
| | 5000 || [19.0.0+]  | |||
| |- | |||
| | 10000 || [13.0.0-19.0.1] NotifyAudioOutputTargetForPlayReport | |||
| |- | |||
| | 10001 || [13.0.0-19.0.1] NotifyAudioOutputChannelCountForPlayReport | |||
| |- | |||
| | 10002 || [13.0.0-19.0.1] NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport | |||
| |- | |||
| | 10100 || [14.0.0+] [[#GetAudioVolumeDataForPlayReport]] | |||
| |- | |||
| | 10101 || [14.0.0+] BindAudioVolumeUpdateEventForPlayReport | |||
| |- | |||
| | 10102 || [14.0.0-19.0.1] BindAudioOutputTargetUpdateEventForPlayReport | |||
| |- | |||
| | 10103 || [14.0.0-19.0.1] GetAudioOutputTargetForPlayReport | |||
| |- | |||
| | 10104 || [14.0.0-19.0.1] GetAudioOutputChannelCountForPlayReport | |||
| |- | |||
| | 10105 || [14.0.0-19.0.1] BindAudioOutputChannelCountUpdateEventForPlayReport | |||
| |- | |||
| | 10106 || [14.0.0-19.0.1] GetDefaultAudioOutputTargetForPlayReport | |||
| |- | |||
| | 10200 || [20.0.0+] | |||
| |- | |||
| | 50000 || [15.0.0-18.1.0] SetAnalogInputBoostGainForPrototyping | |||
| |- | |||
| | 50001 || [19.0.0-19.0.1] OverrideDefaultTargetForDebug | |||
| |- | |||
| | 50003 || [19.0.0+] SetForceOverrideExternalDeviceNameForDebug | |||
| |- | |||
| | 50004 || [19.0.0+] ClearForceOverrideExternalDeviceNameForDebug | |||
| |} | |||
| == SetSystemOutputMasterVolume == | |||
| Takes an input float '''SystemOutputMasterVolume'''. No output. | |||
| [20.0.0+] Originally any input was accepted, now input must be in range 0.0-1.0 otherwise it's replaced by nearest accepted value. | |||
| == GetSystemOutputMasterVolume == | |||
| No input. Returns an output float '''SystemOutputMasterVolume'''. | |||
| == GetAudioVolumeDataForPlayReport == | |||
| No input, returns a total of 7-bytes of output. | |||
| [13.0.0+] No input, returns a total of 9-bytes of output. | |||
| [20.0.0+] Now takes a 0x400-bytes type-0x16 output buffer and no longer returns any output. | |||
| == UpdateHeadphoneSettings == | |||
| Takes one input bool. No output. | |||
| NS calls this with the result of [[Parental_Control_services#IParentalControlService|IParentalControlService::IsRestrictionEnabled]]. | |||
| == GetSystemInformationForDebug == | |||
| Takes a type-0x1A output buffer. No output. | |||
| [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. | |||
| [20.0.0+] Now takes a total of 0x40-bytes of input and the type-0x16 output buffer is now 0x2000-bytes instead of 0x1000-bytes. | |||
| = codecctl = | = codecctl = | ||
| This is "nn::audio::detail::ICodecController". | This is "nn::audio::detail::ICodecController". | ||
| This service no longer exists in [3.0.0+]. | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 308: | Line 760: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || [[#Initialize]] | ||
| |- | |- | ||
| | 1 ||  | | 1 || [[#Finalize]] | ||
| |- | |- | ||
| | 2 ||  | | 2 || [[#Sleep]] | ||
| |- | |- | ||
| | 3 ||  | | 3 || [[#Wake]] | ||
| |- | |- | ||
| | 4 || [[# | | 4 || [[#SetVolume]] | ||
| |- | |- | ||
| | 5 ||  | | 5 || [[#GetVolumeMax]] | ||
| |- | |- | ||
| | 6 ||  | | 6 || [[#GetVolumeMin]] | ||
| |- | |- | ||
| | 7 ||  | | 7 || [[#SetActiveTarget]] | ||
| |- | |- | ||
| | 8 ||  | | 8 || [[#GetActiveTarget]] | ||
| |- | |- | ||
| | 9 ||  | | 9 || [[#BindHeadphoneMicJackInterrupt]] | ||
| |- | |- | ||
| | 10 ||  | | 10 || [[#IsHeadphoneMicJackInserted]] | ||
| |- | |- | ||
| | 11 ||  | | 11 || [[#ClearHeadphoneMicJackInterrupt]] | ||
| |- | |- | ||
| | 12 ||  | | 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". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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. | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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+].  | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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-19.0.1] GetAppletStateSummaries | |||
| |} | |||
| = aud:d = | |||
| This is "nn::audio::detail::IAudioSystemManagerForDebugger". | |||
| This was added with [11.0.0+].  | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || RequestSuspendAudioForDebug | |||
| |- | |||
| | 1 || RequestResumeAudioForDebug | |||
| |} | |||
| = (S2) aud:u = | |||
| This is "nn::audio::IUserClientSession". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 ||  | |||
| |- | |||
| | 1 ||  | |||
| |- | |||
| | 2 ||  | |||
| |- | |||
| | 3 ||  | |||
| |} | |||
| == Cmd0 == | |||
| No input, returns an output [[#audin:u|IAudioInManager]]. | |||
| == Cmd1 == | |||
| No input, returns an output [[#audout:u|IAudioOutManager]]. | |||
| == Cmd2 == | |||
| No input, returns an output [[#audren:u|IAudioRendererManager]]. | |||
| == Cmd3 == | |||
| No input, returns an output [[#ISpatialDownmixOutputModeManager|ISpatialDownmixOutputModeManager]]. | |||
| === ISpatialDownmixOutputModeManager === | |||
| This is "nn::audio::detail::ISpatialDownmixOutputModeManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 ||  | |||
| |} | |||
| ==== Cmd0 ==== | |||
| Takes a PID, an u32, u64, no output. | |||
| = (S2) auddmg:u = | |||
| This is "nn::audio::devmgr::IUserSessionManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 ||  | |||
| |} | |||
| == Cmd0 == | |||
| Takes a PID, an u32, an u64 pid_reserved, returns an output [[#IUserSession|IUserSession]]. | |||
| === IUserSession === | |||
| This is "nn::audio::devmgr::IUserSession". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 ||  | |||
| |- | |||
| | 100 ||  | |||
| |- | |||
| | 200 ||  | |||
| |- | |||
| | 300 ||  | |||
| |- | |||
| | 401 ||  | |||
| |- | |||
| | 500 ||  | |||
| |- | |||
| | 600 ||  | |||
| |- | |||
| | 700 ||  | |||
| |- | |||
| | 800 ||  | |||
| |- | |||
| | 900 ||  | |||
| |- | |||
| | 1000 ||  | |||
| |- | |||
| | 1500 ||  | |||
| |- | |||
| | 1550 ||  | |||
| |- | |||
| | 1600 ||  | |||
| |- | |||
| | 2000 ||  | |||
| |- | |||
| | 2100 ||  | |||
| |- | |||
| | 2200 ||  | |||
| |- | |||
| | 2301 ||  | |||
| |} | |||
| = (S2) audsmx:u = | |||
| This is "nn::audio::sysmix::IUserSessionManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 ||  | |||
| |} | |||
| == Cmd0 == | |||
| Takes a PID, a Process handle, an u32, an u64 pid_reserved, returns an output [[#IUserSession_2|IUserSession]]. | |||
| === IUserSession === | |||
| This is "nn::audio::sysmix::IUserSession". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 1 ||  | |||
| |- | |||
| | 2 ||  | |||
| |- | |||
| | 3 ||  | |||
| |} | |||
| ==== 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 | |||
| |- | |||
| | 0 ||  | |||
| |- | |||
| | 1 ||  | |||
| |- | |||
| | 2 ||  | |||
| |- | |||
| | 3 ||  | |||
| |- | |||
| | 4 ||  | |||
| |- | |||
| | 5 ||  | |||
| |- | |||
| | 6 ||  | |||
| |- | |||
| | 7 ||  | |||
| |- | |||
| | 8 ||  | |||
| |- | |||
| | 9 ||  | |||
| |- | |||
| | 10 ||  | |||
| |- | |||
| | 11 ||  | |||
| |- | |||
| | 12 ||  | |||
| |} | |||
| = SampleFormat = | |||
| This is "nn::audio::SampleFormat". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Value || Name | |||
| |- | |||
| | 0 || Invalid | |||
| |- | |||
| | 1 || PcmInt8 | |||
| |- | |||
| | 2 || PcmInt16 | |||
| |- | |||
| | 3 || PcmInt24 | |||
| |- | |||
| | 4 || PcmInt32 | |||
| |- | |||
| | 5 || PcmFloat | |||
| |- | |||
| | 6 || Adpcm | |||
| |} | |||
| = AudioOutState = | |||
| This is "nn::audio::AudioOutState". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Value || Name | |||
| |- | |||
| | 0 || Started | |||
| |- | |||
| | 1 || Stopped | |||
| |} | |||
| = AudioInState = | |||
| This is "nn::audio::AudioInState". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Value || Name | |||
| |- | |||
| | 0 || Started | |||
| |- | |||
| | 1 || Stopped | |||
| |} | |||
| = FinalOutputRecorderState = | |||
| This is "nn::audio::FinalOutputRecorderState". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Value || Name | |||
| |- | |||
| | 0 || Started | |||
| |- | |||
| | 1 || Stopped | |||
| |} | |||
| = AudioOutInfo = | |||
| This is "nn::audio::AudioOutInfo". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x100 | |||
| | Name | |||
| |} | |||
| = AudioInInfo = | |||
| This is "nn::audio::AudioInInfo". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x100 | |||
| | Name | |||
| |} | |||
| = AudioOutParameter = | |||
| This is "nn::audio::AudioOutParameter". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x4 | |||
| | SampleRate | |||
| |- | |||
| | 0x4 | |||
| | 0x2 | |||
| | ChannelCount | |||
| |- | |||
| | 0x6 | |||
| | 0x2 | |||
| | Reserved | |||
| |} | |||
| = AudioInParameter = | |||
| This is "nn::audio::AudioInParameter". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x4 | |||
| | SampleRate | |||
| |- | |||
| | 0x4 | |||
| | 0x2 | |||
| | ChannelCount | |||
| |- | |||
| | 0x6 | |||
| | 0x2 | |||
| | Reserved | |||
| |} | |||
| = AudioOutParameterInternal = | |||
| This is "nn::audio::detail::AudioOutParameterInternal". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x4 | |||
| | SampleRate | |||
| |- | |||
| | 0x4 | |||
| | 0x4 | |||
| | ChannelCount | |||
| |- | |||
| | 0x8 | |||
| | 0x4 | |||
| | SampleFormat | |||
| |- | |||
| | 0xC | |||
| | 0x4 | |||
| | State | |||
| |} | |||
| = AudioInParameterInternal = | |||
| This is "nn::audio::detail::AudioInParameterInternal". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x4 | |||
| | SampleRate | |||
| |- | |||
| | 0x4 | |||
| | 0x4 | |||
| | ChannelCount | |||
| |- | |||
| | 0x8 | |||
| | 0x4 | |||
| | SampleFormat | |||
| |- | |||
| | 0xC | |||
| | 0x4 | |||
| | State | |||
| |} | |||
| = AudioOutBuffer = | |||
| This is "nn::audio::AudioOutBuffer". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! 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". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x4 | |||
| | SampleRate | |||
| |} | |||
| = FinalOutputRecorderParameterInternal = | |||
| This is "nn::audio::detail::FinalOutputRecorderParameterInternal". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x4 | |||
| | SampleRate | |||
| |- | |||
| | 0x4 | |||
| | 0x4 | |||
| | ChannelCount | |||
| |- | |||
| | 0x8 | |||
| | 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 | |||
| |} | |||
| = 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]] | ||