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