1*8f5875f3SDavid du Colombier /* -*- mode: C; mode: fold -*- */
2*8f5875f3SDavid du Colombier /*
3*8f5875f3SDavid du Colombier * set/get functions for lame_global_flags
4*8f5875f3SDavid du Colombier *
5*8f5875f3SDavid du Colombier * Copyright (c) 2001 Alexander Leidinger
6*8f5875f3SDavid du Colombier *
7*8f5875f3SDavid du Colombier * This library is free software; you can redistribute it and/or
8*8f5875f3SDavid du Colombier * modify it under the terms of the GNU Library General Public
9*8f5875f3SDavid du Colombier * License as published by the Free Software Foundation; either
10*8f5875f3SDavid du Colombier * version 2 of the License, or (at your option) any later version.
11*8f5875f3SDavid du Colombier *
12*8f5875f3SDavid du Colombier * This library is distributed in the hope that it will be useful,
13*8f5875f3SDavid du Colombier * but WITHOUT ANY WARRANTY; without even the implied warranty of
14*8f5875f3SDavid du Colombier * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15*8f5875f3SDavid du Colombier * Library General Public License for more details.
16*8f5875f3SDavid du Colombier *
17*8f5875f3SDavid du Colombier * You should have received a copy of the GNU Library General Public
18*8f5875f3SDavid du Colombier * License along with this library; if not, write to the
19*8f5875f3SDavid du Colombier * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20*8f5875f3SDavid du Colombier * Boston, MA 02111-1307, USA.
21*8f5875f3SDavid du Colombier */
22*8f5875f3SDavid du Colombier
23*8f5875f3SDavid du Colombier /* $Id: set_get.c,v 1.2 2001/03/12 04:38:35 markt Exp $ */
24*8f5875f3SDavid du Colombier
25*8f5875f3SDavid du Colombier #ifdef HAVE_CONFIG_H
26*8f5875f3SDavid du Colombier # include <config.h>
27*8f5875f3SDavid du Colombier #endif
28*8f5875f3SDavid du Colombier
29*8f5875f3SDavid du Colombier #include <assert.h>
30*8f5875f3SDavid du Colombier #include "lame.h"
31*8f5875f3SDavid du Colombier
32*8f5875f3SDavid du Colombier #ifdef WITH_DMALLOC
33*8f5875f3SDavid du Colombier #include <dmalloc.h>
34*8f5875f3SDavid du Colombier #endif
35*8f5875f3SDavid du Colombier
36*8f5875f3SDavid du Colombier
37*8f5875f3SDavid du Colombier /*
38*8f5875f3SDavid du Colombier * input stream description
39*8f5875f3SDavid du Colombier */
40*8f5875f3SDavid du Colombier
41*8f5875f3SDavid du Colombier /* number of samples */
42*8f5875f3SDavid du Colombier /* it's unlikely for this function to return an error */
43*8f5875f3SDavid du Colombier int
lame_set_num_samples(lame_global_flags * gfp,unsigned long num_samples)44*8f5875f3SDavid du Colombier lame_set_num_samples( lame_global_flags* gfp,
45*8f5875f3SDavid du Colombier unsigned long num_samples)
46*8f5875f3SDavid du Colombier {
47*8f5875f3SDavid du Colombier /* default = 2^32-1 */
48*8f5875f3SDavid du Colombier
49*8f5875f3SDavid du Colombier gfp->num_samples = num_samples;
50*8f5875f3SDavid du Colombier
51*8f5875f3SDavid du Colombier return 0;
52*8f5875f3SDavid du Colombier }
53*8f5875f3SDavid du Colombier
54*8f5875f3SDavid du Colombier unsigned long
lame_get_num_samples(const lame_global_flags * gfp)55*8f5875f3SDavid du Colombier lame_get_num_samples( const lame_global_flags* gfp )
56*8f5875f3SDavid du Colombier {
57*8f5875f3SDavid du Colombier return gfp->num_samples;
58*8f5875f3SDavid du Colombier }
59*8f5875f3SDavid du Colombier
60*8f5875f3SDavid du Colombier
61*8f5875f3SDavid du Colombier /* input samplerate */
62*8f5875f3SDavid du Colombier int
lame_set_in_samplerate(lame_global_flags * gfp,int in_samplerate)63*8f5875f3SDavid du Colombier lame_set_in_samplerate( lame_global_flags* gfp,
64*8f5875f3SDavid du Colombier int in_samplerate )
65*8f5875f3SDavid du Colombier {
66*8f5875f3SDavid du Colombier /* input sample rate in Hz, default = 44100 Hz */
67*8f5875f3SDavid du Colombier gfp->in_samplerate = in_samplerate;
68*8f5875f3SDavid du Colombier
69*8f5875f3SDavid du Colombier return 0;
70*8f5875f3SDavid du Colombier }
71*8f5875f3SDavid du Colombier
72*8f5875f3SDavid du Colombier int
lame_get_in_samplerate(const lame_global_flags * gfp)73*8f5875f3SDavid du Colombier lame_get_in_samplerate( const lame_global_flags* gfp )
74*8f5875f3SDavid du Colombier {
75*8f5875f3SDavid du Colombier return gfp->in_samplerate;
76*8f5875f3SDavid du Colombier }
77*8f5875f3SDavid du Colombier
78*8f5875f3SDavid du Colombier
79*8f5875f3SDavid du Colombier /* number of channels in input stream */
80*8f5875f3SDavid du Colombier int
lame_set_num_channels(lame_global_flags * gfp,int num_channels)81*8f5875f3SDavid du Colombier lame_set_num_channels( lame_global_flags* gfp,
82*8f5875f3SDavid du Colombier int num_channels )
83*8f5875f3SDavid du Colombier {
84*8f5875f3SDavid du Colombier /* default = 2 */
85*8f5875f3SDavid du Colombier
86*8f5875f3SDavid du Colombier if ( 2 < num_channels || 0 == num_channels )
87*8f5875f3SDavid du Colombier return -1; /* we didn't support more than 2 channels */
88*8f5875f3SDavid du Colombier
89*8f5875f3SDavid du Colombier gfp->num_channels = num_channels;
90*8f5875f3SDavid du Colombier
91*8f5875f3SDavid du Colombier return 0;
92*8f5875f3SDavid du Colombier }
93*8f5875f3SDavid du Colombier
94*8f5875f3SDavid du Colombier int
lame_get_num_channels(const lame_global_flags * gfp)95*8f5875f3SDavid du Colombier lame_get_num_channels( const lame_global_flags* gfp )
96*8f5875f3SDavid du Colombier {
97*8f5875f3SDavid du Colombier return gfp->num_channels;
98*8f5875f3SDavid du Colombier }
99*8f5875f3SDavid du Colombier
100*8f5875f3SDavid du Colombier
101*8f5875f3SDavid du Colombier /* scale the input by this amount before encoding (not used for decoding) */
102*8f5875f3SDavid du Colombier int
lame_set_scale(lame_global_flags * gfp,float scale)103*8f5875f3SDavid du Colombier lame_set_scale( lame_global_flags* gfp,
104*8f5875f3SDavid du Colombier float scale )
105*8f5875f3SDavid du Colombier {
106*8f5875f3SDavid du Colombier /* default = 0 */
107*8f5875f3SDavid du Colombier gfp->scale = scale;
108*8f5875f3SDavid du Colombier
109*8f5875f3SDavid du Colombier return 0;
110*8f5875f3SDavid du Colombier }
111*8f5875f3SDavid du Colombier
112*8f5875f3SDavid du Colombier float
lame_get_scale(const lame_global_flags * gfp)113*8f5875f3SDavid du Colombier lame_get_scale( const lame_global_flags* gfp )
114*8f5875f3SDavid du Colombier {
115*8f5875f3SDavid du Colombier return gfp->scale;
116*8f5875f3SDavid du Colombier }
117*8f5875f3SDavid du Colombier
118*8f5875f3SDavid du Colombier
119*8f5875f3SDavid du Colombier /* output sample rate in Hz */
120*8f5875f3SDavid du Colombier int
lame_set_out_samplerate(lame_global_flags * gfp,int out_samplerate)121*8f5875f3SDavid du Colombier lame_set_out_samplerate( lame_global_flags* gfp,
122*8f5875f3SDavid du Colombier int out_samplerate )
123*8f5875f3SDavid du Colombier {
124*8f5875f3SDavid du Colombier /*
125*8f5875f3SDavid du Colombier * default = 0: LAME picks best value based on the amount
126*8f5875f3SDavid du Colombier * of compression
127*8f5875f3SDavid du Colombier * MPEG only allows:
128*8f5875f3SDavid du Colombier * MPEG1 32, 44.1, 48khz
129*8f5875f3SDavid du Colombier * MPEG2 16, 22.05, 24
130*8f5875f3SDavid du Colombier * MPEG2.5 8, 11.025, 12
131*8f5875f3SDavid du Colombier *
132*8f5875f3SDavid du Colombier * (not used by decoding routines)
133*8f5875f3SDavid du Colombier */
134*8f5875f3SDavid du Colombier gfp->out_samplerate = out_samplerate;
135*8f5875f3SDavid du Colombier
136*8f5875f3SDavid du Colombier return 0;
137*8f5875f3SDavid du Colombier }
138*8f5875f3SDavid du Colombier
139*8f5875f3SDavid du Colombier int
lame_get_out_samplerate(const lame_global_flags * gfp)140*8f5875f3SDavid du Colombier lame_get_out_samplerate( const lame_global_flags* gfp )
141*8f5875f3SDavid du Colombier {
142*8f5875f3SDavid du Colombier return gfp->out_samplerate;
143*8f5875f3SDavid du Colombier }
144*8f5875f3SDavid du Colombier
145*8f5875f3SDavid du Colombier
146*8f5875f3SDavid du Colombier
147*8f5875f3SDavid du Colombier
148*8f5875f3SDavid du Colombier /*
149*8f5875f3SDavid du Colombier * general control parameters
150*8f5875f3SDavid du Colombier */
151*8f5875f3SDavid du Colombier
152*8f5875f3SDavid du Colombier /*collect data for an MP3 frame analzyer */
153*8f5875f3SDavid du Colombier int
lame_set_analysis(lame_global_flags * gfp,int analysis)154*8f5875f3SDavid du Colombier lame_set_analysis( lame_global_flags* gfp,
155*8f5875f3SDavid du Colombier int analysis )
156*8f5875f3SDavid du Colombier {
157*8f5875f3SDavid du Colombier /* default = 0 */
158*8f5875f3SDavid du Colombier
159*8f5875f3SDavid du Colombier /* enforce disable/enable meaning, if we need more than two values
160*8f5875f3SDavid du Colombier we need to switch to an enum to have an apropriate representation
161*8f5875f3SDavid du Colombier of the possible meanings of the value */
162*8f5875f3SDavid du Colombier if ( 0 > analysis || 1 < analysis )
163*8f5875f3SDavid du Colombier return -1;
164*8f5875f3SDavid du Colombier
165*8f5875f3SDavid du Colombier gfp->analysis = analysis;
166*8f5875f3SDavid du Colombier
167*8f5875f3SDavid du Colombier return 0;
168*8f5875f3SDavid du Colombier }
169*8f5875f3SDavid du Colombier
170*8f5875f3SDavid du Colombier int
lame_get_analysis(const lame_global_flags * gfp)171*8f5875f3SDavid du Colombier lame_get_analysis( const lame_global_flags* gfp )
172*8f5875f3SDavid du Colombier {
173*8f5875f3SDavid du Colombier assert( 0 <= gfp->analysis && 1 >= gfp->analysis );
174*8f5875f3SDavid du Colombier
175*8f5875f3SDavid du Colombier return gfp->analysis;
176*8f5875f3SDavid du Colombier }
177*8f5875f3SDavid du Colombier
178*8f5875f3SDavid du Colombier
179*8f5875f3SDavid du Colombier /* write a Xing VBR header frame */
180*8f5875f3SDavid du Colombier int
lame_set_bWriteVbrTag(lame_global_flags * gfp,int bWriteVbrTag)181*8f5875f3SDavid du Colombier lame_set_bWriteVbrTag( lame_global_flags* gfp,
182*8f5875f3SDavid du Colombier int bWriteVbrTag )
183*8f5875f3SDavid du Colombier {
184*8f5875f3SDavid du Colombier /* default = 1 (on) for VBR/ABR modes, 0 (off) for CBR mode */
185*8f5875f3SDavid du Colombier
186*8f5875f3SDavid du Colombier /* enforce disable/enable meaning, if we need more than two values
187*8f5875f3SDavid du Colombier we need to switch to an enum to have an apropriate representation
188*8f5875f3SDavid du Colombier of the possible meanings of the value */
189*8f5875f3SDavid du Colombier if ( 0 > bWriteVbrTag || 1 < bWriteVbrTag )
190*8f5875f3SDavid du Colombier return -1;
191*8f5875f3SDavid du Colombier
192*8f5875f3SDavid du Colombier gfp->bWriteVbrTag = bWriteVbrTag;
193*8f5875f3SDavid du Colombier
194*8f5875f3SDavid du Colombier return 0;
195*8f5875f3SDavid du Colombier }
196*8f5875f3SDavid du Colombier
197*8f5875f3SDavid du Colombier int
lame_get_bWriteVbrTag(const lame_global_flags * gfp)198*8f5875f3SDavid du Colombier lame_get_bWriteVbrTag( const lame_global_flags* gfp )
199*8f5875f3SDavid du Colombier {
200*8f5875f3SDavid du Colombier assert( 0 <= gfp->bWriteVbrTag && 1 >= gfp->bWriteVbrTag );
201*8f5875f3SDavid du Colombier
202*8f5875f3SDavid du Colombier return gfp->bWriteVbrTag;
203*8f5875f3SDavid du Colombier }
204*8f5875f3SDavid du Colombier
205*8f5875f3SDavid du Colombier
206*8f5875f3SDavid du Colombier /* disable writing a wave header with *decoding* */
207*8f5875f3SDavid du Colombier int
lame_set_disable_waveheader(lame_global_flags * gfp,int disable_waveheader)208*8f5875f3SDavid du Colombier lame_set_disable_waveheader( lame_global_flags* gfp,
209*8f5875f3SDavid du Colombier int disable_waveheader )
210*8f5875f3SDavid du Colombier {
211*8f5875f3SDavid du Colombier /* default = 0 (disabled) */
212*8f5875f3SDavid du Colombier
213*8f5875f3SDavid du Colombier /* enforce disable/enable meaning, if we need more than two values
214*8f5875f3SDavid du Colombier we need to switch to an enum to have an apropriate representation
215*8f5875f3SDavid du Colombier of the possible meanings of the value */
216*8f5875f3SDavid du Colombier if ( 0 > disable_waveheader || 1 < disable_waveheader )
217*8f5875f3SDavid du Colombier return -1;
218*8f5875f3SDavid du Colombier
219*8f5875f3SDavid du Colombier gfp->disable_waveheader = disable_waveheader;
220*8f5875f3SDavid du Colombier
221*8f5875f3SDavid du Colombier return 0;
222*8f5875f3SDavid du Colombier }
223*8f5875f3SDavid du Colombier
224*8f5875f3SDavid du Colombier int
lame_get_disable_waveheader(const lame_global_flags * gfp)225*8f5875f3SDavid du Colombier lame_get_disable_waveheader( const lame_global_flags* gfp )
226*8f5875f3SDavid du Colombier {
227*8f5875f3SDavid du Colombier assert( 0 <= gfp->disable_waveheader && 1 >= gfp->disable_waveheader );
228*8f5875f3SDavid du Colombier
229*8f5875f3SDavid du Colombier return gfp->disable_waveheader;
230*8f5875f3SDavid du Colombier }
231*8f5875f3SDavid du Colombier
232*8f5875f3SDavid du Colombier
233*8f5875f3SDavid du Colombier /* decode only, use lame/mpglib to convert mp3/ogg to wav */
234*8f5875f3SDavid du Colombier int
lame_set_decode_only(lame_global_flags * gfp,int decode_only)235*8f5875f3SDavid du Colombier lame_set_decode_only( lame_global_flags* gfp,
236*8f5875f3SDavid du Colombier int decode_only )
237*8f5875f3SDavid du Colombier {
238*8f5875f3SDavid du Colombier /* default = 0 (disabled) */
239*8f5875f3SDavid du Colombier
240*8f5875f3SDavid du Colombier /* enforce disable/enable meaning, if we need more than two values
241*8f5875f3SDavid du Colombier we need to switch to an enum to have an apropriate representation
242*8f5875f3SDavid du Colombier of the possible meanings of the value */
243*8f5875f3SDavid du Colombier if ( 0 > decode_only || 1 < decode_only )
244*8f5875f3SDavid du Colombier return -1;
245*8f5875f3SDavid du Colombier
246*8f5875f3SDavid du Colombier gfp->decode_only = decode_only;
247*8f5875f3SDavid du Colombier
248*8f5875f3SDavid du Colombier return 0;
249*8f5875f3SDavid du Colombier }
250*8f5875f3SDavid du Colombier
251*8f5875f3SDavid du Colombier int
lame_get_decode_only(const lame_global_flags * gfp)252*8f5875f3SDavid du Colombier lame_get_decode_only( const lame_global_flags* gfp )
253*8f5875f3SDavid du Colombier {
254*8f5875f3SDavid du Colombier assert( 0 <= gfp->decode_only && 1 >= gfp->decode_only );
255*8f5875f3SDavid du Colombier
256*8f5875f3SDavid du Colombier return gfp->decode_only;
257*8f5875f3SDavid du Colombier }
258*8f5875f3SDavid du Colombier
259*8f5875f3SDavid du Colombier
260*8f5875f3SDavid du Colombier /* encode a Vorbis .ogg file */
261*8f5875f3SDavid du Colombier int
lame_set_ogg(lame_global_flags * gfp,int ogg)262*8f5875f3SDavid du Colombier lame_set_ogg( lame_global_flags* gfp,
263*8f5875f3SDavid du Colombier int ogg )
264*8f5875f3SDavid du Colombier {
265*8f5875f3SDavid du Colombier /* default = 0 (disabled) */
266*8f5875f3SDavid du Colombier
267*8f5875f3SDavid du Colombier /* enforce disable/enable meaning, if we need more than two values
268*8f5875f3SDavid du Colombier we need to switch to an enum to have an apropriate representation
269*8f5875f3SDavid du Colombier of the possible meanings of the value */
270*8f5875f3SDavid du Colombier if ( 0 > ogg || 1 < ogg )
271*8f5875f3SDavid du Colombier return -1;
272*8f5875f3SDavid du Colombier
273*8f5875f3SDavid du Colombier gfp->ogg = ogg;
274*8f5875f3SDavid du Colombier
275*8f5875f3SDavid du Colombier return 0;
276*8f5875f3SDavid du Colombier }
277*8f5875f3SDavid du Colombier
278*8f5875f3SDavid du Colombier int
lame_get_ogg(const lame_global_flags * gfp)279*8f5875f3SDavid du Colombier lame_get_ogg( const lame_global_flags* gfp )
280*8f5875f3SDavid du Colombier {
281*8f5875f3SDavid du Colombier assert( 0 <= gfp->ogg && 1 >= gfp->ogg );
282*8f5875f3SDavid du Colombier
283*8f5875f3SDavid du Colombier return gfp->ogg;
284*8f5875f3SDavid du Colombier }
285*8f5875f3SDavid du Colombier
286*8f5875f3SDavid du Colombier
287*8f5875f3SDavid du Colombier /*
288*8f5875f3SDavid du Colombier * Internal algorithm selection.
289*8f5875f3SDavid du Colombier * True quality is determined by the bitrate but this variable will effect
290*8f5875f3SDavid du Colombier * quality by selecting expensive or cheap algorithms.
291*8f5875f3SDavid du Colombier * quality=0..9. 0=best (very slow). 9=worst.
292*8f5875f3SDavid du Colombier * recommended: 2 near-best quality, not too slow
293*8f5875f3SDavid du Colombier * 5 good quality, fast
294*8f5875f3SDavid du Colombier * 7 ok quality, really fast
295*8f5875f3SDavid du Colombier */
296*8f5875f3SDavid du Colombier int
lame_set_quality(lame_global_flags * gfp,int quality)297*8f5875f3SDavid du Colombier lame_set_quality( lame_global_flags* gfp,
298*8f5875f3SDavid du Colombier int quality )
299*8f5875f3SDavid du Colombier {
300*8f5875f3SDavid du Colombier gfp->quality = quality;
301*8f5875f3SDavid du Colombier
302*8f5875f3SDavid du Colombier return 0;
303*8f5875f3SDavid du Colombier }
304*8f5875f3SDavid du Colombier
305*8f5875f3SDavid du Colombier int
lame_get_quality(const lame_global_flags * gfp)306*8f5875f3SDavid du Colombier lame_get_quality( const lame_global_flags* gfp )
307*8f5875f3SDavid du Colombier {
308*8f5875f3SDavid du Colombier return gfp->quality;
309*8f5875f3SDavid du Colombier }
310*8f5875f3SDavid du Colombier
311*8f5875f3SDavid du Colombier
312*8f5875f3SDavid du Colombier /* mode = STEREO, JOINT_STEREO, DUAL_CHANNEL (not supported), MONO */
313*8f5875f3SDavid du Colombier int
lame_set_mode(lame_global_flags * gfp,MPEG_mode mode)314*8f5875f3SDavid du Colombier lame_set_mode( lame_global_flags* gfp,
315*8f5875f3SDavid du Colombier MPEG_mode mode )
316*8f5875f3SDavid du Colombier {
317*8f5875f3SDavid du Colombier /* default: lame chooses based on compression ratio and input channels */
318*8f5875f3SDavid du Colombier
319*8f5875f3SDavid du Colombier if( 0 > mode || MAX_INDICATOR <= mode )
320*8f5875f3SDavid du Colombier return -1; /* Unknown MPEG mode! */
321*8f5875f3SDavid du Colombier
322*8f5875f3SDavid du Colombier gfp->mode = mode;
323*8f5875f3SDavid du Colombier
324*8f5875f3SDavid du Colombier return 0;
325*8f5875f3SDavid du Colombier }
326*8f5875f3SDavid du Colombier
327*8f5875f3SDavid du Colombier MPEG_mode
lame_get_mode(const lame_global_flags * gfp)328*8f5875f3SDavid du Colombier lame_get_mode( const lame_global_flags* gfp )
329*8f5875f3SDavid du Colombier {
330*8f5875f3SDavid du Colombier assert( 0 <= gfp->mode && MAX_INDICATOR > gfp->mode );
331*8f5875f3SDavid du Colombier
332*8f5875f3SDavid du Colombier return gfp->mode;
333*8f5875f3SDavid du Colombier }
334*8f5875f3SDavid du Colombier
335*8f5875f3SDavid du Colombier
336*8f5875f3SDavid du Colombier /* Us a M/S mode with a switching threshold based on compression ratio */
337*8f5875f3SDavid du Colombier int
lame_set_mode_automs(lame_global_flags * gfp,int mode_automs)338*8f5875f3SDavid du Colombier lame_set_mode_automs( lame_global_flags* gfp,
339*8f5875f3SDavid du Colombier int mode_automs )
340*8f5875f3SDavid du Colombier {
341*8f5875f3SDavid du Colombier /* default = 0 (disabled) */
342*8f5875f3SDavid du Colombier
343*8f5875f3SDavid du Colombier /* enforce disable/enable meaning, if we need more than two values
344*8f5875f3SDavid du Colombier we need to switch to an enum to have an apropriate representation
345*8f5875f3SDavid du Colombier of the possible meanings of the value */
346*8f5875f3SDavid du Colombier if ( 0 > mode_automs || 1 < mode_automs )
347*8f5875f3SDavid du Colombier return -1;
348*8f5875f3SDavid du Colombier
349*8f5875f3SDavid du Colombier gfp->mode_automs = mode_automs;
350*8f5875f3SDavid du Colombier
351*8f5875f3SDavid du Colombier return 0;
352*8f5875f3SDavid du Colombier }
353*8f5875f3SDavid du Colombier
354*8f5875f3SDavid du Colombier int
lame_get_mode_automs(const lame_global_flags * gfp)355*8f5875f3SDavid du Colombier lame_get_mode_automs( const lame_global_flags* gfp )
356*8f5875f3SDavid du Colombier {
357*8f5875f3SDavid du Colombier assert( 0 <= gfp->mode_automs && 1 >= gfp->mode_automs );
358*8f5875f3SDavid du Colombier
359*8f5875f3SDavid du Colombier return gfp->mode_automs;
360*8f5875f3SDavid du Colombier }
361*8f5875f3SDavid du Colombier
362*8f5875f3SDavid du Colombier
363*8f5875f3SDavid du Colombier // force_ms. Force M/S for all frames. For testing only.
364*8f5875f3SDavid du Colombier // default = 0 (disabled)
365*8f5875f3SDavid du Colombier int
366*8f5875f3SDavid du Colombier lame_set_force_ms( lame_global_flags* gfp,
367*8f5875f3SDavid du Colombier int force_ms );
368*8f5875f3SDavid du Colombier int
369*8f5875f3SDavid du Colombier lame_get_force_ms( const lame_global_flags* gfp );
370*8f5875f3SDavid du Colombier
371*8f5875f3SDavid du Colombier
372*8f5875f3SDavid du Colombier // use free_format? default = 0 (disabled)
373*8f5875f3SDavid du Colombier int
374*8f5875f3SDavid du Colombier lame_set_free_format( lame_global_flags* gfp,
375*8f5875f3SDavid du Colombier int free_format );
376*8f5875f3SDavid du Colombier int
377*8f5875f3SDavid du Colombier lame_get_free_format( const lame_global_flags* gfp );
378*8f5875f3SDavid du Colombier
379*8f5875f3SDavid du Colombier
380*8f5875f3SDavid du Colombier /* message handlers */
381*8f5875f3SDavid du Colombier int
lame_set_errorf(lame_global_flags * gfp,void (* func)(const char *,va_list))382*8f5875f3SDavid du Colombier lame_set_errorf( lame_global_flags* gfp,
383*8f5875f3SDavid du Colombier void (*func)( const char*, va_list ) )
384*8f5875f3SDavid du Colombier {
385*8f5875f3SDavid du Colombier gfp->report.errorf = func;
386*8f5875f3SDavid du Colombier
387*8f5875f3SDavid du Colombier return 0;
388*8f5875f3SDavid du Colombier }
389*8f5875f3SDavid du Colombier
390*8f5875f3SDavid du Colombier int
lame_set_debugf(lame_global_flags * gfp,void (* func)(const char *,va_list))391*8f5875f3SDavid du Colombier lame_set_debugf( lame_global_flags* gfp,
392*8f5875f3SDavid du Colombier void (*func)( const char*, va_list ) )
393*8f5875f3SDavid du Colombier {
394*8f5875f3SDavid du Colombier gfp->report.debugf = func;
395*8f5875f3SDavid du Colombier
396*8f5875f3SDavid du Colombier return 0;
397*8f5875f3SDavid du Colombier }
398*8f5875f3SDavid du Colombier
399*8f5875f3SDavid du Colombier int
lame_set_msgf(lame_global_flags * gfp,void (* func)(const char *,va_list))400*8f5875f3SDavid du Colombier lame_set_msgf( lame_global_flags* gfp,
401*8f5875f3SDavid du Colombier void (*func)( const char *, va_list ) )
402*8f5875f3SDavid du Colombier {
403*8f5875f3SDavid du Colombier gfp->report.msgf = func;
404*8f5875f3SDavid du Colombier
405*8f5875f3SDavid du Colombier return 0;
406*8f5875f3SDavid du Colombier }
407*8f5875f3SDavid du Colombier
408*8f5875f3SDavid du Colombier
409*8f5875f3SDavid du Colombier /* set one of brate compression ratio. default is compression ratio of 11. */
410*8f5875f3SDavid du Colombier int
411*8f5875f3SDavid du Colombier lame_set_brate( lame_global_flags* gfp,
412*8f5875f3SDavid du Colombier int brate );
413*8f5875f3SDavid du Colombier int
414*8f5875f3SDavid du Colombier lame_get_brate( const lame_global_flags* gfp );
415*8f5875f3SDavid du Colombier int
416*8f5875f3SDavid du Colombier lame_set_compression_ratio( lame_global_flags* gfp,
417*8f5875f3SDavid du Colombier float compression_ratio );
418*8f5875f3SDavid du Colombier float
419*8f5875f3SDavid du Colombier lame_get_compression_ratio( const lame_global_flags* gfp );
420*8f5875f3SDavid du Colombier
421*8f5875f3SDavid du Colombier
422*8f5875f3SDavid du Colombier
423*8f5875f3SDavid du Colombier
424*8f5875f3SDavid du Colombier /*
425*8f5875f3SDavid du Colombier * frame parameters
426*8f5875f3SDavid du Colombier */
427*8f5875f3SDavid du Colombier
428*8f5875f3SDavid du Colombier // mark as copyright. default=0
429*8f5875f3SDavid du Colombier int
430*8f5875f3SDavid du Colombier lame_set_copyright( lame_global_flags* gfp,
431*8f5875f3SDavid du Colombier int copyright );
432*8f5875f3SDavid du Colombier int
433*8f5875f3SDavid du Colombier lame_get_copyright( const lame_global_flags* gfp );
434*8f5875f3SDavid du Colombier
435*8f5875f3SDavid du Colombier
436*8f5875f3SDavid du Colombier // mark as original. default=1
437*8f5875f3SDavid du Colombier int
438*8f5875f3SDavid du Colombier lame_set_original( lame_global_flags* gfp,
439*8f5875f3SDavid du Colombier int original );
440*8f5875f3SDavid du Colombier int
441*8f5875f3SDavid du Colombier lame_get_original( const lame_global_flags* gfp );
442*8f5875f3SDavid du Colombier
443*8f5875f3SDavid du Colombier
444*8f5875f3SDavid du Colombier // error_protection. Use 2 bytes from each fraome for CRC checksum. default=0
445*8f5875f3SDavid du Colombier int
446*8f5875f3SDavid du Colombier lame_set_error_protection( lame_global_flags* gfp,
447*8f5875f3SDavid du Colombier int error_protection );
448*8f5875f3SDavid du Colombier int
449*8f5875f3SDavid du Colombier lame_get_error_protection( const lame_global_flags* gfp );
450*8f5875f3SDavid du Colombier
451*8f5875f3SDavid du Colombier
452*8f5875f3SDavid du Colombier // padding_type. 0=pad no frames 1=pad all frames 2=adjust padding(default)
453*8f5875f3SDavid du Colombier int
454*8f5875f3SDavid du Colombier lame_set_padding_type( lame_global_flags* gfp,
455*8f5875f3SDavid du Colombier int padding_type );
456*8f5875f3SDavid du Colombier int
457*8f5875f3SDavid du Colombier lame_get_padding_type( const lame_global_flags* gfp );
458*8f5875f3SDavid du Colombier
459*8f5875f3SDavid du Colombier
460*8f5875f3SDavid du Colombier // MP3 'private extension' bit Meaningless
461*8f5875f3SDavid du Colombier int
462*8f5875f3SDavid du Colombier lame_set_extension( lame_global_flags* gfp,
463*8f5875f3SDavid du Colombier int extension );
464*8f5875f3SDavid du Colombier int
465*8f5875f3SDavid du Colombier lame_get_extension( const lame_global_flags* gfp );
466*8f5875f3SDavid du Colombier
467*8f5875f3SDavid du Colombier
468*8f5875f3SDavid du Colombier // enforce strict ISO compliance. default=0
469*8f5875f3SDavid du Colombier int
470*8f5875f3SDavid du Colombier lame_set_strict_ISO( lame_global_flags* gfp,
471*8f5875f3SDavid du Colombier int strict_ISO );
472*8f5875f3SDavid du Colombier int
473*8f5875f3SDavid du Colombier lame_get_strict_ISO( const lame_global_flags* gfp );
474*8f5875f3SDavid du Colombier
475*8f5875f3SDavid du Colombier
476*8f5875f3SDavid du Colombier
477*8f5875f3SDavid du Colombier
478*8f5875f3SDavid du Colombier /********************************************************************
479*8f5875f3SDavid du Colombier * quantization/noise shaping
480*8f5875f3SDavid du Colombier ***********************************************************************/
481*8f5875f3SDavid du Colombier
482*8f5875f3SDavid du Colombier // disable the bit reservoir. For testing only. default=0
483*8f5875f3SDavid du Colombier int
484*8f5875f3SDavid du Colombier lame_set_disable_reservoir( lame_global_flags* gfp,
485*8f5875f3SDavid du Colombier int disable_reservoir );
486*8f5875f3SDavid du Colombier int
487*8f5875f3SDavid du Colombier lame_get_disable_reservoir( const lame_global_flags* gfp );
488*8f5875f3SDavid du Colombier
489*8f5875f3SDavid du Colombier
490*8f5875f3SDavid du Colombier // select a different "best quantization" function. default=0
491*8f5875f3SDavid du Colombier int
492*8f5875f3SDavid du Colombier lame_set_experimentalX( lame_global_flags* gfp,
493*8f5875f3SDavid du Colombier int experimentalX );
494*8f5875f3SDavid du Colombier int
495*8f5875f3SDavid du Colombier lame_get_experimentalX( const lame_global_flags* gfp );
496*8f5875f3SDavid du Colombier
497*8f5875f3SDavid du Colombier
498*8f5875f3SDavid du Colombier // another experimental option. for testing only
499*8f5875f3SDavid du Colombier int
500*8f5875f3SDavid du Colombier lame_set_experimentalY( lame_global_flags* gfp,
501*8f5875f3SDavid du Colombier int experimentalY );
502*8f5875f3SDavid du Colombier int
503*8f5875f3SDavid du Colombier lame_get_experimentalY( const lame_global_flags* gfp );
504*8f5875f3SDavid du Colombier
505*8f5875f3SDavid du Colombier
506*8f5875f3SDavid du Colombier // another experimental option. for testing only
507*8f5875f3SDavid du Colombier int
508*8f5875f3SDavid du Colombier lame_set_experimentalZ( lame_global_flags* gfp,
509*8f5875f3SDavid du Colombier int experimentalZ );
510*8f5875f3SDavid du Colombier int
511*8f5875f3SDavid du Colombier lame_get_experimentalZ( const lame_global_flags* gfp );
512*8f5875f3SDavid du Colombier
513*8f5875f3SDavid du Colombier
514*8f5875f3SDavid du Colombier // Naoki's psycho acoustic model. default=0
515*8f5875f3SDavid du Colombier int
516*8f5875f3SDavid du Colombier lame_set_exp_nspsytune( lame_global_flags* gfp,
517*8f5875f3SDavid du Colombier int exp_nspsytune );
518*8f5875f3SDavid du Colombier int
519*8f5875f3SDavid du Colombier lame_get_exp_nspsytune( const lame_global_flags* gfp );
520*8f5875f3SDavid du Colombier
521*8f5875f3SDavid du Colombier
522*8f5875f3SDavid du Colombier
523*8f5875f3SDavid du Colombier
524*8f5875f3SDavid du Colombier /********************************************************************
525*8f5875f3SDavid du Colombier * VBR control
526*8f5875f3SDavid du Colombier ***********************************************************************/
527*8f5875f3SDavid du Colombier
528*8f5875f3SDavid du Colombier // Types of VBR. default = vbr_off = CBR
529*8f5875f3SDavid du Colombier int
530*8f5875f3SDavid du Colombier lame_set_VBR( lame_global_flags* gfp,
531*8f5875f3SDavid du Colombier vbr_mode VBR );
532*8f5875f3SDavid du Colombier vbr_mode
533*8f5875f3SDavid du Colombier lame_get_exp_VBR( const lame_global_flags* gfp );
534*8f5875f3SDavid du Colombier
535*8f5875f3SDavid du Colombier
536*8f5875f3SDavid du Colombier // VBR quality level. 0=highest 9=lowest
537*8f5875f3SDavid du Colombier int
538*8f5875f3SDavid du Colombier lame_set_VBR_q( lame_global_flags* gfp,
539*8f5875f3SDavid du Colombier int VBR_q );
540*8f5875f3SDavid du Colombier int
541*8f5875f3SDavid du Colombier lame_get_VBR_q( const lame_global_flags* gfp );
542*8f5875f3SDavid du Colombier
543*8f5875f3SDavid du Colombier
544*8f5875f3SDavid du Colombier // Ignored except for VBR=vbr_abr (ABR mode)
545*8f5875f3SDavid du Colombier int
546*8f5875f3SDavid du Colombier lame_set_VBR_mean_bitrate_kbps( lame_global_flags* gfp,
547*8f5875f3SDavid du Colombier int VBR_mean_bitrate_kbps );
548*8f5875f3SDavid du Colombier int
549*8f5875f3SDavid du Colombier lame_get_VBR_mean_bitrate_kbps( const lame_global_flags* gfp );
550*8f5875f3SDavid du Colombier
551*8f5875f3SDavid du Colombier int
552*8f5875f3SDavid du Colombier lame_set_VBR_min_bitrate_kbps( lame_global_flags* gfp,
553*8f5875f3SDavid du Colombier int VBR_min_bitrate_kbps );
554*8f5875f3SDavid du Colombier int
555*8f5875f3SDavid du Colombier lame_get_VBR_min_bitrate_kbps( const lame_global_flags* gfp );
556*8f5875f3SDavid du Colombier
557*8f5875f3SDavid du Colombier int
558*8f5875f3SDavid du Colombier lame_set_VBR_max_bitrate_kbps( lame_global_flags* gfp,
559*8f5875f3SDavid du Colombier int VBR_max_bitrate_kbps );
560*8f5875f3SDavid du Colombier int
561*8f5875f3SDavid du Colombier lame_get_VBR_max_bitrate_kbps( const lame_global_flags* gfp );
562*8f5875f3SDavid du Colombier
563*8f5875f3SDavid du Colombier
564*8f5875f3SDavid du Colombier // 1=stricetly enforce VBR_min_bitrate. Normally it will be violated for
565*8f5875f3SDavid du Colombier // analog silence
566*8f5875f3SDavid du Colombier int
567*8f5875f3SDavid du Colombier lame_set_VBR_hard_min( lame_global_flags* gfp,
568*8f5875f3SDavid du Colombier int VBR_hard_min );
569*8f5875f3SDavid du Colombier int
570*8f5875f3SDavid du Colombier lame_get_VBR_hard_min( const lame_global_flags* gfp );
571*8f5875f3SDavid du Colombier
572*8f5875f3SDavid du Colombier
573*8f5875f3SDavid du Colombier /********************************************************************
574*8f5875f3SDavid du Colombier * Filtering control
575*8f5875f3SDavid du Colombier ***********************************************************************/
576*8f5875f3SDavid du Colombier
577*8f5875f3SDavid du Colombier // freq in Hz to apply lowpass. Default = 0 = lame chooses. -1 = disabled
578*8f5875f3SDavid du Colombier int
579*8f5875f3SDavid du Colombier lame_set_lowpassfreq( lame_global_flags* gfp,
580*8f5875f3SDavid du Colombier int lowpassfreq );
581*8f5875f3SDavid du Colombier int
582*8f5875f3SDavid du Colombier lame_get_lowpassfreq( const lame_global_flags* gfp );
583*8f5875f3SDavid du Colombier
584*8f5875f3SDavid du Colombier
585*8f5875f3SDavid du Colombier // width of transition band, in Hz. Default = one polyphase filter band
586*8f5875f3SDavid du Colombier int
587*8f5875f3SDavid du Colombier lame_set_lowpasswidth( lame_global_flags* gfp,
588*8f5875f3SDavid du Colombier int lowpasswidth );
589*8f5875f3SDavid du Colombier int
590*8f5875f3SDavid du Colombier lame_get_lowpasswidth( const lame_global_flags* gfp );
591*8f5875f3SDavid du Colombier
592*8f5875f3SDavid du Colombier
593*8f5875f3SDavid du Colombier // freq in Hz to apply highpass. Default = 0 = lame chooses. -1 = disabled
594*8f5875f3SDavid du Colombier int
595*8f5875f3SDavid du Colombier lame_set_highpassfreq( lame_global_flags* gfp,
596*8f5875f3SDavid du Colombier int highpassfreq );
597*8f5875f3SDavid du Colombier int
598*8f5875f3SDavid du Colombier lame_get_highpassfreq( const lame_global_flags* gfp );
599*8f5875f3SDavid du Colombier
600*8f5875f3SDavid du Colombier
601*8f5875f3SDavid du Colombier // width of transition band, in Hz. Default = one polyphase filter band
602*8f5875f3SDavid du Colombier int
603*8f5875f3SDavid du Colombier lame_set_highpasswidth( lame_global_flags* gfp,
604*8f5875f3SDavid du Colombier int highpasswidth );
605*8f5875f3SDavid du Colombier int
606*8f5875f3SDavid du Colombier lame_get_highpasswidth( const lame_global_flags* gfp );
607*8f5875f3SDavid du Colombier
608*8f5875f3SDavid du Colombier
609*8f5875f3SDavid du Colombier
610*8f5875f3SDavid du Colombier
611*8f5875f3SDavid du Colombier /*
612*8f5875f3SDavid du Colombier * psycho acoustics and other arguments which you should not change
613*8f5875f3SDavid du Colombier * unless you know what you are doing
614*8f5875f3SDavid du Colombier */
615*8f5875f3SDavid du Colombier
616*8f5875f3SDavid du Colombier // only use ATH for masking
617*8f5875f3SDavid du Colombier int
618*8f5875f3SDavid du Colombier lame_set_ATHonly( lame_global_flags* gfp,
619*8f5875f3SDavid du Colombier int ATHonly );
620*8f5875f3SDavid du Colombier int
621*8f5875f3SDavid du Colombier lame_get_ATHonly( const lame_global_flags* gfp );
622*8f5875f3SDavid du Colombier
623*8f5875f3SDavid du Colombier
624*8f5875f3SDavid du Colombier // only use ATH for short blocks
625*8f5875f3SDavid du Colombier int
626*8f5875f3SDavid du Colombier lame_set_ATHshort( lame_global_flags* gfp,
627*8f5875f3SDavid du Colombier int ATHshort );
628*8f5875f3SDavid du Colombier int
629*8f5875f3SDavid du Colombier lame_get_ATHshort( const lame_global_flags* gfp );
630*8f5875f3SDavid du Colombier
631*8f5875f3SDavid du Colombier
632*8f5875f3SDavid du Colombier // disable ATH
633*8f5875f3SDavid du Colombier int
634*8f5875f3SDavid du Colombier lame_set_noATH( lame_global_flags* gfp,
635*8f5875f3SDavid du Colombier int noATH );
636*8f5875f3SDavid du Colombier int
637*8f5875f3SDavid du Colombier lame_get_noATH( const lame_global_flags* gfp );
638*8f5875f3SDavid du Colombier
639*8f5875f3SDavid du Colombier
640*8f5875f3SDavid du Colombier // select ATH formula
641*8f5875f3SDavid du Colombier int
642*8f5875f3SDavid du Colombier lame_set_ATHtype( lame_global_flags* gfp,
643*8f5875f3SDavid du Colombier int ATHtype );
644*8f5875f3SDavid du Colombier int
645*8f5875f3SDavid du Colombier lame_get_ATHtype( const lame_global_flags* gfp );
646*8f5875f3SDavid du Colombier
647*8f5875f3SDavid du Colombier
648*8f5875f3SDavid du Colombier // lower ATH by this many db
649*8f5875f3SDavid du Colombier int
650*8f5875f3SDavid du Colombier lame_set_ATHlower( lame_global_flags* gfp,
651*8f5875f3SDavid du Colombier float ATHlower );
652*8f5875f3SDavid du Colombier float
653*8f5875f3SDavid du Colombier lame_get_ATHlower( const lame_global_flags* gfp );
654*8f5875f3SDavid du Colombier
655*8f5875f3SDavid du Colombier
656*8f5875f3SDavid du Colombier // predictability limit (ISO tonality formula)
657*8f5875f3SDavid du Colombier int
658*8f5875f3SDavid du Colombier lame_set_cwlimit( lame_global_flags* gfp,
659*8f5875f3SDavid du Colombier int cwlimit );
660*8f5875f3SDavid du Colombier int
661*8f5875f3SDavid du Colombier lame_get_cwlimit( const lame_global_flags* gfp );
662*8f5875f3SDavid du Colombier
663*8f5875f3SDavid du Colombier
664*8f5875f3SDavid du Colombier // allow blocktypes to differ between channels?
665*8f5875f3SDavid du Colombier // default: 0 for jstereo, 1 for stereo
666*8f5875f3SDavid du Colombier int
667*8f5875f3SDavid du Colombier lame_set_allow_diff_short( lame_global_flags* gfp,
668*8f5875f3SDavid du Colombier int allow_diff_short );
669*8f5875f3SDavid du Colombier int
670*8f5875f3SDavid du Colombier lame_get_allow_diff_short( const lame_global_flags* gfp );
671*8f5875f3SDavid du Colombier
672*8f5875f3SDavid du Colombier
673*8f5875f3SDavid du Colombier // use temporal masking effect (default = 1)
674*8f5875f3SDavid du Colombier int
675*8f5875f3SDavid du Colombier lame_set_useTemporal( lame_global_flags* gfp,
676*8f5875f3SDavid du Colombier int useTemporal );
677*8f5875f3SDavid du Colombier int
678*8f5875f3SDavid du Colombier lame_get_useTemporal( const lame_global_flags* gfp );
679*8f5875f3SDavid du Colombier
680*8f5875f3SDavid du Colombier
681*8f5875f3SDavid du Colombier // disable short blocks
682*8f5875f3SDavid du Colombier int
683*8f5875f3SDavid du Colombier lame_set_no_short_blocks( lame_global_flags* gfp,
684*8f5875f3SDavid du Colombier int no_short_blocks );
685*8f5875f3SDavid du Colombier int
686*8f5875f3SDavid du Colombier lame_get_no_short_blocks( const lame_global_flags* gfp );
687*8f5875f3SDavid du Colombier
688*8f5875f3SDavid du Colombier
689*8f5875f3SDavid du Colombier /* Input PCM is emphased PCM (for instance from one of the rarely
690*8f5875f3SDavid du Colombier emphased CDs), it is STRONGLY not recommended to use this, because
691*8f5875f3SDavid du Colombier psycho does not take it into account, and last but not least many decoders
692*8f5875f3SDavid du Colombier ignore these bits */
693*8f5875f3SDavid du Colombier int
694*8f5875f3SDavid du Colombier lame_set_emphasis( lame_global_flags* gfp,
695*8f5875f3SDavid du Colombier int emphasis );
696*8f5875f3SDavid du Colombier int
697*8f5875f3SDavid du Colombier lame_get_emphasis( const lame_global_flags* gfp );
698*8f5875f3SDavid du Colombier
699*8f5875f3SDavid du Colombier
700*8f5875f3SDavid du Colombier
701*8f5875f3SDavid du Colombier
702*8f5875f3SDavid du Colombier /***************************************************************/
703*8f5875f3SDavid du Colombier /* internal variables, cannot be set... */
704*8f5875f3SDavid du Colombier /* provided because they may be of use to calling application */
705*8f5875f3SDavid du Colombier /***************************************************************/
706*8f5875f3SDavid du Colombier
707*8f5875f3SDavid du Colombier // version 0=MPEG-2 1=MPEG-1 (2=MPEG-2.5)
708*8f5875f3SDavid du Colombier int
709*8f5875f3SDavid du Colombier lame_get_version( const lame_global_flags* gfp );
710*8f5875f3SDavid du Colombier
711*8f5875f3SDavid du Colombier
712*8f5875f3SDavid du Colombier // encoder delay
713*8f5875f3SDavid du Colombier int
714*8f5875f3SDavid du Colombier lame_get_encoder_delay( const lame_global_flags* gfp );
715*8f5875f3SDavid du Colombier
716*8f5875f3SDavid du Colombier
717*8f5875f3SDavid du Colombier // size of MPEG frame
718*8f5875f3SDavid du Colombier int
719*8f5875f3SDavid du Colombier lame_get_framesize( const lame_global_flags* gfp );
720*8f5875f3SDavid du Colombier
721*8f5875f3SDavid du Colombier
722*8f5875f3SDavid du Colombier // number of frames encoded so far
723*8f5875f3SDavid du Colombier int
724*8f5875f3SDavid du Colombier lame_get_frameNum( const lame_global_flags* gfp );
725*8f5875f3SDavid du Colombier
726*8f5875f3SDavid du Colombier
727*8f5875f3SDavid du Colombier // lame's estimate of the total number of frames to be encoded
728*8f5875f3SDavid du Colombier // only valid if calling program set num_samples
729*8f5875f3SDavid du Colombier int
730*8f5875f3SDavid du Colombier lame_get_totalframes( const lame_global_flags* gfp );
731