annotate libaf/af_tools.c @ 8607:d6f40a06867b

Changes includes: - Improved runtime control system - 3 New filter panning, compressor/limiter and a noise gate - The compressor/limiter and the noise gate are not yet finished - The panning filter does combined mixing and channel routing and can be used to down-mix from stereo to mono (for example) - Improvements to volume and channel - volume now has a very good soft clipping using sin() - channel can handle generic routing of audio data - Conversion of all filters to handle floating point data - Cleanup of message printing - Fix for the sig 11 bug reported by Denes
author anders
date Sat, 28 Dec 2002 13:59:53 +0000
parents
children 440301fef3fe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
1 #include <math.h>
d6f40a06867b Changes includes:
anders
parents:
diff changeset
2 #include <af.h>
d6f40a06867b Changes includes:
anders
parents:
diff changeset
3
d6f40a06867b Changes includes:
anders
parents:
diff changeset
4 /* Convert to gain value from dB. Returns AF_OK if of and AF_ERROR if
d6f40a06867b Changes includes:
anders
parents:
diff changeset
5 fail */
d6f40a06867b Changes includes:
anders
parents:
diff changeset
6 inline int af_from_dB(int n, float* in, float* out, float k, float mi, float ma)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
7 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
8 int i = 0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
9 // Sanity check
d6f40a06867b Changes includes:
anders
parents:
diff changeset
10 if(!in || !out)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
11 return AF_ERROR;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
12
d6f40a06867b Changes includes:
anders
parents:
diff changeset
13 for(i=0;i<n;i++){
d6f40a06867b Changes includes:
anders
parents:
diff changeset
14 if(in[i]<=-200)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
15 out[i]=0.0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
16 else
d6f40a06867b Changes includes:
anders
parents:
diff changeset
17 out[i]=pow(10.0,clamp(in[i],mi,ma)/k);
d6f40a06867b Changes includes:
anders
parents:
diff changeset
18 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
19 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
20 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
21
d6f40a06867b Changes includes:
anders
parents:
diff changeset
22 /* Convert from gain value to dB. Returns AF_OK if of and AF_ERROR if
d6f40a06867b Changes includes:
anders
parents:
diff changeset
23 fail */
d6f40a06867b Changes includes:
anders
parents:
diff changeset
24 inline int af_to_dB(int n, float* in, float* out, float k)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
25 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
26 int i = 0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
27 // Sanity check
d6f40a06867b Changes includes:
anders
parents:
diff changeset
28 if(!in || !out)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
29 return AF_ERROR;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
30
d6f40a06867b Changes includes:
anders
parents:
diff changeset
31 for(i=0;i<AF_NCH;i++){
d6f40a06867b Changes includes:
anders
parents:
diff changeset
32 if(in[i] == 0.0)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
33 out[i]=-200.0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
34 else
d6f40a06867b Changes includes:
anders
parents:
diff changeset
35 out[i]=k*log10(in[i]);
d6f40a06867b Changes includes:
anders
parents:
diff changeset
36 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
37 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
38 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
39
d6f40a06867b Changes includes:
anders
parents:
diff changeset
40 /* Convert from ms to sample time*/
d6f40a06867b Changes includes:
anders
parents:
diff changeset
41 inline int af_from_ms(int n, float* in, float* out, int rate, float mi, float ma)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
42 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
43 int i = 0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
44 // Sanity check
d6f40a06867b Changes includes:
anders
parents:
diff changeset
45 if(!in || !out)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
46 return AF_ERROR;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
47
d6f40a06867b Changes includes:
anders
parents:
diff changeset
48 for(i=0;i<AF_NCH;i++)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
49 out[i]=clamp(in[i],ma,mi);
d6f40a06867b Changes includes:
anders
parents:
diff changeset
50
d6f40a06867b Changes includes:
anders
parents:
diff changeset
51 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
52 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
53
d6f40a06867b Changes includes:
anders
parents:
diff changeset
54 /* Convert from sample time to ms */
d6f40a06867b Changes includes:
anders
parents:
diff changeset
55 inline int af_to_ms(int n, float* in, float* out, int rate)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
56 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
57 int i = 0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
58 // Sanity check
d6f40a06867b Changes includes:
anders
parents:
diff changeset
59 if(!in || !out)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
60 return AF_ERROR;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
61
d6f40a06867b Changes includes:
anders
parents:
diff changeset
62 for(i=0;i<AF_NCH;i++)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
63 out[i]=in[i];
d6f40a06867b Changes includes:
anders
parents:
diff changeset
64
d6f40a06867b Changes includes:
anders
parents:
diff changeset
65 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
66 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
67
d6f40a06867b Changes includes:
anders
parents:
diff changeset
68 /* Helper function for testing the output format */
d6f40a06867b Changes includes:
anders
parents:
diff changeset
69 inline int af_test_output(struct af_instance_s* af, af_data_t* out)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
70 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
71 if((af->data->format != out->format) ||
d6f40a06867b Changes includes:
anders
parents:
diff changeset
72 (af->data->bps != out->bps) ||
d6f40a06867b Changes includes:
anders
parents:
diff changeset
73 (af->data->rate != out->rate) ||
d6f40a06867b Changes includes:
anders
parents:
diff changeset
74 (af->data->nch != out->nch)){
d6f40a06867b Changes includes:
anders
parents:
diff changeset
75 memcpy(out,af->data,sizeof(af_data_t));
d6f40a06867b Changes includes:
anders
parents:
diff changeset
76 return AF_FALSE;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
77 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
78 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
79 }