35 |
DEBUG(("rdpsnd_dsp_softvol_set: left: %u, right: %u\n", left, right)); |
DEBUG(("rdpsnd_dsp_softvol_set: left: %u, right: %u\n", left, right)); |
36 |
} |
} |
37 |
|
|
38 |
inline void |
void |
39 |
rdpsnd_dsp_softvol(unsigned char *inbuffer, unsigned char *outbuffer, unsigned int size, |
rdpsnd_dsp_softvol(unsigned char *buffer, unsigned int size, WAVEFORMATEX * format) |
|
WAVEFORMATEX * format) |
|
40 |
{ |
{ |
41 |
unsigned int factor_left, factor_right; |
unsigned int factor_left, factor_right; |
42 |
unsigned char *posin = inbuffer; |
unsigned char *posin = buffer; |
43 |
unsigned char *posout = outbuffer; |
unsigned char *posout = buffer; |
44 |
|
|
45 |
|
if ((softvol_left == MAX_VOLUME) && (softvol_right == MAX_VOLUME)) |
46 |
|
return; |
47 |
|
|
48 |
factor_left = (softvol_left * 256) / 65535; |
factor_left = (softvol_left * 256) / 65535; |
49 |
factor_right = (softvol_right * 256) / 65535; |
factor_right = (softvol_right * 256) / 65535; |
55 |
|
|
56 |
if (format->wBitsPerSample == 8) |
if (format->wBitsPerSample == 8) |
57 |
{ |
{ |
58 |
char val; |
sint8 val; |
59 |
|
|
60 |
while (posout < outbuffer + size) |
while (posout < buffer + size) |
61 |
{ |
{ |
62 |
/* Left */ |
/* Left */ |
63 |
val = *posin++; |
val = *posin++; |
72 |
} |
} |
73 |
else |
else |
74 |
{ |
{ |
75 |
short val; |
sint16 val; |
76 |
|
|
77 |
while (posout < outbuffer + size) |
while (posout < buffer + size) |
78 |
{ |
{ |
79 |
/* Left */ |
/* Left */ |
80 |
val = *posin++; |
val = *posin++; |
92 |
} |
} |
93 |
} |
} |
94 |
|
|
95 |
DEBUG(("using softvol with shifts left: %d, right: %d (%d/%d)\n", factor_left, factor_right, |
DEBUG(("using softvol with factors left: %d, right: %d (%d/%d)\n", factor_left, |
96 |
format->wBitsPerSample, format->nChannels)); |
factor_right, format->wBitsPerSample, format->nChannels)); |
97 |
} |
} |
98 |
|
|
99 |
unsigned char * |
void |
100 |
rdpsnd_dsp_process(unsigned char *inbuffer, unsigned int size, struct audio_driver *current_driver, |
rdpsnd_dsp_swapbytes(unsigned char *buffer, unsigned int size, WAVEFORMATEX * format) |
|
WAVEFORMATEX * format) |
|
101 |
{ |
{ |
102 |
unsigned char *outbuffer; |
int i; |
103 |
|
uint8 swap; |
104 |
|
|
105 |
outbuffer = xmalloc(size); |
if (format->wBitsPerSample == 8) |
106 |
|
return; |
107 |
|
|
108 |
/* Software volume control */ |
for (i = 0; i < size; i += 2) |
|
if (current_driver->wave_out_volume == rdpsnd_dsp_softvol_set) |
|
|
{ |
|
|
rdpsnd_dsp_softvol(inbuffer, outbuffer, size, format); |
|
|
} |
|
|
else |
|
109 |
{ |
{ |
110 |
memcpy(outbuffer, inbuffer, size); |
swap = *(buffer + i); |
111 |
|
*(buffer + i) = *(buffer + i + 1); |
112 |
|
*(buffer + i + 1) = swap; |
113 |
} |
} |
114 |
|
} |
115 |
|
|
116 |
|
|
117 |
|
STREAM |
118 |
|
rdpsnd_dsp_process(STREAM s, struct audio_driver *current_driver, WAVEFORMATEX * format) |
119 |
|
{ |
120 |
|
static struct stream out; |
121 |
|
|
122 |
|
/* softvol and byteswap do not change the amount of data they |
123 |
|
return, so they can operate on the input-stream */ |
124 |
|
if (current_driver->wave_out_volume == rdpsnd_dsp_softvol_set) |
125 |
|
rdpsnd_dsp_softvol(s->data, s->size, format); |
126 |
|
|
127 |
|
#ifdef B_ENDIAN |
128 |
|
if (current_driver->need_byteswap_on_be) |
129 |
|
rdpsnd_dsp_swapbytes(s->data, s->size, format); |
130 |
|
#endif |
131 |
|
|
132 |
|
/* FIXME: where do we lose the 4 bytes referenced here? */ |
133 |
|
out.data = xmalloc(s->size - 4); |
134 |
|
|
135 |
|
memcpy(out.data, s->data + 4, s->size - 4); |
136 |
|
|
137 |
|
out.size = s->size - 4; |
138 |
|
out.p = out.data; |
139 |
|
out.end = out.p + out.size; |
140 |
|
|
141 |
return outbuffer; |
return &out; |
142 |
} |
} |