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 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 220: |
Line 332: |
| ! Cmd || Name | | ! Cmd || Name |
| |- | | |- |
− | | 0 || EnableDspUsageMeasurement | + | | 0 || [17.0.0+] GetDspStatistics ([6.0.0-16.1.0] EnableDspUsageMeasurement) |
| |- | | |- |
− | | 1 || DisableDspUsageMeasurement | + | | 1 || [6.0.0-16.1.0] DisableDspUsageMeasurement |
| |- | | |- |
− | | 6 || GetDspUsage | + | | 6 || [6.0.0-16.1.0] GetDspUsage |
| |} | | |} |
| | | |
Line 278: |
Line 390: |
| |- | | |- |
| | 11 || [3.0.0+] ExecuteAudioRendererRendering | | | 11 || [3.0.0+] ExecuteAudioRendererRendering |
| + | |- |
| + | | 12 || [15.0.0+] SetVoiceDropParameter |
| + | |- |
| + | | 13 || [15.0.0+] GetVoiceDropParameter |
| |} | | |} |
| | | |
Line 329: |
Line 445: |
| | 12 || [3.0.0+] QueryAudioDeviceOutputEvent | | | 12 || [3.0.0+] QueryAudioDeviceOutputEvent |
| |- | | |- |
− | | 13 || [5.0.0+] GetAudioSystemMasterVolumeSetting | + | | 13 || [13.0.0+] [[#GetActiveAudioOutputDeviceName]] ([5.0.0-12.1.0] [[#GetAudioSystemMasterVolumeSetting]]) |
| + | |- |
| + | | 14 || [13.0.0+] ListAudioOutputDeviceName |
| + | |- |
| + | | 15 || [17.0.0+] AcquireAudioInputDeviceNotification |
| + | |- |
| + | | 16 || [17.0.0+] ReleaseAudioInputDeviceNotification |
| + | |- |
| + | | 17 || [17.0.0+] AcquireAudioOutputDeviceNotification |
| + | |- |
| + | | 18 || [17.0.0+] ReleaseAudioOutputDeviceNotification |
| + | |- |
| + | | 19 || [18.0.0+] SetAudioDeviceOutputVolumeAutoTuneEnabled |
| + | |- |
| + | | 20 || [18.0.0+] IsAudioDeviceOutputVolumeAutoTuneEnabled |
| |} | | |} |
| | | |
Line 349: |
Line 479: |
| === GetAudioDeviceOutputVolumeAuto === | | === GetAudioDeviceOutputVolumeAuto === |
| Takes a type-0x21 input buffer containing the '''DeviceName'''. Returns an output float. | | Takes a type-0x21 input buffer containing the '''DeviceName'''. Returns an output float. |
| + | |
| + | === GetAudioSystemMasterVolumeSetting === |
| + | Takes a type-0x5 input buffer, returns 4-bytes of output. |
| + | |
| + | === GetActiveAudioOutputDeviceName === |
| + | Takes a type-0x6 output buffer, returns no output. |
| | | |
| = audout:a = | | = audout:a = |
Line 475: |
Line 611: |
| | 5 || SetTargetMute | | | 5 || SetTargetMute |
| |- | | |- |
− | | 6 || IsTargetConnected | + | | 6 || [1.0.0-17.0.1] IsTargetConnected |
| |- | | |- |
| | 7 || SetDefaultTarget | | | 7 || SetDefaultTarget |
Line 485: |
Line 621: |
| | 10 || SetAudioOutputMode | | | 10 || SetAudioOutputMode |
| |- | | |- |
− | | 11 || SetForceMutePolicy | + | | 11 || [1.0.0-13.2.1] SetForceMutePolicy |
| |- | | |- |
− | | 12 || GetForceMutePolicy | + | | 12 || [1.0.0-13.2.1] GetForceMutePolicy |
| |- | | |- |
| | 13 || GetOutputModeSetting | | | 13 || GetOutputModeSetting |
Line 501: |
Line 637: |
| | 18 || [3.0.0+] GetHeadphoneOutputLevelMode | | | 18 || [3.0.0+] GetHeadphoneOutputLevelMode |
| |- | | |- |
− | | 19 || [3.0.0+] AcquireAudioVolumeUpdateEventForPlayReport | + | | 19 || [17.0.0+] SetForceMonauralOutputModeEnabled ([3.0.0-13.2.1] AcquireAudioVolumeUpdateEventForPlayReport) |
| |- | | |- |
− | | 20 || [3.0.0+] AcquireAudioOutputDeviceUpdateEventForPlayReport | + | | 20 || [17.0.0+] IsForceMonauralOutputModeEnabled ([3.0.0-13.2.1] AcquireAudioOutputDeviceUpdateEventForPlayReport) |
| |- | | |- |
− | | 21 || [3.0.0+] GetAudioOutputTargetForPlayReport | + | | 21 || [3.0.0-13.2.1] GetAudioOutputTargetForPlayReport |
| |- | | |- |
| | 22 || [3.0.0+] NotifyHeadphoneVolumeWarningDisplayedEvent | | | 22 || [3.0.0+] NotifyHeadphoneVolumeWarningDisplayedEvent |
Line 513: |
Line 649: |
| | 24 || [4.0.0+] GetSystemOutputMasterVolume | | | 24 || [4.0.0+] GetSystemOutputMasterVolume |
| |- | | |- |
− | | 25 || [4.0.0+] GetAudioVolumeDataForPlayReport | + | | 25 || [4.0.0-13.2.1] [[#GetAudioVolumeDataForPlayReport]] |
| + | |- |
| + | | 26 || [4.0.0-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 |
| |- | | |- |
− | | 26 || [4.0.0+] [[#UpdateHeadphoneSettings]] | + | | 35 || [14.0.0-14.1.2] SetHearingProtectionSafeguardTimerRemainingTimeForDebug |
| |- | | |- |
− | | 27 || [7.0.0+] SetVolumeMappingTableForDev | + | | 36 || [14.0.0-14.1.2] GetHearingProtectionSafeguardTimerRemainingTimeForDebug |
| |- | | |- |
− | | 28 || [10.0.0+] GetAudioOutputChannelCountForPlayReport | + | | 37 || [14.0.0-14.1.2] SetHearingProtectionSafeguardEnabled |
| |- | | |- |
− | | 29 || [10.0.0+] BindAudioOutputChannelCountUpdateEventForPlayReport | + | | 38 || [14.0.0-14.1.2] IsHearingProtectionSafeguardEnabled |
| + | |- |
| + | | 39 || [14.0.0-14.1.2] IsHearingProtectionSafeguardMonitoringOutputForDebug |
| + | |- |
| + | | 40 || [14.0.0+] [[#GetSystemInformationForDebug]] |
| + | |- |
| + | | 41 || [15.0.0+] SetVolumeButtonLongPressTime |
| + | |- |
| + | | 42 || [15.0.0+] SetNativeVolumeForDebug |
| + | |- |
| + | | 5000 || [19.0.0+] |
| + | |- |
| + | | 10000 || [13.0.0+] NotifyAudioOutputTargetForPlayReport |
| + | |- |
| + | | 10001 || [13.0.0+] NotifyAudioOutputChannelCountForPlayReport |
| + | |- |
| + | | 10002 || [13.0.0+] NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport |
| + | |- |
| + | | 10100 || [14.0.0+] GetAudioVolumeDataForPlayReport |
| + | |- |
| + | | 10101 || [14.0.0+] BindAudioVolumeUpdateEventForPlayReport |
| + | |- |
| + | | 10102 || [14.0.0+] BindAudioOutputTargetUpdateEventForPlayReport |
| + | |- |
| + | | 10103 || [14.0.0+] GetAudioOutputTargetForPlayReport |
| + | |- |
| + | | 10104 || [14.0.0+] GetAudioOutputChannelCountForPlayReport |
| + | |- |
| + | | 10105 || [14.0.0+] BindAudioOutputChannelCountUpdateEventForPlayReport |
| + | |- |
| + | | 10106 || [14.0.0+] GetDefaultAudioOutputTargetForPlayReport |
| + | |- |
| + | | 50000 || [15.0.0-18.1.0] SetAnalogInputBoostGainForPrototyping |
| + | |- |
| + | | 50001 || [19.0.0+] OverrideDefaultTargetForDebug |
| + | |- |
| + | | 50003 || [19.0.0+] SetForceOverrideExternalDeviceNameForDebug |
| + | |- |
| + | | 50004 || [19.0.0+] ClearForceOverrideExternalDeviceNameForDebug |
| |} | | |} |
| | | |
− | === UpdateHeadphoneSettings === | + | == GetAudioVolumeDataForPlayReport == |
| + | No input, returns a total of 7-bytes of output. |
| + | |
| + | [13.0.0+] No input, returns a total of 9-bytes of output. |
| + | |
| + | == UpdateHeadphoneSettings == |
| Takes one input bool. No output. | | Takes one input bool. No output. |
− | NS calls this with the result of IParentalControlService::IsRestrictionEnabled[https://switchbrew.org/wiki/Parental_Control_services#IParentalControlService]. | + | NS calls this with the result of [[Parental_Control_services#IParentalControlService|IParentalControlService::IsRestrictionEnabled]]. |
| + | |
| + | == GetSystemInformationForDebug == |
| + | Takes a type-0x1A output buffer. |
| + | |
| + | [15.0.0+] Now takes a type-0x16 output buffer. |
| + | |
| + | [18.0.0+] Originally the output buffer was a binary structure, now it's just a string. |
| | | |
| = codecctl = | | = codecctl = |
Line 617: |
Line 821: |
| |- | | |- |
| | 3 || [3.0.0+] [[#GetWorkBufferSizeForMultiStream]] | | | 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 via "nn::codec::HardwareOpus*" (separate from the former). | + | Official sw can use either software libopus, or hwopus (libopus running on the ADSP) via "nn::codec::HardwareOpus*" (separate from the former). |
| | | |
| == OpenHardwareOpusDecoder == | | == OpenHardwareOpusDecoder == |
Line 630: |
Line 846: |
| Takes a type-0x19 input buffer, an u32 '''WorkBufferSize''' and a TransferMemory handle for '''WorkBuffer'''. Returns an [[#IHardwareOpusDecoder]] object. The TransferMemory is created by the user-process with permissions=0. | | Takes a type-0x19 input buffer, an u32 '''WorkBufferSize''' and a TransferMemory handle for '''WorkBuffer'''. Returns an [[#IHardwareOpusDecoder]] object. The TransferMemory is created by the user-process with permissions=0. |
| | | |
− | The input buffer is a [[#MultiStreamParameters]] struct. The user-process initializes this struct the same way as [[#GetWorkBufferSizeForMultiStream]], except that an u8-array specified by the user is copied to +0x10 with size '''ChannelCount''', when '''ChannelCount''' above 0. | + | The input buffer is a [[#OpusMultiStreamParameters]] struct. The user-process initializes this struct the same way as [[#GetWorkBufferSizeForMultiStream]], except that an u8-array specified by the user is copied to +0x10 with size '''ChannelCount''', when '''ChannelCount''' above 0. |
| | | |
| == GetWorkBufferSizeForMultiStream == | | == GetWorkBufferSizeForMultiStream == |
| Takes a type-0x19 input buffer. Returns the u32 required size for the decoder's work buffer. Official user-processes align the output size to page-alignment. | | Takes a type-0x19 input buffer. Returns the u32 required size for the decoder's work buffer. Official user-processes align the output size to page-alignment. |
| | | |
− | The input buffer is a [[#MultiStreamParameters]] struct. | + | The input buffer is a [[#OpusMultiStreamParameters]] struct. |
| + | |
| + | == OpenHardwareOpusDecoderEx == |
| + | Takes a struct [[#OpusParametersEx]] and a u32 '''WorkBufferSize''' and a TransferMemory handle for '''WorkBuffer'''. Returns an [[#IHardwareOpusDecoder]] object. The TransferMemory is created by the user-process with permissions=0. |
| + | |
| + | When ''UseLargeFrameSize'' in the parameter struct is 1 a larger output buffer that can store 120ms opus frames is used vs the default of 40ms. |
| + | |
| + | == GetWorkBufferSizeEx == |
| + | Takes a struct [[#OpusParametersEx]]. Returns the u32 required size for the decoder's work buffer. Official user-processes align the output size to page-alignment. |
| + | |
| + | == OpenHardwareOpusDecoderForMultiStreamEx == |
| + | Takes a type-0x19 input buffer, an u32 '''WorkBufferSize''' and a TransferMemory handle for '''WorkBuffer'''. Returns an [[#IHardwareOpusDecoder]] object. The TransferMemory is created by the user-process with permissions=0. |
| + | |
| + | The input buffer is a [[#OpusMultiStreamParametersEx]] struct. When ''UseLargeFrameSize'' is 1 a larger output buffer that can store 120ms opus frames is used vs the default of 40ms. |
| + | |
| + | == GetWorkBufferSizeForMultiStreamEx == |
| + | Takes a type-0x19 input buffer. Returns the u32 required size for the decoder's work buffer. Official user-processes align the output size to page-alignment. |
| + | |
| + | The input buffer is a [[#OpusMultiStreamParametersEx]] struct. |
| | | |
| == IHardwareOpusDecoder == | | == IHardwareOpusDecoder == |
Line 751: |
Line 985: |
| |- | | |- |
| | 9 || SetAudioOutputProcessRecordVolume | | | 9 || SetAudioOutputProcessRecordVolume |
| + | |- |
| + | | 10 || [18.0.0+] GetAppletStateSummaries |
| |} | | |} |
| | | |
Line 787: |
Line 1,023: |
| |- | | |- |
| | 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,190: |
| {| 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) |
| + | |- |
| + | | 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 |
| |- | | |- |
− | | 0x00 || 8 || Pointer to next buffer (unused) | + | | 0xC |
| + | | 0x4 |
| + | | State |
| + | |} |
| + | |
| + | = FinalOutputRecorderWorkBufferParameterInternal = |
| + | This is "nn::audio::detail::FinalOutputRecorderWorkBufferParameterInternal". |
| + | |
| + | {| class="wikitable" border="1" |
| |- | | |- |
− | | 0x08 || 8 || Pointer to sample buffer
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| |- | | |- |
− | | 0x10 || 8 || Capacity of sample buffer | + | | 0x0 |
| + | | 0x8 |
| + | | |
| |- | | |- |
− | | 0x18 || 8 || Size of data in the sample buffer | + | | 0x8 |
| + | | 0x8 |
| + | | |
| |- | | |- |
− | | 0x20 || 8 || Offset of data in the sample buffer (unused/ignored?) | + | | 0x10 |
| + | | 0x8 |
| + | | |
| |} | | |} |
| | | |
− | = MultiStreamParameters = | + | = OpusParametersEx = |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 816: |
Line 1,350: |
| | 0x0 | | | 0x0 |
| | 0x4 | | | 0x4 |
− | | Sample rate (Hz) | + | | SampleRate |
| |- | | |- |
| | 0x4 | | | 0x4 |
| | 0x4 | | | 0x4 |
− | | Number of channels | + | | ChannelCount |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | UseLargeFrameSize |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Padding |
| + | |} |
| + | |
| + | = OpusMultiStreamParameters = |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | SampleRate |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | ChannelCount |
| |- | | |- |
| | 0x8 | | | 0x8 |
Line 834: |
Line 1,392: |
| | u8 array of channel mappings | | | u8 array of channel mappings |
| |} | | |} |
| + | |
| + | = OpusMultiStreamParametersEx = |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | SampleRate |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | ChannelCount |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Number of streams |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Number of stereo streams |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | UseLargeFrameSize |
| + | |- |
| + | | 0x14 |
| + | | 0x4 |
| + | | Padding |
| + | |- |
| + | | 0x18 |
| + | | 0x100 |
| + | | u8 array of channel mappings |
| + | |} |
| + | |
| + | = Notes = |
| + | Once nnMain finishes running, it calls a func which handles ADSP Aborts. This waits on an event, calls a func, then Aborts with Result 0xC0899. |
| + | |
| + | That func just calls another func, which: |
| + | * Calls various AGIC funcs for this IRQ, etc. |
| + | * Copies data from devicemem+0x608C (the 0x7000-byte devicemem "shared memory segment") to a stack struct. |
| + | * A funcptr is called if set with the above struct, then this returns. |
| + | |
| + | That funcptr, besides other func-calls, will log an [[Error_Report_services|erpt]] using the input struct when set with the "AdspException*" fields. |
| + | |
| + | This is triggered by AGIC IRQ adsp_wdresetreq, "ADSP Watchdog Timer Reset Request". The ADSP updates the watchdog from a thread, so normally the watchdog only expires when the ADSP configures it to trigger immediately. |
| + | |
| + | When handling an assert/exception, the ADSP: |
| + | * Logs exception info in text form into devicemem. |
| + | * Logs the binary form of the exception into devicemem (offset above). |
| + | * Eventually configures the watchdog to trigger immediately, prints "HALT: spinning forever...\n", then enters a loop using instruction "wfe". |
| | | |
| [[Category:Services]] | | [[Category:Services]] |