Mercurial > hg > dmlib
annotate minijss/jssmix.h @ 2298:b5abfff07ca9
Add new DMGrowBuf helper functions dmGrowBufCopyOffsSize() and
dmGrowBufConstCopyOffsSize().
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 04 Jul 2019 10:54:16 +0300 |
parents | 4b22da2a309f |
children | d6b9410f1b1b |
rev | line source |
---|---|
0 | 1 /* |
2 * miniJSS - Mixing device and channel handling | |
3 * Programmed and designed by Matti 'ccr' Hamalainen | |
1163 | 4 * (C) Copyright 2006-2015 Tecnic Software productions (TNSP) |
0 | 5 */ |
6 #ifndef JSSMIX_H | |
7 #define JSSMIX_H | |
8 #include "jss.h" | |
9 | |
358 | 10 |
11 #ifdef __cplusplus | |
12 extern "C" { | |
13 #endif | |
14 | |
0 | 15 //#define DBG(...) do { fprintf(stderr, __VA_ARGS__); } while (0) |
16 #define DBG(...) do { /* stub */ } while (0) | |
17 | |
18 | |
19 // Mixing limits | |
20 #define JVM_LIMIT_16_POS (32767) | |
21 #define JVM_LIMIT_16_NEG (-32767) | |
22 #define JVM_ADD_16 (32768) | |
23 | |
57
2edda27f951c
Silly interpolation in mixing.
Matti Hamalainen <ccr@tnsp.org>
parents:
56
diff
changeset
|
24 |
56
8725853609db
Remove the floating point mixing .. it wasn't so good idea after all.
Matti Hamalainen <ccr@tnsp.org>
parents:
51
diff
changeset
|
25 #define JMIXER_ADDBUF_TYPE Sint32 |
8725853609db
Remove the floating point mixing .. it wasn't so good idea after all.
Matti Hamalainen <ccr@tnsp.org>
parents:
51
diff
changeset
|
26 |
0 | 27 |
28 // A channel data structure | |
29 typedef struct | |
30 { | |
31 DMFixedPoint | |
287
1e89cd081956
Use fixed point everywhere in the mixing internals, to avoid going over
Matti Hamalainen <ccr@tnsp.org>
parents:
227
diff
changeset
|
32 chSize, // Length of sample in UNITS |
1e89cd081956
Use fixed point everywhere in the mixing internals, to avoid going over
Matti Hamalainen <ccr@tnsp.org>
parents:
227
diff
changeset
|
33 chLoopS, // Loop start in UNITS |
1e89cd081956
Use fixed point everywhere in the mixing internals, to avoid going over
Matti Hamalainen <ccr@tnsp.org>
parents:
227
diff
changeset
|
34 chLoopE, // Loop end in UNITS |
1e89cd081956
Use fixed point everywhere in the mixing internals, to avoid going over
Matti Hamalainen <ccr@tnsp.org>
parents:
227
diff
changeset
|
35 |
0 | 36 chPos, // Current position in sample, 32:32 fixpoint |
134
1ba202b448e0
Implement volume and panning ramps (interpolation between callbacks aka "frames")
Matti Hamalainen <ccr@tnsp.org>
parents:
57
diff
changeset
|
37 chDeltaO, // Delta in 32:32 UNSIGNED! (chDirection) |
1ba202b448e0
Implement volume and panning ramps (interpolation between callbacks aka "frames")
Matti Hamalainen <ccr@tnsp.org>
parents:
57
diff
changeset
|
38 chVolume, // Volume |
1ba202b448e0
Implement volume and panning ramps (interpolation between callbacks aka "frames")
Matti Hamalainen <ccr@tnsp.org>
parents:
57
diff
changeset
|
39 chDeltaV, |
1ba202b448e0
Implement volume and panning ramps (interpolation between callbacks aka "frames")
Matti Hamalainen <ccr@tnsp.org>
parents:
57
diff
changeset
|
40 chPanning, // Panning |
1ba202b448e0
Implement volume and panning ramps (interpolation between callbacks aka "frames")
Matti Hamalainen <ccr@tnsp.org>
parents:
57
diff
changeset
|
41 chDeltaP; |
139
111f3e4b57ad
Improve volume ramping functionality to allow arbitrary length ramps.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
42 int chVolumeD, |
111f3e4b57ad
Improve volume ramping functionality to allow arbitrary length ramps.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
43 chPanningD; |
111f3e4b57ad
Improve volume ramping functionality to allow arbitrary length ramps.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
44 |
1269 | 45 int chFreq; // Frequency of sample in Hz |
0 | 46 |
47 void *chData; // Pointer to data | |
48 | |
49 BOOL chPlaying, // TRUE = playing | |
50 chMute, // TRUE = muted | |
51 chDirection; // TRUE = playing forwards, FALSE = backwards | |
52 | |
53 int chFlags; // Flags | |
54 | |
57
2edda27f951c
Silly interpolation in mixing.
Matti Hamalainen <ccr@tnsp.org>
parents:
56
diff
changeset
|
55 JMIXER_ADDBUF_TYPE chPrevR[5], chPrevL[5]; |
0 | 56 } JSSChannel; |
57 | |
58 | |
59 // Channel table | |
60 typedef int JSSChannelTable[jsetNChannels]; | |
61 | |
62 | |
63 // Virtual software mixer "device" structure | |
64 typedef struct _JSSMixer JSSMixer; | |
65 | |
66 struct _JSSMixer | |
67 { | |
1269 | 68 int outFormat, // Output format (see JSS_AUDIO_* in jss.h) |
69 outChannels, // Number of output channels | |
70 outFreq, // Real output frequency | |
0 | 71 globalVol; |
1269 | 72 |
0 | 73 JSSChannel channels[jsetNChannels]; |
1127
e22d4ceb6414
Cosmetics pass, remove excess and trailing whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
74 |
0 | 75 int addBufSize; |
51
36e2f910219c
A non-working implementation of floating point audio mixing.
Matti Hamalainen <ccr@tnsp.org>
parents:
49
diff
changeset
|
76 JMIXER_ADDBUF_TYPE *addBuffer; |
0 | 77 |
78 // Callback handling | |
79 int cbFreq, cbCounter; | |
80 void *cbData; | |
81 void (*cbFunction)(void *, void *); | |
82 | |
83 // Mixing routine pointers | |
287
1e89cd081956
Use fixed point everywhere in the mixing internals, to avoid going over
Matti Hamalainen <ccr@tnsp.org>
parents:
227
diff
changeset
|
84 int (*jvmMixChannel_FW)(JSSMixer *, JSSChannel *, JMIXER_ADDBUF_TYPE *, const int, const DMFixedPoint); |
1e89cd081956
Use fixed point everywhere in the mixing internals, to avoid going over
Matti Hamalainen <ccr@tnsp.org>
parents:
227
diff
changeset
|
85 int (*jvmMixChannel_BW)(JSSMixer *, JSSChannel *, JMIXER_ADDBUF_TYPE *, const int, const DMFixedPoint); |
51
36e2f910219c
A non-working implementation of floating point audio mixing.
Matti Hamalainen <ccr@tnsp.org>
parents:
49
diff
changeset
|
86 void (*jvmPostProcess)(JMIXER_ADDBUF_TYPE *, void *, const int); |
0 | 87 |
88 // Device locking | |
89 #ifdef JSS_SUP_THREADS | |
90 DMMutex *mutex; | |
91 #endif | |
92 }; | |
93 | |
94 | |
95 /* Enums | |
96 */ | |
97 enum { | |
98 JMIX_AUTO = 0, | |
99 JMIX_C, | |
100 JMIX_MMX, | |
101 JMIX_SSE | |
102 }; | |
103 | |
104 | |
105 /* Main routines | |
106 */ | |
136 | 107 JSSMixer * jvmInit(const int outFormat, const int outChannels, const int outFreq, const int mixerID); |
0 | 108 int jvmClose(JSSMixer *mixer); |
109 | |
110 int jvmSetCallback(JSSMixer *mixer, void (*cbFunction)(void *, void *), void *cbData); | |
111 void jvmRemoveCallback(JSSMixer *mixer); | |
112 int jvmSetCallbackFreq(JSSMixer *mixer, const int cbFreq); | |
36
f3407a58e01e
Change DMFixedPoint types and appropriate JSS functions back to using signed
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
113 Sint32 jvmGetLastCBBufPos(JSSMixer *mixer, const int cbHandle); |
f3407a58e01e
Change DMFixedPoint types and appropriate JSS functions back to using signed
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
114 Sint32 jvmGetNextCBBufPos(JSSMixer *mixer, const int cbHandle); |
0 | 115 |
116 int jvmGetSampleSize(JSSMixer *mixer); | |
117 int jvmGetSampleRes(JSSMixer *mixer); | |
118 | |
119 void jvmRenderAudio(JSSMixer *mixer, void *mixBuffer, const int mixLength); | |
120 | |
121 | |
122 /* | |
123 int jvmAddCallback(JSSMixer *mixer, void (*cbFunction)(JSSMixer *, void *)); | |
124 int jvmRemoveCallback(JSSMixer *mixer, int cbHandle); | |
125 int jvmSetCallbackFreq(JSSMixer *mixer, int cbHandle, int cbFreq); | |
126 | |
127 int jvmAllocChannels(JSSMixer *mixer, int nChannels); | |
128 int jvmFreeChannels(JSSMixer *mixer, int iHandle); | |
129 int jvmGetChannelTable(JSSMixer *mixer, int iHandle, JSSChannelTable *pTable); | |
130 */ | |
131 | |
132 | |
133 /* Channel manipulation routines | |
134 */ | |
135 void jvmPlay(JSSMixer *mixer, const int channel); | |
136 void jvmStop(JSSMixer *mixer, const int channel); | |
227
b7e23d91a8c2
Add jvmReset() function for reseting channel's position and pitch.
Matti Hamalainen <ccr@tnsp.org>
parents:
141
diff
changeset
|
137 void jvmReset(JSSMixer * mixer, const int channel); |
0 | 138 |
139 void jvmSetSample(JSSMixer *mixer, const int channel, | |
36
f3407a58e01e
Change DMFixedPoint types and appropriate JSS functions back to using signed
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
140 void *data, const Sint32 size, const Sint32 loopS, |
f3407a58e01e
Change DMFixedPoint types and appropriate JSS functions back to using signed
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
141 const Sint32 loopE, const int flags); |
0 | 142 |
143 void jvmSetFreq(JSSMixer *mixer, const int channel, const int freq); | |
144 int jvmGetFreq(JSSMixer *mixer, const int channel); | |
134
1ba202b448e0
Implement volume and panning ramps (interpolation between callbacks aka "frames")
Matti Hamalainen <ccr@tnsp.org>
parents:
57
diff
changeset
|
145 |
0 | 146 void jvmSetVolume(JSSMixer *mixer, const int channel, const int volume); |
139
111f3e4b57ad
Improve volume ramping functionality to allow arbitrary length ramps.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
147 void jvmSetVolumeRamp(JSSMixer * mixer, const int channel, const int start, const int end, const int len); |
0 | 148 int jvmGetVolume(JSSMixer *mixer, const int channel); |
134
1ba202b448e0
Implement volume and panning ramps (interpolation between callbacks aka "frames")
Matti Hamalainen <ccr@tnsp.org>
parents:
57
diff
changeset
|
149 |
36
f3407a58e01e
Change DMFixedPoint types and appropriate JSS functions back to using signed
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
150 void jvmSetPos(JSSMixer *mixer, const int channel, const Sint32 pos); |
f3407a58e01e
Change DMFixedPoint types and appropriate JSS functions back to using signed
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
151 Sint32 jvmGetPos(JSSMixer *mixer, const int channel); |
0 | 152 |
153 void jvmSetPan(JSSMixer *mixer, const int channel, const int panning); | |
139
111f3e4b57ad
Improve volume ramping functionality to allow arbitrary length ramps.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
154 void jvmSetPanRamp(JSSMixer * mixer, const int channel, const int start, const int end, const int len); |
0 | 155 int jvmGetPan(JSSMixer *mixer, const int channel); |
156 | |
157 void jvmMute(JSSMixer *mixer, const int channel, const BOOL mute); | |
141
0c9438a2c72a
Add function jvmGetMute() to get status of channel mute.
Matti Hamalainen <ccr@tnsp.org>
parents:
139
diff
changeset
|
158 BOOL jvmGetMute(JSSMixer *mixer, const int channel); |
0 | 159 |
160 void jvmClear(JSSMixer *mixer, const int channel); | |
161 void jvmClearChannels(JSSMixer *mixer); | |
162 | |
163 void jvmSetGlobalVol(JSSMixer *mixer, const int volume); | |
164 int jvmGetGlobalVol(JSSMixer *mixer); | |
165 | |
166 | |
358 | 167 #ifdef __cplusplus |
168 } | |
169 #endif | |
170 | |
0 | 171 #endif // JSSMIX_H |