1 #include "wrap_mpega.h"
4 #include <aros/asmcall.h>
18 #define DEFAULT_BUFFER_SIZE 8192
31 struct mad_stream stream
;
32 struct mad_frame frame
;
33 struct mad_synth synth
;
38 struct audio_dither left_dither
;
39 struct audio_dither right_dither
;
42 mad_fixed_t replaygain
;
44 struct resample_state resample
[2];
45 mad_fixed_t resampled
[2][1152];
48 #define CALLHOOK(hook, object, message, base) \
49 AROS_UFC4(IPTR, ((struct Hook *) hook)->h_Entry, \
50 AROS_UFCA(struct Hook *, hook, A0), \
51 AROS_UFCA(APTR, object, A2), \
52 AROS_UFCA(APTR, message, A1), \
53 AROS_UFCA(APTR, base, A4))
56 static __inline
void SetStreamValues(MPEGA_STREAM
*mpega_stream
, struct mad_header
*header
)
60 case MAD_MODE_SINGLE_CHANNEL
:
61 mpega_stream
->mode
= MPEGA_MODE_MONO
;
64 case MAD_MODE_DUAL_CHANNEL
:
65 mpega_stream
->mode
= MPEGA_MODE_DUAL
;
68 case MAD_MODE_JOINT_STEREO
:
69 mpega_stream
->mode
= MPEGA_MODE_J_STEREO
;
73 mpega_stream
->mode
= MPEGA_MODE_STEREO
;
77 mpega_stream
->mode
= -1;
81 mpega_stream
->norm
= ((header
->flags
& MAD_FLAG_LSF_EXT
) ? 2 : 1);
82 mpega_stream
->layer
= header
->layer
;
83 mpega_stream
->bitrate
= header
->bitrate
/ 1000;
84 mpega_stream
->frequency
= header
->samplerate
;
85 mpega_stream
->channels
= ((header
->mode
== MAD_MODE_SINGLE_CHANNEL
) ? 1 : 2);
87 mpega_stream
->private_bit
= ((header
->private_bits
& MAD_PRIVATE_HEADER
) ? 1 : 0);
88 mpega_stream
->copyright
= ((header
->flags
& MAD_FLAG_COPYRIGHT
) ? 1 : 0);
89 mpega_stream
->original
= ((header
->flags
& MAD_FLAG_ORIGINAL
) ? 1 : 0);
92 static __inline
void ClearStreamValues(MPEGA_STREAM
*mpega_stream
)
95 mpega_stream
->mode
= MPEGA_MODE_J_STEREO
;
96 mpega_stream
->norm
= 1;
97 mpega_stream
->layer
= 3;
98 mpega_stream
->bitrate
= 128;
99 mpega_stream
->frequency
= 44100;
100 mpega_stream
->channels
= 2;
102 mpega_stream
->private_bit
= 0;
103 mpega_stream
->copyright
= 0;
104 mpega_stream
->original
= 0;
106 mpega_stream
->ms_duration
= 1000;
108 mpega_stream
->dec_channels
= 2;
109 mpega_stream
->dec_quality
= 2;
110 mpega_stream
->dec_frequency
= 44100;
113 static __inline
void SetStreamOptions(MPEGA_STREAM
*mpega_stream
, MPEGA_CTRL
*ctrl
, DecHandle
*dechandle
)
115 MPEGA_LAYER
*layer
= ((mpega_stream
->layer
== 3) ? (&ctrl
->layer_3
) : (&ctrl
->layer_1_2
));
116 MPEGA_OUTPUT
*output
;
119 if (layer
->force_mono
|| mpega_stream
->channels
== 1)
121 output
= &layer
->mono
;
122 mpega_stream
->dec_channels
= 1;
124 output
= &layer
->stereo
;
125 mpega_stream
->dec_channels
= 2;
128 if (output
->quality
== 0)
130 switch (output
->freq_div
)
133 if ((freq
= mpega_stream
->frequency
/ 4) > 8000)
135 mad_stream_options(&dechandle
->stream
, MAD_OPTION_QUARTSAMPLERATE
);
136 mpega_stream
->dec_frequency
= freq
;
142 if ((freq
= mpega_stream
->frequency
/ 2) > 8000)
144 mad_stream_options(&dechandle
->stream
, MAD_OPTION_HALFSAMPLERATE
);
145 mpega_stream
->dec_frequency
= freq
;
151 if ((freq
= mpega_stream
->frequency
) > output
->freq_max
)
153 LONG freqdiv
= freq
/ output
->freq_max
;
161 mad_stream_options(&dechandle
->stream
, MAD_OPTION_QUARTSAMPLERATE
);
163 resample_init(&dechandle
->resample
[0], freq
, output
->freq_max
);
164 if (mpega_stream
->dec_channels
== 2)
165 resample_init(&dechandle
->resample
[1], freq
, output
->freq_max
);
167 mpega_stream
->dec_frequency
= output
->freq_max
;
173 mad_stream_options(&dechandle
->stream
, MAD_OPTION_HALFSAMPLERATE
);
175 resample_init(&dechandle
->resample
[0], freq
, output
->freq_max
);
176 if (mpega_stream
->dec_channels
== 2)
177 resample_init(&dechandle
->resample
[1], freq
, output
->freq_max
);
179 mpega_stream
->dec_frequency
= output
->freq_max
;
183 mad_stream_options(&dechandle
->stream
, 0);
185 resample_init(&dechandle
->resample
[0], mpega_stream
->frequency
, freq
);
186 if (mpega_stream
->dec_channels
== 2)
187 resample_init(&dechandle
->resample
[1], mpega_stream
->frequency
, freq
);
189 mpega_stream
->dec_frequency
= freq
;
198 mad_stream_options(&dechandle
->stream
, 0);
199 mpega_stream
->dec_frequency
= mpega_stream
->frequency
;
203 switch (output
->freq_div
)
206 if ((freq
= mpega_stream
->frequency
/ 4) > 8000)
208 resample_init(&dechandle
->resample
[0], mpega_stream
->frequency
, freq
);
209 if (mpega_stream
->dec_channels
== 2)
210 resample_init(&dechandle
->resample
[1], mpega_stream
->frequency
, freq
);
212 mpega_stream
->dec_frequency
= freq
;
218 if ((freq
= mpega_stream
->frequency
/ 2) > 8000)
220 resample_init(&dechandle
->resample
[0], mpega_stream
->frequency
, freq
);
221 if (mpega_stream
->dec_channels
== 2)
222 resample_init(&dechandle
->resample
[1], mpega_stream
->frequency
, freq
);
224 mpega_stream
->dec_frequency
= freq
;
230 if ((freq
= mpega_stream
->frequency
) > output
->freq_max
)
232 resample_init(&dechandle
->resample
[0], freq
, output
->freq_max
);
233 if (mpega_stream
->dec_channels
== 2)
234 resample_init(&dechandle
->resample
[1], freq
, output
->freq_max
);
236 mpega_stream
->dec_frequency
= output
->freq_max
;
242 mpega_stream
->dec_frequency
= mpega_stream
->frequency
;
247 if ((mpega_stream
->dec_quality
= output
->quality
) < 2)
249 dechandle
->stream
.options
|= MAD_OPTION_IGNORECRC
;
250 dechandle
->gain
= MAD_F_ONE
;
254 static __inline ULONG
CheckID3(UBYTE
*buffer
)
258 if (buffer
[0]=='I' && buffer
[1]=='D' && buffer
[2]=='3' && buffer
[3]<0xFF && buffer
[4]<0xFF && buffer
[6]<0x80 && buffer
[7]<0x80 && buffer
[8]<0x80 && buffer
[9]<0x80)
260 size
= 10 + (((buffer
[6] & 0x7F) << 21) | ((buffer
[7] & 0x7F) << 14) | ((buffer
[8] & 0x7F) << 7) | buffer
[9] & 0x7F);
262 if (buffer
[5] & 0x10)
269 static __inline LONG
ReadFunc(DecHandle
*dechandle
, UBYTE
*buffer
, LONG len
, APTR a4base
)
271 MPEGA_CTRL
*ctrl
= dechandle
->ctrl
;
274 if (ctrl
->bs_access
== NULL
)
276 bytes
= Read(dechandle
->fh
, buffer
, len
);
278 MPEGA_ACCESS
*access
= dechandle
->access
;
280 access
->func
= MPEGA_BSFUNC_READ
;
281 access
->data
.read
.buffer
= buffer
;
282 access
->data
.read
.num_bytes
= len
;
284 bytes
= CALLHOOK(ctrl
->bs_access
, (APTR
)dechandle
->fh
, access
, a4base
);
290 static LONG
InitDecoder(MPEGA_STREAM
*mpega_stream
, MPEGA_CTRL
*ctrl
, APTR a4base
)
292 DecHandle
*dechandle
= (DecHandle
*) mpega_stream
->handle
;
296 ClearStreamValues(mpega_stream
);
298 mad_stream_init(&dechandle
->stream
);
299 mad_frame_init(&dechandle
->frame
);
300 mad_synth_init(&dechandle
->synth
);
302 tag_init(&dechandle
->tag
);
303 resample_init(&dechandle
->resample
[0], 44100, 44100);
304 resample_init(&dechandle
->resample
[1], 44100, 44100);
305 mad_timer_reset(&dechandle
->timer
);
306 dechandle
->gain
= dechandle
->replaygain
= MAD_F_ONE
;
308 bytes
= ReadFunc(dechandle
, dechandle
->buffer
, ctrl
->stream_buffer_size
, a4base
);
312 if (ctrl
->check_mpeg
) return 0;
314 /* Force MAD_ERROR_BUFLEN on first decode */
315 bzero(dechandle
->buffer
, MAD_BUFFER_GUARD
);
316 mad_stream_buffer(&dechandle
->stream
, dechandle
->buffer
, 0);
321 dechandle
->streamskip
= skip
= CheckID3(dechandle
->buffer
);
322 if (dechandle
->streamsize
== 0) dechandle
->streamsize
= ((bytes
> skip
) ? (bytes
) : (skip
));
324 /* Ensure that we have something to decode */
325 if (skip
> (bytes
- 2000))
327 LONG len
= 0, size
= bytes
;
331 bytes
= len
= size
- skip
;
332 bcopy(dechandle
->buffer
+ (size
- len
), dechandle
->buffer
, len
);
339 size
= ReadFunc(dechandle
, dechandle
->buffer
+ len
, ctrl
->stream_buffer_size
- len
, a4base
);
341 if (size
<= 0) return 0;
346 bytes
= len
= size
- skip
;
347 bcopy(dechandle
->buffer
+ (size
- len
), dechandle
->buffer
, len
);
348 size
= ReadFunc(dechandle
, dechandle
->buffer
+ len
, ctrl
->stream_buffer_size
- len
, a4base
);
351 if (size
> 0) bytes
+= size
;
354 bzero(dechandle
->buffer
+ bytes
, MAD_BUFFER_GUARD
);
355 mad_stream_buffer(&dechandle
->stream
, dechandle
->buffer
, bytes
);
357 dechandle
->stream
.sync
= 0;
358 mad_stream_options(&dechandle
->stream
, MAD_OPTION_IGNORECRC
);
360 if (mad_frame_decode(&dechandle
->frame
, &dechandle
->stream
) == -1)
362 while (MAD_RECOVERABLE(dechandle
->stream
.error
))
364 dechandle
->stream
.error
= 0;
365 if (mad_frame_decode(&dechandle
->frame
, &dechandle
->stream
) == 0) break;
368 if (dechandle
->stream
.error
)
370 mad_stream_options(&dechandle
->stream
, 0);
371 if (ctrl
->check_mpeg
|| dechandle
->streamsize
<= (bytes
+ skip
)) return 0;
377 mad_stream_options(&dechandle
->stream
, 0);
378 SetStreamValues(mpega_stream
, &dechandle
->frame
.header
);
380 if (tag_parse(&dechandle
->tag
, &dechandle
->stream
) == 0)
382 skip
= dechandle
->stream
.next_frame
- dechandle
->buffer
;
383 dechandle
->streamskip
+= skip
;
385 if (dechandle
->tag
.flags
& TAG_LAME
)
387 struct tag_rgain
*rgain
= &dechandle
->tag
.lame
.replay_gain
[0];
389 /*** TODO: Skip Encoder Delay samples when decoding the first frames ***/
390 dechandle
->sampleskip
= dechandle
->tag
.lame
.start_delay
;
392 if (dechandle
->streamsize
<= (bytes
+skip
) && dechandle
->tag
.lame
.music_length
> (bytes
+skip
))
393 dechandle
->streamsize
= dechandle
->tag
.lame
.music_length
;
395 if (dechandle
->tag
.lame
.replay_gain
[1].name
== TAG_RGAIN_NAME_AUDIOPHILE
&& dechandle
->tag
.lame
.replay_gain
[1].originator
!= TAG_RGAIN_ORIGINATOR_UNSPECIFIED
)
396 rgain
= &dechandle
->tag
.lame
.replay_gain
[1];
398 if ((rgain
->name
== TAG_RGAIN_NAME_RADIO
|| rgain
->name
== TAG_RGAIN_NAME_AUDIOPHILE
) && rgain
->originator
!= TAG_RGAIN_ORIGINATOR_UNSPECIFIED
)
400 double db
= (double)(rgain
->adjustment
+ 60) / 10; /* 6.0 dB pregain */
402 if (db
> 18.0 || db
< -175.0) db
= (db
> 18.0) ? 18.0 : -175.0;
403 dechandle
->gain
= dechandle
->replaygain
= mad_f_tofixed(exp(db
/20*M_LN10
));
407 if (dechandle
->tag
.flags
& TAG_VBR
&& dechandle
->tag
.xing
.flags
& TAG_XING_FRAMES
)
410 mad_timer_t total
= dechandle
->frame
.header
.duration
;
412 mad_timer_multiply(&total
, dechandle
->tag
.xing
.frames
);
413 mpega_stream
->ms_duration
= mad_timer_count(total
, MAD_UNITS_MILLISECONDS
);
414 seconds
= ((mpega_stream
->ms_duration
> 1000) ? (mpega_stream
->ms_duration
/ 1000) : (1));
416 if (dechandle
->tag
.xing
.flags
& TAG_XING_BYTES
)
418 mpega_stream
->bitrate
= ((dechandle
->tag
.xing
.bytes
/ 125) / seconds
);
420 mpega_stream
->bitrate
= (((dechandle
->streamsize
- dechandle
->streamskip
) / 125) / seconds
);
423 else mpega_stream
->ms_duration
= ((dechandle
->streamsize
- dechandle
->streamskip
) * 8) / ((mpega_stream
->bitrate
) ? (mpega_stream
->bitrate
) : (8));
425 skip
= dechandle
->stream
.this_frame
- dechandle
->buffer
;
426 dechandle
->streamskip
+= skip
;
428 if (dechandle
->streamsize
)
431 mad_timer_t total
= dechandle
->frame
.header
.duration
;
433 mad_timer_multiply(&total
, ((dechandle
->streamsize
- dechandle
->streamskip
) / (dechandle
->stream
.next_frame
- dechandle
->stream
.this_frame
)));
434 mpega_stream
->ms_duration
= mad_timer_count(total
, MAD_UNITS_MILLISECONDS
);
436 /* This will overflow on files over 500MB, but is more accurate than the above */
437 mpega_stream
->ms_duration
= ((dechandle
->streamsize
- dechandle
->streamskip
) * 8) / ((mpega_stream
->bitrate
) ? (mpega_stream
->bitrate
) : (8));
441 mad_stream_buffer(&dechandle
->stream
, dechandle
->buffer
+ skip
, bytes
- skip
);
442 mad_frame_mute(&dechandle
->frame
);
445 SetStreamOptions(mpega_stream
, ctrl
, dechandle
);
450 static void FinishDecoder(DecHandle
*dechandle
)
452 resample_finish(&dechandle
->resample
[0]);
453 resample_finish(&dechandle
->resample
[1]);
454 tag_finish(&dechandle
->tag
);
455 mad_synth_finish(&dechandle
->synth
);
456 mad_frame_finish(&dechandle
->frame
);
457 mad_stream_finish(&dechandle
->stream
);
460 static __inline LONG
ValidateFrequency(LONG freq
)
462 if (freq
<= 0) return 48000;
463 if (freq
<= 8000) return 8000;
464 if (freq
<= 11025) return 11025;
465 if (freq
<= 12000) return 12000;
466 if (freq
<= 16000) return 16000;
467 if (freq
<= 22050) return 22050;
468 if (freq
<= 24000) return 24000;
469 if (freq
<= 32000) return 32000;
470 if (freq
<= 44100) return 44100;
475 static __inline
void ValidateCtrl(MPEGA_CTRL
*ctrl
)
477 if (ctrl
->stream_buffer_size
<= 0)
478 ctrl
->stream_buffer_size
= DEFAULT_BUFFER_SIZE
;
480 if (ctrl
->layer_1_2
.mono
.freq_div
< 0)
481 ctrl
->layer_1_2
.mono
.freq_div
= 0;
483 if (ctrl
->layer_1_2
.mono
.freq_div
> 2)
484 ctrl
->layer_1_2
.mono
.freq_div
= 4;
486 if (ctrl
->layer_1_2
.mono
.quality
< 0)
487 ctrl
->layer_1_2
.mono
.quality
= 0;
489 if (ctrl
->layer_1_2
.mono
.quality
> 2)
490 ctrl
->layer_1_2
.mono
.quality
= 2;
492 if (ctrl
->layer_1_2
.stereo
.freq_div
< 0)
493 ctrl
->layer_1_2
.stereo
.freq_div
= 0;
495 if (ctrl
->layer_1_2
.stereo
.freq_div
> 2)
496 ctrl
->layer_1_2
.stereo
.freq_div
= 4;
498 if (ctrl
->layer_1_2
.stereo
.quality
< 0)
499 ctrl
->layer_1_2
.stereo
.quality
= 0;
501 if (ctrl
->layer_1_2
.stereo
.quality
> 2)
502 ctrl
->layer_1_2
.stereo
.quality
= 2;
504 ctrl
->layer_1_2
.mono
.freq_max
= ValidateFrequency(ctrl
->layer_1_2
.mono
.freq_max
);
505 ctrl
->layer_1_2
.stereo
.freq_max
= ValidateFrequency(ctrl
->layer_1_2
.stereo
.freq_max
);
507 if (ctrl
->layer_3
.mono
.freq_div
< 0)
508 ctrl
->layer_3
.mono
.freq_div
= 0;
510 if (ctrl
->layer_3
.mono
.freq_div
> 2)
511 ctrl
->layer_3
.mono
.freq_div
= 4;
513 if (ctrl
->layer_3
.mono
.quality
< 0)
514 ctrl
->layer_3
.mono
.quality
= 0;
516 if (ctrl
->layer_3
.mono
.quality
> 2)
517 ctrl
->layer_3
.mono
.quality
= 2;
519 if (ctrl
->layer_3
.stereo
.freq_div
< 0)
520 ctrl
->layer_3
.stereo
.freq_div
= 0;
522 if (ctrl
->layer_3
.stereo
.freq_div
> 2)
523 ctrl
->layer_3
.stereo
.freq_div
= 4;
525 if (ctrl
->layer_3
.stereo
.quality
< 0)
526 ctrl
->layer_3
.stereo
.quality
= 0;
528 if (ctrl
->layer_3
.stereo
.quality
> 2)
529 ctrl
->layer_3
.stereo
.quality
= 2;
531 ctrl
->layer_3
.mono
.freq_max
= ValidateFrequency(ctrl
->layer_3
.mono
.freq_max
);
532 ctrl
->layer_3
.stereo
.freq_max
= ValidateFrequency(ctrl
->layer_3
.stereo
.freq_max
);
535 static __inline LONG
OutputPCM(MPEGA_STREAM
*mpega_stream
, DecHandle
*dechandle
, WORD
*pcm
[MPEGA_MAX_CHANNELS
])
537 WORD
*outleft
= pcm
[0];
538 WORD
*outright
= pcm
[1];
539 mad_fixed_t
const *left
= dechandle
->synth
.pcm
.samples
[0];
540 mad_fixed_t
const *right
= dechandle
->synth
.pcm
.samples
[1];
541 ULONG len
= dechandle
->synth
.pcm
.length
;
542 LONG nsamples
, sample0
, sample1
;
546 if (mpega_stream
->dec_channels
== 1 || !outright
)
548 if (dechandle
->resample
[0].ratio
!= MAD_F_ONE
)
550 nsamples
= resample_block(&dechandle
->resample
[0], len
, left
, dechandle
->resampled
[0]);
551 left
= dechandle
->resampled
[0];
554 if (mpega_stream
->dec_quality
< 2)
558 sample0
= audio_linear_round(16, *left
++);
560 *outleft
++ = sample0
& 0x0000FFFF;
565 sample0
= audio_linear_dither(16, *left
++, &dechandle
->left_dither
);
567 *outleft
++ = sample0
& 0x0000FFFF;
570 } else { /* Stereo */
571 if (dechandle
->resample
[0].ratio
!= MAD_F_ONE
)
573 nsamples
= resample_block(&dechandle
->resample
[0], len
, left
, dechandle
->resampled
[0]);
574 resample_block(&dechandle
->resample
[1], len
, right
, dechandle
->resampled
[1]);
575 left
= dechandle
->resampled
[0];
576 right
= dechandle
->resampled
[1];
579 if (mpega_stream
->dec_quality
< 2)
583 sample0
= audio_linear_round(16, *left
++);
584 sample1
= audio_linear_round(16, *right
++);
586 *outleft
++ = sample0
& 0x0000FFFF;
587 *outright
++ = sample1
& 0x0000FFFF;
592 sample0
= audio_linear_dither(16, *left
++, &dechandle
->left_dither
);
593 sample1
= audio_linear_dither(16, *right
++, &dechandle
->right_dither
);
595 *outleft
++ = sample0
& 0x0000FFFF;
596 *outright
++ = sample1
& 0x0000FFFF;
605 MPEGA_STREAM
*WRAP_MPEGA_open(char *stream_name
, MPEGA_CTRL
*ctrl
, APTR a4base
)
609 MPEGA_STREAM
*mpega_stream
;
611 if ((mpega_stream
= malloc(sizeof(MPEGA_STREAM
))))
613 DecHandle
*dechandle
;
615 if ((dechandle
= calloc(1, sizeof(DecHandle
))))
617 mpega_stream
->handle
= dechandle
;
619 dechandle
->fh
= NULL
;
620 dechandle
->access
= NULL
;
622 if ((dechandle
->ctrl
= malloc(sizeof(MPEGA_CTRL
))))
624 bcopy(ctrl
, dechandle
->ctrl
, sizeof(MPEGA_CTRL
));
625 ValidateCtrl(dechandle
->ctrl
);
627 if (ctrl
->bs_access
== NULL
)
631 if ((dechandle
->fh
= Open(stream_name
, MODE_OLDFILE
)))
633 struct FileInfoBlock
*fib
;
635 dechandle
->streamsize
= 0;
637 if ((fib
= malloc(sizeof(struct FileInfoBlock
))))
639 if (ExamineFH(dechandle
->fh
, fib
))
641 dechandle
->streamsize
= fib
->fib_Size
;
647 if ((dechandle
->buffer
= malloc(dechandle
->ctrl
->stream_buffer_size
+ MAD_BUFFER_GUARD
)))
649 if (InitDecoder(mpega_stream
, dechandle
->ctrl
, a4base
) != 0)
654 free(dechandle
->buffer
);
657 Close(dechandle
->fh
);
661 MPEGA_ACCESS
*access
;
663 if ((access
= malloc(sizeof(MPEGA_ACCESS
))))
665 dechandle
->access
= access
;
667 access
->func
= MPEGA_BSFUNC_OPEN
;
668 access
->data
.open
.stream_name
= stream_name
;
669 access
->data
.open
.buffer_size
= dechandle
->ctrl
->stream_buffer_size
;
670 access
->data
.open
.stream_size
= 0;
672 if ((dechandle
->fh
= (BPTR
)CALLHOOK(ctrl
->bs_access
, NULL
, access
, a4base
)))
674 dechandle
->streamsize
= access
->data
.open
.stream_size
;
675 if (access
->data
.open
.buffer_size
> 0) dechandle
->ctrl
->stream_buffer_size
= access
->data
.open
.buffer_size
;
677 if ((dechandle
->buffer
= malloc(dechandle
->ctrl
->stream_buffer_size
+ MAD_BUFFER_GUARD
)))
679 if (InitDecoder(mpega_stream
, dechandle
->ctrl
, a4base
) != 0)
684 free(dechandle
->buffer
);
687 access
->func
= MPEGA_BSFUNC_CLOSE
;
688 CALLHOOK(ctrl
->bs_access
, (APTR
)dechandle
->fh
, access
, a4base
);
695 free(dechandle
->ctrl
);
708 void WRAP_MPEGA_close(MPEGA_STREAM
*mpega_stream
, APTR a4base
)
712 DecHandle
*dechandle
= (DecHandle
*) mpega_stream
->handle
;
716 MPEGA_CTRL
*ctrl
= dechandle
->ctrl
;
718 FinishDecoder(dechandle
);
720 if (ctrl
->bs_access
== NULL
)
722 if (dechandle
->fh
) Close(dechandle
->fh
);
724 MPEGA_ACCESS
*access
= dechandle
->access
;
726 access
->func
= MPEGA_BSFUNC_CLOSE
;
728 CALLHOOK(ctrl
->bs_access
, (APTR
)dechandle
->fh
, access
, a4base
);
731 if (dechandle
->ctrl
) free(dechandle
->ctrl
);
732 if (dechandle
->buffer
) free(dechandle
->buffer
);
733 if (dechandle
->access
) free(dechandle
->access
);
742 LONG
WRAP_MPEGA_decode_frame(MPEGA_STREAM
*mpega_stream
, WORD
*pcm
[MPEGA_MAX_CHANNELS
], APTR a4base
)
744 if (mpega_stream
&& pcm
&& pcm
[0])
746 DecHandle
*dechandle
= (DecHandle
*) mpega_stream
->handle
;
747 MPEGA_CTRL
*ctrl
= dechandle
->ctrl
;
749 if (mad_frame_decode(&dechandle
->frame
, &dechandle
->stream
) == -1)
751 LONG error
= dechandle
->stream
.error
;
753 if (error
== MAD_ERROR_BUFLEN
)
755 LONG bytes
= ctrl
->stream_buffer_size
, len
= 0;
757 if (dechandle
->stream
.next_frame
)
759 bcopy(dechandle
->stream
.next_frame
, dechandle
->buffer
, len
= &dechandle
->buffer
[bytes
] - dechandle
->stream
.next_frame
);
762 bytes
= ReadFunc(dechandle
, dechandle
->buffer
+ len
, bytes
- len
, a4base
);
764 if (bytes
== 0) return MPEGA_ERR_EOF
;
765 if (bytes
< 0) return MPEGA_ERR_BADVALUE
;
767 bzero(dechandle
->buffer
+ bytes
+ len
, MAD_BUFFER_GUARD
);
768 mad_stream_buffer(&dechandle
->stream
, dechandle
->buffer
, bytes
+ len
);
770 if (mad_frame_decode(&dechandle
->frame
, &dechandle
->stream
) == -1) error
= dechandle
->stream
.error
;
778 case MAD_ERROR_BUFPTR
:
779 return MPEGA_ERR_BADVALUE
;
782 case MAD_ERROR_NOMEM
:
783 return MPEGA_ERR_MEM
;
786 case MAD_ERROR_LOSTSYNC
:
787 return MPEGA_ERR_NO_SYNC
;
790 case MAD_ERROR_BADBIGVALUES
:
791 case MAD_ERROR_BADBLOCKTYPE
:
792 case MAD_ERROR_BADSCFSI
:
793 case MAD_ERROR_BADHUFFDATA
:
794 if (mpega_stream
->dec_quality
> 0) return MPEGA_ERR_BADFRAME
;
797 case MAD_ERROR_BADLAYER
:
798 case MAD_ERROR_BADBITRATE
:
799 case MAD_ERROR_BADSAMPLERATE
:
800 case MAD_ERROR_BADEMPHASIS
:
801 case MAD_ERROR_BADCRC
:
802 case MAD_ERROR_BADBITALLOC
:
803 case MAD_ERROR_BADSCALEFACTOR
:
804 case MAD_ERROR_BADMODE
:
805 case MAD_ERROR_BADFRAMELEN
:
806 case MAD_ERROR_BADDATAPTR
:
807 case MAD_ERROR_BADPART3LEN
:
808 case MAD_ERROR_BADHUFFTABLE
:
809 case MAD_ERROR_BADSTEREO
:
810 return MPEGA_ERR_BADFRAME
;
820 mad_timer_add(&dechandle
->timer
, dechandle
->frame
.header
.duration
);
822 SetStreamValues(mpega_stream
, &dechandle
->frame
.header
);
823 SetStreamOptions(mpega_stream
, ctrl
, dechandle
);
825 if (dechandle
->gain
!= MAD_F_ONE
)
826 gain_filter(dechandle
->gain
, &dechandle
->frame
);
828 mad_synth_frame(&dechandle
->synth
, &dechandle
->frame
);
830 return OutputPCM(mpega_stream
, dechandle
, pcm
);
833 return MPEGA_ERR_BADVALUE
;
836 LONG
WRAP_MPEGA_seek(MPEGA_STREAM
*mpega_stream
, ULONG ms_time_position
, APTR a4base
)
840 DecHandle
*dechandle
= (DecHandle
*) mpega_stream
->handle
;
841 MPEGA_CTRL
*ctrl
= dechandle
->ctrl
;
844 if (dechandle
->tag
.flags
& TAG_VBR
&& dechandle
->tag
.xing
.flags
& TAG_XING_TOC
)
848 if (dechandle
->tag
.xing
.flags
& TAG_XING_BYTES
)
850 step
= dechandle
->tag
.xing
.bytes
/ 256;
852 step
= (dechandle
->streamsize
- dechandle
->streamskip
) / 256;
855 if (ms_time_position
< mpega_stream
->ms_duration
)
857 i
= ((mpega_stream
->ms_duration
> 100) ? (ms_time_position
/ (mpega_stream
->ms_duration
/ 100)) : (0));
861 pos
= (step
* dechandle
->tag
.xing
.toc
[i
]) + dechandle
->streamskip
;
863 pos
= ((((ULONG
)mpega_stream
->bitrate
* 125UL) * (ms_time_position
/ 1000)) + dechandle
->streamskip
);
866 if (ctrl
->bs_access
== NULL
)
868 error
= Seek(dechandle
->fh
, pos
, OFFSET_BEGINNING
);
870 if (error
> 0) error
= 0;
872 MPEGA_ACCESS
*access
= dechandle
->access
;
874 access
->func
= MPEGA_BSFUNC_SEEK
;
875 access
->data
.seek
.abs_byte_seek_pos
= pos
;
877 error
= CALLHOOK(ctrl
->bs_access
, (APTR
)dechandle
->fh
, access
, a4base
);
884 bytes
= ReadFunc(dechandle
, dechandle
->buffer
, ctrl
->stream_buffer_size
, a4base
);
886 if (bytes
== 0) return MPEGA_ERR_EOF
;
887 if (bytes
< 0) return MPEGA_ERR_BADVALUE
;
889 bzero(dechandle
->buffer
+ bytes
, MAD_BUFFER_GUARD
);
890 mad_stream_buffer(&dechandle
->stream
, dechandle
->buffer
, bytes
);
892 mad_frame_mute(&dechandle
->frame
);
893 mad_synth_mute(&dechandle
->synth
);
894 dechandle
->stream
.sync
= 0;
896 /* If we seek somewhere other than the beginning we need to flush out junk audio */
897 if (pos
> dechandle
->streamskip
)
899 mad_frame_decode(&dechandle
->frame
, &dechandle
->stream
);
900 mad_frame_decode(&dechandle
->frame
, &dechandle
->stream
);
901 mad_synth_frame(&dechandle
->synth
, &dechandle
->frame
);
904 // mad_timer_set(&dechandle->timer, 0, pos - dechandle->streamskip, (ULONG)mpega_stream->bitrate * 125);
905 mad_timer_set(&dechandle
->timer
, 0, ms_time_position
, 1000);
911 return MPEGA_ERR_BADVALUE
;
914 LONG
WRAP_MPEGA_time(MPEGA_STREAM
*mpega_stream
, ULONG
*ms_time_position
)
916 if (mpega_stream
&& ms_time_position
)
918 DecHandle
*dechandle
= (DecHandle
*) mpega_stream
->handle
;
920 *ms_time_position
= mad_timer_count(dechandle
->timer
, MAD_UNITS_MILLISECONDS
);
924 return MPEGA_ERR_BADVALUE
;
927 LONG
WRAP_MPEGA_find_sync(UBYTE
*buffer
, LONG buffer_size
)
929 if (buffer
&& buffer_size
> 75)
933 while (i
< buffer_size
- 1)
935 if ((buffer
[i
] == 0xFF) && ((buffer
[i
+1] & 0xE0) == 0xE0)) return i
;
939 return MPEGA_ERR_NO_SYNC
;
942 return MPEGA_ERR_BADVALUE
;
945 LONG
WRAP_MPEGA_scale(MPEGA_STREAM
*mpega_stream
, LONG scale_percent
)
949 DecHandle
*dechandle
= (DecHandle
*) mpega_stream
->handle
;
951 if (scale_percent
<= 0) dechandle
->gain
= ((mad_fixed_t
)0x00000001L
);
956 if (scale_percent
> 800) scale_percent
= 800;
957 scaled
= ((dechandle
->replaygain
/100)*scale_percent
)+1;
959 if (scaled
> MAD_F_MAX
|| scaled
< ((mad_fixed_t
)0x00000001L
)) dechandle
->gain
= MAD_F_MAX
;
960 else dechandle
->gain
= scaled
;
966 return MPEGA_ERR_BADVALUE
;