1159b3361Sopenharmony_ci/* MPGLIB replacement using mpega.library (AmigaOS) 2159b3361Sopenharmony_ci * Written by Thomas Wenzel and Sigbjrn (CISC) Skj�et. 3159b3361Sopenharmony_ci * 4159b3361Sopenharmony_ci * Big thanks to St�hane Tavernard for mpega.library. 5159b3361Sopenharmony_ci * 6159b3361Sopenharmony_ci */ 7159b3361Sopenharmony_ci 8159b3361Sopenharmony_ci/* $Id$ */ 9159b3361Sopenharmony_ci 10159b3361Sopenharmony_ci#ifdef HAVE_CONFIG_H 11159b3361Sopenharmony_ci#include <config.h> 12159b3361Sopenharmony_ci#endif 13159b3361Sopenharmony_ci 14159b3361Sopenharmony_ci#ifdef AMIGA_MPEGA 15159b3361Sopenharmony_ci 16159b3361Sopenharmony_ci#define __USE_SYSBASE 17159b3361Sopenharmony_ci#include "lame.h" 18159b3361Sopenharmony_ci#include <stdio.h> 19159b3361Sopenharmony_ci#include <stdlib.h> 20159b3361Sopenharmony_ci 21159b3361Sopenharmony_ci/* We need a small workaround here so GCC doesn't fail upon redefinition. :P */ 22159b3361Sopenharmony_ci#define FLOAT _FLOAT 23159b3361Sopenharmony_ci#include <proto/exec.h> 24159b3361Sopenharmony_ci#include <proto/mpega.h> 25159b3361Sopenharmony_ci#undef _FLOAT 26159b3361Sopenharmony_ci 27159b3361Sopenharmony_ci#ifndef __GNUC__ 28159b3361Sopenharmony_ci#include <dos.h> 29159b3361Sopenharmony_ci#endif 30159b3361Sopenharmony_ci 31159b3361Sopenharmony_cistruct Library *MPEGABase = NULL; 32159b3361Sopenharmony_ciMPEGA_STREAM *mstream = NULL; 33159b3361Sopenharmony_ciMPEGA_CTRL mctrl; 34159b3361Sopenharmony_ci 35159b3361Sopenharmony_cistatic const int smpls[2][4] = { 36159b3361Sopenharmony_ci/* Layer x I II III */ 37159b3361Sopenharmony_ci {0, 384, 1152, 1152}, /* MPEG-1 */ 38159b3361Sopenharmony_ci {0, 384, 1152, 576} /* MPEG-2(.5) */ 39159b3361Sopenharmony_ci}; 40159b3361Sopenharmony_ci 41159b3361Sopenharmony_ci 42159b3361Sopenharmony_ci#ifndef __GNUC__ 43159b3361Sopenharmony_cistatic int 44159b3361Sopenharmony_cibreak_cleanup(void) 45159b3361Sopenharmony_ci{ 46159b3361Sopenharmony_ci /* Dummy break function to make atexit() work. :P */ 47159b3361Sopenharmony_ci return 1; 48159b3361Sopenharmony_ci} 49159b3361Sopenharmony_ci#endif 50159b3361Sopenharmony_ci 51159b3361Sopenharmony_cistatic void 52159b3361Sopenharmony_ciexit_cleanup(void) 53159b3361Sopenharmony_ci{ 54159b3361Sopenharmony_ci if (mstream) { 55159b3361Sopenharmony_ci MPEGA_close(mstream); 56159b3361Sopenharmony_ci mstream = NULL; 57159b3361Sopenharmony_ci } 58159b3361Sopenharmony_ci if (MPEGABase) { 59159b3361Sopenharmony_ci CloseLibrary(MPEGABase); 60159b3361Sopenharmony_ci MPEGABase = NULL; 61159b3361Sopenharmony_ci } 62159b3361Sopenharmony_ci} 63159b3361Sopenharmony_ci 64159b3361Sopenharmony_ci 65159b3361Sopenharmony_ciint 66159b3361Sopenharmony_cilame_decode_initfile(const char *fullname, mp3data_struct * mp3data) 67159b3361Sopenharmony_ci{ 68159b3361Sopenharmony_ci mctrl.bs_access = NULL; 69159b3361Sopenharmony_ci 70159b3361Sopenharmony_ci mctrl.layer_1_2.mono.quality = 2; 71159b3361Sopenharmony_ci mctrl.layer_1_2.stereo.quality = 2; 72159b3361Sopenharmony_ci mctrl.layer_1_2.mono.freq_div = 1; 73159b3361Sopenharmony_ci mctrl.layer_1_2.stereo.freq_div = 1; 74159b3361Sopenharmony_ci mctrl.layer_1_2.mono.freq_max = 48000; 75159b3361Sopenharmony_ci mctrl.layer_1_2.stereo.freq_max = 48000; 76159b3361Sopenharmony_ci mctrl.layer_3.mono.quality = 2; 77159b3361Sopenharmony_ci mctrl.layer_3.stereo.quality = 2; 78159b3361Sopenharmony_ci mctrl.layer_3.mono.freq_div = 1; 79159b3361Sopenharmony_ci mctrl.layer_3.stereo.freq_div = 1; 80159b3361Sopenharmony_ci mctrl.layer_3.mono.freq_max = 48000; 81159b3361Sopenharmony_ci mctrl.layer_3.stereo.freq_max = 48000; 82159b3361Sopenharmony_ci mctrl.layer_1_2.force_mono = 0; 83159b3361Sopenharmony_ci mctrl.layer_3.force_mono = 0; 84159b3361Sopenharmony_ci 85159b3361Sopenharmony_ci MPEGABase = OpenLibrary("mpega.library", 2); 86159b3361Sopenharmony_ci if (!MPEGABase) { 87159b3361Sopenharmony_ci error_printf("Unable to open mpega.library v2\n"); 88159b3361Sopenharmony_ci exit(1); 89159b3361Sopenharmony_ci } 90159b3361Sopenharmony_ci#ifndef __GNUC__ 91159b3361Sopenharmony_ci onbreak(break_cleanup); 92159b3361Sopenharmony_ci#endif 93159b3361Sopenharmony_ci atexit(exit_cleanup); 94159b3361Sopenharmony_ci 95159b3361Sopenharmony_ci mp3data->header_parsed = 0; 96159b3361Sopenharmony_ci mstream = MPEGA_open((char *) fullname, &mctrl); 97159b3361Sopenharmony_ci if (!mstream) 98159b3361Sopenharmony_ci return (-1); 99159b3361Sopenharmony_ci 100159b3361Sopenharmony_ci mp3data->header_parsed = 1; 101159b3361Sopenharmony_ci mp3data->stereo = mstream->dec_channels; 102159b3361Sopenharmony_ci mp3data->samplerate = mstream->dec_frequency; 103159b3361Sopenharmony_ci mp3data->bitrate = mstream->bitrate; 104159b3361Sopenharmony_ci mp3data->nsamp = (float) mstream->ms_duration / 1000 * mstream->dec_frequency; 105159b3361Sopenharmony_ci mp3data->mode = mstream->mode; 106159b3361Sopenharmony_ci mp3data->mode_ext = 0; /* mpega.library doesn't supply this info! :( */ 107159b3361Sopenharmony_ci mp3data->framesize = smpls[mstream->norm - 1][mstream->layer]; 108159b3361Sopenharmony_ci 109159b3361Sopenharmony_ci return 0; 110159b3361Sopenharmony_ci} 111159b3361Sopenharmony_ci 112159b3361Sopenharmony_ciint 113159b3361Sopenharmony_cilame_decode_fromfile(FILE * fd, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) 114159b3361Sopenharmony_ci{ 115159b3361Sopenharmony_ci int outsize = 0; 116159b3361Sopenharmony_ci WORD *b[MPEGA_MAX_CHANNELS]; 117159b3361Sopenharmony_ci 118159b3361Sopenharmony_ci b[0] = pcm_l; 119159b3361Sopenharmony_ci b[1] = pcm_r; 120159b3361Sopenharmony_ci 121159b3361Sopenharmony_ci mp3data->header_parsed = 0; 122159b3361Sopenharmony_ci while ((outsize == 0) || (outsize == MPEGA_ERR_BADFRAME)) /* Skip bad frames */ 123159b3361Sopenharmony_ci outsize = MPEGA_decode_frame(mstream, b); 124159b3361Sopenharmony_ci 125159b3361Sopenharmony_ci if (outsize < 0) 126159b3361Sopenharmony_ci return (-1); 127159b3361Sopenharmony_ci 128159b3361Sopenharmony_ci mp3data->header_parsed = 1; 129159b3361Sopenharmony_ci mp3data->stereo = mstream->dec_channels; 130159b3361Sopenharmony_ci mp3data->samplerate = mstream->dec_frequency; 131159b3361Sopenharmony_ci mp3data->bitrate = mstream->bitrate; 132159b3361Sopenharmony_ci mp3data->mode = mstream->mode; 133159b3361Sopenharmony_ci mp3data->mode_ext = 0; /* mpega.library doesn't supply this info! :( */ 134159b3361Sopenharmony_ci mp3data->framesize = smpls[mstream->norm - 1][mstream->layer]; 135159b3361Sopenharmony_ci 136159b3361Sopenharmony_ci return outsize; 137159b3361Sopenharmony_ci} 138159b3361Sopenharmony_ci 139159b3361Sopenharmony_ci#endif /* AMIGA_MPEGA */ 140