Difference between revisions of "Audio services"

From Nintendo Switch Brew
Jump to navigation Jump to search
Line 146: Line 146:
 
| 4 || [3.0.0+] ListAudioInsAutoFiltered
 
| 4 || [3.0.0+] ListAudioInsAutoFiltered
 
|-
 
|-
| 5 || [5.0.0+]
+
| 5 || [5.0.0+] OpenAudioInProtocolSpecified
 
|}
 
|}
  
Line 209: Line 209:
 
| 0 || GetFinalOutputRecorderState
 
| 0 || GetFinalOutputRecorderState
 
|-
 
|-
| 1 || StartFinalOutputRecorder
+
| 1 || Start
 
|-
 
|-
| 2 || StopFinalOutputRecorder
+
| 2 || Stop
 
|-
 
|-
 
| 3 || AppendFinalOutputRecorderBuffer
 
| 3 || AppendFinalOutputRecorderBuffer
Line 217: Line 217:
 
| 4 || RegisterBufferEvent
 
| 4 || RegisterBufferEvent
 
|-
 
|-
| 5 || GetReleasedFinalOutputRecorderBuffer
+
| 5 || GetReleasedFinalOutputRecorderBuffers
 
|-
 
|-
 
| 6 || ContainsFinalOutputRecorderBuffer
 
| 6 || ContainsFinalOutputRecorderBuffer
Line 225: Line 225:
 
| 8 || [3.0.0+] AppendFinalOutputRecorderBufferAuto
 
| 8 || [3.0.0+] AppendFinalOutputRecorderBufferAuto
 
|-
 
|-
| 9 || [3.0.0+] GetReleasedFinalOutputRecorderBufferAuto
+
| 9 || [3.0.0+] GetReleasedFinalOutputRecorderBuffersAuto
 
|-
 
|-
 
| 10 || [6.0.0+] FlushFinalOutputRecorderBuffers
 
| 10 || [6.0.0+] FlushFinalOutputRecorderBuffers
 
|-
 
|-
| 11 || [9.0.0+]
+
| 11 || [9.0.0+] AttachWorkBuffer
 
|}
 
|}
  

Revision as of 23:56, 25 November 2019

audout:u

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

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

ListAudioOuts

Takes a type-6 output buffer. Populates the output buffer with the available audio output devices' names and returns an u32 with the number of device names written.

OpenAudioOut

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, and the initial AudioOutState.

PCM format

Value Name
0 Invalid
1 INT8
2 INT16
3 INT24
4 INT32
5 PCM Float
6 ADPCM

ListAudioOutsAuto

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

OpenAudioOutAuto

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

IAudioOut

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

Cmd Name
0 #GetAudioOutState
1 #StartAudioOut
2 #StopAudioOut
3 #AppendAudioOutBuffer
4 #RegisterBufferEvent
5 #GetReleasedAudioOutBuffer
6 #ContainsAudioOutBuffer
7 [3.0.0+] #AppendAudioOutBufferAuto
8 [3.0.0+] #GetReleasedAudioOutBufferAuto
9 [4.0.0+] GetAudioOutBufferCount
10 [4.0.0+] GetAudioOutPlayedSampleCount
11 [4.0.0+] FlushAudioOutBuffers
12 [6.0.0+] SetAudioOutVolume
13 [6.0.0+] GetAudioOutVolume

GetAudioOutState

Returns an u32 AudioOutState (0x00=Started, 0x01=Stopped).

StartAudioOut

Starts audio playback using data from appended buffers.

StopAudioOut

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

AppendAudioOutBuffer

