aboutsummaryrefslogtreecommitdiff
path: root/vendor/windows/XAudio2/xapofx.odin
blob: 5ab9d57a881c72498e5b99b3801a994c190bdd91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#+build windows

package windows_xaudio2

import win "core:sys/windows"

foreign import xa2 "system:xaudio2.lib"

//--------------<D-E-F-I-N-I-T-I-O-N-S>-------------------------------------//

FXEQ_UUID_STRING :: "F5E01117-D6C4-485A-A3F5-695196F3DBFA"
FXEQ_UUID := &win.CLSID{0xF5E01117, 0xD6C4, 0x485A, {0xA3, 0xF5, 0x69, 0x51, 0x96, 0xF3, 0xDB, 0xFA}}

FXMasteringLimiter_UUID_STRING :: "C4137916-2BE1-46FD-8599-441536F49856"
FXMasteringLimiter_UUID := &win.CLSID{0xC4137916, 0x2BE1, 0x46FD, {0x85, 0x99, 0x44, 0x15, 0x36, 0xF4, 0x98, 0x56}}

FXReverb_UUID_STRING :: "7D9ACA56-CB68-4807-B632-B137352E8596"
FXReverb_UUID := &win.CLSID{0x7D9ACA56, 0xCB68, 0x4807, {0xB6, 0x32, 0xB1, 0x37, 0x35, 0x2E, 0x85, 0x96}}

FXEcho_UUID_STRING :: "5039D740-F736-449A-84D3-A56202557B87"
FXEcho_UUID := &win.CLSID{0x5039D740, 0xF736, 0x449A, {0x84, 0xD3, 0xA5, 0x62, 0x02, 0x55, 0x7B, 0x87}}

// EQ parameter bounds (inclusive), used with FXEQ:
FXEQ_MIN_FRAMERATE :: 22000
FXEQ_MAX_FRAMERATE :: 48000

FXEQ_MIN_FREQUENCY_CENTER       :: 20.0
FXEQ_MAX_FREQUENCY_CENTER       :: 20000.0
FXEQ_DEFAULT_FREQUENCY_CENTER_0 :: 100.0   // band 0
FXEQ_DEFAULT_FREQUENCY_CENTER_1 :: 800.0   // band 1
FXEQ_DEFAULT_FREQUENCY_CENTER_2 :: 2000.0  // band 2
FXEQ_DEFAULT_FREQUENCY_CENTER_3 :: 10000.0 // band 3

FXEQ_MIN_GAIN     :: 0.126 // -18dB
FXEQ_MAX_GAIN     :: 7.94  // +18dB
FXEQ_DEFAULT_GAIN :: 1.0   // 0dB change, all bands

FXEQ_MIN_BANDWIDTH     :: 0.1
FXEQ_MAX_BANDWIDTH     :: 2.0
FXEQ_DEFAULT_BANDWIDTH :: 1.0 // all bands


// Mastering limiter parameter bounds (inclusive), used with FXMasteringLimiter:
FXMASTERINGLIMITER_MIN_RELEASE     :: 1
FXMASTERINGLIMITER_MAX_RELEASE     :: 20
FXMASTERINGLIMITER_DEFAULT_RELEASE :: 6

FXMASTERINGLIMITER_MIN_LOUDNESS     :: 1
FXMASTERINGLIMITER_MAX_LOUDNESS     :: 1800
FXMASTERINGLIMITER_DEFAULT_LOUDNESS :: 1000


// Reverb parameter bounds (inclusive), used with FXReverb:
FXREVERB_MIN_DIFFUSION     :: 0.0
FXREVERB_MAX_DIFFUSION     :: 1.0
FXREVERB_DEFAULT_DIFFUSION :: 0.9

FXREVERB_MIN_ROOMSIZE     :: 0.0001
FXREVERB_MAX_ROOMSIZE     :: 1.0
FXREVERB_DEFAULT_ROOMSIZE :: 0.6

