source: roaraudio/roard/mixer.c @ 855:f2ea73faae80

Last change on this file since 855:f2ea73faae80 was 855:f2ea73faae80, checked in by phi, 16 years ago

added support for changeing volume on 32 bit int

File size: 5.2 KB
Line 
1//mixer.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008
5 *
6 *  This file is part of roard a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  RoarAudio is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 */
24
25#include "roard.h"
26
27int mix_clients (void * output, int bits, void ** input, int samples) {
28 if ( bits == 8 ) {
29  return mix_clients_8bit(output, input, samples);
30 } else if ( bits == 16 ) {
31  return mix_clients_16bit(output, input, samples);
32 } else if ( bits == 24 ) {
33  return mix_clients_24bit(output, input, samples);
34 } else if ( bits == 32 ) {
35  return mix_clients_32bit(output, input, samples);
36 } else {
37  return -1;
38 }
39}
40
41int mix_clients_8bit (void * output, void ** input, int samples) {
42 int i, s;
43 register int c;
44
45 for (s = 0; s < samples; s++) {
46  c = 0;
47
48  for (i = 0; input[i] != NULL; i++)
49   c += ((char**)input)[i][s];
50
51  if ( c > 127 )
52   c = 127;
53  else if ( c < -128 )
54   c = -128;
55  ((char*)output)[s] = (char)c;
56 }
57
58 return 0;
59}
60
61int mix_clients_16bit (void * output, void ** input, int samples) {
62 int i, s;
63 register int c;
64 int16_t ** in  = (int16_t**) input;
65 int16_t *  out = output;
66
67#ifdef DEBUG
68 for (i = 0; input[i] != NULL; i++)
69  ROAR_DBG("mix_clients_16bit(*): input[%i] = %p", i, input[i]);
70#endif
71
72/*
73 if ( input[0] != NULL )
74  write(1, input[0], samples*2);
75*/
76
77/*
78 if ( input[0] != NULL ) {
79  memcpy(output, input[0], samples*2);
80  return -1;
81 }
82*/
83
84 for (s = 0; s < samples; s++) {
85  c = 0;
86  for (i = 0; input[i] != NULL; i++) {
87//   printf("D: input[i=%i] = %p\n", i, input[i]);
88   c += in[i][s];
89  }
90
91  if ( c > 32767 )
92   c = 32767;
93  else if ( c < -32768 )
94   c = -32768;
95
96  out[s] = c;
97 }
98
99 return 0;
100}
101
102int mix_clients_24bit (void * output, void ** input, int samples) {
103 return -1;
104}
105
106int mix_clients_32bit (void * output, void ** input, int samples) {
107#ifdef ROAR_NATIVE_INT64
108 int i, s;
109 ROAR_NATIVE_INT64 c;
110
111 for (s = 0; s < samples; s++) {
112  c = 0;
113
114  for (i = 0; input[i]; i++)
115   c += ((ROAR_NATIVE_INT64**)input)[i][s];
116
117  if ( c > 21474836487LL )
118   c = 2147483647LL;
119  else if ( c < -2147483648LL )
120   c = -2147483648LL;
121  ((int*)output)[s] = (char)c;
122 }
123
124 return  0;
125#else
126 return -1;
127#endif
128}
129
130int change_vol (void * output, int bits, void * input, int samples, int channels, struct roar_mixer_settings * set) {
131
132 ROAR_DBG("change_vol(*): mixer at %p", set->mixer);
133
134 if ( bits == 8 ) {
135  return  change_vol_8bit(output, input, samples, channels, set);
136 } else if ( bits == 16 ) {
137  return  change_vol_16bit(output, input, samples, channels, set);
138 } else if ( bits == 24 ) {
139  return  change_vol_24bit(output, input, samples, channels, set);
140 } else if ( bits == 32 ) {
141  return  change_vol_32bit(output, input, samples, channels, set);
142 } else {
143  return -1;
144 }
145}
146
147int change_vol_8bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
148 char * in = input, * out = output;
149 int    i;
150 register int s;
151
152 if ( !(in && out) )
153  return -1;
154
155 if (set->rpg_mul == set->rpg_div) {
156  for (i = 0; i < samples; i++) {
157   s  = in[i];
158   s *= set->mixer[i % channels];
159   s /= set->scale;
160   out[i] = s;
161  }
162 } else {
163  for (i = 0; i < samples; i++) {
164   s  = in[i];
165   s *= (set->mixer[i % channels] * set->rpg_mul) / set->rpg_div;
166   s /= set->scale;
167   out[i] = s;
168  }
169 }
170
171 return 0;
172}
173
174int change_vol_16bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
175 int16_t * in = input, * out = output;
176 int       i;
177 register int s;
178
179 if ( !(in && out) )
180  return -1;
181
182 if (set->rpg_mul == set->rpg_div) {
183  for (i = 0; i < samples; i++) {
184   s  = in[i];
185   s *= set->mixer[i % channels];
186   s /= set->scale;
187   out[i] = s;
188  }
189 } else {
190  for (i = 0; i < samples; i++) {
191   s  = in[i];
192   s *= (set->mixer[i % channels] * set->rpg_mul) / set->rpg_div;
193   s /= set->scale;
194   out[i] = s;
195  }
196 }
197
198 return 0;
199}
200
201int change_vol_24bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
202 return -1;
203}
204
205int change_vol_32bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
206#ifdef ROAR_NATIVE_INT64
207 int32_t * in = input, * out = output;
208 int       i;
209 ROAR_NATIVE_INT64 s;
210
211 if ( !(in && out) )
212  return -1;
213
214 if (set->rpg_mul == set->rpg_div) {
215  for (i = 0; i < samples; i++) {
216   s  = in[i];
217   s *= set->mixer[i % channels];
218   s /= set->scale;
219   out[i] = s;
220  }
221 } else {
222  for (i = 0; i < samples; i++) {
223   s  = in[i];
224   s *= (set->mixer[i % channels] * set->rpg_mul) / set->rpg_div;
225   s /= set->scale;
226   out[i] = s;
227  }
228 }
229
230 return 0;
231#else
232 return -1;
233#endif
234}
235
236
237//ll
Note: See TracBrowser for help on using the repository browser.