Takes a type-5 input buffer for sample data and a u64 which acts as a tag for the supplied buffer (official apps use the buffer's address).

The format of the input buffer is as follows:

Offset Size Description
0x00 8 Pointer to next buffer (unused)
0x08 8 Pointer to sample buffer
0x10 8 Capacity of sample buffer
0x18 8 Size of data in the sample buffer
0x20 8 Offset of data in the sample buffer (unused/ignored?)

RegisterBufferEvent

Returns an event handle that is signalled when a buffer is released.

GetReleasedAudioOutBuffer

Takes a type-6 output buffer which will be filled with the identifiers from #AppendAudioOutBuffer of audio buffers that have been released. Returns an u32 ReleasedBuffersCount.

ContainsAudioOutBuffer

Takes an u64 tag for the desired buffer. Returns 1 if the buffer was appended and not yet released.

AppendAudioOutBufferAuto

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

GetReleasedAudioOutBufferAuto

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

audin:u

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

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

IAudioIn

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

Cmd Name
0 #GetAudioInState
1 StartAudioIn
2 StopAudioIn
3 AppendAudioInBuffer
4 RegisterBufferEvent
5 GetReleasedAudioInBuffer
6 ContainsAudioInBuffer
7 [3.0.0+] AppendAudioInBufferWithUserEvent
8 [3.0.0+] AppendAudioInBufferAuto
9 [3.0.0+] GetReleasedAudioInBufferAuto
10 [3.0.0+] AppendAudioInBufferWithUserEventAuto
11 [4.0.0+] GetAudioInBufferCount
12 [4.0.0+] SetAudioInDeviceGain
13 [4.0.0+] GetAudioInDeviceGain
14 [6.0.0+] FlushAudioInBuffers

GetAudioInState

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

audrec:u

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

Cmd Name
0 OpenFinalOutputRecorder

IFinalOutputRecorder

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

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

auddev

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

This was added with [6.0.0+].

Cmd Name
0 EnableDspUsageMeasurement
1 DisableDspUsageMeasurement
6 GetDspUsage

audren:u

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

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

GetAudioDeviceService

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

IAudioRenderer

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

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

GetSampleRate

Returns the Sample Rate. (u32)

GetSampleCount

Returns the Sample Count. (u32)

GetMixBufferCount

Returns the number of Mix Buffers. (u32)

GetAudioRendererState

Returns an AudioRenderState, 0x00=Started 0x01=Stopped (u32)

SetRenderingTimeLimit

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

GetRenderingTimeLimit

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

IAudioDevice

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

Cmd Name
0 #ListAudioDeviceName
1 #SetAudioDeviceOutputVolume
2 #GetAudioDeviceOutputVolume
3 GetActiveAudioDeviceName
4 QueryAudioDeviceSystemEvent
5 GetActiveChannelCount
6 [3.0.0+] #ListAudioDeviceNameAuto
7 [3.0.0+] #SetAudioDeviceOutputVolumeAuto
8 [3.0.0+] #GetAudioDeviceOutputVolumeAuto
10 [3.0.0+] GetActiveAudioDeviceNameAuto
11 [3.0.0+] QueryAudioDeviceInputEvent
12 [3.0.0+] QueryAudioDeviceOutputEvent
13 [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".

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

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

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

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

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

Cmd Name
0 #RequestSuspendForDebug
1 #RequestResumeForDebug

RequestSuspendForDebug

Takes an u64 AppletResourceUserId.

RequestResumeForDebug

Takes an u64 AppletResourceUserId.

audctl

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

Cmd Name
0 GetTargetVolume
1 SetTargetVolume
2 GetTargetVolumeMin
3 GetTargetVolumeMax
4 IsTargetMute
5 SetTargetMute
6 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

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

This service no longer exists in [3.0.0+].

Cmd Name
0 #InitializeCodecController
1 #FinalizeCodecController
2 #SleepCodecController
3 #WakeCodecController
4 #SetCodecVolume
5 #GetCodecVolumeMax
6 #GetCodecVolumeMin
7 #SetCodecActiveTarget
8 #GetCodecActiveTarget
9 #BindCodecHeadphoneMicJackInterrupt
10 #IsCodecHeadphoneMicJackInserted
11 #ClearCodecHeadphoneMicJackInterrupt
12 #IsCodecDeviceRequested

InitializeCodecController

Takes no input.

FinalizeCodecController

Takes no input.

SleepCodecController

Takes no input.

WakeCodecController

Takes no input.

SetCodecVolume

Takes an u32 Volume.

GetCodecVolumeMax

Returns an u32 VolumeMax.

GetCodecVolumeMin

Returns an u32 VolumeMin.

SetCodecActiveTarget

Takes an u32 Target.

GetCodecActiveTarget

Returns an u32 Target.

BindCodecHeadphoneMicJackInterrupt

Returns an event handle.

IsCodecHeadphoneMicJackInserted

Returns a bool.

ClearCodecHeadphoneMicJackInterrupt

Takes no input.

IsCodecDeviceRequested

Returns a bool.

hwopus

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

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

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

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+] #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.

Cmd Name
0 StartDspProfiler
1 StopDspProfiler
2 StartCpuProfiler
3 StopCpuProfiler