Mercurial > mplayer.hg
annotate mp3lib/sr1.c @ 7429:7a221aaf7012
Enable the LIVE lib only if the network layer (STREAMING) is enable.
Fixed the bug where if streaming disable and live enable, the live config
test will reenable the network layer.
author | bertrand |
---|---|
date | Tue, 17 Sep 2002 19:47:55 +0000 |
parents | 82a03c17f314 |
children | 855ca896de24 |
rev | line source |
---|---|
1 | 1 // #define NEWBUFFERING |
2 //#define DEBUG_RESYNC | |
3 | |
4 /* 1 frame = 4608 byte PCM */ | |
5 | |
6 #ifdef __GNUC__ | |
7 #define LOCAL static inline | |
8 #else | |
9 #define LOCAL static _inline | |
10 #endif | |
11 | |
12 //#undef LOCAL | |
13 //#define LOCAL | |
14 | |
15 #include <stdlib.h> | |
16 #include <stdio.h> | |
17 #include <string.h> | |
18 #include <signal.h> | |
19 #include <math.h> | |
20 | |
21 #define real float | |
22 // #define int long | |
23 | |
24 #include "mpg123.h" | |
25 #include "huffman.h" | |
26 #include "mp3.h" | |
1040 | 27 #include "bswap.h" |
4262 | 28 #include "../cpudetect.h" |
29 #include "../liba52/mm_accel.h" | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
30 #include "../mp_msg.h" |
1 | 31 |
1045 | 32 #include "fastmemcpy.h" |
4262 | 33 |
34 #ifdef ARCH_X86 | |
35 #define CAN_COMPILE_X86_ASM | |
36 #endif | |
37 | |
1 | 38 //static FILE* mp3_file=NULL; |
39 | |
40 int MP3_frames=0; | |
41 int MP3_eof=0; | |
42 int MP3_pause=0; | |
43 int MP3_filesize=0; | |
44 int MP3_fpos=0; // current file position | |
45 int MP3_framesize=0; // current framesize | |
46 int MP3_bitrate=0; // current bitrate | |
47 int MP3_samplerate=0; // current samplerate | |
48 int MP3_resync=0; | |
49 int MP3_channels=0; | |
50 int MP3_bps=2; | |
51 | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
52 static long outscale = 32768; |
1 | 53 #include "tabinit.c" |
54 | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
55 #if 1 |
1 | 56 extern int mplayer_audio_read(char *buf,int size); |
57 | |
58 LOCAL int mp3_read(char *buf,int size){ | |
59 // int len=fread(buf,1,size,mp3_file); | |
60 int len=mplayer_audio_read(buf,size); | |
61 if(len>0) MP3_fpos+=len; | |
62 // if(len!=size) MP3_eof=1; | |
63 return len; | |
64 } | |
65 #else | |
66 extern int mp3_read(char *buf,int size); | |
67 #endif | |
68 | |
69 //void mp3_seek(int pos){ | |
70 // fseek(mp3_file,pos,SEEK_SET); | |
71 // return (MP3_fpos=ftell(mp3_file)); | |
72 //} | |
73 | |
74 /* Frame reader */ | |
75 | |
76 #define MAXFRAMESIZE 1280 | |
77 #define MAXFRAMESIZE2 (512+MAXFRAMESIZE) | |
78 | |
79 static int fsizeold=0,ssize=0; | |
80 static unsigned char bsspace[2][MAXFRAMESIZE2]; /* !!!!! */ | |
81 static unsigned char *bsbufold=bsspace[0]+512; | |
82 static unsigned char *bsbuf=bsspace[1]+512; | |
83 static int bsnum=0; | |
84 | |
85 static int bitindex; | |
86 static unsigned char *wordpointer; | |
87 static int bitsleft; | |
88 | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
89 unsigned char *pcm_sample; /* outbuffer address */ |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
90 int pcm_point = 0; /* outbuffer offset */ |
1 | 91 |
92 static struct frame fr; | |
93 | |
94 static int tabsel_123[2][3][16] = { | |
95 { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, | |
96 {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, | |
97 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, | |
98 | |
99 { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, | |
100 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, | |
101 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } | |
102 }; | |
103 | |
104 static long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 }; | |
105 | |
106 LOCAL unsigned int getbits(short number_of_bits) | |
107 { | |
108 unsigned long rval; | |
109 // if(MP3_frames>=7741) printf("getbits: bits=%d bitsleft=%d wordptr=%x\n",number_of_bits,bitsleft,wordpointer); | |
110 if((bitsleft-=number_of_bits)<0) return 0; | |
111 if(!number_of_bits) return 0; | |
112 rval = wordpointer[0]; | |
113 rval <<= 8; | |
114 rval |= wordpointer[1]; | |
115 rval <<= 8; | |
116 rval |= wordpointer[2]; | |
117 rval <<= bitindex; | |
118 rval &= 0xffffff; | |
119 bitindex += number_of_bits; | |
120 rval >>= (24-number_of_bits); | |
121 wordpointer += (bitindex>>3); | |
122 bitindex &= 7; | |
123 return rval; | |
124 } | |
125 | |
126 | |
127 LOCAL unsigned int getbits_fast(short number_of_bits) | |
128 { | |
129 unsigned long rval; | |
130 // if(MP3_frames>=7741) printf("getbits_fast: bits=%d bitsleft=%d wordptr=%x\n",number_of_bits,bitsleft,wordpointer); | |
131 if((bitsleft-=number_of_bits)<0) return 0; | |
132 if(!number_of_bits) return 0; | |
4321 | 133 #if defined(CAN_COMPILE_X86_ASM) |
1040 | 134 rval = bswap_16(*((unsigned short *)wordpointer)); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
135 #else |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
136 /* |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
137 * we may not be able to address unaligned 16-bit data on non-x86 cpus. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
138 * Fall back to some portable code. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
139 */ |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
140 rval = wordpointer[0] << 8 | wordpointer[1]; |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
141 #endif |
1 | 142 rval <<= bitindex; |
143 rval &= 0xffff; | |
144 bitindex += number_of_bits; | |
145 rval >>= (16-number_of_bits); | |
146 wordpointer += (bitindex>>3); | |
147 bitindex &= 7; | |
148 return rval; | |
149 } | |
150 | |
151 LOCAL unsigned int get1bit(void) | |
152 { | |
153 unsigned char rval; | |
154 // if(MP3_frames>=7741) printf("get1bit: bitsleft=%d wordptr=%x\n",bitsleft,wordpointer); | |
155 if((--bitsleft)<0) return 0; | |
156 rval = *wordpointer << bitindex; | |
157 bitindex++; | |
158 wordpointer += (bitindex>>3); | |
159 bitindex &= 7; | |
160 return ((rval>>7)&1); | |
161 } | |
162 | |
163 LOCAL void set_pointer(long backstep) | |
164 { | |
165 // if(backstep!=512 && backstep>fsizeold) | |
166 // printf("\rWarning! backstep (%d>%d) \n",backstep,fsizeold); | |
167 wordpointer = bsbuf + ssize - backstep; | |
168 if (backstep) memcpy(wordpointer,bsbufold+fsizeold-backstep,backstep); | |
169 bitindex = 0; | |
170 bitsleft+=8*backstep; | |
171 // printf("Backstep %d (bitsleft=%d)\n",backstep,bitsleft); | |
172 } | |
173 | |
174 LOCAL int stream_head_read(unsigned char *hbuf,unsigned long *newhead){ | |
175 if(mp3_read(hbuf,4) != 4) return FALSE; | |
4321 | 176 #if defined(CAN_COMPILE_X86_ASM) |
1040 | 177 *newhead = bswap_32(*((unsigned long *)hbuf)); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
178 #else |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
179 /* |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
180 * we may not be able to address unaligned 32-bit data on non-x86 cpus. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
181 * Fall back to some portable code. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
182 */ |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
183 *newhead = |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
184 hbuf[0] << 24 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
185 hbuf[1] << 16 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
186 hbuf[2] << 8 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
187 hbuf[3]; |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
188 #endif |
1040 | 189 return TRUE; |
1 | 190 } |
191 | |
192 LOCAL int stream_head_shift(unsigned char *hbuf,unsigned long *head){ | |
1040 | 193 *((unsigned long *)hbuf) >>= 8; |
1 | 194 if(mp3_read(hbuf+3,1) != 1) return 0; |
195 *head <<= 8; | |
196 *head |= hbuf[3]; | |
197 return 1; | |
198 } | |
199 | |
200 /* | |
201 * decode a header and write the information | |
202 * into the frame structure | |
203 */ | |
204 LOCAL int decode_header(struct frame *fr,unsigned long newhead){ | |
205 | |
206 // head_check: | |
1040 | 207 if( (newhead & 0xffe00000) != 0xffe00000 || |
1045 | 208 (newhead & 0x0000fc00) == 0x0000fc00) return FALSE; |
1 | 209 |
210 fr->lay = 4-((newhead>>17)&3); | |
211 // if(fr->lay!=3) return FALSE; | |
212 | |
213 if( newhead & ((long)1<<20) ) { | |
214 fr->lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1; | |
215 fr->mpeg25 = 0; | |
216 } else { | |
217 fr->lsf = 1; | |
218 fr->mpeg25 = 1; | |
219 } | |
220 | |
221 if(fr->mpeg25) | |
222 fr->sampling_frequency = 6 + ((newhead>>10)&0x3); | |
223 else | |
224 fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3); | |
225 | |
1166
95f6f14176c6
fr->sampling_frequency limitation (thanx to pl <p_l@tfz.net>)
arpi_esp
parents:
1045
diff
changeset
|
226 if(fr->sampling_frequency>8) return FALSE; // valid: 0..8 |
95f6f14176c6
fr->sampling_frequency limitation (thanx to pl <p_l@tfz.net>)
arpi_esp
parents:
1045
diff
changeset
|
227 |
1 | 228 fr->error_protection = ((newhead>>16)&0x1)^0x1; |
229 fr->bitrate_index = ((newhead>>12)&0xf); | |
230 fr->padding = ((newhead>>9)&0x1); | |
231 fr->extension = ((newhead>>8)&0x1); | |
232 fr->mode = ((newhead>>6)&0x3); | |
233 fr->mode_ext = ((newhead>>4)&0x3); | |
234 fr->copyright = ((newhead>>3)&0x1); | |
235 fr->original = ((newhead>>2)&0x1); | |
236 fr->emphasis = newhead & 0x3; | |
237 | |
238 MP3_channels = fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; | |
239 | |
240 if(!fr->bitrate_index){ | |
241 // fprintf(stderr,"Free format not supported.\n"); | |
242 return FALSE; | |
243 } | |
244 | |
245 switch(fr->lay){ | |
246 case 2: | |
247 MP3_bitrate=tabsel_123[fr->lsf][1][fr->bitrate_index]; | |
248 MP3_samplerate=freqs[fr->sampling_frequency]; | |
249 fr->framesize = (long) MP3_bitrate * 144000; | |
250 fr->framesize /= MP3_samplerate; | |
251 MP3_framesize=fr->framesize; | |
252 fr->framesize += fr->padding - 4; | |
253 break; | |
254 case 3: | |
255 if(fr->lsf) | |
256 ssize = (fr->stereo == 1) ? 9 : 17; | |
257 else | |
258 ssize = (fr->stereo == 1) ? 17 : 32; | |
259 if(fr->error_protection) ssize += 2; | |
260 | |
261 MP3_bitrate=tabsel_123[fr->lsf][2][fr->bitrate_index]; | |
262 MP3_samplerate=freqs[fr->sampling_frequency]; | |
263 fr->framesize = (long) MP3_bitrate * 144000; | |
264 fr->framesize /= MP3_samplerate<<(fr->lsf); | |
265 MP3_framesize=fr->framesize; | |
266 fr->framesize += fr->padding - 4; | |
267 break; | |
268 default: | |
269 // fprintf(stderr,"Sorry, unsupported layer type.\n"); | |
270 return 0; | |
271 } | |
272 if(fr->framesize<=0 || fr->framesize>MAXFRAMESIZE) return FALSE; | |
273 | |
274 return 1; | |
275 } | |
276 | |
277 | |
278 LOCAL int stream_read_frame_body(int size){ | |
279 | |
280 /* flip/init buffer for Layer 3 */ | |
281 bsbufold = bsbuf; | |
282 bsbuf = bsspace[bsnum]+512; | |
283 bsnum = (bsnum + 1) & 1; | |
284 | |
285 if( mp3_read(bsbuf,size) != size) return 0; // broken frame | |
286 | |
287 bitindex = 0; | |
288 wordpointer = (unsigned char *) bsbuf; | |
289 bitsleft=8*size; | |
290 | |
291 return 1; | |
292 } | |
293 | |
294 | |
295 /***************************************************************** | |
296 * read next frame return number of frames read. | |
297 */ | |
298 LOCAL int read_frame(struct frame *fr){ | |
299 unsigned long newhead; | |
300 unsigned char hbuf[8]; | |
301 int skipped,resyncpos; | |
302 int frames=0; | |
303 | |
304 resync: | |
305 skipped=MP3_fpos; | |
306 resyncpos=MP3_fpos; | |
307 | |
308 set_pointer(512); | |
309 fsizeold=fr->framesize; /* for Layer3 */ | |
310 if(!stream_head_read(hbuf,&newhead)) return 0; | |
311 if(!decode_header(fr,newhead)){ | |
312 // invalid header! try to resync stream! | |
313 #ifdef DEBUG_RESYNC | |
314 printf("ReSync: searching for a valid header... (pos=%X)\n",MP3_fpos); | |
315 #endif | |
316 retry1: | |
317 while(!decode_header(fr,newhead)){ | |
318 if(!stream_head_shift(hbuf,&newhead)) return 0; | |
319 } | |
320 resyncpos=MP3_fpos-4; | |
321 // found valid header | |
322 #ifdef DEBUG_RESYNC | |
323 printf("ReSync: found valid hdr at %X fsize=%ld ",resyncpos,fr->framesize); | |
324 #endif | |
325 if(!stream_read_frame_body(fr->framesize)) return 0; // read body | |
326 set_pointer(512); | |
327 fsizeold=fr->framesize; /* for Layer3 */ | |
328 if(!stream_head_read(hbuf,&newhead)) return 0; | |
329 if(!decode_header(fr,newhead)){ | |
330 // invalid hdr! go back... | |
331 #ifdef DEBUG_RESYNC | |
332 printf("INVALID\n"); | |
333 #endif | |
334 // mp3_seek(resyncpos+1); | |
335 if(!stream_head_read(hbuf,&newhead)) return 0; | |
336 goto retry1; | |
337 } | |
338 #ifdef DEBUG_RESYNC | |
339 printf("OK!\n"); | |
340 ++frames; | |
341 #endif | |
342 } | |
343 | |
344 skipped=resyncpos-skipped; | |
345 // if(skipped && !MP3_resync) printf("\r%d bad bytes skipped (resync at 0x%X) \n",skipped,resyncpos); | |
346 | |
347 // printf("%8X [%08X] %d %d (%d)%s%s\n",MP3_fpos-4,newhead,fr->framesize,fr->mode,fr->mode_ext,fr->error_protection?" CRC":"",fr->padding?" PAD":""); | |
348 | |
349 /* read main data into memory */ | |
350 if(!stream_read_frame_body(fr->framesize)){ | |
351 printf("\nBroken frame at 0x%X \n",resyncpos); | |
352 return 0; | |
353 } | |
354 ++frames; | |
355 | |
356 if(MP3_resync){ | |
357 MP3_resync=0; | |
358 if(frames==1) goto resync; | |
359 } | |
360 | |
361 return frames; | |
362 } | |
363 | |
4262 | 364 int _has_mmx = 0; |
365 | |
1 | 366 #include "layer2.c" |
367 #include "layer3.c" | |
368 | |
369 /******************************************************************************/ | |
370 /* PUBLIC FUNCTIONS */ | |
371 /******************************************************************************/ | |
372 | |
373 static int tables_done_flag=0; | |
374 | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
375 /* It's hidden from gcc in assembler */ |
6177 | 376 extern void __attribute__((__stdcall__)) dct64_MMX(real *, real *, real *); |
377 extern void __attribute__((__stdcall__)) dct64_MMX_3dnow(real *, real *, real *); | |
378 extern void __attribute__((__stdcall__)) dct64_MMX_3dnowex(real *, real *, real *); | |
379 extern void __attribute__((__stdcall__)) dct64_MMX_sse(real *, real *, real *); | |
380 void __attribute__((__stdcall__)) (*dct64_MMX_func)(real *, real *, real *); | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
381 |
3088
73c2e9304d08
changed to use cpudetect.c (to use change te #if 1 -> #if 0 :)
alex
parents:
1393
diff
changeset
|
382 #include "../cpudetect.h" |
73c2e9304d08
changed to use cpudetect.c (to use change te #if 1 -> #if 0 :)
alex
parents:
1393
diff
changeset
|
383 |
1 | 384 // Init decoder tables. Call first, once! |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
385 #ifdef USE_FAKE_MONO |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
386 void MP3_Init(int fakemono){ |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
387 #else |
1 | 388 void MP3_Init(){ |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
389 #endif |
4262 | 390 int accel=0; |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
391 |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
392 #ifdef CAN_COMPILE_X86_ASM |
5888 | 393 // GetCpuCaps(&gCpuCaps); |
4262 | 394 if(gCpuCaps.hasMMX) accel |= MM_ACCEL_X86_MMX; |
395 if(gCpuCaps.hasMMX2) accel |= MM_ACCEL_X86_MMXEXT; | |
396 if(gCpuCaps.hasSSE) accel |= MM_ACCEL_X86_SSE; | |
397 if(gCpuCaps.has3DNow) accel |= MM_ACCEL_X86_3DNOW; | |
398 if(gCpuCaps.has3DNowExt) accel |= MM_ACCEL_X86_3DNOWEXT; | |
399 | |
400 if (accel & MM_ACCEL_X86_MMX) | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
401 { |
4262 | 402 _has_mmx = 1; |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
403 make_decode_tables_MMX(outscale); |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
404 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: made decode tables with MMX optimization\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
405 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
406 else |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
407 make_decode_tables(outscale); |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
408 #else |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
409 make_decode_tables(outscale); |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
410 #endif |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
411 |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
412 #ifdef USE_FAKE_MONO |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
413 if (fakemono == 1) |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
414 fr.synth = synth_1to1_l; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
415 else if (fakemono == 2) |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
416 fr.synth = synth_1to1_r; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
417 else |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
418 fr.synth = synth_1to1; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
419 #else |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
420 fr.synth = synth_1to1; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
421 #endif |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
422 fr.synth_mono = synth_1to1_mono2stereo; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
423 fr.down_sample = 0; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
424 fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample); |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
425 init_layer2(); |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
426 init_layer3(fr.down_sample_sblimit); |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
427 tables_done_flag = 1; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
428 |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
429 dct36_func = dct36; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
430 mp_msg(MSGT_DECAUDIO,MSGL_V,"init layer2&3 finished, tables done\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
431 |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
432 #ifdef CAN_COMPILE_X86_ASM |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
433 #if 0 |
4262 | 434 if(accel & MM_ACCEL_X86_SSE) |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
435 { |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
436 /* SSE version is buggy */ |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
437 synth_func = synth_1to1_MMX; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
438 dct64_MMX_func = dct64_MMX_sse; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
439 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using SSE optimized decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
440 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
441 else |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
442 #endif |
4262 | 443 if (accel & MM_ACCEL_X86_3DNOWEXT) |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
444 { |
4262 | 445 synth_func=synth_1to1_MMX; |
446 dct36_func=dct36_3dnowex; | |
447 dct64_MMX_func=dct64_MMX_3dnowex; | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
448 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow!Ex optimized decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
449 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
450 else |
4262 | 451 if (accel & MM_ACCEL_X86_3DNOW) |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
452 { |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
453 synth_func = synth_1to1_MMX; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
454 dct36_func = dct36_3dnow; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
455 dct64_MMX_func = dct64_MMX_3dnow; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
456 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow! optimized decore!\n"); |
4262 | 457 } |
458 else | |
459 if (accel & MM_ACCEL_X86_MMX) | |
460 { | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
461 synth_func = synth_1to1_MMX; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
462 dct64_MMX_func = dct64_MMX; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
463 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using MMX optimized decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
464 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
465 else |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
466 if (gCpuCaps.cpuType >= CPUTYPE_I586) |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
467 { |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
468 synth_func = synth_1to1_pent; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
469 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using Pentium optimized decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
470 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
471 else |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
472 { |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
473 synth_func = NULL; /* use default c version */ |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
474 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using generic C decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
475 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
476 #else /* CAN_COMPILE_X86_ASM */ |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
477 synth_func = NULL; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
478 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using generic C decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
479 #endif |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
480 |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
481 #ifdef USE_FAKE_MONO |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
482 if (fakemono == 1) |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
483 fr.synth=synth_1to1_l; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
484 else if (fakemono == 2) |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
485 fr.synth=synth_1to1_r; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
486 else |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
487 fr.synth=synth_1to1; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
488 #else |
1 | 489 fr.synth=synth_1to1; |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
490 #endif |
1 | 491 fr.synth_mono=synth_1to1_mono2stereo; |
492 fr.down_sample=0; | |
493 fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample); | |
494 init_layer2(); | |
495 init_layer3(fr.down_sample_sblimit); | |
496 tables_done_flag=1; | |
497 } | |
498 | |
499 #if 0 | |
500 | |
501 void MP3_Close(){ | |
502 MP3_eof=1; | |
503 if(mp3_file) fclose(mp3_file); | |
504 mp3_file=NULL; | |
505 } | |
506 | |
507 // Open a file, init buffers. Call once per file! | |
508 int MP3_Open(char *filename,int buffsize){ | |
509 MP3_eof=1; // lock decoding | |
510 MP3_pause=1; // lock playing | |
511 if(mp3_file) MP3_Close(); // close prev. file | |
512 MP3_frames=0; | |
513 | |
514 mp3_file=fopen(filename,"rb"); | |
515 // printf("MP3_Open: file='%s'",filename); | |
516 // if(!mp3_file){ printf(" not found!\n"); return 0;} else printf("Ok!\n"); | |
517 if(!mp3_file) return 0; | |
518 | |
519 MP3_filesize=MP3_PrintTAG(); | |
520 fseek(mp3_file,0,SEEK_SET); | |
521 | |
522 MP3_InitBuffers(buffsize); | |
523 if(!tables_done_flag) MP3_Init(); | |
524 MP3_eof=0; // allow decoding | |
525 MP3_pause=0; // allow playing | |
526 return MP3_filesize; | |
527 } | |
528 | |
529 #endif | |
530 | |
531 // Read & decode a single frame. Called by sound driver. | |
532 int MP3_DecodeFrame(unsigned char *hova,short single){ | |
533 pcm_sample = hova; | |
534 pcm_point = 0; | |
535 if(!read_frame(&fr))return(0); | |
536 if(single==-2){ set_pointer(512); return(1); } | |
537 if(fr.error_protection) getbits(16); /* skip crc */ | |
538 fr.single=single; | |
539 switch(fr.lay){ | |
540 case 2: do_layer2(&fr,single);break; | |
541 case 3: do_layer3(&fr,single);break; | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
542 default: |
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
543 return 0; // unsupported |
1 | 544 } |
545 // ++MP3_frames; | |
546 return(pcm_point?pcm_point:2); | |
547 } | |
548 | |
549 // Prints last frame header in ascii. | |
550 void MP3_PrintHeader(){ | |
551 static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" }; | |
552 static char *layers[4] = { "???" , "I", "II", "III" }; | |
553 | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
554 mp_msg(MSGT_DECAUDIO,MSGL_V,"\rMPEG %s, Layer %s, %ld Hz %d kbit %s, BPF: %ld\n", |
1 | 555 fr.mpeg25 ? "2.5" : (fr.lsf ? "2.0" : "1.0"), |
556 layers[fr.lay],freqs[fr.sampling_frequency], | |
557 tabsel_123[fr.lsf][fr.lay-1][fr.bitrate_index], | |
558 modes[fr.mode],fr.framesize+4); | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
559 mp_msg(MSGT_DECAUDIO,MSGL_V,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d\n", |
1 | 560 fr.stereo,fr.copyright?"Yes":"No", |
561 fr.original?"Yes":"No",fr.error_protection?"Yes":"No", | |
562 fr.emphasis); | |
563 } | |
564 | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
565 #if 0 |
1 | 566 #include "genre.h" |
567 | |
568 // Read & print ID3 TAG. Do not call when playing!!! returns filesize. | |
569 int MP3_PrintTAG(){ | |
570 struct id3tag { | |
571 char tag[3]; | |
572 char title[30]; | |
573 char artist[30]; | |
574 char album[30]; | |
575 char year[4]; | |
576 char comment[30]; | |
577 unsigned char genre; | |
578 }; | |
579 struct id3tag tag; | |
580 char title[31]={0,}; | |
581 char artist[31]={0,}; | |
582 char album[31]={0,}; | |
583 char year[5]={0,}; | |
584 char comment[31]={0,}; | |
585 char genre[31]={0,}; | |
586 int fsize; | |
587 int ret; | |
588 | |
589 fseek(mp3_file,0,SEEK_END); | |
590 fsize=ftell(mp3_file); | |
591 if(fseek(mp3_file,-128,SEEK_END)) return fsize; | |
592 ret=fread(&tag,128,1,mp3_file); | |
593 if(ret!=1 || tag.tag[0]!='T' || tag.tag[1]!='A' || tag.tag[2]!='G') return fsize; | |
594 | |
595 strncpy(title,tag.title,30); | |
596 strncpy(artist,tag.artist,30); | |
597 strncpy(album,tag.album,30); | |
598 strncpy(year,tag.year,4); | |
599 strncpy(comment,tag.comment,30); | |
600 | |
601 if ( tag.genre <= sizeof(genre_table)/sizeof(*genre_table) ) { | |
602 strncpy(genre, genre_table[tag.genre], 30); | |
603 } else { | |
604 strncpy(genre,"Unknown",30); | |
605 } | |
606 | |
607 // printf("\n"); | |
608 printf("Title : %30s Artist: %s\n",title,artist); | |
609 printf("Album : %30s Year : %4s\n",album,year); | |
610 printf("Comment: %30s Genre : %s\n",comment,genre); | |
611 printf("\n"); | |
612 return fsize-128; | |
613 } | |
614 | |
615 #endif |