Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1905 serge 1
/*
2
	synth_ntom.h: ntom-resampling synth functions
3
 
4
	This header is used multiple times to create different variants of this function.
5
	Hint: MONO_NAME, MONO2STEREO_NAME, SYNTH_NAME and SAMPLE_T as well as WRITE_SAMPLE do vary.
6
 
7
	copyright 1995-2008 by the mpg123 project - free software under the terms of the LGPL 2.1
8
	see COPYING and AUTHORS files in distribution or http://mpg123.org
9
	initially written by Michael Hipp, generalized by Thomas Orgis
10
 
11
	Well, this is very simple resampling... you may or may not like what you hear.
12
	But it's cheap.
13
	But still, we don't implement a non-autoincrement version of this one.
14
*/
15
 
16
/* Note: These mono functions would also work generically,
17
   it's just that they need a runtime calculation for the conversion loop...
18
   The fixed XtoY functions have the chance for loop unrolling... */
19
 
20
int MONO_NAME(real *bandPtr, mpg123_handle *fr)
21
{
22
	SAMPLE_T samples_tmp[8*64];
23
	SAMPLE_T *tmp1 = samples_tmp;
24
	size_t i;
25
	int ret;
26
 
27
	size_t pnt = fr->buffer.fill;
28
	unsigned char *samples = fr->buffer.data;
29
	fr->buffer.data = (unsigned char*) samples_tmp;
30
	fr->buffer.fill = 0;
31
	ret = SYNTH_NAME(bandPtr, 0, fr, 1);
32
	fr->buffer.data = samples;
33
 
34
	samples += pnt;
35
	for(i=0;i<(fr->buffer.fill/(2*sizeof(SAMPLE_T)));i++)
36
	{
37
		*( (SAMPLE_T *)samples) = *tmp1;
38
		samples += sizeof(SAMPLE_T);
39
		tmp1 += 2;
40
	}
41
	fr->buffer.fill = pnt + (fr->buffer.fill/2);
42
 
43
	return ret;
44
}
45
 
46
 
47
int MONO2STEREO_NAME(real *bandPtr, mpg123_handle *fr)
48
{
49
	size_t i;
50
	int ret;
51
	size_t pnt1 = fr->buffer.fill;
52
	unsigned char *samples = fr->buffer.data + pnt1;
53
 
54
	ret = SYNTH_NAME(bandPtr, 0, fr, 1);
55
 
56
	for(i=0;i<((fr->buffer.fill-pnt1)/(2*sizeof(SAMPLE_T)));i++)
57
	{
58
		((SAMPLE_T *)samples)[1] = ((SAMPLE_T *)samples)[0];
59
		samples+=2*sizeof(SAMPLE_T);
60
	}
61
 
62
	return ret;
63
}
64
 
65
 
66
int SYNTH_NAME(real *bandPtr,int channel, mpg123_handle *fr, int final)
67
{
68
	static const int step = 2;
69
	SAMPLE_T *samples = (SAMPLE_T *) (fr->buffer.data + fr->buffer.fill);
70
 
71
	real *b0, **buf; /* (*buf)[0x110]; */
72
	int clip = 0;
73
	int bo1;
74
	int ntom;
75
 
76
	if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
77
 
78
	if(!channel)
79
	{
80
		fr->bo--;
81
		fr->bo &= 0xf;
82
		buf = fr->real_buffs[0];
83
		ntom = fr->ntom_val[1] = fr->ntom_val[0];
84
	}
85
	else
86
	{
87
		samples++;
88
		buf = fr->real_buffs[1];
89
		ntom = fr->ntom_val[1];
90
	}
91
 
92
	if(fr->bo & 0x1)
93
	{
94
		b0 = buf[0];
95
		bo1 = fr->bo;
96
		dct64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
97
	}
98
	else
99
	{
100
		b0 = buf[1];
101
		bo1 = fr->bo+1;
102
		dct64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
103
	}
104
 
105
	{
106
		register int j;
107
		real *window = fr->decwin + 16 - bo1;
108
 
109
		for (j=16;j;j--,window+=0x10)
110
		{
111
			real sum;
112
 
113
			ntom += fr->ntom_step;
114
			if(ntom < NTOM_MUL)
115
			{
116
				window += 16;
117
				b0 += 16;
118
				continue;
119
			}
120
 
121
			sum  = REAL_MUL_SYNTH(*window++, *b0++);
122
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
123
			sum += REAL_MUL_SYNTH(*window++, *b0++);
124
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
125
			sum += REAL_MUL_SYNTH(*window++, *b0++);
126
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
127
			sum += REAL_MUL_SYNTH(*window++, *b0++);
128
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
129
			sum += REAL_MUL_SYNTH(*window++, *b0++);
130
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
131
			sum += REAL_MUL_SYNTH(*window++, *b0++);
132
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
133
			sum += REAL_MUL_SYNTH(*window++, *b0++);
134
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
135
			sum += REAL_MUL_SYNTH(*window++, *b0++);
136
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
137
 
138
			while(ntom >= NTOM_MUL)
139
			{
140
				WRITE_SAMPLE(samples,sum,clip);
141
				samples += step;
142
				ntom -= NTOM_MUL;
143
			}
144
		}
145
 
146
		ntom += fr->ntom_step;
147
		if(ntom >= NTOM_MUL)
148
		{
149
			real sum;
150
			sum  = REAL_MUL_SYNTH(window[0x0], b0[0x0]);
151
			sum += REAL_MUL_SYNTH(window[0x2], b0[0x2]);
152
			sum += REAL_MUL_SYNTH(window[0x4], b0[0x4]);
153
			sum += REAL_MUL_SYNTH(window[0x6], b0[0x6]);
154
			sum += REAL_MUL_SYNTH(window[0x8], b0[0x8]);
155
			sum += REAL_MUL_SYNTH(window[0xA], b0[0xA]);
156
			sum += REAL_MUL_SYNTH(window[0xC], b0[0xC]);
157
			sum += REAL_MUL_SYNTH(window[0xE], b0[0xE]);
158
 
159
			while(ntom >= NTOM_MUL)
160
			{
161
				WRITE_SAMPLE(samples,sum,clip);
162
				samples += step;
163
				ntom -= NTOM_MUL;
164
			}
165
		}
166
 
167
		b0-=0x10,window-=0x20;
168
		window += bo1<<1;
169
 
170
		for (j=15;j;j--,b0-=0x20,window-=0x10)
171
		{
172
			real sum;
173
 
174
			ntom += fr->ntom_step;
175
			if(ntom < NTOM_MUL)
176
			{
177
				window -= 16;
178
				b0 += 16;
179
				continue;
180
			}
181
 
182
			sum = REAL_MUL_SYNTH(-*(--window), *b0++);
183
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
184
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
185
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
186
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
187
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
188
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
189
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
190
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
191
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
192
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
193
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
194
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
195
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
196
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
197
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
198
 
199
			while(ntom >= NTOM_MUL)
200
			{
201
				WRITE_SAMPLE(samples,sum,clip);
202
				samples += step;
203
				ntom -= NTOM_MUL;
204
			}
205
		}
206
	}
207
 
208
	fr->ntom_val[channel] = ntom;
209
	if(final) fr->buffer.fill = ((unsigned char *) samples - fr->buffer.data - (channel ? sizeof(SAMPLE_T) : 0));
210
 
211
	return clip;
212
}
213