/* MPGLIB replacement using mpega.library (AmigaOS)
 * Written by Thomas Wenzel and Sigbjørn (CISC) Skjæret.
 *
 * Big thanks to Stéphane Tavernard for mpega.library.
 *
 */

/* $Id: amiga_mpega.c,v 1.2 2001/02/05 00:34:37 cisc Exp $ */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifdef AMIGA_MPEGA

#define __USE_SYSBASE
#include "lame.h"
#include <stdio.h>
#include <stdlib.h>

/* We need a small workaround here so GCC doesn't fail upon redefinition. :P */
#define FLOAT _FLOAT
#include <proto/exec.h>
#include <proto/mpega.h>
#undef _FLOAT

#ifndef __GNUC__
#include <dos.h>
#endif

struct Library  *MPEGABase=NULL;
MPEGA_STREAM    *mstream=NULL;
MPEGA_CTRL      mctrl;

static const int smpls[2][4]={
/* Layer x  I   II   III */
        {0,384,1152,1152}, /* MPEG-1     */
        {0,384,1152, 576}  /* MPEG-2(.5) */
};


#ifndef __GNUC__
static int break_cleanup(void)
{
	/* Dummy break function to make atexit() work. :P */
	return 1;
}
#endif

static void exit_cleanup(void)
{
	if(mstream) {
		MPEGA_close(mstream);
		mstream = NULL;
	}
	if(MPEGABase) {
		CloseLibrary(MPEGABase);
		MPEGABase = NULL;
	}
}


int lame_decode_initfile(const char *fullname, mp3data_struct *mp3data)
{
	mctrl.bs_access = NULL;

	mctrl.layer_1_2.mono.quality    = 2;
	mctrl.layer_1_2.stereo.quality  = 2;
	mctrl.layer_1_2.mono.freq_div   = 1;
	mctrl.layer_1_2.stereo.freq_div = 1;
	mctrl.layer_1_2.mono.freq_max   = 48000;
	mctrl.layer_1_2.stereo.freq_max = 48000;
	mctrl.layer_3.mono.quality      = 2;
	mctrl.layer_3.stereo.quality    = 2;
	mctrl.layer_3.mono.freq_div     = 1;
	mctrl.layer_3.stereo.freq_div   = 1;
	mctrl.layer_3.mono.freq_max     = 48000;
	mctrl.layer_3.stereo.freq_max   = 48000;
	mctrl.layer_1_2.force_mono      = 0;
	mctrl.layer_3.force_mono        = 0;

	MPEGABase = OpenLibrary("mpega.library", 2);
	if(!MPEGABase) {
		fprintf(stderr, "Unable to open mpega.library v2\n");
		exit(1);
	}
#ifndef __GNUC__
	onbreak(break_cleanup);
#endif
	atexit(exit_cleanup);

	mp3data->header_parsed = 0;
	mstream=MPEGA_open((char *)fullname, &mctrl);
	if(!mstream) return (-1);

	mp3data->header_parsed = 1;
	mp3data->stereo        = mstream->dec_channels;
	mp3data->samplerate    = mstream->dec_frequency;
	mp3data->bitrate       = mstream->bitrate;
	mp3data->nsamp         = (float)mstream->ms_duration/1000 * mstream->dec_frequency;
	mp3data->mode          = mstream->mode;
	mp3data->mode_ext      = 0;	/* mpega.library doesn't supply this info! :( */
	mp3data->framesize     = smpls[mstream->norm-1][mstream->layer];

	return 0;
}

int lame_decode_fromfile(FILE *fd, short pcm_l[], short pcm_r[], mp3data_struct *mp3data)
{
	int outsize=0;
	WORD *b[MPEGA_MAX_CHANNELS];

	b[0]=pcm_l;
	b[1]=pcm_r;

	mp3data->header_parsed = 0;
	while ((outsize == 0) || (outsize == MPEGA_ERR_BADFRAME))	/* Skip bad frames */
		outsize = MPEGA_decode_frame(mstream, b);

	if (outsize < 0) return (-1);

	mp3data->header_parsed = 1;
	mp3data->stereo        = mstream->dec_channels;
	mp3data->samplerate    = mstream->dec_frequency;
	mp3data->bitrate       = mstream->bitrate;
	mp3data->mode          = mstream->mode;
	mp3data->mode_ext      = 0;	/* mpega.library doesn't supply this info! :( */
	mp3data->framesize     = smpls[mstream->norm-1][mstream->layer];

	return outsize;
}

#endif /* AMIGA_MPEGA */
