Audio services: Difference between revisions

(48 intermediate revisions by 4 users not shown)
Line 10: Line 10:
| 1 || [[#OpenAudioOut]]
| 1 || [[#OpenAudioOut]]
|-
|-
| 2 || [3.0.0+] [[#ListAudioOutsEx]]
| 2 || [3.0.0+] [[#ListAudioOutsAuto]]
|-
|-
| 3 || [3.0.0+] [[#OpenAudioOutEx]]
| 3 || [3.0.0+] [[#OpenAudioOutAuto]]
|}
|}


Line 20: Line 20:


== OpenAudioOut ==
== OpenAudioOut ==
Takes a type-5 input buffer ('''DeviceNameIn'''), a type-6 output buffer ('''DeviceNameOut'''), two u32s '''SampleRate''' (must be 48000) and '''ChannelCount''' (high u16 can't be 0, official apps pass 0xCAFE0000), one u64 '''ClientPID''', a PID and a copy-handle.
Takes a type-5 input buffer ('''DeviceNameIn'''), a type-6 output buffer ('''DeviceNameOut'''), two u32s '''SampleRate''' (must be 48000) and '''ChannelCount''' (only the higher u16 is used), one u64 '''ClientPID''', a PID and a copy-handle.
Returns an [[#IAudioOut]] object and four u32s: the sample rate, channel count, [[#PCM_format|PCM format]], and the initial AudioOutState.
Returns an [[#IAudioOut]] object and four u32s: the sample rate, channel count, [[#PCM_format|PCM format]], and the initial AudioOutState.


Line 43: Line 43:
|}
|}


== ListAudioOutsEx ==
== ListAudioOutsAuto ==
Same as [[#ListAudioOuts]], but takes a type-0x22 output buffer instead.
Same as [[#ListAudioOuts]], but takes a type-0x22 output buffer instead.


== OpenAudioOutEx ==
== 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 70: Line 70:
| 6 || [[#ContainsAudioOutBuffer]]
| 6 || [[#ContainsAudioOutBuffer]]
|-
|-
| 7 || [3.0.0+] [[#AppendAudioOutBufferEx]]
| 7 || [3.0.0+] [[#AppendAudioOutBufferAuto]]
|-
|-
| 8 || [3.0.0+] [[#GetReleasedAudioOutBufferEx]]
| 8 || [3.0.0+] [[#GetReleasedAudioOutBufferAuto]]
|-
|-
| 9 || [4.0.0+]
| 9 || [4.0.0+] GetAudioOutBufferCount
|-
|-
| 10 || [4.0.0+]
| 10 || [4.0.0+] GetAudioOutPlayedSampleCount
|-
|-
| 11 || [4.0.0+]
| 11 || [4.0.0+] FlushAudioOutBuffers
|-
| 12 || [6.0.0+] SetAudioOutVolume
|-
| 13 || [6.0.0+] GetAudioOutVolume
|}
|}


Line 88: Line 92:


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


=== AppendAudioOutBuffer ===
=== AppendAudioOutBuffer ===
Line 98: Line 102:
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x00 || 8 || Pointer to next buffer
| 0x00 || 8 || Pointer to next buffer (unused)
|-
|-
| 0x08 || 8 || Pointer to sample buffer
| 0x08 || 8 || Pointer to sample buffer
Line 106: Line 110:
| 0x18 || 8 || Size of data in the sample buffer
| 0x18 || 8 || Size of data in the sample buffer
|-
|-
| 0x20 || 8 || Offset of data in the sample buffer
| 0x20 || 8 || Offset of data in the sample buffer (unused/ignored?)
|}
|}


Line 119: Line 123:
Takes an u64 '''tag''' for the desired buffer. Returns 1 if the buffer was appended and not yet released.
Takes an u64 '''tag''' for the desired buffer. Returns 1 if the buffer was appended and not yet released.


=== AppendAudioOutBufferEx ===
=== AppendAudioOutBufferAuto ===
Same as [[#AppendAudioOutBuffer]] but takes a type-0x21 buffer instead.
Same as [[#AppendAudioOutBuffer]] but takes a type-0x21 buffer instead.


=== GetReleasedAudioOutBufferEx ===
=== GetReleasedAudioOutBufferAuto ===
Same as [[#GetReleasedAudioOutBuffer]] but takes a type-0x22 buffer instead.
Same as [[#GetReleasedAudioOutBuffer]] but takes a type-0x22 buffer instead.


= audin:u =
= audin:u =
This is "nn::audio::detail::IAudioInManagerForDebugger".
This is "nn::audio::detail::IAudioInManager".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 136: Line 140:
| 1 || OpenAudioIn
| 1 || OpenAudioIn
|-
|-
| 2 || [3.0.0+] ListAudioInsEx
| 2 || [3.0.0+] ListAudioInsAuto
|-
| 3 || [3.0.0+] OpenAudioInAuto
|-
|-
| 3 || [3.0.0+] OpenAudioInEx
| 4 || [3.0.0+] ListAudioInsAutoFiltered
|-
|-
| 4 || [3.0.0+] ListAudioInsExAndProbe
| 5 || [5.0.0+]
|}
|}


Line 166: Line 172:
| 7 || [3.0.0+] AppendAudioInBufferWithUserEvent
| 7 || [3.0.0+] AppendAudioInBufferWithUserEvent
|-
|-
| 8 || [3.0.0+] AppendAudioInBufferEx
| 8 || [3.0.0+] AppendAudioInBufferAuto
|-
|-
| 9 || [3.0.0+] GetReleasedAudioInBufferEx
| 9 || [3.0.0+] GetReleasedAudioInBufferAuto
|-
|-
| 10 || [3.0.0+] AppendAudioInBufferWithUserEventEx
| 10 || [3.0.0+] AppendAudioInBufferWithUserEventAuto
|-
|-
| 11 || [4.0.0+]
| 11 || [4.0.0+] GetAudioInBufferCount
|-
|-
| 12 || [4.0.0+]
| 12 || [4.0.0+] SetAudioInDeviceGain
|-
|-
| 13 || [4.0.0+]
| 13 || [4.0.0+] GetAudioInDeviceGain
|-
| 14 || [6.0.0+] FlushAudioInBuffers
|}
|}


=== GetAudioInState ===
=== GetAudioInState ===
 
Returns an u32 '''AudioInState''' (0x00=Started, 0x01=Stopped).
Returns an AudioInState, 0x00=Started 0x01=Stopped (u32)


= audrec:u =
= audrec:u =
Line 214: Line 221:
| 6 || ContainsFinalOutputRecorderBuffer
| 6 || ContainsFinalOutputRecorderBuffer
|-
|-
| 7 ||
| 7 || GetFinalOutputRecorderBufferEndTime
|-
|-
| 8 || [3.0.0+] AppendFinalOutputRecorderBufferEx
| 8 || [3.0.0+] AppendFinalOutputRecorderBufferAuto
|-
|-
| 9 || [3.0.0+] GetReleasedFinalOutputRecorderBufferEx
| 9 || [3.0.0+] GetReleasedFinalOutputRecorderBufferAuto
|-
| 10 || [6.0.0+] FlushFinalOutputRecorderBuffers
|-
| 11 || [9.0.0+]
|}
 
= auddev =
This is "nn::audio::detail::IAudioSnoopManager".
 
This was added with [6.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || EnableDspUsageMeasurement
|-
| 1 || DisableDspUsageMeasurement
|-
| 6 || GetDspUsage
|}
|}


Line 230: Line 257:
| 0 || OpenAudioRenderer
| 0 || OpenAudioRenderer
|-
|-
| 1 || GetAudioRendererWorkBufferSize
| 1 || GetWorkBufferSize
|-
|-
| 2 || GetAudioRenderersProcessMasterVolume
| 2 || [[#GetAudioDeviceService]]
|-
| 3 || [3.0.0+] OpenAudioRendererForManualExecution
|-
|-
| 3 || SetAudioRenderersProcessMasterVolume
| 4 || [4.0.0+] GetAudioDeviceServiceWithRevisionInfo
|}
|}
=== GetAudioDeviceService ===
Takes an input u64 [[AM_services#AppletResourceUserId|AppletResourceUserId]], returns an output [[#IAudioDevice]].


== IAudioRenderer ==
== IAudioRenderer ==
Line 244: Line 276:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetAudioRendererSampleRate]]
| 0 || [[#GetSampleRate]]
|-
|-
| 1 || [[#GetAudioRendererSampleCount]]
| 1 || [[#GetSampleCount]]
|-
|-
| 2 || [[#GetAudioRendererMixBufferCount]]
| 2 || [[#GetMixBufferCount]]
|-
|-
| 3 || [[#GetAudioRendererState]]
| 3 || [[#GetState]]
|-
|-
| 4 || RequestUpdateAudioRenderer
| 4 || RequestUpdate
|-
|-
| 5 || StartAudioRenderer
| 5 || Start
|-
|-
| 6 || StopAudioRenderer
| 6 || Stop
|-
|-
| 7 || QuerySystemEvent
| 7 || QuerySystemEvent
|-
|-
| 8 || [[#SetAudioRendererRenderingTimeLimit]]
| 8 || [[#SetRenderingTimeLimit]]
|-
| 9 || [[#GetRenderingTimeLimit]]
|-
| 10 || [3.0.0+] RequestUpdateAuto
|-
|-
| 9 || [[#GetAudioRendererRenderingTimeLimit]]
| 11 || [3.0.0+] ExecuteAudioRendererRendering
|}
|}


=== GetAudioRendererSampleRate ===
=== GetSampleRate ===
Returns the Sample Rate. (u32)
Returns the Sample Rate. (u32)


=== GetAudioRendererSampleCount ===
=== GetSampleCount ===
Returns the Sample Count. (u32)
Returns the Sample Count. (u32)


=== GetAudioRendererMixBufferCount ===
=== GetMixBufferCount ===
Returns the number of Mix Buffers. (u32)
Returns the number of Mix Buffers. (u32)


Line 277: Line 313:
Returns an AudioRenderState, 0x00=Started 0x01=Stopped (u32)
Returns an AudioRenderState, 0x00=Started 0x01=Stopped (u32)


=== SetAudioRendererRenderingTimeLimit ===
=== SetRenderingTimeLimit ===
Takes a upper limit of the rendering time in percent. (u32)
Takes a upper limit of the rendering time in percent. (u32)


=== GetAudioRendererRenderingTimeLimit ===
=== GetRenderingTimeLimit ===
Returns the upper limit of the rendering time in percent. (u32)
Returns the upper limit of the rendering time in percent. (u32)


= audout:a, audin:a, audrec:a, audren:a =
== IAudioDevice ==
This is "nn::audio::detail::IAudioOutManagerForApplet", "nn::audio::detail::IAudioInManagerForApplet", "nn::audio::detail::IFinalOutputRecorderManagerForApplet", "nn::audio::detail::IAudioRendererManagerForApplet".
This is "nn::audio::detail::IAudioDevice".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 290: Line 326:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || RequestSuspend
| 0 || [[#ListAudioDeviceName]]
|-
|-
| 1 || RequestResume
| 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 || [5.0.0+] GetAudioSystemMasterVolumeSetting
|}
|}
=== 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.
= audout:a =
This is "nn::audio::detail::IAudioOutManagerForApplet".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || RequestSuspendAudioOuts
|-
| 1 || RequestResumeAudioOuts
|-
| 2 || GetAudioOutsProcessMasterVolume
|-
| 3 || SetAudioOutsProcessMasterVolume
|-
| 4 || [4.0.0+] GetAudioOutsProcessRecordVolume
|-
| 5 || [4.0.0+] SetAudioOutsProcessRecordVolume
|}
[4.0.0+] RequestSuspendAudioOuts/RequestResumeAudioOuts no longer returns an output handle.
= audin:a =
This is "nn::audio::detail::IAudioInManagerForApplet".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || RequestSuspendAudioIns
|-
| 1 || RequestResumeAudioIns
|-
| 2 || GetAudioInsProcessMasterVolume
|-
| 3 || SetAudioInsProcessMasterVolume
|}
[4.0.0+] RequestSuspendAudioIns/RequestResumeAudioIns no longer returns an output handle.
= audrec:a =
This is "nn::audio::detail::IFinalOutputRecorderManagerForApplet".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || RequestSuspendFinalOutputRecorders
|-
| 1 || RequestResumeFinalOutputRecorders
|}
[4.0.0+] RequestSuspendFinalOutputRecorders/RequestResumeFinalOutputRecorders no longer returns an output handle.
= audren:a =
This is "nn::audio::detail::IAudioRendererManagerForApplet".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || RequestSuspendAudioRenderers
|-
| 1 || RequestResumeAudioRenderers
|-
| 2 || GetAudioRenderersProcessMasterVolume
|-
| 3 || SetAudioRenderersProcessMasterVolume
|-
| 4 || RegisterAppletResourceUserId
|-
| 5 || UnregisterAppletResourceUserId
|-
| 6 || [4.0.0+] GetAudioRenderersProcessRecordVolume
|-
| 7 || [4.0.0+] SetAudioRenderersProcessRecordVolume
|}
[4.0.0+] RequestSuspendAudioRenderers/RequestResumeAudioRenderers no longer returns an output handle.


= audout:d, audin:d, audrec:d, audren:d =
= audout:d, audin:d, audrec:d, audren:d =
Line 308: Line 464:


== RequestSuspendForDebug ==
== RequestSuspendForDebug ==
 
Takes an u64 [[AM_services#AppletResourceUserId|AppletResourceUserId]].
Takes an [[AM_services#AppletResourceUserId|AppletResourceUserId]]. (u64)


== RequestResumeForDebug ==
== RequestResumeForDebug ==
Takes an u64 [[AM_services#AppletResourceUserId|AppletResourceUserId]].


Takes an [[AM_services#AppletResourceUserId|AppletResourceUserId]]. (u64)
= audctl =
This is "nn::audioctrl::detail::IAudioController".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetTargetVolume
|-
| 1 || SetTargetVolume
|-
| 2 || GetTargetVolumeMin
|-
| 3 || GetTargetVolumeMax
|-
| 4 || IsTargetMute
|-
| 5 || SetTargetMute
|-
| 6 || IsTargetConnected
|-
| 7 || SetDefaultTarget
|-
| 8 || GetDefaultTarget
|-
| 9 || GetAudioOutputMode
|-
| 10 || SetAudioOutputMode
|-
| 11 || SetForceMutePolicy
|-
| 12 || GetForceMutePolicy
|-
| 13 || GetOutputModeSetting
|-
| 14 || SetOutputModeSetting
|-
| 15 || SetOutputTarget
|-
| 16 || SetInputTargetForceEnabled
|-
| 17 || [3.0.0+] SetHeadphoneOutputLevelMode
|-
| 18 || [3.0.0+] GetHeadphoneOutputLevelMode
|-
| 19 || [3.0.0+] AcquireAudioVolumeUpdateEventForPlayReport
|-
| 20 || [3.0.0+] AcquireAudioOutputDeviceUpdateEventForPlayReport
|-
| 21 || [3.0.0+] GetAudioOutputTargetForPlayReport
|-
| 22 || [3.0.0+] NotifyHeadphoneVolumeWarningDisplayedEvent
|-
| 23 || [4.0.0+] SetSystemOutputMasterVolume
|-
| 24 || [4.0.0+] GetSystemOutputMasterVolume
|-
| 25 || [4.0.0+] GetAudioVolumeDataForPlayReport
|-
| 26 || [4.0.0+] UpdateHeadphoneSettings
|-
| 27 || [7.0.0+] SetVolumeMappingTableForDev
|}


= codecctl =
= codecctl =
Line 389: Line 607:
== IsCodecDeviceRequested ==
== IsCodecDeviceRequested ==
Returns a bool.
Returns a bool.
= hwopus =
This is "nn::codec::detail::IHardwareOpusDecoderManager".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#Initialize]]
|-
| 1 || [[#GetWorkBufferSize]]
|-
| 2 || [3.0.0+] [[#OpenHardwareOpusDecoderForMultiStream]]
|-
| 3 || [3.0.0+] [[#GetWorkBufferSizeForMultiStream]]
|}
Official sw can use either software libopus, or hwopus via "nn::codec::HardwareOpus*" (separate from the former).
== Initialize ==
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 [[#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.
== 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 [[#MultiStreamParameters]] struct.
== MultiStreamParameters ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| Sample rate (Hz)
|-
| 0x4
| 0x4
| Number of channels
|-
| 0x8
| 0x4
| Number of streams
|-
| 0xC
| 0x4
| Number of stereo streams
|-
| 0x10
| 0x100
| u8 array of channel mappings
|}
== IHardwareOpusDecoder ==
This is "nn::codec::detail::IHardwareOpusDecoder".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [4.0.0+] [[#DecodeInterleavedOld]] ([1.0.0-3.0.2] [[#DecodeInterleavedOld|#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+] [[#DecodeInterleaved]]
|-
| 7 || [6.0.0+] [[#DecodeInterleavedForMultiStream]]
|-
| 8 || [7.0.0+]
|-
| 9 || [7.0.0+]
|}
=== DecodeInterleavedOld ===
Takes a type-5 input buffer ('''OpusDataIn''') and a type-6 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-5 input buffer ('''DecoderContextIn'''). Sends the unknown context data to the hardware decoder. The input buffer is unused.
=== DecodeInterleavedForMultiStreamOld ===
Takes a type-5 input buffer ('''OpusDataIn''') and a type-6 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-5 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 || StartDspProfiler
|-
| 1 || StopDspProfiler
|-
| 2 || StartCpuProfiler
|-
| 3 || StopCpuProfiler
|}


[[Category:Services]]
[[Category:Services]]