|
Packit |
47f805 |
/* MPGLIB replacement using mpega.library (AmigaOS)
|
|
Packit |
47f805 |
* Written by Thomas Wenzel and Sigbjrn (CISC) Skj�et.
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* Big thanks to St�hane Tavernard for mpega.library.
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
*/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* $Id: amiga_mpega.c,v 1.3 2005/11/01 13:01:56 robert Exp $ */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
47f805 |
#include <config.h>
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef AMIGA_MPEGA
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#define __USE_SYSBASE
|
|
Packit |
47f805 |
#include "lame.h"
|
|
Packit |
47f805 |
#include <stdio.h>
|
|
Packit |
47f805 |
#include <stdlib.h>
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* We need a small workaround here so GCC doesn't fail upon redefinition. :P */
|
|
Packit |
47f805 |
#define FLOAT _FLOAT
|
|
Packit |
47f805 |
#include <proto/exec.h>
|
|
Packit |
47f805 |
#include <proto/mpega.h>
|
|
Packit |
47f805 |
#undef _FLOAT
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifndef __GNUC__
|
|
Packit |
47f805 |
#include <dos.h>
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
struct Library *MPEGABase = NULL;
|
|
Packit |
47f805 |
MPEGA_STREAM *mstream = NULL;
|
|
Packit |
47f805 |
MPEGA_CTRL mctrl;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static const int smpls[2][4] = {
|
|
Packit |
47f805 |
/* Layer x I II III */
|
|
Packit |
47f805 |
{0, 384, 1152, 1152}, /* MPEG-1 */
|
|
Packit |
47f805 |
{0, 384, 1152, 576} /* MPEG-2(.5) */
|
|
Packit |
47f805 |
};
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifndef __GNUC__
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
break_cleanup(void)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
/* Dummy break function to make atexit() work. :P */
|
|
Packit |
47f805 |
return 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static void
|
|
Packit |
47f805 |
exit_cleanup(void)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
if (mstream) {
|
|
Packit |
47f805 |
MPEGA_close(mstream);
|
|
Packit |
47f805 |
mstream = NULL;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (MPEGABase) {
|
|
Packit |
47f805 |
CloseLibrary(MPEGABase);
|
|
Packit |
47f805 |
MPEGABase = NULL;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
int
|
|
Packit |
47f805 |
lame_decode_initfile(const char *fullname, mp3data_struct * mp3data)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
mctrl.bs_access = NULL;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
mctrl.layer_1_2.mono.quality = 2;
|
|
Packit |
47f805 |
mctrl.layer_1_2.stereo.quality = 2;
|
|
Packit |
47f805 |
mctrl.layer_1_2.mono.freq_div = 1;
|
|
Packit |
47f805 |
mctrl.layer_1_2.stereo.freq_div = 1;
|
|
Packit |
47f805 |
mctrl.layer_1_2.mono.freq_max = 48000;
|
|
Packit |
47f805 |
mctrl.layer_1_2.stereo.freq_max = 48000;
|
|
Packit |
47f805 |
mctrl.layer_3.mono.quality = 2;
|
|
Packit |
47f805 |
mctrl.layer_3.stereo.quality = 2;
|
|
Packit |
47f805 |
mctrl.layer_3.mono.freq_div = 1;
|
|
Packit |
47f805 |
mctrl.layer_3.stereo.freq_div = 1;
|
|
Packit |
47f805 |
mctrl.layer_3.mono.freq_max = 48000;
|
|
Packit |
47f805 |
mctrl.layer_3.stereo.freq_max = 48000;
|
|
Packit |
47f805 |
mctrl.layer_1_2.force_mono = 0;
|
|
Packit |
47f805 |
mctrl.layer_3.force_mono = 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
MPEGABase = OpenLibrary("mpega.library", 2);
|
|
Packit |
47f805 |
if (!MPEGABase) {
|
|
Packit |
47f805 |
error_printf("Unable to open mpega.library v2\n");
|
|
Packit |
47f805 |
exit(1);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#ifndef __GNUC__
|
|
Packit |
47f805 |
onbreak(break_cleanup);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
atexit(exit_cleanup);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
mp3data->header_parsed = 0;
|
|
Packit |
47f805 |
mstream = MPEGA_open((char *) fullname, &mctrl);
|
|
Packit |
47f805 |
if (!mstream)
|
|
Packit |
47f805 |
return (-1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
mp3data->header_parsed = 1;
|
|
Packit |
47f805 |
mp3data->stereo = mstream->dec_channels;
|
|
Packit |
47f805 |
mp3data->samplerate = mstream->dec_frequency;
|
|
Packit |
47f805 |
mp3data->bitrate = mstream->bitrate;
|
|
Packit |
47f805 |
mp3data->nsamp = (float) mstream->ms_duration / 1000 * mstream->dec_frequency;
|
|
Packit |
47f805 |
mp3data->mode = mstream->mode;
|
|
Packit |
47f805 |
mp3data->mode_ext = 0; /* mpega.library doesn't supply this info! :( */
|
|
Packit |
47f805 |
mp3data->framesize = smpls[mstream->norm - 1][mstream->layer];
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
int
|
|
Packit |
47f805 |
lame_decode_fromfile(FILE * fd, short pcm_l[], short pcm_r[], mp3data_struct * mp3data)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int outsize = 0;
|
|
Packit |
47f805 |
WORD *b[MPEGA_MAX_CHANNELS];
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
b[0] = pcm_l;
|
|
Packit |
47f805 |
b[1] = pcm_r;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
mp3data->header_parsed = 0;
|
|
Packit |
47f805 |
while ((outsize == 0) || (outsize == MPEGA_ERR_BADFRAME)) /* Skip bad frames */
|
|
Packit |
47f805 |
outsize = MPEGA_decode_frame(mstream, b);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (outsize < 0)
|
|
Packit |
47f805 |
return (-1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
mp3data->header_parsed = 1;
|
|
Packit |
47f805 |
mp3data->stereo = mstream->dec_channels;
|
|
Packit |
47f805 |
mp3data->samplerate = mstream->dec_frequency;
|
|
Packit |
47f805 |
mp3data->bitrate = mstream->bitrate;
|
|
Packit |
47f805 |
mp3data->mode = mstream->mode;
|
|
Packit |
47f805 |
mp3data->mode_ext = 0; /* mpega.library doesn't supply this info! :( */
|
|
Packit |
47f805 |
mp3data->framesize = smpls[mstream->norm - 1][mstream->layer];
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
return outsize;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#endif /* AMIGA_MPEGA */
|