libnx v4.10.0
Loading...
Searching...
No Matches
audren.h
Go to the documentation of this file.
1/**
2 * @file audren.h
3 * @brief Audio renderer service.
4 * @author fincs
5 * @copyright libnx Authors
6 */
7#pragma once
8
9#include "../types.h"
10#include "../kernel/event.h"
11#include "../audio/audio.h"
12#include "../sf/service.h"
13
14#define AUDREN_TIMER_FREQ_HZ 200.0f
15#define AUDREN_TIMER_PERIOD_MS 5.0f
16#define AUDREN_SAMPLES_PER_FRAME_32KHZ 160
17#define AUDREN_SAMPLES_PER_FRAME_48KHZ 240
18
19#define AUDREN_INPUT_PARAM_ALIGNMENT 0x1000
20#define AUDREN_OUTPUT_PARAM_ALIGNMENT 0x10
21#define AUDREN_MEMPOOL_ALIGNMENT 0x1000
22#define AUDREN_BUFFER_ALIGNMENT 0x40
23
24#define AUDREN_REVISION_1 0x31564552 // REV1 [1.0.0+]
25#define AUDREN_REVISION_2 0x32564552 // REV2 [2.0.0+]
26#define AUDREN_REVISION_3 0x33564552 // REV3 [3.0.0+]
27#define AUDREN_REVISION_4 0x34564552 // REV4 [4.0.0+]
28#define AUDREN_REVISION_5 0x35564552 // REV5 [6.0.0+]
29#define AUDREN_REVISION_6 0x36564552 // REV6 [6.1.0+]
30
31#define AUDREN_NODEID(_a,_b,_c) ((((u32)(_a) & 0xF) << 28) | (((u32)(_b) & 0xFFF) << 16) | ((u32)(_c) & 0xFFFF))
32#define AUDREN_FINAL_MIX_ID 0
33#define AUDREN_UNUSED_MIX_ID 0x7FFFFFFF
34#define AUDREN_UNUSED_SPLITTER_ID 0xFFFFFFFF
35
36#define AUDREN_DEFAULT_DEVICE_NAME "MainAudioOut"
37
38typedef enum {
39 AudioRendererOutputRate_32kHz,
40 AudioRendererOutputRate_48kHz,
41} AudioRendererOutputRate;
42
43typedef struct {
44 AudioRendererOutputRate output_rate;
45 int num_voices;
46 int num_effects;
47 int num_sinks;
48 int num_mix_objs;
49 int num_mix_buffers;
51
52/*
53Input buffer layout:
54
55AudioRendererUpdateDataHeader
56AudioRendererBehaviorInfoIn
57AudioRendererMemPoolInfoIn * mempool_count
58AudioRendererChannelInfoIn * channel_count
59AudioRendererVoiceInfoIn * voice_count
60(effects would go here)
61(splitters would go here)
62AudioRendererMixInfoIn * mix_count (i.e. submix_count+1)
63AudioRendererSinkInfoIn * sink_count
64AudioRendererPerformanceBufferInfoIn
65*/
66
67/*
68Output buffer layout:
69
70AudioRendererUpdateDataHeader
71AudioRendererMemPoolInfoOut * mempool_count
72AudioRendererVoiceInfoOut * voice_count
73(effects would go here)
74AudioRendererSinkInfoOut * sink_count
75AudioRendererPerformanceBufferInfoOut
76AudioRendererBehaviorInfoOut
77*/
78
79typedef struct {
80 u32 revision;
81 u32 behavior_sz;
82 u32 mempools_sz;
83 u32 voices_sz;
84 u32 channels_sz;
85 u32 effects_sz;
86 u32 mixes_sz;
87 u32 sinks_sz;
88 u32 perfmgr_sz;
89 u32 _padding[6];
90 u32 total_sz;
92
93typedef struct {
94 u32 revision;
95 u32 _padding1;
96 u64 flags;
98
99typedef struct {
100 u64 unknown[20];
101 u64 _padding1[2];
103
104typedef enum {
105 AudioRendererMemPoolState_Invalid,
106 AudioRendererMemPoolState_New,
107 AudioRendererMemPoolState_RequestDetach,
108 AudioRendererMemPoolState_Detached,
109 AudioRendererMemPoolState_RequestAttach,
110 AudioRendererMemPoolState_Attached,
111 AudioRendererMemPoolState_Released,
112} AudioRendererMemPoolState;
113
114typedef struct {
115 const void* address;
116 u64 size;
117 AudioRendererMemPoolState state;
118 u32 _padding2[3];
120
121typedef struct
122{
123 AudioRendererMemPoolState new_state;
124 u32 _padding2[3];
126
127typedef struct {
128 u32 id;
129 float mix[24];
130 bool is_used;
131 u8 _padding1[11];
133
134typedef struct {
135 bool enable;
136 u8 _padding;
137 s16 numerator[3];
138 s16 denominator[2];
140
141typedef struct {
142 u16 coefficients[16];
144
145typedef struct {
146 u16 index;
147 s16 history0;
148 s16 history1;
150
151typedef struct {
152 const void* address;
153 u64 size;
154 s32 start_sample_offset;
155 s32 end_sample_offset;
156 bool is_looping;
157 bool end_of_stream;
158 bool sent_to_server;
159 u8 _padding1[5];
160 const void* context_addr;
161 u64 context_sz;
162 u64 _padding2;
164
165typedef enum {
166 AudioRendererVoicePlayState_Started,
167 AudioRendererVoicePlayState_Stopped,
168 AudioRendererVoicePlayState_Paused,
169} AudioRendererVoicePlayState;
170
171typedef struct {
172 u32 id;
173 u32 node_id;
174 bool is_new;
175 bool is_used;
176 AudioRendererVoicePlayState state : 8;
177 PcmFormat sample_format : 8;
178 u32 sample_rate;
179 u32 priority;
180 u32 sorting_order;
181 u32 channel_count;
182 float pitch;
183 float volume;
184 AudioRendererBiquadFilter biquads[2];
185 u32 wavebuf_count;
186 s16 wavebuf_head;
187 u16 _padding1;
188 u32 _padding2;
189 const void* extra_params_ptr;
190 u64 extra_params_sz;
191 u32 dest_mix_id;
192 u32 dest_splitter_id;
193 AudioRendererWaveBuf wavebufs[4];
194 u32 channel_ids[6];
195 u8 _padding3[24];
197
198typedef struct {
199 u64 played_sample_count;
200 u32 num_wavebufs_consumed;
201 u32 voice_drops_count;
203
204typedef struct {
205 float volume;
206 u32 sample_rate;
207 u32 buffer_count;
208 bool is_used;
209 u8 _padding1[3];
210 u32 mix_id;
211 u32 _padding2;
212 u32 node_id;
213 u32 _padding3[2];
214 float mix[24][24]; // [src_index][dest_index]
215 u32 dest_mix_id;
216 u32 dest_splitter_id;
217 u32 _padding4;
219
220typedef struct {
221 u8 coefficients[16];
223
224typedef enum {
225 AudioRendererSinkType_Invalid,
226 AudioRendererSinkType_Device,
227 AudioRendererSinkType_CircularBuffer,
228} AudioRendererSinkType;
229
230typedef struct {
231 char name[255];
232 u8 _padding1;
233 u32 input_count;
234 u8 inputs[6];
235 u8 _padding2;
236 bool downmix_params_enabled;
237 AudioRendererDownMixParameters downmix_params;
239
240typedef struct {
241 void* buffer_ptr;
242 u32 buffer_sz;
243 u32 input_count;
244 u32 sample_count;
245 u32 last_read_offset;
246 PcmFormat sample_format;
247 u8 inputs[6];
248 u8 _padding2[6];
250
251typedef struct {
252 AudioRendererSinkType type : 8;
253 bool is_used;
254 u8 _padding1[2];
255 u32 node_id;
256 u64 _padding2[3];
257 union {
259 AudioRendererCircularBufferSinkInfoIn circular_buffer_sink;
260 };
262
263typedef struct {
264 u32 last_written_offset;
265 u32 unk1;
266 u64 unk2;
267 u64 _padding1[2];
269
270typedef struct {
271 u32 detail_target;
272 u32 _padding1[3];
274
275typedef struct {
276 u32 written_sz;
277 u32 _padding1[3];
279
280static inline u32 audrenGetRevision(void)
281{
282 extern u32 g_audrenRevision;
283 return g_audrenRevision;
284}
285
286NX_CONSTEXPR int audrenGetMemPoolCount(const AudioRendererConfig* config)
287{
288 return config->num_effects + 4 * config->num_voices;
289}
290
291NX_CONSTEXPR size_t audrenGetInputParamSize(const AudioRendererConfig* config)
292{
293 size_t size = 0;
294 size += sizeof(AudioRendererUpdateDataHeader);
295 size += sizeof(AudioRendererBehaviorInfoIn);
296 size += sizeof(AudioRendererMemPoolInfoIn) * audrenGetMemPoolCount(config);
297 size += sizeof(AudioRendererChannelInfoIn) * config->num_voices;
298 size += sizeof(AudioRendererVoiceInfoIn) * config->num_voices;
299 // todo: effects, splitters
300 size += sizeof(AudioRendererMixInfoIn) * config->num_mix_objs;
301 size += sizeof(AudioRendererSinkInfoIn) * config->num_sinks;
303 return size;
304}
305
306NX_CONSTEXPR size_t audrenGetOutputParamSize(const AudioRendererConfig* config)
307{
308 size_t size = 0;
309 size += sizeof(AudioRendererUpdateDataHeader);
310 size += sizeof(AudioRendererMemPoolInfoOut) * audrenGetMemPoolCount(config);
311 size += sizeof(AudioRendererVoiceInfoOut) * config->num_voices;
312 // todo: effects
313 size += sizeof(AudioRendererSinkInfoOut) * config->num_sinks;
315 size += sizeof(AudioRendererBehaviorInfoOut);
316 return size;
317}
318
319/// Initialize audren.
321
322/// Exit audren.
323void audrenExit(void);
324
325/// Gets the Service object for IAudioRenderer.
327
328/// Returns event that is signalled on new frame (autoclear=true).
330
331void audrenWaitFrame(void);
332Result audrenGetState(u32* out_state);
333Result audrenRequestUpdateAudioRenderer(const void* in_param_buf, size_t in_param_buf_size, void* out_param_buf, size_t out_param_buf_size, void* perf_buf, size_t perf_buf_size);
334Result audrenStartAudioRenderer(void);
335Result audrenStopAudioRenderer(void);
336Result audrenSetAudioRendererRenderingTimeLimit(int percent);
PcmFormat
PcmFormat.
Definition audio.h:12
Event * audrenGetFrameEvent(void)
Returns event that is signalled on new frame (autoclear=true).
void audrenExit(void)
Exit audren.
Service * audrenGetServiceSession_AudioRenderer(void)
Gets the Service object for IAudioRenderer.
Result audrenInitialize(const AudioRendererConfig *config)
Initialize audren.
Definition audren.h:145
Definition audren.h:141
Definition audren.h:93
Definition audren.h:99
Definition audren.h:134
Definition audren.h:127
Definition audren.h:43
Definition audren.h:230
Definition audren.h:220
Definition audren.h:114
Definition audren.h:122
Definition audren.h:204
Definition audren.h:251
Definition audren.h:263
Definition audren.h:79
Definition audren.h:171
Definition audren.h:198
Definition audren.h:151
Kernel-mode event structure.
Definition event.h:13
Service object structure.
Definition service.h:14
uint64_t u64
64-bit unsigned integer.
Definition types.h:22
uint8_t u8
8-bit unsigned integer.
Definition types.h:19
int16_t s16
16-bit signed integer.
Definition types.h:26
uint16_t u16
16-bit unsigned integer.
Definition types.h:20
u32 Result
Function error code result type.
Definition types.h:44
#define NX_CONSTEXPR
Flags a function as constexpr in C++14 and above; or as (always) inline otherwise.
Definition types.h:92
int32_t s32
32-bit signed integer.
Definition types.h:27
uint32_t u32
32-bit unsigned integer.
Definition types.h:21