source: roaraudio/roard/mixer.c @ 139:4a577b978f6c

Last change on this file since 139:4a577b978f6c was 139:4a577b978f6c, checked in by phi, 16 years ago

what ever diffrents this makes, but valgrind is now happy

File size: 3.3 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 for (i = 0; i < samples; i++) {
133  s  = in[i];
134  s *= set->mixer[i % channels];
135  s /= set->scale;
136  out[i] = s;
137 }
138
139 return 0;
140}
141
142int change_vol_16bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
143 int16_t * in = input, * out = output;
144 int       i;
145 int       s;
146
147 if ( !(in && out) )
148  return -1;
149
150 for (i = 0; i < samples; i++) {
151  s  = in[i];
152  s *= set->mixer[i % channels];
153  s /= set->scale;
154  out[i] = s;
155 }
156
157 return 0;
158}
159
160int change_vol_24bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
161 return -1;
162}
163
164int change_vol_32bit (void * output, void * input, int samples, int channels, struct roar_mixer_settings * set) {
165 return -1;
166}
167
168
169//ll
Note: See TracBrowser for help on using the repository browser.