annotate libaf/af_tools.c @ 25317:7f3cb5408f28

Fixed VIDIX color bug that was introduced when Radeon VIDIX driver was synchronized with vidix.sf.net. The red color was saturating. Corrected value fixes the issue and restore the color to the level it used to have before synchronization. Meaning of the value remains unknow but was retrieved from register's value of a Radeon 9000 card, so it may need further testing. Patch by Guillaume Lecerf (foxcore at gmail dot com)
author ben
date Mon, 10 Dec 2007 19:27:46 +0000
parents a54a25221b79
children 327b7955381f
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>
8623
440301fef3fe Added/reordered #includes to silence warnings about "implicit declaration".
rathann
parents: 8607
diff changeset
2 #include <string.h>
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
3 #include <af.h>
d6f40a06867b Changes includes:
anders
parents:
diff changeset
4
d6f40a06867b Changes includes:
anders
parents:
diff changeset
5 /* Convert to gain value from dB. Returns AF_OK if of and AF_ERROR if
d6f40a06867b Changes includes:
anders
parents:
diff changeset
6 fail */
24890
a54a25221b79 Remove some pointless 'inline' qualifiers
uau
parents: 14621
diff changeset
7 int af_from_dB(int n, float* in, float* out, float k, float mi, float ma)
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
8 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
9 int i = 0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
10 // Sanity check
d6f40a06867b Changes includes:
anders
parents:
diff changeset
11 if(!in || !out)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
12 return AF_ERROR;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
13
d6f40a06867b Changes includes:
anders
parents:
diff changeset
14 for(i=0;i<n;i++){
d6f40a06867b Changes includes:
anders
parents:
diff changeset
15 if(in[i]<=-200)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
16 out[i]=0.0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
17 else
d6f40a06867b Changes includes:
anders
parents:
diff changeset
18 out[i]=pow(10.0,clamp(in[i],mi,ma)/k);
d6f40a06867b Changes includes:
anders
parents:
diff changeset
19 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
20 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
21 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
22
d6f40a06867b Changes includes:
anders
parents:
diff changeset
23 /* Convert from gain value to dB. Returns AF_OK if of and AF_ERROR if
d6f40a06867b Changes includes:
anders
parents:
diff changeset
24 fail */
24890
a54a25221b79 Remove some pointless 'inline' qualifiers
uau
parents: 14621
diff changeset
25 int af_to_dB(int n, float* in, float* out, float k)
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
26 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
27 int i = 0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
28 // Sanity check
d6f40a06867b Changes includes:
anders
parents:
diff changeset
29 if(!in || !out)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
30 return AF_ERROR;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
31
8674
93212da0032e 10l memory leak + bug fixes in ms to sample time conversion
anders
parents: 8623
diff changeset
32 for(i=0;i<n;i++){
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
33 if(in[i] == 0.0)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
34 out[i]=-200.0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
35 else
d6f40a06867b Changes includes:
anders
parents:
diff changeset
36 out[i]=k*log10(in[i]);
d6f40a06867b Changes includes:
anders
parents:
diff changeset
37 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
38 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
39 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
40
8674
93212da0032e 10l memory leak + bug fixes in ms to sample time conversion
anders
parents: 8623
diff changeset
41 /* Convert from ms to sample time */
24890
a54a25221b79 Remove some pointless 'inline' qualifiers
uau
parents: 14621
diff changeset
42 int af_from_ms(int n, float* in, int* out, int rate, float mi, float ma)
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
43 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
44 int i = 0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
45 // Sanity check
d6f40a06867b Changes includes:
anders
parents:
diff changeset
46 if(!in || !out)
d6f40a06867b Changes includes:
anders
parents:
diff changeset
47 return AF_ERROR;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
48
8674
93212da0032e 10l memory leak + bug fixes in ms to sample time conversion
anders
parents: 8623
diff changeset
49 for(i=0;i<n;i++)
93212da0032e 10l memory leak + bug fixes in ms to sample time conversion
anders
parents: 8623
diff changeset
50 out[i]=(int)((float)rate * clamp(in[i],mi,ma)/1000.0);
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
51
d6f40a06867b Changes includes:
anders
parents:
diff changeset
52 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
53 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
54
d6f40a06867b Changes includes:
anders
parents:
diff changeset
55 /* Convert from sample time to ms */
24890
a54a25221b79 Remove some pointless 'inline' qualifiers
uau
parents: 14621
diff changeset
56 int af_to_ms(int n, int* in, float* out, int rate)
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
57 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
58 int i = 0;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
59 // Sanity check
8674
93212da0032e 10l memory leak + bug fixes in ms to sample time conversion
anders
parents: 8623
diff changeset
60 if(!in || !out || !rate)
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
61 return AF_ERROR;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
62
8674
93212da0032e 10l memory leak + bug fixes in ms to sample time conversion
anders
parents: 8623
diff changeset
63 for(i=0;i<n;i++)
93212da0032e 10l memory leak + bug fixes in ms to sample time conversion
anders
parents: 8623
diff changeset
64 out[i]=1000.0 * (float)in[i]/((float)rate);
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
65
d6f40a06867b Changes includes:
anders
parents:
diff changeset
66 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
67 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
68
d6f40a06867b Changes includes:
anders
parents:
diff changeset
69 /* Helper function for testing the output format */
24890
a54a25221b79 Remove some pointless 'inline' qualifiers
uau
parents: 14621
diff changeset
70 int af_test_output(struct af_instance_s* af, af_data_t* out)
8607
d6f40a06867b Changes includes:
anders
parents:
diff changeset
71 {
d6f40a06867b Changes includes:
anders
parents:
diff changeset
72 if((af->data->format != out->format) ||
d6f40a06867b Changes includes:
anders
parents:
diff changeset
73 (af->data->bps != out->bps) ||
d6f40a06867b Changes includes:
anders
parents:
diff changeset
74 (af->data->rate != out->rate) ||
d6f40a06867b Changes includes:
anders
parents:
diff changeset
75 (af->data->nch != out->nch)){
d6f40a06867b Changes includes:
anders
parents:
diff changeset
76 memcpy(out,af->data,sizeof(af_data_t));
d6f40a06867b Changes includes:
anders
parents:
diff changeset
77 return AF_FALSE;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
78 }
d6f40a06867b Changes includes:
anders
parents:
diff changeset
79 return AF_OK;
d6f40a06867b Changes includes:
anders
parents:
diff changeset
80 }
14621
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
81
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
82 /* Soft clipping, the sound of a dream, thanks to Jon Wattes
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
83 post to Musicdsp.org */
24890
a54a25221b79 Remove some pointless 'inline' qualifiers
uau
parents: 14621
diff changeset
84 float af_softclip(float a)
14621
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
85 {
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
86 if (a >= M_PI/2)
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
87 return 1.0;
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
88 else if (a <= -M_PI/2)
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
89 return -1.0;
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
90 else
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
91 return sin(a);
0293cab15c03 af_softclip
alex
parents: 8674
diff changeset
92 }