source: roaraudio/roard/mixer.c @ 254:056fc8ba8bec

Last change on this file since 254:056fc8ba8bec was 254:056fc8ba8bec, checked in by phi, 16 years ago

added ReplayGain? support to codecfilter_vorbis

File size: 3.7 KB
Line 
1//mixer.c:
2
3#include "roard.h"
4
5int mix_clients (void * output, int bits, void ** input, int samples) {
6 if ( bits == 8 ) {
7  return mix_clients_8bit(output, input, samples);
8 } else if ( bits == 16 ) {
9  return mix_clients_16bit(output, input, samples);
10 } else if ( bits == 24 ) {
11  return mix_clients_24bit(output, input, samples);
12 } else if ( bits == 32 ) {
13  return mix_clients_32bit(output, input, samples);
14 } else {
15  return -1;
16 }
17}
18
19int mix_clients_8bit (void * output, void ** input, int samples) {
20 int i, s;
21 int c;
22
23 for (s = 0; s < samples; s++) {
24  c = 0;
25
26  for (i = 0; input[i] != NULL; i++)
27   c += ((char**)input)[i][s];
28
29  if ( c > 127 )
30   c = 127;
31  else if ( c < -128 )
32   c = -128;
33  ((char*)output)[s] = (char)c;
34 }
35
36 return 0;
37}
38
39int mix_clients_16bit (void * output, void ** input, int samples) {
40 int i, s;
41 int c;
42 int16_t ** in  = (int16_t**) input;
43 int16_t *  out = output;
44
45#ifdef DEBUG
46 for (i = 0; input[i] != NULL; i++)
47  ROAR_DBG("mix_clients_16bit(*): input[%i] = %p", i, input[i]);
48#endif
49
50/*
51 if ( input[0] != NULL )
52  write(1, input[0], samples*2);
53*/
54
55/*
56 if ( input[0] != NULL ) {
57  memcpy(output, input[0], samples*2);
58  return -1;
59 }
60*/
61
62 for (s = 0; s < samples; s++) {
63  c = 0;
64  for (i = 0; input[i] != NULL; i++) {
65//   printf("D: input[i=%i] = %p\n", i, input[i]);
66   c += in[i][s];
67  }
68
69  if ( c > 32767 )
70   c = 32767;
71  else if ( c < -32768 )
72   c = -32768;
73
74  out[s] = c;
75 }
76
77 return 0;
78}
79
80int mix_clients_24bit (void * output, void ** input, int samples) {
81 return -1;
82}
83
84int mix_clients_32bit (void * output, void ** input, int samples) {
85/*
86 int i, s;
87 int c;
88
89 for (s = 0; s < samples; s++) {
90  c = 0;
91
92  for (i = 0; input[i]; i++)
93   c += ((int**)input)[i][s];
94
95  if ( c > 127 )
96   c = 127;
97  else if ( c < -128 )
98   c = -128;
99  ((int*)output)[s] = (char)c;
100 }
101
102 return 0;
103*/
104 return 1;
105}
106
107int change_vol (void * output, int bits, void * input, int samples, int channels, struct roar_mixer_settings * set) {
108
109 ROAR_DBG("change_vol(*): mixer at %p", set->mixer);
110
111 if ( bits == 8 ) {
112  return  change_vol_8bit(output, input, samples, channels, set);
113 } else if ( bits == 16 ) {
114  return  change_vol_16bit(output, input, samples, channels, set);
115 } else if ( bits == 24 ) {
116  return  change_vol_24bit(output, input, samples, channels, set);
117 } else if ( bits == 32 ) {
118  return  change_vol_32bit(output, input, samples, channels, set);
119 } else {
120  return -1;
121 }
122}
123
124int change_vol_8bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
125 char * in = input, * out = output;
126 int    i;
127 int    s;
128
129 if ( !(in && out) )
130  return -1;
131
132 if (set->rpg_mul == set->rpg_div) {
133  for (i = 0; i < samples; i++) {
134   s  = in[i];
135   s *= set->mixer[i % channels];
136   s /= set->scale;
137   out[i] = s;
138  }
139 } else {
140  for (i = 0; i < samples; i++) {
141   s  = in[i];
142   s *= (set->mixer[i % channels] * set->rpg_mul) / set->rpg_div;
143   s /= set->scale;
144   out[i] = s;
145  }
146 }
147
148 return 0;
149}
150
151int change_vol_16bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
152 int16_t * in = input, * out = output;
153 int       i;
154 int       s;
155
156 if ( !(in && out) )
157  return -1;
158
159 if (set->rpg_mul == set->rpg_div) {
160  for (i = 0; i < samples; i++) {
161   s  = in[i];
162   s *= set->mixer[i % channels];
163   s /= set->scale;
164   out[i] = s;
165  }
166 } else {
167  for (i = 0; i < samples; i++) {
168   s  = in[i];
169   s *= (set->mixer[i % channels] * set->rpg_mul) / set->rpg_div;
170   s /= set->scale;
171   out[i] = s;
172  }
173 }
174
175 return 0;
176}
177
178int change_vol_24bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
179 return -1;
180}
181
182int change_vol_32bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
183 return -1;
184}
185
186
187//ll
Note: See TracBrowser for help on using the repository browser.