1 /* -*- mode: C; mode: fold -*- */
2 /*
3 * set/get functions for lame_global_flags
4 *
5 * Copyright (c) 2001-2005 Alexander Leidinger
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
21 */
22
23 /* $Id$ */
24
25 #ifdef HAVE_CONFIG_H
26 # include <config.h>
27 #endif
28
29 #include "lame.h"
30 #include "machine.h"
31 #include "encoder.h"
32 #include "util.h"
33 #include "bitstream.h" /* because of compute_flushbits */
34
35 #include "set_get.h"
36 #include "lame_global_flags.h"
37
38 /*
39 * input stream description
40 */
41
42
43 /* number of samples */
44 /* it's unlikely for this function to return an error */
45 int
lame_set_num_samples(lame_global_flags * gfp,unsigned long num_samples)46 lame_set_num_samples(lame_global_flags * gfp, unsigned long num_samples)
47 {
48 if (is_lame_global_flags_valid(gfp)) {
49 /* default = 2^32-1 */
50 gfp->num_samples = num_samples;
51 return 0;
52 }
53 return -1;
54 }
55
56 unsigned long
lame_get_num_samples(const lame_global_flags * gfp)57 lame_get_num_samples(const lame_global_flags * gfp)
58 {
59 if (is_lame_global_flags_valid(gfp)) {
60 return gfp->num_samples;
61 }
62 return 0;
63 }
64
65
66 /* input samplerate */
67 int
lame_set_in_samplerate(lame_global_flags * gfp,int in_samplerate)68 lame_set_in_samplerate(lame_global_flags * gfp, int in_samplerate)
69 {
70 if (is_lame_global_flags_valid(gfp)) {
71 if (in_samplerate < 1)
72 return -1;
73 /* input sample rate in Hz, default = 44100 Hz */
74 gfp->samplerate_in = in_samplerate;
75 return 0;
76 }
77 return -1;
78 }
79
80 int
lame_get_in_samplerate(const lame_global_flags * gfp)81 lame_get_in_samplerate(const lame_global_flags * gfp)
82 {
83 if (is_lame_global_flags_valid(gfp)) {
84 return gfp->samplerate_in;
85 }
86 return 0;
87 }
88
89
90 /* number of channels in input stream */
91 int
lame_set_num_channels(lame_global_flags * gfp,int num_channels)92 lame_set_num_channels(lame_global_flags * gfp, int num_channels)
93 {
94 if (is_lame_global_flags_valid(gfp)) {
95 /* default = 2 */
96 if (2 < num_channels || 0 >= num_channels) {
97 return -1; /* we don't support more than 2 channels */
98 }
99 gfp->num_channels = num_channels;
100 return 0;
101 }
102 return -1;
103 }
104
105 int
lame_get_num_channels(const lame_global_flags * gfp)106 lame_get_num_channels(const lame_global_flags * gfp)
107 {
108 if (is_lame_global_flags_valid(gfp)) {
109 return gfp->num_channels;
110 }
111 return 0;
112 }
113
114
115 /* scale the input by this amount before encoding (not used for decoding) */
116 int
lame_set_scale(lame_global_flags * gfp,float scale)117 lame_set_scale(lame_global_flags * gfp, float scale)
118 {
119 if (is_lame_global_flags_valid(gfp)) {
120 /* default = 1 */
121 gfp->scale = scale;
122 return 0;
123 }
124 return -1;
125 }
126
127 float
lame_get_scale(const lame_global_flags * gfp)128 lame_get_scale(const lame_global_flags * gfp)
129 {
130 if (is_lame_global_flags_valid(gfp)) {
131 return gfp->scale;
132 }
133 return 0;
134 }
135
136
137 /* scale the channel 0 (left) input by this amount before
138 encoding (not used for decoding) */
139 int
lame_set_scale_left(lame_global_flags * gfp,float scale)140 lame_set_scale_left(lame_global_flags * gfp, float scale)
141 {
142 if (is_lame_global_flags_valid(gfp)) {
143 /* default = 1 */
144 gfp->scale_left = scale;
145 return 0;
146 }
147 return -1;
148 }
149
150 float
lame_get_scale_left(const lame_global_flags * gfp)151 lame_get_scale_left(const lame_global_flags * gfp)
152 {
153 if (is_lame_global_flags_valid(gfp)) {
154 return gfp->scale_left;
155 }
156 return 0;
157 }
158
159
160 /* scale the channel 1 (right) input by this amount before
161 encoding (not used for decoding) */
162 int
lame_set_scale_right(lame_global_flags * gfp,float scale)163 lame_set_scale_right(lame_global_flags * gfp, float scale)
164 {
165 if (is_lame_global_flags_valid(gfp)) {
166 /* default = 1 */
167 gfp->scale_right = scale;
168 return 0;
169 }
170 return -1;
171 }
172
173 float
lame_get_scale_right(const lame_global_flags * gfp)174 lame_get_scale_right(const lame_global_flags * gfp)
175 {
176 if (is_lame_global_flags_valid(gfp)) {
177 return gfp->scale_right;
178 }
179 return 0;
180 }
181
182
183 /* output sample rate in Hz */
184 int
lame_set_out_samplerate(lame_global_flags * gfp,int out_samplerate)185 lame_set_out_samplerate(lame_global_flags * gfp, int out_samplerate)
186 {
187 if (is_lame_global_flags_valid(gfp)) {
188 /*
189 * default = 0: LAME picks best value based on the amount
190 * of compression
191 * MPEG only allows:
192 * MPEG1 32, 44.1, 48khz
193 * MPEG2 16, 22.05, 24
194 * MPEG2.5 8, 11.025, 12
195 *
196 * (not used by decoding routines)
197 */
198 if (out_samplerate != 0) {
199 int v=0;
200 if (SmpFrqIndex(out_samplerate, &v) < 0)
201 return -1;
202 }
203 gfp->samplerate_out = out_samplerate;
204 return 0;
205 }
206 return -1;
207 }
208
209 int
lame_get_out_samplerate(const lame_global_flags * gfp)210 lame_get_out_samplerate(const lame_global_flags * gfp)
211 {
212 if (is_lame_global_flags_valid(gfp)) {
213 return gfp->samplerate_out;
214 }
215 return 0;
216 }
217
218
219
220
221 /*
222 * general control parameters
223 */
224
225 /* collect data for an MP3 frame analzyer */
226 int
lame_set_analysis(lame_global_flags * gfp,int analysis)227 lame_set_analysis(lame_global_flags * gfp, int analysis)
228 {
229 if (is_lame_global_flags_valid(gfp)) {
230 /* default = 0 */
231
232 /* enforce disable/enable meaning, if we need more than two values
233 we need to switch to an enum to have an apropriate representation
234 of the possible meanings of the value */
235 if (0 > analysis || 1 < analysis)
236 return -1;
237 gfp->analysis = analysis;
238 return 0;
239 }
240 return -1;
241 }
242
243 int
lame_get_analysis(const lame_global_flags * gfp)244 lame_get_analysis(const lame_global_flags * gfp)
245 {
246 if (is_lame_global_flags_valid(gfp)) {
247 assert(0 <= gfp->analysis && 1 >= gfp->analysis);
248 return gfp->analysis;
249 }
250 return 0;
251 }
252
253
254 /* write a Xing VBR header frame */
255 int
lame_set_bWriteVbrTag(lame_global_flags * gfp,int bWriteVbrTag)256 lame_set_bWriteVbrTag(lame_global_flags * gfp, int bWriteVbrTag)
257 {
258 if (is_lame_global_flags_valid(gfp)) {
259 /* default = 1 (on) for VBR/ABR modes, 0 (off) for CBR mode */
260
261 /* enforce disable/enable meaning, if we need more than two values
262 we need to switch to an enum to have an apropriate representation
263 of the possible meanings of the value */
264 if (0 > bWriteVbrTag || 1 < bWriteVbrTag)
265 return -1;
266 gfp->write_lame_tag = bWriteVbrTag;
267 return 0;
268 }
269 return -1;
270 }
271
272 int
lame_get_bWriteVbrTag(const lame_global_flags * gfp)273 lame_get_bWriteVbrTag(const lame_global_flags * gfp)
274 {
275 if (is_lame_global_flags_valid(gfp)) {
276 assert(0 <= gfp->write_lame_tag && 1 >= gfp->write_lame_tag);
277 return gfp->write_lame_tag;
278 }
279 return 0;
280 }
281
282
283
284 /* decode only, use lame/mpglib to convert mp3 to wav */
285 int
lame_set_decode_only(lame_global_flags * gfp,int decode_only)286 lame_set_decode_only(lame_global_flags * gfp, int decode_only)
287 {
288 if (is_lame_global_flags_valid(gfp)) {
289 /* default = 0 (disabled) */
290
291 /* enforce disable/enable meaning, if we need more than two values
292 we need to switch to an enum to have an apropriate representation
293 of the possible meanings of the value */
294 if (0 > decode_only || 1 < decode_only)
295 return -1;
296 gfp->decode_only = decode_only;
297 return 0;
298 }
299 return -1;
300 }
301
302 int
lame_get_decode_only(const lame_global_flags * gfp)303 lame_get_decode_only(const lame_global_flags * gfp)
304 {
305 if (is_lame_global_flags_valid(gfp)) {
306 assert(0 <= gfp->decode_only && 1 >= gfp->decode_only);
307 return gfp->decode_only;
308 }
309 return 0;
310 }
311
312
313 #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
314 /* 1=encode a Vorbis .ogg file. default=0 */
315 /* DEPRECATED */
316 int CDECL lame_set_ogg(lame_global_flags *, int);
317 int CDECL lame_get_ogg(const lame_global_flags *);
318 #else
319 #endif
320
321 /* encode a Vorbis .ogg file */
322 /* DEPRECATED */
323 int
lame_set_ogg(lame_global_flags * gfp,int ogg)324 lame_set_ogg(lame_global_flags * gfp, int ogg)
325 {
326 (void) gfp;
327 (void) ogg;
328 return -1;
329 }
330
331 int
lame_get_ogg(const lame_global_flags * gfp)332 lame_get_ogg(const lame_global_flags * gfp)
333 {
334 (void) gfp;
335 return 0;
336 }
337
338
339 /*
340 * Internal algorithm selection.
341 * True quality is determined by the bitrate but this variable will effect
342 * quality by selecting expensive or cheap algorithms.
343 * quality=0..9. 0=best (very slow). 9=worst.
344 * recommended: 3 near-best quality, not too slow
345 * 5 good quality, fast
346 * 7 ok quality, really fast
347 */
348 int
lame_set_quality(lame_global_flags * gfp,int quality)349 lame_set_quality(lame_global_flags * gfp, int quality)
350 {
351 if (is_lame_global_flags_valid(gfp)) {
352 if (quality < 0) {
353 gfp->quality = 0;
354 }
355 else if (quality > 9) {
356 gfp->quality = 9;
357 }
358 else {
359 gfp->quality = quality;
360 }
361 return 0;
362 }
363 return -1;
364 }
365
366 int
lame_get_quality(const lame_global_flags * gfp)367 lame_get_quality(const lame_global_flags * gfp)
368 {
369 if (is_lame_global_flags_valid(gfp)) {
370 return gfp->quality;
371 }
372 return 0;
373 }
374
375
376 /* mode = STEREO, JOINT_STEREO, DUAL_CHANNEL (not supported), MONO */
377 int
lame_set_mode(lame_global_flags * gfp,MPEG_mode mode)378 lame_set_mode(lame_global_flags * gfp, MPEG_mode mode)
379 {
380 if (is_lame_global_flags_valid(gfp)) {
381 int mpg_mode = mode;
382 /* default: lame chooses based on compression ratio and input channels */
383 if (mpg_mode < 0 || MAX_INDICATOR <= mpg_mode)
384 return -1; /* Unknown MPEG mode! */
385 gfp->mode = mode;
386 return 0;
387 }
388 return -1;
389 }
390
391 MPEG_mode
lame_get_mode(const lame_global_flags * gfp)392 lame_get_mode(const lame_global_flags * gfp)
393 {
394 if (is_lame_global_flags_valid(gfp)) {
395 assert(gfp->mode < MAX_INDICATOR);
396 return gfp->mode;
397 }
398 return NOT_SET;
399 }
400
401
402 #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
403 /*
404 mode_automs. Use a M/S mode with a switching threshold based on
405 compression ratio
406 DEPRECATED
407 */
408 int CDECL lame_set_mode_automs(lame_global_flags *, int);
409 int CDECL lame_get_mode_automs(const lame_global_flags *);
410 #else
411 #endif
412
413 /* Us a M/S mode with a switching threshold based on compression ratio */
414 /* DEPRECATED */
415 int
lame_set_mode_automs(lame_global_flags * gfp,int mode_automs)416 lame_set_mode_automs(lame_global_flags * gfp, int mode_automs)
417 {
418 if (is_lame_global_flags_valid(gfp)) {
419 /* default = 0 (disabled) */
420
421 /* enforce disable/enable meaning, if we need more than two values
422 we need to switch to an enum to have an apropriate representation
423 of the possible meanings of the value */
424 if (0 > mode_automs || 1 < mode_automs)
425 return -1;
426 lame_set_mode(gfp, JOINT_STEREO);
427 return 0;
428 }
429 return -1;
430 }
431
432 int
lame_get_mode_automs(const lame_global_flags * gfp)433 lame_get_mode_automs(const lame_global_flags * gfp)
434 {
435 (void) gfp;
436 return 1;
437 }
438
439
440 /*
441 * Force M/S for all frames. For testing only.
442 * Requires mode = 1.
443 */
444 int
lame_set_force_ms(lame_global_flags * gfp,int force_ms)445 lame_set_force_ms(lame_global_flags * gfp, int force_ms)
446 {
447 if (is_lame_global_flags_valid(gfp)) {
448 /* default = 0 (disabled) */
449
450 /* enforce disable/enable meaning, if we need more than two values
451 we need to switch to an enum to have an apropriate representation
452 of the possible meanings of the value */
453 if (0 > force_ms || 1 < force_ms)
454 return -1;
455 gfp->force_ms = force_ms;
456 return 0;
457 }
458 return -1;
459 }
460
461 int
lame_get_force_ms(const lame_global_flags * gfp)462 lame_get_force_ms(const lame_global_flags * gfp)
463 {
464 if (is_lame_global_flags_valid(gfp)) {
465 assert(0 <= gfp->force_ms && 1 >= gfp->force_ms);
466 return gfp->force_ms;
467 }
468 return 0;
469 }
470
471
472 /* Use free_format. */
473 int
lame_set_free_format(lame_global_flags * gfp,int free_format)474 lame_set_free_format(lame_global_flags * gfp, int free_format)
475 {
476 if (is_lame_global_flags_valid(gfp)) {
477 /* default = 0 (disabled) */
478
479 /* enforce disable/enable meaning, if we need more than two values
480 we need to switch to an enum to have an apropriate representation
481 of the possible meanings of the value */
482 if (0 > free_format || 1 < free_format)
483 return -1;
484 gfp->free_format = free_format;
485 return 0;
486 }
487 return -1;
488 }
489
490 int
lame_get_free_format(const lame_global_flags * gfp)491 lame_get_free_format(const lame_global_flags * gfp)
492 {
493 if (is_lame_global_flags_valid(gfp)) {
494 assert(0 <= gfp->free_format && 1 >= gfp->free_format);
495 return gfp->free_format;
496 }
497 return 0;
498 }
499
500
501
502 /* Perform ReplayGain analysis */
503 int
lame_set_findReplayGain(lame_global_flags * gfp,int findReplayGain)504 lame_set_findReplayGain(lame_global_flags * gfp, int findReplayGain)
505 {
506 if (is_lame_global_flags_valid(gfp)) {
507 /* default = 0 (disabled) */
508
509 /* enforce disable/enable meaning, if we need more than two values
510 we need to switch to an enum to have an apropriate representation
511 of the possible meanings of the value */
512 if (0 > findReplayGain || 1 < findReplayGain)
513 return -1;
514 gfp->findReplayGain = findReplayGain;
515 return 0;
516 }
517 return -1;
518 }
519
520 int
lame_get_findReplayGain(const lame_global_flags * gfp)521 lame_get_findReplayGain(const lame_global_flags * gfp)
522 {
523 if (is_lame_global_flags_valid(gfp)) {
524 assert(0 <= gfp->findReplayGain && 1 >= gfp->findReplayGain);
525 return gfp->findReplayGain;
526 }
527 return 0;
528 }
529
530
531 /* Decode on the fly. Find the peak sample. If ReplayGain analysis is
532 enabled then perform it on the decoded data. */
533 int
lame_set_decode_on_the_fly(lame_global_flags * gfp,int decode_on_the_fly)534 lame_set_decode_on_the_fly(lame_global_flags * gfp, int decode_on_the_fly)
535 {
536 if (is_lame_global_flags_valid(gfp)) {
537 #ifndef DECODE_ON_THE_FLY
538 return -1;
539 #else
540 /* default = 0 (disabled) */
541
542 /* enforce disable/enable meaning, if we need more than two values
543 we need to switch to an enum to have an apropriate representation
544 of the possible meanings of the value */
545 if (0 > decode_on_the_fly || 1 < decode_on_the_fly)
546 return -1;
547
548 gfp->decode_on_the_fly = decode_on_the_fly;
549
550 return 0;
551 #endif
552 }
553 return -1;
554 }
555
556 int
lame_get_decode_on_the_fly(const lame_global_flags * gfp)557 lame_get_decode_on_the_fly(const lame_global_flags * gfp)
558 {
559 if (is_lame_global_flags_valid(gfp)) {
560 assert(0 <= gfp->decode_on_the_fly && 1 >= gfp->decode_on_the_fly);
561 return gfp->decode_on_the_fly;
562 }
563 return 0;
564 }
565
566 #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
567 /* DEPRECATED: now does the same as lame_set_findReplayGain()
568 default = 0 (disabled) */
569 int CDECL lame_set_ReplayGain_input(lame_global_flags *, int);
570 int CDECL lame_get_ReplayGain_input(const lame_global_flags *);
571
572 /* DEPRECATED: now does the same as
573 lame_set_decode_on_the_fly() && lame_set_findReplayGain()
574 default = 0 (disabled) */
575 int CDECL lame_set_ReplayGain_decode(lame_global_flags *, int);
576 int CDECL lame_get_ReplayGain_decode(const lame_global_flags *);
577
578 /* DEPRECATED: now does the same as lame_set_decode_on_the_fly()
579 default = 0 (disabled) */
580 int CDECL lame_set_findPeakSample(lame_global_flags *, int);
581 int CDECL lame_get_findPeakSample(const lame_global_flags *);
582 #else
583 #endif
584
585 /* DEPRECATED. same as lame_set_decode_on_the_fly() */
586 int
lame_set_findPeakSample(lame_global_flags * gfp,int arg)587 lame_set_findPeakSample(lame_global_flags * gfp, int arg)
588 {
589 return lame_set_decode_on_the_fly(gfp, arg);
590 }
591
592 int
lame_get_findPeakSample(const lame_global_flags * gfp)593 lame_get_findPeakSample(const lame_global_flags * gfp)
594 {
595 return lame_get_decode_on_the_fly(gfp);
596 }
597
598 /* DEPRECATED. same as lame_set_findReplayGain() */
599 int
lame_set_ReplayGain_input(lame_global_flags * gfp,int arg)600 lame_set_ReplayGain_input(lame_global_flags * gfp, int arg)
601 {
602 return lame_set_findReplayGain(gfp, arg);
603 }
604
605 int
lame_get_ReplayGain_input(const lame_global_flags * gfp)606 lame_get_ReplayGain_input(const lame_global_flags * gfp)
607 {
608 return lame_get_findReplayGain(gfp);
609 }
610
611 /* DEPRECATED. same as lame_set_decode_on_the_fly() &&
612 lame_set_findReplayGain() */
613 int
lame_set_ReplayGain_decode(lame_global_flags * gfp,int arg)614 lame_set_ReplayGain_decode(lame_global_flags * gfp, int arg)
615 {
616 if (lame_set_decode_on_the_fly(gfp, arg) < 0 || lame_set_findReplayGain(gfp, arg) < 0)
617 return -1;
618 else
619 return 0;
620 }
621
622 int
lame_get_ReplayGain_decode(const lame_global_flags * gfp)623 lame_get_ReplayGain_decode(const lame_global_flags * gfp)
624 {
625 if (lame_get_decode_on_the_fly(gfp) > 0 && lame_get_findReplayGain(gfp) > 0)
626 return 1;
627 else
628 return 0;
629 }
630
631
632 /* set and get some gapless encoding flags */
633
634 int
lame_set_nogap_total(lame_global_flags * gfp,int the_nogap_total)635 lame_set_nogap_total(lame_global_flags * gfp, int the_nogap_total)
636 {
637 if (is_lame_global_flags_valid(gfp)) {
638 gfp->nogap_total = the_nogap_total;
639 return 0;
640 }
641 return -1;
642 }
643
644 int
lame_get_nogap_total(const lame_global_flags * gfp)645 lame_get_nogap_total(const lame_global_flags * gfp)
646 {
647 if (is_lame_global_flags_valid(gfp)) {
648 return gfp->nogap_total;
649 }
650 return 0;
651 }
652
653 int
lame_set_nogap_currentindex(lame_global_flags * gfp,int the_nogap_index)654 lame_set_nogap_currentindex(lame_global_flags * gfp, int the_nogap_index)
655 {
656 if (is_lame_global_flags_valid(gfp)) {
657 gfp->nogap_current = the_nogap_index;
658 return 0;
659 }
660 return -1;
661 }
662
663 int
lame_get_nogap_currentindex(const lame_global_flags * gfp)664 lame_get_nogap_currentindex(const lame_global_flags * gfp)
665 {
666 if (is_lame_global_flags_valid(gfp)) {
667 return gfp->nogap_current;
668 }
669 return 0;
670 }
671
672
673 /* message handlers */
674 int
lame_set_errorf(lame_global_flags * gfp,void (* func)(const char *,va_list))675 lame_set_errorf(lame_global_flags * gfp, void (*func) (const char *, va_list))
676 {
677 if (is_lame_global_flags_valid(gfp)) {
678 gfp->report.errorf = func;
679 return 0;
680 }
681 return -1;
682 }
683
684 int
lame_set_debugf(lame_global_flags * gfp,void (* func)(const char *,va_list))685 lame_set_debugf(lame_global_flags * gfp, void (*func) (const char *, va_list))
686 {
687 if (is_lame_global_flags_valid(gfp)) {
688 gfp->report.debugf = func;
689 return 0;
690 }
691 return -1;
692 }
693
694 int
lame_set_msgf(lame_global_flags * gfp,void (* func)(const char *,va_list))695 lame_set_msgf(lame_global_flags * gfp, void (*func) (const char *, va_list))
696 {
697 if (is_lame_global_flags_valid(gfp)) {
698 gfp->report.msgf = func;
699 return 0;
700 }
701 return -1;
702 }
703
704
705 /*
706 * Set one of
707 * - brate
708 * - compression ratio.
709 *
710 * Default is compression ratio of 11.
711 */
712 int
lame_set_brate(lame_global_flags * gfp,int brate)713 lame_set_brate(lame_global_flags * gfp, int brate)
714 {
715 if (is_lame_global_flags_valid(gfp)) {
716 gfp->brate = brate;
717 if (brate > 320) {
718 gfp->disable_reservoir = 1;
719 }
720 return 0;
721 }
722 return -1;
723 }
724
725 int
lame_get_brate(const lame_global_flags * gfp)726 lame_get_brate(const lame_global_flags * gfp)
727 {
728 if (is_lame_global_flags_valid(gfp)) {
729 return gfp->brate;
730 }
731 return 0;
732 }
733
734 int
lame_set_compression_ratio(lame_global_flags * gfp,float compression_ratio)735 lame_set_compression_ratio(lame_global_flags * gfp, float compression_ratio)
736 {
737 if (is_lame_global_flags_valid(gfp)) {
738 gfp->compression_ratio = compression_ratio;
739 return 0;
740 }
741 return -1;
742 }
743
744 float
lame_get_compression_ratio(const lame_global_flags * gfp)745 lame_get_compression_ratio(const lame_global_flags * gfp)
746 {
747 if (is_lame_global_flags_valid(gfp)) {
748 return gfp->compression_ratio;
749 }
750 return 0;
751 }
752
753
754
755
756 /*
757 * frame parameters
758 */
759
760 /* Mark as copyright protected. */
761 int
lame_set_copyright(lame_global_flags * gfp,int copyright)762 lame_set_copyright(lame_global_flags * gfp, int copyright)
763 {
764 if (is_lame_global_flags_valid(gfp)) {
765 /* default = 0 (disabled) */
766
767 /* enforce disable/enable meaning, if we need more than two values
768 we need to switch to an enum to have an apropriate representation
769 of the possible meanings of the value */
770 if (0 > copyright || 1 < copyright)
771 return -1;
772 gfp->copyright = copyright;
773 return 0;
774 }
775 return -1;
776 }
777
778 int
lame_get_copyright(const lame_global_flags * gfp)779 lame_get_copyright(const lame_global_flags * gfp)
780 {
781 if (is_lame_global_flags_valid(gfp)) {
782 assert(0 <= gfp->copyright && 1 >= gfp->copyright);
783 return gfp->copyright;
784 }
785 return 0;
786 }
787
788
789 /* Mark as original. */
790 int
lame_set_original(lame_global_flags * gfp,int original)791 lame_set_original(lame_global_flags * gfp, int original)
792 {
793 if (is_lame_global_flags_valid(gfp)) {
794 /* default = 1 (enabled) */
795
796 /* enforce disable/enable meaning, if we need more than two values
797 we need to switch to an enum to have an apropriate representation
798 of the possible meanings of the value */
799 if (0 > original || 1 < original)
800 return -1;
801 gfp->original = original;
802 return 0;
803 }
804 return -1;
805 }
806
807 int
lame_get_original(const lame_global_flags * gfp)808 lame_get_original(const lame_global_flags * gfp)
809 {
810 if (is_lame_global_flags_valid(gfp)) {
811 assert(0 <= gfp->original && 1 >= gfp->original);
812 return gfp->original;
813 }
814 return 0;
815 }
816
817
818 /*
819 * error_protection.
820 * Use 2 bytes from each frame for CRC checksum.
821 */
822 int
lame_set_error_protection(lame_global_flags * gfp,int error_protection)823 lame_set_error_protection(lame_global_flags * gfp, int error_protection)
824 {
825 if (is_lame_global_flags_valid(gfp)) {
826 /* default = 0 (disabled) */
827
828 /* enforce disable/enable meaning, if we need more than two values
829 we need to switch to an enum to have an apropriate representation
830 of the possible meanings of the value */
831 if (0 > error_protection || 1 < error_protection)
832 return -1;
833 gfp->error_protection = error_protection;
834 return 0;
835 }
836 return -1;
837 }
838
839 int
lame_get_error_protection(const lame_global_flags * gfp)840 lame_get_error_protection(const lame_global_flags * gfp)
841 {
842 if (is_lame_global_flags_valid(gfp)) {
843 assert(0 <= gfp->error_protection && 1 >= gfp->error_protection);
844 return gfp->error_protection;
845 }
846 return 0;
847 }
848
849
850 #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
851 /* padding_type. 0=pad no frames 1=pad all frames 2=adjust padding(default) */
852 int CDECL lame_set_padding_type(lame_global_flags *, Padding_type);
853 Padding_type CDECL lame_get_padding_type(const lame_global_flags *);
854 #else
855 #endif
856
857 /*
858 * padding_type.
859 * PAD_NO = pad no frames
860 * PAD_ALL = pad all frames
861 * PAD_ADJUST = adjust padding
862 */
863 int
lame_set_padding_type(lame_global_flags * gfp,Padding_type padding_type)864 lame_set_padding_type(lame_global_flags * gfp, Padding_type padding_type)
865 {
866 (void) gfp;
867 (void) padding_type;
868 return 0;
869 }
870
871 Padding_type
lame_get_padding_type(const lame_global_flags * gfp)872 lame_get_padding_type(const lame_global_flags * gfp)
873 {
874 (void) gfp;
875 return PAD_ADJUST;
876 }
877
878
879 /* MP3 'private extension' bit. Meaningless. */
880 int
lame_set_extension(lame_global_flags * gfp,int extension)881 lame_set_extension(lame_global_flags * gfp, int extension)
882 {
883 if (is_lame_global_flags_valid(gfp)) {
884 /* default = 0 (disabled) */
885 /* enforce disable/enable meaning, if we need more than two values
886 we need to switch to an enum to have an apropriate representation
887 of the possible meanings of the value */
888 if (0 > extension || 1 < extension)
889 return -1;
890 gfp->extension = extension;
891 return 0;
892 }
893 return -1;
894 }
895
896 int
lame_get_extension(const lame_global_flags * gfp)897 lame_get_extension(const lame_global_flags * gfp)
898 {
899 if (is_lame_global_flags_valid(gfp)) {
900 assert(0 <= gfp->extension && 1 >= gfp->extension);
901 return gfp->extension;
902 }
903 return 0;
904 }
905
906
907 /* Enforce strict ISO compliance. */
908 int
lame_set_strict_ISO(lame_global_flags * gfp,int val)909 lame_set_strict_ISO(lame_global_flags * gfp, int val)
910 {
911 if (is_lame_global_flags_valid(gfp)) {
912 /* default = 0 (disabled) */
913 /* enforce disable/enable meaning, if we need more than two values
914 we need to switch to an enum to have an apropriate representation
915 of the possible meanings of the value */
916 if (val < MDB_DEFAULT || MDB_MAXIMUM < val)
917 return -1;
918 gfp->strict_ISO = val;
919 return 0;
920 }
921 return -1;
922 }
923
924 int
lame_get_strict_ISO(const lame_global_flags * gfp)925 lame_get_strict_ISO(const lame_global_flags * gfp)
926 {
927 if (is_lame_global_flags_valid(gfp)) {
928 return gfp->strict_ISO;
929 }
930 return 0;
931 }
932
933
934
935
936 /********************************************************************
937 * quantization/noise shaping
938 ***********************************************************************/
939
940 /* Disable the bit reservoir. For testing only. */
941 int
lame_set_disable_reservoir(lame_global_flags * gfp,int disable_reservoir)942 lame_set_disable_reservoir(lame_global_flags * gfp, int disable_reservoir)
943 {
944 if (is_lame_global_flags_valid(gfp)) {
945 /* default = 0 (disabled) */
946
947 /* enforce disable/enable meaning, if we need more than two values
948 we need to switch to an enum to have an apropriate representation
949 of the possible meanings of the value */
950 if (0 > disable_reservoir || 1 < disable_reservoir)
951 return -1;
952 gfp->disable_reservoir = disable_reservoir;
953 return 0;
954 }
955 return -1;
956 }
957
958 int
lame_get_disable_reservoir(const lame_global_flags * gfp)959 lame_get_disable_reservoir(const lame_global_flags * gfp)
960 {
961 if (is_lame_global_flags_valid(gfp)) {
962 assert(0 <= gfp->disable_reservoir && 1 >= gfp->disable_reservoir);
963 return gfp->disable_reservoir;
964 }
965 return 0;
966 }
967
968
969
970
971 int
lame_set_experimentalX(lame_global_flags * gfp,int experimentalX)972 lame_set_experimentalX(lame_global_flags * gfp, int experimentalX)
973 {
974 if (is_lame_global_flags_valid(gfp)) {
975 lame_set_quant_comp(gfp, experimentalX);
976 lame_set_quant_comp_short(gfp, experimentalX);
977 return 0;
978 }
979 return -1;
980 }
981
982 int
lame_get_experimentalX(const lame_global_flags * gfp)983 lame_get_experimentalX(const lame_global_flags * gfp)
984 {
985 return lame_get_quant_comp(gfp);
986 }
987
988
989 /* Select a different "best quantization" function. default = 0 */
990 int
lame_set_quant_comp(lame_global_flags * gfp,int quant_type)991 lame_set_quant_comp(lame_global_flags * gfp, int quant_type)
992 {
993 if (is_lame_global_flags_valid(gfp)) {
994 gfp->quant_comp = quant_type;
995 return 0;
996 }
997 return -1;
998 }
999
1000 int
lame_get_quant_comp(const lame_global_flags * gfp)1001 lame_get_quant_comp(const lame_global_flags * gfp)
1002 {
1003 if (is_lame_global_flags_valid(gfp)) {
1004 return gfp->quant_comp;
1005 }
1006 return 0;
1007 }
1008
1009
1010 /* Select a different "best quantization" function. default = 0 */
1011 int
lame_set_quant_comp_short(lame_global_flags * gfp,int quant_type)1012 lame_set_quant_comp_short(lame_global_flags * gfp, int quant_type)
1013 {
1014 if (is_lame_global_flags_valid(gfp)) {
1015 gfp->quant_comp_short = quant_type;
1016 return 0;
1017 }
1018 return -1;
1019 }
1020
1021 int
lame_get_quant_comp_short(const lame_global_flags * gfp)1022 lame_get_quant_comp_short(const lame_global_flags * gfp)
1023 {
1024 if (is_lame_global_flags_valid(gfp)) {
1025 return gfp->quant_comp_short;
1026 }
1027 return 0;
1028 }
1029
1030
1031 /* Another experimental option. For testing only. */
1032 int
lame_set_experimentalY(lame_global_flags * gfp,int experimentalY)1033 lame_set_experimentalY(lame_global_flags * gfp, int experimentalY)
1034 {
1035 if (is_lame_global_flags_valid(gfp)) {
1036 gfp->experimentalY = experimentalY;
1037 return 0;
1038 }
1039 return -1;
1040 }
1041
1042 int
lame_get_experimentalY(const lame_global_flags * gfp)1043 lame_get_experimentalY(const lame_global_flags * gfp)
1044 {
1045 if (is_lame_global_flags_valid(gfp)) {
1046 return gfp->experimentalY;
1047 }
1048 return 0;
1049 }
1050
1051
1052 int
lame_set_experimentalZ(lame_global_flags * gfp,int experimentalZ)1053 lame_set_experimentalZ(lame_global_flags * gfp, int experimentalZ)
1054 {
1055 if (is_lame_global_flags_valid(gfp)) {
1056 gfp->experimentalZ = experimentalZ;
1057 return 0;
1058 }
1059 return -1;
1060 }
1061
1062 int
lame_get_experimentalZ(const lame_global_flags * gfp)1063 lame_get_experimentalZ(const lame_global_flags * gfp)
1064 {
1065 if (is_lame_global_flags_valid(gfp)) {
1066 return gfp->experimentalZ;
1067 }
1068 return 0;
1069 }
1070
1071
1072 /* Naoki's psycho acoustic model. */
1073 int
lame_set_exp_nspsytune(lame_global_flags * gfp,int exp_nspsytune)1074 lame_set_exp_nspsytune(lame_global_flags * gfp, int exp_nspsytune)
1075 {
1076 if (is_lame_global_flags_valid(gfp)) {
1077 /* default = 0 (disabled) */
1078 gfp->exp_nspsytune = exp_nspsytune;
1079 return 0;
1080 }
1081 return -1;
1082 }
1083
1084 int
lame_get_exp_nspsytune(const lame_global_flags * gfp)1085 lame_get_exp_nspsytune(const lame_global_flags * gfp)
1086 {
1087 if (is_lame_global_flags_valid(gfp)) {
1088 return gfp->exp_nspsytune;
1089 }
1090 return 0;
1091 }
1092
1093
1094
1095
1096 /********************************************************************
1097 * VBR control
1098 ***********************************************************************/
1099
1100 /* Types of VBR. default = vbr_off = CBR */
1101 int
lame_set_VBR(lame_global_flags * gfp,vbr_mode VBR)1102 lame_set_VBR(lame_global_flags * gfp, vbr_mode VBR)
1103 {
1104 if (is_lame_global_flags_valid(gfp)) {
1105 int vbr_q = VBR;
1106 if (0 > vbr_q || vbr_max_indicator <= vbr_q)
1107 return -1; /* Unknown VBR mode! */
1108 gfp->VBR = VBR;
1109 return 0;
1110 }
1111 return -1;
1112 }
1113
1114 vbr_mode
lame_get_VBR(const lame_global_flags * gfp)1115 lame_get_VBR(const lame_global_flags * gfp)
1116 {
1117 if (is_lame_global_flags_valid(gfp)) {
1118 assert(gfp->VBR < vbr_max_indicator);
1119 return gfp->VBR;
1120 }
1121 return vbr_off;
1122 }
1123
1124
1125 /*
1126 * VBR quality level.
1127 * 0 = highest
1128 * 9 = lowest
1129 */
1130 int
lame_set_VBR_q(lame_global_flags * gfp,int VBR_q)1131 lame_set_VBR_q(lame_global_flags * gfp, int VBR_q)
1132 {
1133 if (is_lame_global_flags_valid(gfp)) {
1134 int ret = 0;
1135
1136 if (0 > VBR_q) {
1137 ret = -1; /* Unknown VBR quality level! */
1138 VBR_q = 0;
1139 }
1140 if (9 < VBR_q) {
1141 ret = -1;
1142 VBR_q = 9;
1143 }
1144 gfp->VBR_q = VBR_q;
1145 gfp->VBR_q_frac = 0;
1146 return ret;
1147 }
1148 return -1;
1149 }
1150
1151 int
lame_get_VBR_q(const lame_global_flags * gfp)1152 lame_get_VBR_q(const lame_global_flags * gfp)
1153 {
1154 if (is_lame_global_flags_valid(gfp)) {
1155 assert(0 <= gfp->VBR_q && 10 > gfp->VBR_q);
1156 return gfp->VBR_q;
1157 }
1158 return 0;
1159 }
1160
1161 int
lame_set_VBR_quality(lame_global_flags * gfp,float VBR_q)1162 lame_set_VBR_quality(lame_global_flags * gfp, float VBR_q)
1163 {
1164 if (is_lame_global_flags_valid(gfp)) {
1165 int ret = 0;
1166
1167 if (0 > VBR_q) {
1168 ret = -1; /* Unknown VBR quality level! */
1169 VBR_q = 0;
1170 }
1171 if (9.999 < VBR_q) {
1172 ret = -1;
1173 VBR_q = 9.999;
1174 }
1175
1176 gfp->VBR_q = (int) VBR_q;
1177 gfp->VBR_q_frac = VBR_q - gfp->VBR_q;
1178
1179 return ret;
1180 }
1181 return -1;
1182 }
1183
1184 float
lame_get_VBR_quality(const lame_global_flags * gfp)1185 lame_get_VBR_quality(const lame_global_flags * gfp)
1186 {
1187 if (is_lame_global_flags_valid(gfp)) {
1188 return gfp->VBR_q + gfp->VBR_q_frac;
1189 }
1190 return 0;
1191 }
1192
1193
1194 /* Ignored except for VBR = vbr_abr (ABR mode) */
1195 int
lame_set_VBR_mean_bitrate_kbps(lame_global_flags * gfp,int VBR_mean_bitrate_kbps)1196 lame_set_VBR_mean_bitrate_kbps(lame_global_flags * gfp, int VBR_mean_bitrate_kbps)
1197 {
1198 if (is_lame_global_flags_valid(gfp)) {
1199 gfp->VBR_mean_bitrate_kbps = VBR_mean_bitrate_kbps;
1200 return 0;
1201 }
1202 return -1;
1203 }
1204
1205 int
lame_get_VBR_mean_bitrate_kbps(const lame_global_flags * gfp)1206 lame_get_VBR_mean_bitrate_kbps(const lame_global_flags * gfp)
1207 {
1208 if (is_lame_global_flags_valid(gfp)) {
1209 return gfp->VBR_mean_bitrate_kbps;
1210 }
1211 return 0;
1212 }
1213
1214 int
lame_set_VBR_min_bitrate_kbps(lame_global_flags * gfp,int VBR_min_bitrate_kbps)1215 lame_set_VBR_min_bitrate_kbps(lame_global_flags * gfp, int VBR_min_bitrate_kbps)
1216 {
1217 if (is_lame_global_flags_valid(gfp)) {
1218 gfp->VBR_min_bitrate_kbps = VBR_min_bitrate_kbps;
1219 return 0;
1220 }
1221 return -1;
1222 }
1223
1224 int
lame_get_VBR_min_bitrate_kbps(const lame_global_flags * gfp)1225 lame_get_VBR_min_bitrate_kbps(const lame_global_flags * gfp)
1226 {
1227 if (is_lame_global_flags_valid(gfp)) {
1228 return gfp->VBR_min_bitrate_kbps;
1229 }
1230 return 0;
1231 }
1232
1233 int
lame_set_VBR_max_bitrate_kbps(lame_global_flags * gfp,int VBR_max_bitrate_kbps)1234 lame_set_VBR_max_bitrate_kbps(lame_global_flags * gfp, int VBR_max_bitrate_kbps)
1235 {
1236 if (is_lame_global_flags_valid(gfp)) {
1237 gfp->VBR_max_bitrate_kbps = VBR_max_bitrate_kbps;
1238 return 0;
1239 }
1240 return -1;
1241 }
1242
1243 int
lame_get_VBR_max_bitrate_kbps(const lame_global_flags * gfp)1244 lame_get_VBR_max_bitrate_kbps(const lame_global_flags * gfp)
1245 {
1246 if (is_lame_global_flags_valid(gfp)) {
1247 return gfp->VBR_max_bitrate_kbps;
1248 }
1249 return 0;
1250 }
1251
1252
1253 /*
1254 * Strictly enforce VBR_min_bitrate.
1255 * Normally it will be violated for analog silence.
1256 */
1257 int
lame_set_VBR_hard_min(lame_global_flags * gfp,int VBR_hard_min)1258 lame_set_VBR_hard_min(lame_global_flags * gfp, int VBR_hard_min)
1259 {
1260 if (is_lame_global_flags_valid(gfp)) {
1261 /* default = 0 (disabled) */
1262
1263 /* enforce disable/enable meaning, if we need more than two values
1264 we need to switch to an enum to have an apropriate representation
1265 of the possible meanings of the value */
1266 if (0 > VBR_hard_min || 1 < VBR_hard_min)
1267 return -1;
1268
1269 gfp->VBR_hard_min = VBR_hard_min;
1270
1271 return 0;
1272 }
1273 return -1;
1274 }
1275
1276 int
lame_get_VBR_hard_min(const lame_global_flags * gfp)1277 lame_get_VBR_hard_min(const lame_global_flags * gfp)
1278 {
1279 if (is_lame_global_flags_valid(gfp)) {
1280 assert(0 <= gfp->VBR_hard_min && 1 >= gfp->VBR_hard_min);
1281 return gfp->VBR_hard_min;
1282 }
1283 return 0;
1284 }
1285
1286
1287 /********************************************************************
1288 * Filtering control
1289 ***********************************************************************/
1290
1291 /*
1292 * Freqency in Hz to apply lowpass.
1293 * 0 = default = lame chooses
1294 * -1 = disabled
1295 */
1296 int
lame_set_lowpassfreq(lame_global_flags * gfp,int lowpassfreq)1297 lame_set_lowpassfreq(lame_global_flags * gfp, int lowpassfreq)
1298 {
1299 if (is_lame_global_flags_valid(gfp)) {
1300 gfp->lowpassfreq = lowpassfreq;
1301 return 0;
1302 }
1303 return -1;
1304 }
1305
1306 int
lame_get_lowpassfreq(const lame_global_flags * gfp)1307 lame_get_lowpassfreq(const lame_global_flags * gfp)
1308 {
1309 if (is_lame_global_flags_valid(gfp)) {
1310 return gfp->lowpassfreq;
1311 }
1312 return 0;
1313 }
1314
1315
1316 /*
1317 * Width of transition band (in Hz).
1318 * default = one polyphase filter band
1319 */
1320 int
lame_set_lowpasswidth(lame_global_flags * gfp,int lowpasswidth)1321 lame_set_lowpasswidth(lame_global_flags * gfp, int lowpasswidth)
1322 {
1323 if (is_lame_global_flags_valid(gfp)) {
1324 gfp->lowpasswidth = lowpasswidth;
1325 return 0;
1326 }
1327 return -1;
1328 }
1329
1330 int
lame_get_lowpasswidth(const lame_global_flags * gfp)1331 lame_get_lowpasswidth(const lame_global_flags * gfp)
1332 {
1333 if (is_lame_global_flags_valid(gfp)) {
1334 return gfp->lowpasswidth;
1335 }
1336 return 0;
1337 }
1338
1339
1340 /*
1341 * Frequency in Hz to apply highpass.
1342 * 0 = default = lame chooses
1343 * -1 = disabled
1344 */
1345 int
lame_set_highpassfreq(lame_global_flags * gfp,int highpassfreq)1346 lame_set_highpassfreq(lame_global_flags * gfp, int highpassfreq)
1347 {
1348 if (is_lame_global_flags_valid(gfp)) {
1349 gfp->highpassfreq = highpassfreq;
1350 return 0;
1351 }
1352 return -1;
1353 }
1354
1355 int
lame_get_highpassfreq(const lame_global_flags * gfp)1356 lame_get_highpassfreq(const lame_global_flags * gfp)
1357 {
1358 if (is_lame_global_flags_valid(gfp)) {
1359 return gfp->highpassfreq;
1360 }
1361 return 0;
1362 }
1363
1364
1365 /*
1366 * Width of transition band (in Hz).
1367 * default = one polyphase filter band
1368 */
1369 int
lame_set_highpasswidth(lame_global_flags * gfp,int highpasswidth)1370 lame_set_highpasswidth(lame_global_flags * gfp, int highpasswidth)
1371 {
1372 if (is_lame_global_flags_valid(gfp)) {
1373 gfp->highpasswidth = highpasswidth;
1374 return 0;
1375 }
1376 return -1;
1377 }
1378
1379 int
lame_get_highpasswidth(const lame_global_flags * gfp)1380 lame_get_highpasswidth(const lame_global_flags * gfp)
1381 {
1382 if (is_lame_global_flags_valid(gfp)) {
1383 return gfp->highpasswidth;
1384 }
1385 return 0;
1386 }
1387
1388
1389
1390
1391 /*
1392 * psycho acoustics and other arguments which you should not change
1393 * unless you know what you are doing
1394 */
1395
1396
1397 /* Adjust masking values. */
1398 int
lame_set_maskingadjust(lame_global_flags * gfp,float adjust)1399 lame_set_maskingadjust(lame_global_flags * gfp, float adjust)
1400 {
1401 if (is_lame_global_flags_valid(gfp)) {
1402 gfp->maskingadjust = adjust;
1403 return 0;
1404 }
1405 return -1;
1406 }
1407
1408 float
lame_get_maskingadjust(const lame_global_flags * gfp)1409 lame_get_maskingadjust(const lame_global_flags * gfp)
1410 {
1411 if (is_lame_global_flags_valid(gfp)) {
1412 return gfp->maskingadjust;
1413 }
1414 return 0;
1415 }
1416
1417 int
lame_set_maskingadjust_short(lame_global_flags * gfp,float adjust)1418 lame_set_maskingadjust_short(lame_global_flags * gfp, float adjust)
1419 {
1420 if (is_lame_global_flags_valid(gfp)) {
1421 gfp->maskingadjust_short = adjust;
1422 return 0;
1423 }
1424 return -1;
1425 }
1426
1427 float
lame_get_maskingadjust_short(const lame_global_flags * gfp)1428 lame_get_maskingadjust_short(const lame_global_flags * gfp)
1429 {
1430 if (is_lame_global_flags_valid(gfp)) {
1431 return gfp->maskingadjust_short;
1432 }
1433 return 0;
1434 }
1435
1436 /* Only use ATH for masking. */
1437 int
lame_set_ATHonly(lame_global_flags * gfp,int ATHonly)1438 lame_set_ATHonly(lame_global_flags * gfp, int ATHonly)
1439 {
1440 if (is_lame_global_flags_valid(gfp)) {
1441 gfp->ATHonly = ATHonly;
1442 return 0;
1443 }
1444 return -1;
1445 }
1446
1447 int
lame_get_ATHonly(const lame_global_flags * gfp)1448 lame_get_ATHonly(const lame_global_flags * gfp)
1449 {
1450 if (is_lame_global_flags_valid(gfp)) {
1451 return gfp->ATHonly;
1452 }
1453 return 0;
1454 }
1455
1456
1457 /* Only use ATH for short blocks. */
1458 int
lame_set_ATHshort(lame_global_flags * gfp,int ATHshort)1459 lame_set_ATHshort(lame_global_flags * gfp, int ATHshort)
1460 {
1461 if (is_lame_global_flags_valid(gfp)) {
1462 gfp->ATHshort = ATHshort;
1463 return 0;
1464 }
1465 return -1;
1466 }
1467
1468 int
lame_get_ATHshort(const lame_global_flags * gfp)1469 lame_get_ATHshort(const lame_global_flags * gfp)
1470 {
1471 if (is_lame_global_flags_valid(gfp)) {
1472 return gfp->ATHshort;
1473 }
1474 return 0;
1475 }
1476
1477
1478 /* Disable ATH. */
1479 int
lame_set_noATH(lame_global_flags * gfp,int noATH)1480 lame_set_noATH(lame_global_flags * gfp, int noATH)
1481 {
1482 if (is_lame_global_flags_valid(gfp)) {
1483 gfp->noATH = noATH;
1484 return 0;
1485 }
1486 return -1;
1487 }
1488
1489 int
lame_get_noATH(const lame_global_flags * gfp)1490 lame_get_noATH(const lame_global_flags * gfp)
1491 {
1492 if (is_lame_global_flags_valid(gfp)) {
1493 return gfp->noATH;
1494 }
1495 return 0;
1496 }
1497
1498
1499 /* Select ATH formula. */
1500 int
lame_set_ATHtype(lame_global_flags * gfp,int ATHtype)1501 lame_set_ATHtype(lame_global_flags * gfp, int ATHtype)
1502 {
1503 if (is_lame_global_flags_valid(gfp)) {
1504 /* XXX: ATHtype should be converted to an enum. */
1505 gfp->ATHtype = ATHtype;
1506 return 0;
1507 }
1508 return -1;
1509 }
1510
1511 int
lame_get_ATHtype(const lame_global_flags * gfp)1512 lame_get_ATHtype(const lame_global_flags * gfp)
1513 {
1514 if (is_lame_global_flags_valid(gfp)) {
1515 return gfp->ATHtype;
1516 }
1517 return 0;
1518 }
1519
1520
1521 /* Select ATH formula 4 shape. */
1522 int
lame_set_ATHcurve(lame_global_flags * gfp,float ATHcurve)1523 lame_set_ATHcurve(lame_global_flags * gfp, float ATHcurve)
1524 {
1525 if (is_lame_global_flags_valid(gfp)) {
1526 gfp->ATHcurve = ATHcurve;
1527 return 0;
1528 }
1529 return -1;
1530 }
1531
1532 float
lame_get_ATHcurve(const lame_global_flags * gfp)1533 lame_get_ATHcurve(const lame_global_flags * gfp)
1534 {
1535 if (is_lame_global_flags_valid(gfp)) {
1536 return gfp->ATHcurve;
1537 }
1538 return 0;
1539 }
1540
1541
1542 /* Lower ATH by this many db. */
1543 int
lame_set_ATHlower(lame_global_flags * gfp,float ATHlower)1544 lame_set_ATHlower(lame_global_flags * gfp, float ATHlower)
1545 {
1546 if (is_lame_global_flags_valid(gfp)) {
1547 gfp->ATH_lower_db = ATHlower;
1548 return 0;
1549 }
1550 return -1;
1551 }
1552
1553 float
lame_get_ATHlower(const lame_global_flags * gfp)1554 lame_get_ATHlower(const lame_global_flags * gfp)
1555 {
1556 if (is_lame_global_flags_valid(gfp)) {
1557 return gfp->ATH_lower_db;
1558 }
1559 return 0;
1560 }
1561
1562
1563 /* Select ATH adaptive adjustment scheme. */
1564 int
lame_set_athaa_type(lame_global_flags * gfp,int athaa_type)1565 lame_set_athaa_type(lame_global_flags * gfp, int athaa_type)
1566 {
1567 if (is_lame_global_flags_valid(gfp)) {
1568 gfp->athaa_type = athaa_type;
1569 return 0;
1570 }
1571 return -1;
1572 }
1573
1574 int
lame_get_athaa_type(const lame_global_flags * gfp)1575 lame_get_athaa_type(const lame_global_flags * gfp)
1576 {
1577 if (is_lame_global_flags_valid(gfp)) {
1578 return gfp->athaa_type;
1579 }
1580 return 0;
1581 }
1582
1583
1584 #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
1585 int CDECL lame_set_athaa_loudapprox(lame_global_flags * gfp, int athaa_loudapprox);
1586 int CDECL lame_get_athaa_loudapprox(const lame_global_flags * gfp);
1587 #else
1588 #endif
1589
1590 /* Select the loudness approximation used by the ATH adaptive auto-leveling. */
1591 int
lame_set_athaa_loudapprox(lame_global_flags * gfp,int athaa_loudapprox)1592 lame_set_athaa_loudapprox(lame_global_flags * gfp, int athaa_loudapprox)
1593 {
1594 (void) gfp;
1595 (void) athaa_loudapprox;
1596 return 0;
1597 }
1598
1599 int
lame_get_athaa_loudapprox(const lame_global_flags * gfp)1600 lame_get_athaa_loudapprox(const lame_global_flags * gfp)
1601 {
1602 (void) gfp;
1603 /* obsolete, the type known under number 2 is the only survival */
1604 return 2;
1605 }
1606
1607
1608 /* Adjust (in dB) the point below which adaptive ATH level adjustment occurs. */
1609 int
lame_set_athaa_sensitivity(lame_global_flags * gfp,float athaa_sensitivity)1610 lame_set_athaa_sensitivity(lame_global_flags * gfp, float athaa_sensitivity)
1611 {
1612 if (is_lame_global_flags_valid(gfp)) {
1613 gfp->athaa_sensitivity = athaa_sensitivity;
1614 return 0;
1615 }
1616 return -1;
1617 }
1618
1619 float
lame_get_athaa_sensitivity(const lame_global_flags * gfp)1620 lame_get_athaa_sensitivity(const lame_global_flags * gfp)
1621 {
1622 if (is_lame_global_flags_valid(gfp)) {
1623 return gfp->athaa_sensitivity;
1624 }
1625 return 0;
1626 }
1627
1628
1629 /* Predictability limit (ISO tonality formula) */
1630 int lame_set_cwlimit(lame_global_flags * gfp, int cwlimit);
1631 int lame_get_cwlimit(const lame_global_flags * gfp);
1632
1633 int
lame_set_cwlimit(lame_global_flags * gfp,int cwlimit)1634 lame_set_cwlimit(lame_global_flags * gfp, int cwlimit)
1635 {
1636 (void) gfp;
1637 (void) cwlimit;
1638 return 0;
1639 }
1640
1641 int
lame_get_cwlimit(const lame_global_flags * gfp)1642 lame_get_cwlimit(const lame_global_flags * gfp)
1643 {
1644 (void) gfp;
1645 return 0;
1646 }
1647
1648
1649
1650 /*
1651 * Allow blocktypes to differ between channels.
1652 * default:
1653 * 0 for jstereo => block types coupled
1654 * 1 for stereo => block types may differ
1655 */
1656 int
lame_set_allow_diff_short(lame_global_flags * gfp,int allow_diff_short)1657 lame_set_allow_diff_short(lame_global_flags * gfp, int allow_diff_short)
1658 {
1659 if (is_lame_global_flags_valid(gfp)) {
1660 gfp->short_blocks = allow_diff_short ? short_block_allowed : short_block_coupled;
1661 return 0;
1662 }
1663 return -1;
1664 }
1665
1666 int
lame_get_allow_diff_short(const lame_global_flags * gfp)1667 lame_get_allow_diff_short(const lame_global_flags * gfp)
1668 {
1669 if (is_lame_global_flags_valid(gfp)) {
1670 if (gfp->short_blocks == short_block_allowed)
1671 return 1; /* short blocks allowed to differ */
1672 else
1673 return 0; /* not set, dispensed, forced or coupled */
1674 }
1675 return 0;
1676 }
1677
1678
1679 /* Use temporal masking effect */
1680 int
lame_set_useTemporal(lame_global_flags * gfp,int useTemporal)1681 lame_set_useTemporal(lame_global_flags * gfp, int useTemporal)
1682 {
1683 if (is_lame_global_flags_valid(gfp)) {
1684 /* default = 1 (enabled) */
1685
1686 /* enforce disable/enable meaning, if we need more than two values
1687 we need to switch to an enum to have an apropriate representation
1688 of the possible meanings of the value */
1689 if (0 <= useTemporal && useTemporal <= 1) {
1690 gfp->useTemporal = useTemporal;
1691 return 0;
1692 }
1693 }
1694 return -1;
1695 }
1696
1697 int
lame_get_useTemporal(const lame_global_flags * gfp)1698 lame_get_useTemporal(const lame_global_flags * gfp)
1699 {
1700 if (is_lame_global_flags_valid(gfp)) {
1701 assert(0 <= gfp->useTemporal && 1 >= gfp->useTemporal);
1702 return gfp->useTemporal;
1703 }
1704 return 0;
1705 }
1706
1707
1708 /* Use inter-channel masking effect */
1709 int
lame_set_interChRatio(lame_global_flags * gfp,float ratio)1710 lame_set_interChRatio(lame_global_flags * gfp, float ratio)
1711 {
1712 if (is_lame_global_flags_valid(gfp)) {
1713 /* default = 0.0 (no inter-channel maskin) */
1714 if (0 <= ratio && ratio <= 1.0) {
1715 gfp->interChRatio = ratio;
1716 return 0;
1717 }
1718 }
1719 return -1;
1720 }
1721
1722 float
lame_get_interChRatio(const lame_global_flags * gfp)1723 lame_get_interChRatio(const lame_global_flags * gfp)
1724 {
1725 if (is_lame_global_flags_valid(gfp)) {
1726 assert((0 <= gfp->interChRatio && gfp->interChRatio <= 1.0) || EQ(gfp->interChRatio, -1));
1727 return gfp->interChRatio;
1728 }
1729 return 0;
1730 }
1731
1732
1733 /* Use pseudo substep shaping method */
1734 int
lame_set_substep(lame_global_flags * gfp,int method)1735 lame_set_substep(lame_global_flags * gfp, int method)
1736 {
1737 if (is_lame_global_flags_valid(gfp)) {
1738 /* default = 0.0 (no substep noise shaping) */
1739 if (0 <= method && method <= 7) {
1740 gfp->substep_shaping = method;
1741 return 0;
1742 }
1743 }
1744 return -1;
1745 }
1746
1747 int
lame_get_substep(const lame_global_flags * gfp)1748 lame_get_substep(const lame_global_flags * gfp)
1749 {
1750 if (is_lame_global_flags_valid(gfp)) {
1751 assert(0 <= gfp->substep_shaping && gfp->substep_shaping <= 7);
1752 return gfp->substep_shaping;
1753 }
1754 return 0;
1755 }
1756
1757 /* scalefactors scale */
1758 int
lame_set_sfscale(lame_global_flags * gfp,int val)1759 lame_set_sfscale(lame_global_flags * gfp, int val)
1760 {
1761 if (is_lame_global_flags_valid(gfp)) {
1762 gfp->noise_shaping = (val != 0) ? 2 : 1;
1763 return 0;
1764 }
1765 return -1;
1766 }
1767
1768 int
lame_get_sfscale(const lame_global_flags * gfp)1769 lame_get_sfscale(const lame_global_flags * gfp)
1770 {
1771 if (is_lame_global_flags_valid(gfp)) {
1772 return (gfp->noise_shaping == 2) ? 1 : 0;
1773 }
1774 return 0;
1775 }
1776
1777 /* subblock gain */
1778 int
lame_set_subblock_gain(lame_global_flags * gfp,int sbgain)1779 lame_set_subblock_gain(lame_global_flags * gfp, int sbgain)
1780 {
1781 if (is_lame_global_flags_valid(gfp)) {
1782 gfp->subblock_gain = sbgain;
1783 return 0;
1784 }
1785 return -1;
1786 }
1787
1788 int
lame_get_subblock_gain(const lame_global_flags * gfp)1789 lame_get_subblock_gain(const lame_global_flags * gfp)
1790 {
1791 if (is_lame_global_flags_valid(gfp)) {
1792 return gfp->subblock_gain;
1793 }
1794 return 0;
1795 }
1796
1797
1798 /* Disable short blocks. */
1799 int
lame_set_no_short_blocks(lame_global_flags * gfp,int no_short_blocks)1800 lame_set_no_short_blocks(lame_global_flags * gfp, int no_short_blocks)
1801 {
1802 if (is_lame_global_flags_valid(gfp)) {
1803 /* enforce disable/enable meaning, if we need more than two values
1804 we need to switch to an enum to have an apropriate representation
1805 of the possible meanings of the value */
1806 if (0 <= no_short_blocks && no_short_blocks <= 1) {
1807 gfp->short_blocks = no_short_blocks ? short_block_dispensed : short_block_allowed;
1808 return 0;
1809 }
1810 }
1811 return -1;
1812 }
1813
1814 int
lame_get_no_short_blocks(const lame_global_flags * gfp)1815 lame_get_no_short_blocks(const lame_global_flags * gfp)
1816 {
1817 if (is_lame_global_flags_valid(gfp)) {
1818 switch (gfp->short_blocks) {
1819 default:
1820 case short_block_not_set:
1821 return -1;
1822 case short_block_dispensed:
1823 return 1;
1824 case short_block_allowed:
1825 case short_block_coupled:
1826 case short_block_forced:
1827 return 0;
1828 }
1829 }
1830 return -1;
1831 }
1832
1833
1834 /* Force short blocks. */
1835 int
lame_set_force_short_blocks(lame_global_flags * gfp,int short_blocks)1836 lame_set_force_short_blocks(lame_global_flags * gfp, int short_blocks)
1837 {
1838 if (is_lame_global_flags_valid(gfp)) {
1839 /* enforce disable/enable meaning, if we need more than two values
1840 we need to switch to an enum to have an apropriate representation
1841 of the possible meanings of the value */
1842 if (0 > short_blocks || 1 < short_blocks)
1843 return -1;
1844
1845 if (short_blocks == 1)
1846 gfp->short_blocks = short_block_forced;
1847 else if (gfp->short_blocks == short_block_forced)
1848 gfp->short_blocks = short_block_allowed;
1849
1850 return 0;
1851 }
1852 return -1;
1853 }
1854
1855 int
lame_get_force_short_blocks(const lame_global_flags * gfp)1856 lame_get_force_short_blocks(const lame_global_flags * gfp)
1857 {
1858 if (is_lame_global_flags_valid(gfp)) {
1859 switch (gfp->short_blocks) {
1860 default:
1861 case short_block_not_set:
1862 return -1;
1863 case short_block_dispensed:
1864 case short_block_allowed:
1865 case short_block_coupled:
1866 return 0;
1867 case short_block_forced:
1868 return 1;
1869 }
1870 }
1871 return -1;
1872 }
1873
1874 int
lame_set_short_threshold_lrm(lame_global_flags * gfp,float lrm)1875 lame_set_short_threshold_lrm(lame_global_flags * gfp, float lrm)
1876 {
1877 if (is_lame_global_flags_valid(gfp)) {
1878 gfp->attackthre = lrm;
1879 return 0;
1880 }
1881 return -1;
1882 }
1883
1884 float
lame_get_short_threshold_lrm(const lame_global_flags * gfp)1885 lame_get_short_threshold_lrm(const lame_global_flags * gfp)
1886 {
1887 if (is_lame_global_flags_valid(gfp)) {
1888 return gfp->attackthre;
1889 }
1890 return 0;
1891 }
1892
1893 int
lame_set_short_threshold_s(lame_global_flags * gfp,float s)1894 lame_set_short_threshold_s(lame_global_flags * gfp, float s)
1895 {
1896 if (is_lame_global_flags_valid(gfp)) {
1897 gfp->attackthre_s = s;
1898 return 0;
1899 }
1900 return -1;
1901 }
1902
1903 float
lame_get_short_threshold_s(const lame_global_flags * gfp)1904 lame_get_short_threshold_s(const lame_global_flags * gfp)
1905 {
1906 if (is_lame_global_flags_valid(gfp)) {
1907 return gfp->attackthre_s;
1908 }
1909 return 0;
1910 }
1911
1912 int
lame_set_short_threshold(lame_global_flags * gfp,float lrm,float s)1913 lame_set_short_threshold(lame_global_flags * gfp, float lrm, float s)
1914 {
1915 if (is_lame_global_flags_valid(gfp)) {
1916 lame_set_short_threshold_lrm(gfp, lrm);
1917 lame_set_short_threshold_s(gfp, s);
1918 return 0;
1919 }
1920 return -1;
1921 }
1922
1923
1924 /*
1925 * Input PCM is emphased PCM
1926 * (for instance from one of the rarely emphased CDs).
1927 *
1928 * It is STRONGLY not recommended to use this, because psycho does not
1929 * take it into account, and last but not least many decoders
1930 * ignore these bits
1931 */
1932 int
lame_set_emphasis(lame_global_flags * gfp,int emphasis)1933 lame_set_emphasis(lame_global_flags * gfp, int emphasis)
1934 {
1935 if (is_lame_global_flags_valid(gfp)) {
1936 /* XXX: emphasis should be converted to an enum */
1937 if (0 <= emphasis && emphasis < 4) {
1938 gfp->emphasis = emphasis;
1939 return 0;
1940 }
1941 }
1942 return -1;
1943 }
1944
1945 int
lame_get_emphasis(const lame_global_flags * gfp)1946 lame_get_emphasis(const lame_global_flags * gfp)
1947 {
1948 if (is_lame_global_flags_valid(gfp)) {
1949 assert(0 <= gfp->emphasis && gfp->emphasis < 4);
1950 return gfp->emphasis;
1951 }
1952 return 0;
1953 }
1954
1955
1956
1957
1958 /***************************************************************/
1959 /* internal variables, cannot be set... */
1960 /* provided because they may be of use to calling application */
1961 /***************************************************************/
1962
1963 /* MPEG version.
1964 * 0 = MPEG-2
1965 * 1 = MPEG-1
1966 * (2 = MPEG-2.5)
1967 */
1968 int
lame_get_version(const lame_global_flags * gfp)1969 lame_get_version(const lame_global_flags * gfp)
1970 {
1971 if (is_lame_global_flags_valid(gfp)) {
1972 lame_internal_flags const *const gfc = gfp->internal_flags;
1973 if (is_lame_internal_flags_valid(gfc)) {
1974 return gfc->cfg.version;
1975 }
1976 }
1977 return 0;
1978 }
1979
1980
1981 /* Encoder delay. */
1982 int
lame_get_encoder_delay(const lame_global_flags * gfp)1983 lame_get_encoder_delay(const lame_global_flags * gfp)
1984 {
1985 if (is_lame_global_flags_valid(gfp)) {
1986 lame_internal_flags const *const gfc = gfp->internal_flags;
1987 if (is_lame_internal_flags_valid(gfc)) {
1988 return gfc->ov_enc.encoder_delay;
1989 }
1990 }
1991 return 0;
1992 }
1993
1994 /* padding added to the end of the input */
1995 int
lame_get_encoder_padding(const lame_global_flags * gfp)1996 lame_get_encoder_padding(const lame_global_flags * gfp)
1997 {
1998 if (is_lame_global_flags_valid(gfp)) {
1999 lame_internal_flags const *const gfc = gfp->internal_flags;
2000 if (is_lame_internal_flags_valid(gfc)) {
2001 return gfc->ov_enc.encoder_padding;
2002 }
2003 }
2004 return 0;
2005 }
2006
2007
2008 /* Size of MPEG frame. */
2009 int
lame_get_framesize(const lame_global_flags * gfp)2010 lame_get_framesize(const lame_global_flags * gfp)
2011 {
2012 if (is_lame_global_flags_valid(gfp)) {
2013 lame_internal_flags const *const gfc = gfp->internal_flags;
2014 if (is_lame_internal_flags_valid(gfc)) {
2015 SessionConfig_t const *const cfg = &gfc->cfg;
2016 return 576 * cfg->mode_gr;
2017 }
2018 }
2019 return 0;
2020 }
2021
2022
2023 /* Number of frames encoded so far. */
2024 int
lame_get_frameNum(const lame_global_flags * gfp)2025 lame_get_frameNum(const lame_global_flags * gfp)
2026 {
2027 if (is_lame_global_flags_valid(gfp)) {
2028 lame_internal_flags const *const gfc = gfp->internal_flags;
2029 if (is_lame_internal_flags_valid(gfc)) {
2030 return gfc->ov_enc.frame_number;
2031 }
2032 }
2033 return 0;
2034 }
2035
2036 int
lame_get_mf_samples_to_encode(const lame_global_flags * gfp)2037 lame_get_mf_samples_to_encode(const lame_global_flags * gfp)
2038 {
2039 if (is_lame_global_flags_valid(gfp)) {
2040 lame_internal_flags const *const gfc = gfp->internal_flags;
2041 if (is_lame_internal_flags_valid(gfc)) {
2042 return gfc->sv_enc.mf_samples_to_encode;
2043 }
2044 }
2045 return 0;
2046 }
2047
2048 int CDECL
lame_get_size_mp3buffer(const lame_global_flags * gfp)2049 lame_get_size_mp3buffer(const lame_global_flags * gfp)
2050 {
2051 if (is_lame_global_flags_valid(gfp)) {
2052 lame_internal_flags const *const gfc = gfp->internal_flags;
2053 if (is_lame_internal_flags_valid(gfc)) {
2054 int size;
2055 compute_flushbits(gfc, &size);
2056 return size;
2057 }
2058 }
2059 return 0;
2060 }
2061
2062 int
lame_get_RadioGain(const lame_global_flags * gfp)2063 lame_get_RadioGain(const lame_global_flags * gfp)
2064 {
2065 if (is_lame_global_flags_valid(gfp)) {
2066 lame_internal_flags const *const gfc = gfp->internal_flags;
2067 if (is_lame_internal_flags_valid(gfc)) {
2068 return gfc->ov_rpg.RadioGain;
2069 }
2070 }
2071 return 0;
2072 }
2073
2074 int
lame_get_AudiophileGain(const lame_global_flags * gfp)2075 lame_get_AudiophileGain(const lame_global_flags * gfp)
2076 {
2077 if (is_lame_global_flags_valid(gfp)) {
2078 lame_internal_flags const *const gfc = gfp->internal_flags;
2079 if (is_lame_internal_flags_valid(gfc)) {
2080 return 0;
2081 }
2082 }
2083 return 0;
2084 }
2085
2086 float
lame_get_PeakSample(const lame_global_flags * gfp)2087 lame_get_PeakSample(const lame_global_flags * gfp)
2088 {
2089 if (is_lame_global_flags_valid(gfp)) {
2090 lame_internal_flags const *const gfc = gfp->internal_flags;
2091 if (is_lame_internal_flags_valid(gfc)) {
2092 return (float) gfc->ov_rpg.PeakSample;
2093 }
2094 }
2095 return 0;
2096 }
2097
2098 int
lame_get_noclipGainChange(const lame_global_flags * gfp)2099 lame_get_noclipGainChange(const lame_global_flags * gfp)
2100 {
2101 if (is_lame_global_flags_valid(gfp)) {
2102 lame_internal_flags const *const gfc = gfp->internal_flags;
2103 if (is_lame_internal_flags_valid(gfc)) {
2104 return gfc->ov_rpg.noclipGainChange;
2105 }
2106 }
2107 return 0;
2108 }
2109
2110 float
lame_get_noclipScale(const lame_global_flags * gfp)2111 lame_get_noclipScale(const lame_global_flags * gfp)
2112 {
2113 if (is_lame_global_flags_valid(gfp)) {
2114 lame_internal_flags const *const gfc = gfp->internal_flags;
2115 if (is_lame_internal_flags_valid(gfc)) {
2116 return gfc->ov_rpg.noclipScale;
2117 }
2118 }
2119 return 0;
2120 }
2121
2122
2123 /*
2124 * LAME's estimate of the total number of frames to be encoded.
2125 * Only valid if calling program set num_samples.
2126 */
2127 int
lame_get_totalframes(const lame_global_flags * gfp)2128 lame_get_totalframes(const lame_global_flags * gfp)
2129 {
2130 if (is_lame_global_flags_valid(gfp)) {
2131 lame_internal_flags const *const gfc = gfp->internal_flags;
2132 if (is_lame_internal_flags_valid(gfc)) {
2133 SessionConfig_t const *const cfg = &gfc->cfg;
2134 unsigned long const pcm_samples_per_frame = 576ul * cfg->mode_gr;
2135 unsigned long pcm_samples_to_encode = gfp->num_samples;
2136 unsigned long end_padding = 0;
2137 int frames = 0;
2138
2139 if (pcm_samples_to_encode == (0ul-1ul))
2140 return 0; /* unknown */
2141
2142 /* estimate based on user set num_samples: */
2143 if (cfg->samplerate_in != cfg->samplerate_out) {
2144 /* resampling, estimate new samples_to_encode */
2145 double resampled_samples_to_encode = 0.0, frames_f = 0.0;
2146 if (cfg->samplerate_in > 0) {
2147 resampled_samples_to_encode = pcm_samples_to_encode;
2148 resampled_samples_to_encode *= cfg->samplerate_out;
2149 resampled_samples_to_encode /= cfg->samplerate_in;
2150 }
2151 if (resampled_samples_to_encode <= 0.0)
2152 return 0; /* unlikely to happen, so what, no estimate! */
2153 frames_f = floor(resampled_samples_to_encode / pcm_samples_per_frame);
2154 if (frames_f >= (INT_MAX-2))
2155 return 0; /* overflow, happens eventually, no estimate! */
2156 frames = frames_f;
2157 resampled_samples_to_encode -= frames * pcm_samples_per_frame;
2158 pcm_samples_to_encode = ceil(resampled_samples_to_encode);
2159 }
2160 else {
2161 frames = pcm_samples_to_encode / pcm_samples_per_frame;
2162 pcm_samples_to_encode -= frames * pcm_samples_per_frame;
2163 }
2164 pcm_samples_to_encode += 576ul;
2165 end_padding = pcm_samples_per_frame - (pcm_samples_to_encode % pcm_samples_per_frame);
2166 if (end_padding < 576ul) {
2167 end_padding += pcm_samples_per_frame;
2168 }
2169 pcm_samples_to_encode += end_padding;
2170 frames += (pcm_samples_to_encode / pcm_samples_per_frame);
2171 /* check to see if we underestimated totalframes */
2172 /* if (totalframes < gfp->frameNum) */
2173 /* totalframes = gfp->frameNum; */
2174 return frames;
2175 }
2176 }
2177 return 0;
2178 }
2179
2180
2181
2182
2183
2184 int
lame_set_preset(lame_global_flags * gfp,int preset)2185 lame_set_preset(lame_global_flags * gfp, int preset)
2186 {
2187 if (is_lame_global_flags_valid(gfp)) {
2188 gfp->preset = preset;
2189 return apply_preset(gfp, preset, 1);
2190 }
2191 return -1;
2192 }
2193
2194
2195
2196 int
lame_set_asm_optimizations(lame_global_flags * gfp,int optim,int mode)2197 lame_set_asm_optimizations(lame_global_flags * gfp, int optim, int mode)
2198 {
2199 if (is_lame_global_flags_valid(gfp)) {
2200 mode = (mode == 1 ? 1 : 0);
2201 switch (optim) {
2202 case MMX:{
2203 gfp->asm_optimizations.mmx = mode;
2204 return optim;
2205 }
2206 case AMD_3DNOW:{
2207 gfp->asm_optimizations.amd3dnow = mode;
2208 return optim;
2209 }
2210 case SSE:{
2211 gfp->asm_optimizations.sse = mode;
2212 return optim;
2213 }
2214 default:
2215 return optim;
2216 }
2217 }
2218 return -1;
2219 }
2220
2221
2222 void
lame_set_write_id3tag_automatic(lame_global_flags * gfp,int v)2223 lame_set_write_id3tag_automatic(lame_global_flags * gfp, int v)
2224 {
2225 if (is_lame_global_flags_valid(gfp)) {
2226 gfp->write_id3tag_automatic = v;
2227 }
2228 }
2229
2230
2231 int
lame_get_write_id3tag_automatic(lame_global_flags const * gfp)2232 lame_get_write_id3tag_automatic(lame_global_flags const *gfp)
2233 {
2234 if (is_lame_global_flags_valid(gfp)) {
2235 return gfp->write_id3tag_automatic;
2236 }
2237 return 1;
2238 }
2239
2240
2241 /*
2242
2243 UNDOCUMENTED, experimental settings. These routines are not prototyped
2244 in lame.h. You should not use them, they are experimental and may
2245 change.
2246
2247 */
2248
2249
2250 /*
2251 * just another daily changing developer switch
2252 */
2253 void CDECL lame_set_tune(lame_global_flags *, float);
2254
2255 void
lame_set_tune(lame_global_flags * gfp,float val)2256 lame_set_tune(lame_global_flags * gfp, float val)
2257 {
2258 if (is_lame_global_flags_valid(gfp)) {
2259 gfp->tune_value_a = val;
2260 gfp->tune = 1;
2261 }
2262 }
2263
2264 /* Custom msfix hack */
2265 void
lame_set_msfix(lame_global_flags * gfp,double msfix)2266 lame_set_msfix(lame_global_flags * gfp, double msfix)
2267 {
2268 if (is_lame_global_flags_valid(gfp)) {
2269 /* default = 0 */
2270 gfp->msfix = msfix;
2271 }
2272 }
2273
2274 float
lame_get_msfix(const lame_global_flags * gfp)2275 lame_get_msfix(const lame_global_flags * gfp)
2276 {
2277 if (is_lame_global_flags_valid(gfp)) {
2278 return gfp->msfix;
2279 }
2280 return 0;
2281 }
2282
2283 #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
2284 int CDECL lame_set_preset_expopts(lame_global_flags *, int);
2285 #else
2286 #endif
2287
2288 int
lame_set_preset_expopts(lame_global_flags * gfp,int preset_expopts)2289 lame_set_preset_expopts(lame_global_flags * gfp, int preset_expopts)
2290 {
2291 (void) gfp;
2292 (void) preset_expopts;
2293 return 0;
2294 }
2295
2296
2297 int
lame_set_preset_notune(lame_global_flags * gfp,int preset_notune)2298 lame_set_preset_notune(lame_global_flags * gfp, int preset_notune)
2299 {
2300 (void) gfp;
2301 (void) preset_notune;
2302 return 0;
2303 }
2304
2305 static int
calc_maximum_input_samples_for_buffer_size(lame_internal_flags const * gfc,size_t buffer_size)2306 calc_maximum_input_samples_for_buffer_size(lame_internal_flags const* gfc, size_t buffer_size)
2307 {
2308 SessionConfig_t const *const cfg = &gfc->cfg;
2309 int const pcm_samples_per_frame = 576 * cfg->mode_gr;
2310 int frames_per_buffer = 0, input_samples_per_buffer = 0;
2311 int kbps = 320;
2312
2313 if (cfg->samplerate_out < 16000)
2314 kbps = 64;
2315 else if (cfg->samplerate_out < 32000)
2316 kbps = 160;
2317 else
2318 kbps = 320;
2319 if (cfg->free_format)
2320 kbps = cfg->avg_bitrate;
2321 else if (cfg->vbr == vbr_off) {
2322 kbps = cfg->avg_bitrate;
2323 }
2324 {
2325 int const pad = 1;
2326 int const bpf = ((cfg->version + 1) * 72000 * kbps / cfg->samplerate_out + pad);
2327 frames_per_buffer = buffer_size / bpf;
2328 }
2329 {
2330 double ratio = (double) cfg->samplerate_in / cfg->samplerate_out;
2331 input_samples_per_buffer = pcm_samples_per_frame * frames_per_buffer * ratio;
2332 }
2333 return input_samples_per_buffer;
2334 }
2335
2336 int
lame_get_maximum_number_of_samples(lame_t gfp,size_t buffer_size)2337 lame_get_maximum_number_of_samples(lame_t gfp, size_t buffer_size)
2338 {
2339 if (is_lame_global_flags_valid(gfp)) {
2340 lame_internal_flags const *const gfc = gfp->internal_flags;
2341 if (is_lame_internal_flags_valid(gfc)) {
2342 return calc_maximum_input_samples_for_buffer_size(gfc, buffer_size);
2343 }
2344 }
2345 return LAME_GENERICERROR;
2346 }
2347