// Loudness defaults used with FXLoudness:
FXLOUDNESS_DEFAULT_MOMENTARY_MS :: 400
FXLOUDNESS_DEFAULT_SHORTTERM_MS :: 3000

// Echo initialization data/parameter bounds (inclusive), used with FXEcho:
FXECHO_MIN_WETDRYMIX     :: 0.0
FXECHO_MAX_WETDRYMIX     :: 1.0
FXECHO_DEFAULT_WETDRYMIX :: 0.5

FXECHO_MIN_FEEDBACK     :: 0.0
FXECHO_MAX_FEEDBACK     :: 1.0
FXECHO_DEFAULT_FEEDBACK :: 0.5

FXECHO_MIN_DELAY     :: 1.0
FXECHO_MAX_DELAY     :: 2000.0
FXECHO_DEFAULT_DELAY :: 500.0

//--------------<D-A-T-A---T-Y-P-E-S>---------------------------------------//

// EQ parameters (4 bands), used with IXAPOParameters.SetParameters:
// The EQ supports only f32 audio foramts.
// The framerate must be within [22000, 48000] Hz.
FXEQ_PARAMETERS :: struct #packed {
	FrequencyCenter0: f32,  // center frequency in Hz, band 0
	Gain0:            f32,  // boost/cut
	Bandwidth0:       f32,  // bandwidth, region of EQ is center frequency +/- bandwidth/2
	FrequencyCenter1: f32,  // band 1
	Gain1:            f32,
	Bandwidth1:       f32,
	FrequencyCenter2: f32,  // band 2
	Gain2:            f32,
	Bandwidth2:       f32,
	FrequencyCenter3: f32,  // band 3
	Gain3:            f32,
	Bandwidth3:       f32,
}

// Mastering limiter parameters, used with IXAPOParameters.SetParameters:
// The mastering limiter supports only f32 audio formats.
FXMASTERINGLIMITER_PARAMETERS :: struct #packed {
	Release:  u32,  // release time (tuning factor with no specific units)
	Loudness: u32,  // loudness target (threshold)
}

// Reverb parameters, used with IXAPOParameters.SetParameters:
// The reverb supports only f32 audio formats with the following channel configurations:
//     Input: Mono   Output: Mono
//     Input: Stereo Output: Stereo
FXREVERB_PARAMETERS :: struct #packed {
	Diffusion: f32,  // diffusion
	RoomSize:  f32,  // room size
}


// Echo initialization data, used with CreateFX:
// Use of this structure is optional, the default MaxDelay is FXECHO_DEFAULT_DELAY.
FXECHO_INITDATA :: struct #packed {
	MaxDelay: f32,  // maximum delay (all channels) in milliseconds, must be within [FXECHO_MIN_DELAY, FXECHO_MAX_DELAY]
}

// Echo parameters, used with IXAPOParameters.SetParameters:
// The echo supports only f32 audio formats.
FXECHO_PARAMETERS :: struct #packed {
	WetDryMix: f32,   // ratio of wet (processed) signal to dry (original) signal
	Feedback:  f32,   // amount of output fed back into input
	Delay:     f32,   // delay (all channels) in milliseconds, must be within [FXECHO_MIN_DELAY, FXECHO_PARAMETERS.MaxDelay]
}

//--------------<F-U-N-C-T-I-O-N-S>-----------------------------------------//

@(default_calling_convention="cdecl")
foreign xa2 {
	// creates instance of requested XAPO, use Release to free instance
    	//  pInitData        - [in] effect-specific initialization parameters, may be nil if InitDataByteSize == 0
    	//  InitDataByteSize - [in] size of pInitData in bytes, may be 0 if pInitData is nil
	CreateFX :: proc(clsid: win.REFCLSID, pEffect: ^^IUnknown, pInitDat: rawptr = nil, InitDataByteSize: u32 = 0) -> HRESULT ---
}