Audio services: Difference between revisions

No edit summary
No edit summary
Line 6: Line 6:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#ListAudioOuts]]
| 0 || [[#ListAudioOuts|ListAudioOuts]]
|-
|-
| 1 || [[#OpenAudioOut]]
| 1 || [[#OpenAudioOut|OpenAudioOut]]
|-
|-
| 2 || [3.0.0+] [[#ListAudioOutsAuto]]
| 2 || [3.0.0+] [[#ListAudioOutsAuto|ListAudioOutsAuto]]
|-
|-
| 3 || [3.0.0+] [[#OpenAudioOutAuto]]
| 3 || [3.0.0+] [[#OpenAudioOutAuto|OpenAudioOutAuto]]
|}
|}


== ListAudioOuts ==
== ListAudioOuts ==
Takes a type-0x6 output buffer.
Takes a type-0x6 output buffer containing an array of [[#AudioOutInfo]]. Returns an u32 '''Count'''.
Populates the output buffer with the available audio output devices' names and returns an u32 with the number of device names written.


== OpenAudioOut ==
== OpenAudioOut ==
Takes a type-0x5 input buffer ('''DeviceNameIn'''), a type-0x6 output buffer ('''DeviceNameOut'''), two u32s '''SampleRate''' (must be 48000) and '''ChannelCount''' (only the higher u16 is used), one [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], a PID and a copy-handle.
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 an output [[#AudioOutParameterInternal]].
Returns an [[#IAudioOut]] object and four u32s: the sample rate, channel count, [[#SampleFormat|SampleFormat]], and the initial AudioOutState.


== ListAudioOutsAuto ==
== ListAudioOutsAuto ==
Line 36: Line 34:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetAudioOutState]]
| 0 || [[#GetAudioOutState|GetAudioOutState]]
|-
|-
| 1 || [[#Start]]
| 1 || [[#Start|Start]]
|-
|-
| 2 || [[#Stop]]
| 2 || [[#Stop|Stop]]
|-
|-
| 3 || [[#AppendAudioOutBuffer]]
| 3 || [[#AppendAudioOutBuffer|AppendAudioOutBuffer]]
|-
|-
| 4 || [[#RegisterBufferEvent]]
| 4 || [[#RegisterBufferEvent|RegisterBufferEvent]]
|-
|-
| 5 || [[#GetReleasedAudioOutBuffers]]
| 5 || [[#GetReleasedAudioOutBuffers|GetReleasedAudioOutBuffers]]
|-
|-
| 6 || [[#ContainsAudioOutBuffer]]
| 6 || [[#ContainsAudioOutBuffer|ContainsAudioOutBuffer]]
|-
|-
| 7 || [3.0.0+] [[#AppendAudioOutBufferAuto]]
| 7 || [3.0.0+] [[#AppendAudioOutBufferAuto|AppendAudioOutBufferAuto]]
|-
|-
| 8 || [3.0.0+] [[#GetReleasedAudioOutBuffersAuto]]
| 8 || [3.0.0+] [[#GetReleasedAudioOutBuffersAuto|GetReleasedAudioOutBuffersAuto]]
|-
|-
| 9 || [4.0.0+] [[#GetAudioOutBufferCount]]
| 9 || [4.0.0+] [[#GetAudioOutBufferCount|GetAudioOutBufferCount]]
|-
|-
| 10 || [4.0.0+] [[#GetAudioOutPlayedSampleCount]]
| 10 || [4.0.0+] [[#GetAudioOutPlayedSampleCount|GetAudioOutPlayedSampleCount]]
|-
|-
| 11 || [4.0.0+] [[#FlushAudioOutBuffers]]
| 11 || [4.0.0+] [[#FlushAudioOutBuffers|FlushAudioOutBuffers]]
|-
|-
| 12 || [6.0.0+] [[#SetAudioOutVolume]]
| 12 || [6.0.0+] [[#SetAudioOutVolume|SetAudioOutVolume]]
|-
|-
| 13 || [6.0.0+] [[#GetAudioOutVolume]]
| 13 || [6.0.0+] [[#GetAudioOutVolume|GetAudioOutVolume]]
|}
|}


=== GetAudioOutState ===
=== GetAudioOutState ===
Returns an u32 '''AudioOutState''' (0=Started, 1=Stopped).
No input. Returns an output [[#AudioOutState]].


=== Start ===
=== Start ===
No input/output.
Starts audio playback using data from appended buffers.
Starts audio playback using data from appended buffers.


=== Stop ===
=== Stop ===
No input/output.
Stops audio playback. This waits for audio playback to finish before returning.
Stops audio playback. This waits for audio playback to finish before returning.


=== AppendAudioOutBuffer ===
=== AppendAudioOutBuffer ===
Takes a type-0x5 input buffer of [[#AudioOutBuffer|AudioOutBuffer]] and a u64 which acts as a tag for the supplied buffer (official apps use the buffer's address).
Takes a type-0x5 input buffer containing an [[#AudioOutBuffer]] and an input u64 '''BufferClientPtr'''. No output.


=== RegisterBufferEvent ===
=== RegisterBufferEvent ===
Returns an event handle that is signalled when a buffer is released.
No input. Returns an output Event handle.
 
The event is signalled when a buffer is released.


=== GetReleasedAudioOutBuffers ===
=== GetReleasedAudioOutBuffers ===
Takes a type-0x6 output buffer which will be filled with the identifiers from [[#AppendAudioOutBuffer]] of audio buffers that have been released.
Takes a type-0x6 output buffer '''AudioBuffer'''. Returns an output u32 '''Count'''.
Returns an u32 '''ReleasedBuffersCount'''.
 
'''AudioBuffer''' will be filled with the identifiers from [[#AppendAudioOutBuffer]] of audio buffers that have been released.


=== ContainsAudioOutBuffer ===
=== ContainsAudioOutBuffer ===
Takes an u64 '''tag''' for the desired buffer. Returns 1 if the buffer was appended and not yet released.
Takes an input u64 '''AudioBufferPointer'''. Returns an output bool '''Contains'''.


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


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


=== GetAudioOutBufferCount ===
=== GetAudioOutBufferCount ===
Returns u32 amount of buffers awaiting playback.
No input. Returns an output u32 '''AudioOutBufferCount'''.


=== GetAudioOutPlayedSampleCount ===
=== GetAudioOutPlayedSampleCount ===
Returns u64 total amount of samples played back.
No input. Returns an output u64 '''AudioOutPlayedSampleCount'''.


=== FlushAudioOutBuffers ===
=== FlushAudioOutBuffers ===
Flushes all pending buffers. Returns 1 if buffers were pending.
No input. Returns an output bool '''Pending'''.


=== SetAudioOutVolume ===
=== SetAudioOutVolume ===
Set float playback volume for this interface.
Takes an input float '''AudioOutVolume'''. No output.


=== GetAudioOutVolume ===
=== GetAudioOutVolume ===
Get float playback volume for this interface. Default is 1.0.
No input. Returns an output float '''AudioOutVolume'''.


= audin:u =
= audin:u =
Line 115: Line 120:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || ListAudioIns
| 0 || [[#ListAudioIns|ListAudioIns]]
|-
|-
| 1 || OpenAudioIn
| 1 || [[#OpenAudioIn|OpenAudioIn]]
|-
|-
| 2 || [3.0.0+] ListAudioInsAuto
| 2 || [3.0.0+] [[#ListAudioInsAuto|ListAudioInsAuto]]
|-
|-
| 3 || [3.0.0+] OpenAudioInAuto
| 3 || [3.0.0+] [[#OpenAudioInAuto|OpenAudioInAuto]]
|-
|-
| 4 || [3.0.0+] ListAudioInsAutoFiltered
| 4 || [3.0.0+] [[#ListAudioInsAutoFiltered|ListAudioInsAutoFiltered]]
|-
|-
| 5 || [5.0.0+] OpenAudioInProtocolSpecified
| 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 135: Line 158:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetAudioInState]]
| 0 || [[#GetAudioInState|GetAudioInState]]
|-
|-
| 1 || Start
| 1 || [[#Start_2|Start]]
|-
|-
| 2 || Stop
| 2 || [[#Stop_2|Stop]]
|-
|-
| 3 || AppendAudioInBuffer
| 3 || [[#AppendAudioInBuffer|AppendAudioInBuffer]]
|-
|-
| 4 || RegisterBufferEvent
| 4 || [[#RegisterBufferEvent_2|RegisterBufferEvent]]
|-
|-
| 5 || GetReleasedAudioInBuffers
| 5 || [[#GetReleasedAudioInBuffers|GetReleasedAudioInBuffers]]
|-
|-
| 6 || ContainsAudioInBuffer
| 6 || [[#ContainsAudioInBuffer|ContainsAudioInBuffer]]
|-
|-
| 7 || [3.0.0+] AppendUacInBuffer
| 7 || [3.0.0+] [[#AppendUacInBuffer|AppendUacInBuffer]]
|-
|-
| 8 || [3.0.0+] AppendAudioInBufferAuto
| 8 || [3.0.0+] [[#AppendAudioInBufferAuto|AppendAudioInBufferAuto]]
|-
|-
| 9 || [3.0.0+] GetReleasedAudioInBuffersAuto
| 9 || [3.0.0+] [[#GetReleasedAudioInBuffersAuto|GetReleasedAudioInBuffersAuto]]
|-
|-
| 10 || [3.0.0+] AppendUacInBufferAuto
| 10 || [3.0.0+] [[#AppendUacInBufferAuto|AppendUacInBufferAuto]]
|-
|-
| 11 || [4.0.0+] GetAudioInBufferCount
| 11 || [4.0.0+] [[#GetAudioInBufferCount|GetAudioInBufferCount]]
|-
|-
| 12 || [4.0.0+] SetDeviceGain
| 12 || [4.0.0+] [[#SetDeviceGain|SetDeviceGain]]
|-
|-
| 13 || [4.0.0+] GetDeviceGain
| 13 || [4.0.0+] [[#GetDeviceGain|GetDeviceGain]]
|-
|-
| 14 || [6.0.0+] FlushAudioInBuffers
| 14 || [6.0.0+] [[#FlushAudioInBuffers|FlushAudioInBuffers]]
|}
|}


=== GetAudioInState ===
=== GetAudioInState ===
Returns an u32 '''AudioInState''' (0=Started, 1=Stopped).
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.
 
=== GetDeviceGain ===
No input. Returns an output float '''DeviceGain'''.
 
=== FlushAudioInBuffers ===
No input. Returns an output bool '''Pending'''.


= audrec:u =
= audrec:u =
Line 176: 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 186: Line 258:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || GetFinalOutputRecorderState
| 0 || [[#GetFinalOutputRecorderState|GetFinalOutputRecorderState]]
|-
|-
| 1 || Start
| 1 || [[#Start_3|Start]]
|-
|-
| 2 || Stop
| 2 || [[#Stop_3|Stop]]
|-
|-
| 3 || AppendFinalOutputRecorderBuffer
| 3 || [[#AppendFinalOutputRecorderBuffer|AppendFinalOutputRecorderBuffer]]
|-
|-
| 4 || RegisterBufferEvent
| 4 || [[#RegisterBufferEvent_3|RegisterBufferEvent]]
|-
|-
| 5 || GetReleasedFinalOutputRecorderBuffers
| 5 || [[#GetReleasedFinalOutputRecorderBuffers|GetReleasedFinalOutputRecorderBuffers]]
|-
|-
| 6 || ContainsFinalOutputRecorderBuffer
| 6 || [[#ContainsFinalOutputRecorderBuffer|ContainsFinalOutputRecorderBuffer]]
|-
|-
| 7 || GetFinalOutputRecorderBufferEndTime
| 7 || [[#GetFinalOutputRecorderBufferEndTime|GetFinalOutputRecorderBufferEndTime]]
|-
|-
| 8 || [3.0.0+] AppendFinalOutputRecorderBufferAuto
| 8 || [3.0.0+] [[#AppendFinalOutputRecorderBufferAuto|AppendFinalOutputRecorderBufferAuto]]
|-
|-
| 9 || [3.0.0+] GetReleasedFinalOutputRecorderBuffersAuto
| 9 || [3.0.0+] [[#GetReleasedFinalOutputRecorderBuffersAuto|GetReleasedFinalOutputRecorderBuffersAuto]]
|-
|-
| 10 || [6.0.0+] FlushFinalOutputRecorderBuffers
| 10 || [6.0.0+] [[#FlushFinalOutputRecorderBuffers|FlushFinalOutputRecorderBuffers]]
|-
|-
| 11 || [9.0.0+] AttachWorkBuffer
| 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 =
= auddev =
Line 787: Line 899:
|-
|-
| 6 || Adpcm
| 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
|}
|}


Line 794: Line 1,066:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! 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)
|-
|-
| 0x00 || 8 || Pointer to next buffer (unused)
| 0x8
| 0x8
| Pointer to sample buffer
|-
|-
| 0x08 || 8 || Pointer to sample buffer
| 0x10
| 0x8
| Capacity of sample buffer
|-
|-
| 0x10 || 8 || Capacity of sample buffer
| 0x18
| 0x8
| Size of data in the sample buffer
|-
|-
| 0x18 || 8 || 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
| 0x4
|
|-
| 0x4
| 0x4
|
|-
| 0x8
| 0x4
|
|-
| 0xC
| 0x4
|
|-
|-
| 0x20 || 8 || Offset of data in the sample buffer (unused/ignored?)
| 0x10
| 0x8
|  
|}
|}


Line 816: Line 1,234:
| 0x0
| 0x0
| 0x4
| 0x4
| Sample rate (Hz)
| SampleRate
|-
|-
| 0x4
| 0x4
| 0x4
| 0x4
| Number of channels
| ChannelCount
|-
|-
| 0x8
| 0x8