xref: /third_party/lame/frontend/amiga_mpega.c (revision 159b3361)
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