1 module pixelperfectengine.audio.base.types;
2 
3 /*
4  * Copyright (C) 2015-2021, by Laszlo Szeremi under the Boost license.
5  *
6  * Pixel Perfect Engine, audio.base.types module.
7  */
8 
9 /**
10  * Designates the audio format of a wave data.
11  *
12  * These are the same codes as in the *.wav file for compatibility.
13  */
14 public enum AudioFormat : ushort {
15 	/* WAVE form wFormatTag IDs */
16 	UNKNOWN		=	0x0000, /* Microsoft Corporation */
17 	PCM			=	0x0001,
18 	ADPCM		=	0x0002, /* Microsoft Corporation */
19 	IEEE_FLOAT	=	0x0003, /* Microsoft Corporation */
20 	VSELP		=	0x0004, /* Compaq Computer Corp. */
21 	IBM_CVSD	=	0x0005, /* IBM Corporation */
22 	ALAW		=	0x0006, /* Microsoft Corporation */
23 	MULAW		=	0x0007, /* Microsoft Corporation */
24 	DTS			=	0x0008, /* Microsoft Corporation */
25 	OKI_ADPCM	=	0x0010, /* OKI */
26 	DVI_ADPCM	=	0x0011, /* Intel Corporation */
27 	IMA_ADPCM	=	DVI_ADPCM, /*  Intel Corporation */
28 	MEDIASPACE_ADPCM	=	0x0012, /* Videologic */
29 	SIERRA_ADPCM=	0x0013, /* Sierra Semiconductor Corp */
30 	G723_ADPCM	=	0x0014, /* Antex Electronics Corporation */
31 	DIGISTD		=	0x0015, /* DSP Solutions, Inc. */
32 	DIGIFIX		=	0x0016, /* DSP Solutions, Inc. */
33 	DIALOGIC_OKI_ADPCM	=	0x0017, /* Dialogic Corporation */
34 	MEDIAVISION_ADPCM	=	0x0018, /* Media Vision, Inc. */
35 	CU_CODEC	=	0x0019, /* Hewlett-Packard Company */
36 	YAMAHA_ADPCM=	0x0020, /* Yamaha Corporation of America */
37 	SONARC		=	0x0021, /* Speech Compression */
38 	DSPGROUP_TRUESPEECH	=	0x0022, /* DSP Group, Inc */
39 	ECHOSC1		=	0x0023, /* Echo Speech Corporation */
40 	AUDIOFILE_AF36		=	0x0024, /* Virtual Music, Inc. */
41 	APTX		=	0x0025, /* Audio Processing Technology */
42 	AUDIOFILE_AF10		=	0x0026, /* Virtual Music, Inc. */
43 	PROSODY_1612=	0x0027, /* Aculab plc */
44 	LRC			=	0x0028, /* Merging Technologies S.A. */
45 	DOLBY_AC2	=	0x0030, /* Dolby Laboratories */
46 	GSM610		=	0x0031, /* Microsoft Corporation */
47 	MSNAUDIO	=	0x0032, /* Microsoft Corporation */
48 	ANTEX_ADPCME=	0x0033, /* Antex Electronics Corporation */
49 	CONTROL_RES_VQLPC	=	0x0034, /* Control Resources Limited */
50 	DIGIREAL	=	0x0035, /* DSP Solutions, Inc. */
51 	DIGIADPCM	=	0x0036, /* DSP Solutions, Inc. */
52 	CONTROL_RES_CR10	=	0x0037, /* Control Resources Limited */
53 	NMS_VBXADPCM=	0x0038, /* Natural MicroSystems */
54 	CS_IMAADPCM	=	0x0039, /* Crystal Semiconductor IMA ADPCM */
55 	ECHOSC3		=	0x003A, /* Echo Speech Corporation */
56 	ROCKWELL_ADPCM		=	0x003B, /* Rockwell International */
57 	ROCKWELL_DIGITALK	=	0x003C, /* Rockwell International */
58 	XEBEC		=	0x003D, /* Xebec Multimedia Solutions Limited */
59 	G721_ADPCM	=	0x0040, /* Antex Electronics Corporation */
60 	G728_CELP	=	0x0041, /* Antex Electronics Corporation */
61 	MSG723		=	0x0042, /* Microsoft Corporation */
62 	MPEG		=	0x0050, /* Microsoft Corporation */
63 	RT24		=	0x0052, /* InSoft, Inc. */
64 	PAC			=	0x0053, /* InSoft, Inc. */
65 	MPEGLAYER3	=	0x0055, /* ISO/MPEG Layer3 Format Tag */
66 	LUCENT_G723	=	0x0059, /* Lucent Technologies */
67 	CIRRUS		=	0x0060, /* Cirrus Logic */
68 	ESPCM		=	0x0061, /* ESS Technology */
69 	VOXWARE		=	0x0062, /* Voxware Inc */
70 	CANOPUS_ATRAC		=	0x0063, /* Canopus, co., Ltd. */
71 	G726_ADPCM	=	0x0064, /* APICOM */
72 	G722_ADPCM	=	0x0065, /* APICOM */
73 	DSAT_DISPLAY=	0x0067, /* Microsoft Corporation */
74 	VOXWARE_BYTE_ALIGNED=	0x0069, /* Voxware Inc */
75 	VOXWARE_AC8	=	0x0070, /* Voxware Inc */
76 	VOXWARE_AC10=	0x0071, /* Voxware Inc */
77 	VOXWARE_AC16=	0x0072, /* Voxware Inc */
78 	VOXWARE_AC20=	0x0073, /* Voxware Inc */
79 	VOXWARE_RT24=	0x0074, /* Voxware Inc */
80 	VOXWARE_RT29=	0x0075, /* Voxware Inc */
81 	VOXWARE_RT29HW		=	0x0076, /* Voxware Inc */
82 	VOXWARE_VR12=	0x0077, /* Voxware Inc */
83 	VOXWARE_VR18=	0x0078, /* Voxware Inc */
84 	VOXWARE_TQ40=	0x0079, /* Voxware Inc */
85 	SOFTSOUND	=	0x0080, /* Softsound, Ltd. */
86 	VOXWARE_TQ60=	0x0081, /* Voxware Inc */
87 	MSRT24		=	0x0082, /* Microsoft Corporation */
88 	G729A		=	0x0083, /* AT&T Labs, Inc. */
89 	MVI_MVI2	=	0x0084, /* Motion Pixels */
90 	DF_G726		=	0x0085, /* DataFusion Systems (Pty) (Ltd) */
91 	DF_GSM610	=	0x0086, /* DataFusion Systems (Pty) (Ltd) */
92 	ISIAUDIO	=	0x0088, /* Iterated Systems, Inc. */
93 	ONLIVE		=	0x0089, /* OnLive! Technologies, Inc. */
94 	SBC24		=	0x0091, /* Siemens Business Communications Sys */
95 	DOLBY_AC3_SPDIF		=	0x0092, /* Sonic Foundry */
96 	MEDIASONIC_G723		=	0x0093, /* MediaSonic */
97 	PROSODY_8KBPS		=	0x0094, /* Aculab plc */
98 	ZYXEL_ADPCM	=	0x0097, /* ZyXEL Communications, Inc. */
99 	PHILIPS_LPCBB		=	0x0098, /* Philips Speech Processing */
100 	PACKED		=	0x0099, /* Studer Professional Audio AG */
101 	MALDEN_PHONYTALK	=	0x00A0, /* Malden Electronics Ltd. */
102 	RHETOREX_ADPCM		=	0x0100, /* Rhetorex Inc. */
103 	IRAT		=	0x0101, /* BeCubed Software Inc. */
104 	VIVO_G723	=	0x0111, /* Vivo Software */
105 	VIVO_SIREN	=	0x0112, /* Vivo Software */
106 	DIGITAL_G723=	0x0123, /* Digital Equipment Corporation */
107 	SANYO_LD_ADPCM		=	0x0125, /* Sanyo Electric Co., Ltd. */
108 	SIPROLAB_ACEPLNET	=	0x0130, /* Sipro Lab Telecom Inc. */
109 	SIPROLAB_ACELP4800	=	0x0131, /* Sipro Lab Telecom Inc. */
110 	SIPROLAB_ACELP8V3	=	0x0132, /* Sipro Lab Telecom Inc. */
111 	SIPROLAB_G729		=	0x0133, /* Sipro Lab Telecom Inc. */
112 	SIPROLAB_G729A		=	0x0134, /* Sipro Lab Telecom Inc. */
113 	SIPROLAB_KELVIN		=	0x0135, /* Sipro Lab Telecom Inc. */
114 	G726ADPCM	=	0x0140, /* Dictaphone Corporation */
115 	QUALCOMM_PUREVOICE	=	0x0150, /* Qualcomm, Inc. */
116 	QUALCOMM_HALFRATE	=	0x0151, /* Qualcomm, Inc. */
117 	TUBGSM		=	0x0155, /* Ring Zero Systems, Inc. */
118 	MSAUDIO1	=	0x0160, /* Microsoft Corporation */
119 	CREATIVE_ADPCM		=	0x0200, /* Creative Labs, Inc */
120 	CREATIVE_FASTSPEECH8=	0x0202, /* Creative Labs, Inc */
121 	CREATIVE_FASTSPEECH10	=	0x0203, /* Creative Labs, Inc */
122 	UHER_ADPCM	=	0x0210, /* UHER informatic GmbH */
123 	QUARTERDECK	=	0x0220, /* Quarterdeck Corporation */
124 	ILINK_VC	=	0x0230, /* I-link Worldwide */
125 	RAW_SPORT	=	0x0240, /* Aureal Semiconductor */
126 	IPI_HSX		=	0x0250, /* Interactive Products, Inc. */
127 	IPI_RPELP	=	0x0251, /* Interactive Products, Inc. */
128 	CS2			=	0x0260, /* Consistent Software */
129 	SONY_SCX	=	0x0270, /* Sony Corp. */
130 	FM_TOWNS_SND=	0x0300, /* Fujitsu Corp. */
131 	BTV_DIGITAL	=	0x0400, /* Brooktree Corporation */
132 	QDESIGN_MUSIC		=	0x0450, /* QDesign Corporation */
133 	VME_VMPCM	=	0x0680, /* AT&T Labs, Inc. */
134 	TPC			=	0x0681, /* AT&T Labs, Inc. */
135 	OLIGSM		=	0x1000, /* Ing C. Olivetti & C., S.p.A. */
136 	OLIADPCM	=	0x1001, /* Ing C. Olivetti & C., S.p.A. */
137 	OLICELP		=	0x1002, /* Ing C. Olivetti & C., S.p.A. */
138 	OLISBC		=	0x1003, /* Ing C. Olivetti & C., S.p.A. */
139 	OLIOPR		=	0x1004, /* Ing C. Olivetti & C., S.p.A. */
140 	LH_CODEC	=	0x1100, /* Lernout & Hauspie */
141 	WAVE_FORMAT_NORRIS	=	0x1400, /* Norris Communications, Inc. */
142 	SOUNDSPACE_MUSICOMPRESS	=	0x1500, /* AT&T Labs, Inc. */
143 	DVM		=	0x2000, /* FAST Multimedia AG */
144 }
145 /**
146  * Defines the the format of a waveform data.
147  */
148 public struct WaveFormat {
149 	public uint		samplerate;				///Base playback frequency. Actual playback can ignore this for pitching, etc.
150 	public uint		bytesPerSecond;			///Bytes per second at base playback frequency.
151 	public ushort	format;					///The audio format, compatible with the *.wav format
152 	public ushort	channels;				///The number of audio channels
153 	public ushort	bytesPerSample;			///Bytes per sample
154 	public ushort	bitsPerSample;			///Bits per sample
155 }
156 /**
157  * Defines errorcodes for sample loading.
158  * Negative numbers indicate specific issues, positive numbers indicate issues with sample length, format, etc.
159  */
160 public enum SampleLoadErrorCode : int {
161 	none						=	0,
162 	SampleLoadingNotSupported	=	-1,
163 	SampleSlotNotExist			=	-2,
164 	SampleBankFull				=	-3,
165 	FileFormatNotSupported		=	-4,
166 	FileNotFound				=	-5,
167 	//sample format issues
168 	//should be OR-ed together
169 	FormatNotSupported			=	0x1,
170 	BitdepthNotSupported		=	0x2,
171 	SampleRateNotSupported		=	0x4,
172 	ChNumNotSupported			=	0x8,
173 	SampleLenghtNotSupported	=	0x10,	//Should be only used if a specific sample length was requested
174 }
175 public enum IIRType : ubyte {
176 	none,
177 	LPF,
178 	HPF,
179 	BPF0,
180 	BPF1,
181 	Notch,
182 }
183 /**
184  * Defines a workpad for many simple audio codecs
185  */
186 public struct DecoderWorkpad {
187 	size_t			pos;		///Position of the decoder
188 	int				outn1;		///Previous output sample
189 	int				pred;		///Predictor for ADPCM
190 }
191 /**
192  * Defines a workpad for sample stretching algorithms
193  */
194 public struct WavemodWorkpad {
195 	ulong			lookupVal;	///Current nearest-lookup position
196 	///Substracts from the offset for the next wavechunk.
197 	///Returns the new lookupVal
198 	ulong sub(size_t amount) @nogc @safe pure nothrow {
199 		return lookupVal - (amount<<24);
200 	}
201 }
202 /**
203  * Stores Biquad filter values for audio.
204  */
205 struct BiquadFilterValues {
206 	float	a0;
207 	float	a1;
208 	float	a2;
209 	float	b0;
210 	float	b1;
211 	float	b2;
212 }
213 /** 
214  * Defines the type of a module parameter.
215  */
216 public enum MValueType : ubyte {
217 	init,
218 	String,
219 	Int32,
220 	Int64,
221 	Float,			///Set in the form of a double
222 	Boolean,		///Set in the form of a 32 bit integer
223 }
224 /** 
225  * Defines the type and the name of a module's parameters.
226  */
227 public struct MValue {
228 	MValueType		type;
229 	ubyte			idType;		///0 if ID is hash of the name, 1 if not.
230 	int				id;			///Ideally the MurMurHashV3/32 value of the name, but other numbers also can be used if needed, e.g. it's too complex to rely on hash values
231 	string			name;
232 	this (MValueType type, uint id, string name) @nogc @safe pure nothrow {
233 		this.type = type;
234 		this.id = id;
235 		this.name = name;
236 		idType = 1;
237 	}
238 	this (MValueType type, string name) @nogc @safe pure nothrow {
239 		import pixelperfectengine.system.etc : hashCalc;
240 		this.type = type;
241 		this.id = hashCalc(name);
242 		this.name = name;
243 	}
244 }