/
Smooth_proc.h
104 lines (78 loc) · 3.62 KB
/
Smooth_proc.h
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
/* Copyright 2012 Kjetil S. Matheussen
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef AUDIO_SMOOTH_PROC_H
#define AUDIO_SMOOTH_PROC_H
typedef struct{
float* values;
volatile float target_value;
float start_value;
float end_value;
int num_values;
bool smoothing_is_necessary;
} Smooth;
typedef struct{
float vals [2][2];
} Panvals;
// Copied from https://github.com/kmatheussen/soundengine/blob/master/SoundObject.java (written by me)
//
static inline Panvals get_pan_vals_vector(float pan, int num_source_channels){
Panvals p;
const float sqrt2 = 1.414213562373095;
const float pan_scaleval = 2.0f-(2*sqrt2);
if(num_source_channels==1){
float x=scale(pan,-1,1,0,1);
p.vals[0][0] = ((1.0f-x)*((pan_scaleval*(1.0f-x))+(1.0f-pan_scaleval)));
p.vals[0][1] = x * ( (pan_scaleval*x) + (1.0f-pan_scaleval));
}else{
if(pan<=0){
//fprintf(stderr,"p1\n");
p.vals[0][0] = 1.0f;
p.vals[0][1] = 0.0f;
pan=scale(pan,-1,0,-1,1);
float x=scale(pan,-1,1,0,1);
//fprintf(stderr,"p2\n");
p.vals[1][0] = ((1.0f-x)*((pan_scaleval*(1.0f-x))+(1.0f-pan_scaleval)));
//fprintf(stderr,"p3\n");
p.vals[1][1] = x * ( (pan_scaleval*x) + (1.0f-pan_scaleval));
//fprintf(stderr,"p4\n");
//System.out.println("l/r/pan "+p.vals[1][0]+" "+p.vals[1][1]+" "+pan);
}else{
//fprintf(stderr,"p5\n");
pan=scale(pan,0,1,-1,1);
float x=scale(pan,-1,1,0,1);
//fprintf(stderr,"p6\n");
p.vals[0][0] = ((1.0f-x)*((pan_scaleval*(1.0f-x))+(1.0f-pan_scaleval)));
//fprintf(stderr,"p7\n");
p.vals[0][1] = x * ( (pan_scaleval*x) + (1.0f-pan_scaleval));
//fprintf(stderr,"p8\n");
p.vals[1][0] = 0.0f;
p.vals[1][1] = 1.0f;
//System.out.println("l/r/pan "+p.vals[0][0]+" "+p.vals[0][1]+" "+pan);
}
}
return p;
}
extern LANGSPEC void SMOOTH_init(Smooth *smooth, float value, int blocksize);
extern LANGSPEC void SMOOTH_new_blocksize(Smooth *smooth, int blockframes);
extern LANGSPEC void SMOOTH_release(Smooth *smooth);
extern LANGSPEC void SMOOTH_set_target_value(Smooth *smooth, float value);
extern LANGSPEC float SMOOTH_get_target_value(Smooth *smooth);
extern LANGSPEC void SMOOTH_called_per_block(Smooth *smooth);
extern LANGSPEC void SMOOTH_apply_volume(Smooth *smooth, float *sound, int num_frames);
extern LANGSPEC void SMOOTH_apply_inverted_volume(Smooth *smooth, float *sound, int num_frames);
extern LANGSPEC void SMOOTH_copy_sound(Smooth *smooth, float *dst, float *src, int num_frames);
extern LANGSPEC void SMOOTH_mix_sounds_raw(float *target, float *source, int num_frames, float start_volume, float end_volume);
extern LANGSPEC void SMOOTH_mix_sounds(Smooth *smooth, float *target, float *source, int num_frames);
extern LANGSPEC void SMOOTH_mix_sounds_using_inverted_values(Smooth *smooth, float *target, float *source, int num_frames);
extern LANGSPEC void SMOOTH_apply_pan(Smooth *smooth, float **sound, int num_channels, int num_frames);
#endif // AUDIO_SMOOTH_PROC_H