1159b3361Sopenharmony_ci/*
2159b3361Sopenharmony_ci *      Command line parsing related functions
3159b3361Sopenharmony_ci *
4159b3361Sopenharmony_ci *      Copyright (c) 1999 Mark Taylor
5159b3361Sopenharmony_ci *                    2000-2017 Robert Hegemann
6159b3361Sopenharmony_ci *
7159b3361Sopenharmony_ci * This library is free software; you can redistribute it and/or
8159b3361Sopenharmony_ci * modify it under the terms of the GNU Library General Public
9159b3361Sopenharmony_ci * License as published by the Free Software Foundation; either
10159b3361Sopenharmony_ci * version 2 of the License, or (at your option) any later version.
11159b3361Sopenharmony_ci *
12159b3361Sopenharmony_ci * This library is distributed in the hope that it will be useful,
13159b3361Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14159b3361Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15159b3361Sopenharmony_ci * Library General Public License for more details.
16159b3361Sopenharmony_ci *
17159b3361Sopenharmony_ci * You should have received a copy of the GNU Library General Public
18159b3361Sopenharmony_ci * License along with this library; if not, write to the
19159b3361Sopenharmony_ci * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20159b3361Sopenharmony_ci * Boston, MA 02111-1307, USA.
21159b3361Sopenharmony_ci */
22159b3361Sopenharmony_ci
23159b3361Sopenharmony_ci/* $Id$ */
24159b3361Sopenharmony_ci
25159b3361Sopenharmony_ci#ifdef HAVE_CONFIG_H
26159b3361Sopenharmony_ci# include <config.h>
27159b3361Sopenharmony_ci#endif
28159b3361Sopenharmony_ci
29159b3361Sopenharmony_ci#include <assert.h>
30159b3361Sopenharmony_ci#include <ctype.h>
31159b3361Sopenharmony_ci#include <math.h>
32159b3361Sopenharmony_ci
33159b3361Sopenharmony_ci#ifdef STDC_HEADERS
34159b3361Sopenharmony_ci# include <stdio.h>
35159b3361Sopenharmony_ci# include <stdlib.h>
36159b3361Sopenharmony_ci# include <string.h>
37159b3361Sopenharmony_ci#else
38159b3361Sopenharmony_ci# ifndef HAVE_STRCHR
39159b3361Sopenharmony_ci#  define strchr index
40159b3361Sopenharmony_ci#  define strrchr rindex
41159b3361Sopenharmony_ci# endif
42159b3361Sopenharmony_cichar   *strchr(), *strrchr();
43159b3361Sopenharmony_ci# ifndef HAVE_MEMCPY
44159b3361Sopenharmony_ci#  define memcpy(d, s, n) bcopy ((s), (d), (n))
45159b3361Sopenharmony_ci#  define memmove(d, s, n) bcopy ((s), (d), (n))
46159b3361Sopenharmony_ci# endif
47159b3361Sopenharmony_ci#endif
48159b3361Sopenharmony_ci
49159b3361Sopenharmony_ci
50159b3361Sopenharmony_ci#ifdef HAVE_LIMITS_H
51159b3361Sopenharmony_ci# include <limits.h>
52159b3361Sopenharmony_ci#endif
53159b3361Sopenharmony_ci
54159b3361Sopenharmony_ci#include "lame.h"
55159b3361Sopenharmony_ci
56159b3361Sopenharmony_ci#include "parse.h"
57159b3361Sopenharmony_ci#include "main.h"
58159b3361Sopenharmony_ci#include "get_audio.h"
59159b3361Sopenharmony_ci#include "version.h"
60159b3361Sopenharmony_ci#include "console.h"
61159b3361Sopenharmony_ci
62159b3361Sopenharmony_ci#undef dimension_of
63159b3361Sopenharmony_ci#define dimension_of(array) (sizeof(array)/sizeof(array[0]))
64159b3361Sopenharmony_ci
65159b3361Sopenharmony_ci#ifdef WITH_DMALLOC
66159b3361Sopenharmony_ci#include <dmalloc.h>
67159b3361Sopenharmony_ci#endif
68159b3361Sopenharmony_ci
69159b3361Sopenharmony_ci
70159b3361Sopenharmony_ci#ifdef HAVE_ICONV
71159b3361Sopenharmony_ci#include <iconv.h>
72159b3361Sopenharmony_ci#include <errno.h>
73159b3361Sopenharmony_ci#ifdef HAVE_LANGINFO_H
74159b3361Sopenharmony_ci#include <locale.h>
75159b3361Sopenharmony_ci#include <langinfo.h>
76159b3361Sopenharmony_ci#endif
77159b3361Sopenharmony_ci#if defined(__KLIBC__) && !defined(iconv_open)
78159b3361Sopenharmony_ci/* kLIBC iconv_open() does not support UTF-16LE and //TRANSLIT */
79159b3361Sopenharmony_cistatic iconv_t os2_iconv_open (const char *tocode, const char *fromcode)
80159b3361Sopenharmony_ci{
81159b3361Sopenharmony_ci    char to[strlen(tocode) + 1];
82159b3361Sopenharmony_ci    char from[strlen(fromcode) + 1];
83159b3361Sopenharmony_ci    char *p;
84159b3361Sopenharmony_ci
85159b3361Sopenharmony_ci    strcpy(to, tocode);
86159b3361Sopenharmony_ci    strcpy(from, fromcode);
87159b3361Sopenharmony_ci
88159b3361Sopenharmony_ci    if (!strncmp(to, "UTF-16", 6))
89159b3361Sopenharmony_ci    {
90159b3361Sopenharmony_ci        strcpy(to, "UCS-2");
91159b3361Sopenharmony_ci        memmove(to + 5, to + 6, strlen(to + 6));
92159b3361Sopenharmony_ci    }
93159b3361Sopenharmony_ci
94159b3361Sopenharmony_ci    p = strstr(to, "//");
95159b3361Sopenharmony_ci    if (p)
96159b3361Sopenharmony_ci        *p = '\0';
97159b3361Sopenharmony_ci
98159b3361Sopenharmony_ci    if (!strncmp(from, "UTF-16", 6))
99159b3361Sopenharmony_ci    {
100159b3361Sopenharmony_ci        strcpy(from, "UCS-2");
101159b3361Sopenharmony_ci        memmove(from + 5, from + 6, strlen(from + 6));
102159b3361Sopenharmony_ci    }
103159b3361Sopenharmony_ci
104159b3361Sopenharmony_ci    p = strstr(from, "//");
105159b3361Sopenharmony_ci    if (p)
106159b3361Sopenharmony_ci        *p = '\0';
107159b3361Sopenharmony_ci
108159b3361Sopenharmony_ci    return iconv_open(to, from);
109159b3361Sopenharmony_ci}
110159b3361Sopenharmony_ci
111159b3361Sopenharmony_ci#define iconv_open(t, f) os2_iconv_open(t, f)
112159b3361Sopenharmony_ci#endif /* KLIBC iconv */
113159b3361Sopenharmony_ci#endif /* HAVE_ICONV */
114159b3361Sopenharmony_ci
115159b3361Sopenharmony_ci#if defined _ALLOW_INTERNAL_OPTIONS
116159b3361Sopenharmony_ci#define INTERNAL_OPTS 1
117159b3361Sopenharmony_ci#else
118159b3361Sopenharmony_ci#define INTERNAL_OPTS 0
119159b3361Sopenharmony_ci#endif
120159b3361Sopenharmony_ci
121159b3361Sopenharmony_ci#if (INTERNAL_OPTS!=0)
122159b3361Sopenharmony_ci#include "set_get.h"
123159b3361Sopenharmony_ci#define DEV_HELP(a) a
124159b3361Sopenharmony_ci#else
125159b3361Sopenharmony_ci#define DEV_HELP(a)
126159b3361Sopenharmony_ci#define lame_set_tune(a,b) (void)0
127159b3361Sopenharmony_ci#define lame_set_short_threshold(a,b,c) (void)0
128159b3361Sopenharmony_ci#define lame_set_maskingadjust(a,b) (void)0
129159b3361Sopenharmony_ci#define lame_set_maskingadjust_short(a,b) (void)0
130159b3361Sopenharmony_ci#define lame_set_ATHcurve(a,b) (void)0
131159b3361Sopenharmony_ci#define lame_set_preset_notune(a,b) (void)0
132159b3361Sopenharmony_ci#define lame_set_substep(a,b) (void)0
133159b3361Sopenharmony_ci#define lame_set_subblock_gain(a,b) (void)0
134159b3361Sopenharmony_ci#define lame_set_sfscale(a,b) (void)0
135159b3361Sopenharmony_ci#endif
136159b3361Sopenharmony_ci
137159b3361Sopenharmony_cistatic int const lame_alpha_version_enabled = LAME_ALPHA_VERSION;
138159b3361Sopenharmony_cistatic int const internal_opts_enabled = INTERNAL_OPTS;
139159b3361Sopenharmony_ci
140159b3361Sopenharmony_ci/* GLOBAL VARIABLES.  set by parse_args() */
141159b3361Sopenharmony_ci/* we need to clean this up */
142159b3361Sopenharmony_ci
143159b3361Sopenharmony_ciReaderConfig global_reader = { sf_unknown, 0, 0, 0, 0 };
144159b3361Sopenharmony_ciWriterConfig global_writer = { 0 };
145159b3361Sopenharmony_ci
146159b3361Sopenharmony_ciUiConfig global_ui_config = {0,0,0,0};
147159b3361Sopenharmony_ci
148159b3361Sopenharmony_ciDecoderConfig global_decoder;
149159b3361Sopenharmony_ci
150159b3361Sopenharmony_ciRawPCMConfig global_raw_pcm =
151159b3361Sopenharmony_ci{ /* in_bitwidth */ 16
152159b3361Sopenharmony_ci, /* in_signed   */ -1
153159b3361Sopenharmony_ci, /* in_endian   */ ByteOrderLittleEndian
154159b3361Sopenharmony_ci};
155159b3361Sopenharmony_ci
156159b3361Sopenharmony_ci
157159b3361Sopenharmony_ci
158159b3361Sopenharmony_ci/* possible text encodings */
159159b3361Sopenharmony_citypedef enum TextEncoding
160159b3361Sopenharmony_ci{ TENC_RAW     /* bytes will be stored as-is into ID3 tags, which are Latin1 per definition */
161159b3361Sopenharmony_ci, TENC_LATIN1  /* text will be converted from local encoding to Latin1, as ID3 needs it */
162159b3361Sopenharmony_ci, TENC_UTF16   /* text will be converted from local encoding to Unicode, as ID3v2 wants it */
163159b3361Sopenharmony_ci} TextEncoding;
164159b3361Sopenharmony_ci
165159b3361Sopenharmony_ci#ifdef HAVE_ICONV
166159b3361Sopenharmony_ci#define ID3TAGS_EXTENDED
167159b3361Sopenharmony_ci/* search for Zero termination in multi-byte strings */
168159b3361Sopenharmony_cistatic size_t
169159b3361Sopenharmony_cistrlenMultiByte(char const* str, size_t w)
170159b3361Sopenharmony_ci{
171159b3361Sopenharmony_ci    size_t n = 0;
172159b3361Sopenharmony_ci    if (str != 0) {
173159b3361Sopenharmony_ci        size_t i;
174159b3361Sopenharmony_ci        for (n = 0; ; ++n) {
175159b3361Sopenharmony_ci            size_t x = 0;
176159b3361Sopenharmony_ci            for (i = 0; i < w; ++i) {
177159b3361Sopenharmony_ci                x += *str++ == 0 ? 1 : 0;
178159b3361Sopenharmony_ci            }
179159b3361Sopenharmony_ci            if (x == w) {
180159b3361Sopenharmony_ci                break;
181159b3361Sopenharmony_ci            }
182159b3361Sopenharmony_ci        }
183159b3361Sopenharmony_ci    }
184159b3361Sopenharmony_ci    return n;
185159b3361Sopenharmony_ci}
186159b3361Sopenharmony_ci
187159b3361Sopenharmony_cistatic char*
188159b3361Sopenharmony_cicurrentCharacterEncoding()
189159b3361Sopenharmony_ci{
190159b3361Sopenharmony_ci#ifdef HAVE_LANGINFO_H
191159b3361Sopenharmony_ci    char* cur_code = nl_langinfo(CODESET);
192159b3361Sopenharmony_ci#else
193159b3361Sopenharmony_ci    char* env_lang = getenv("LANG");
194159b3361Sopenharmony_ci    char* xxx_code = env_lang == NULL ? NULL : strrchr(env_lang, '.');
195159b3361Sopenharmony_ci    char* cur_code = xxx_code == NULL ? "" : xxx_code+1;
196159b3361Sopenharmony_ci#endif
197159b3361Sopenharmony_ci    return cur_code;
198159b3361Sopenharmony_ci}
199159b3361Sopenharmony_ci
200159b3361Sopenharmony_cistatic size_t
201159b3361Sopenharmony_cicurrCharCodeSize(void)
202159b3361Sopenharmony_ci{
203159b3361Sopenharmony_ci    size_t n = 1;
204159b3361Sopenharmony_ci    char dst[32];
205159b3361Sopenharmony_ci    char* src = "A";
206159b3361Sopenharmony_ci    char* cur_code = currentCharacterEncoding();
207159b3361Sopenharmony_ci    iconv_t xiconv = iconv_open(cur_code, "ISO_8859-1");
208159b3361Sopenharmony_ci    if (xiconv != (iconv_t)-1) {
209159b3361Sopenharmony_ci        for (n = 0; n < 32; ++n) {
210159b3361Sopenharmony_ci            char* i_ptr = src;
211159b3361Sopenharmony_ci            char* o_ptr = dst;
212159b3361Sopenharmony_ci            size_t srcln = 1;
213159b3361Sopenharmony_ci            size_t avail = n;
214159b3361Sopenharmony_ci            size_t rc = iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
215159b3361Sopenharmony_ci            if (rc != (size_t)-1) {
216159b3361Sopenharmony_ci                break;
217159b3361Sopenharmony_ci            }
218159b3361Sopenharmony_ci        }
219159b3361Sopenharmony_ci        iconv_close(xiconv);
220159b3361Sopenharmony_ci    }
221159b3361Sopenharmony_ci    return n;
222159b3361Sopenharmony_ci}
223159b3361Sopenharmony_ci
224159b3361Sopenharmony_ci#if 0
225159b3361Sopenharmony_cistatic
226159b3361Sopenharmony_cichar* fromLatin1( char* src )
227159b3361Sopenharmony_ci{
228159b3361Sopenharmony_ci    char* dst = 0;
229159b3361Sopenharmony_ci    if (src != 0) {
230159b3361Sopenharmony_ci        size_t const l = strlen(src);
231159b3361Sopenharmony_ci        size_t const n = l*4;
232159b3361Sopenharmony_ci        dst = calloc(n+4, 4);
233159b3361Sopenharmony_ci        if (dst != 0) {
234159b3361Sopenharmony_ci            char* cur_code = currentCharacterEncoding();
235159b3361Sopenharmony_ci            iconv_t xiconv = iconv_open(cur_code, "ISO_8859-1");
236159b3361Sopenharmony_ci            if (xiconv != (iconv_t)-1) {
237159b3361Sopenharmony_ci                char* i_ptr = src;
238159b3361Sopenharmony_ci                char* o_ptr = dst;
239159b3361Sopenharmony_ci                size_t srcln = l;
240159b3361Sopenharmony_ci                size_t avail = n;
241159b3361Sopenharmony_ci                iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
242159b3361Sopenharmony_ci                iconv_close(xiconv);
243159b3361Sopenharmony_ci            }
244159b3361Sopenharmony_ci        }
245159b3361Sopenharmony_ci    }
246159b3361Sopenharmony_ci    return dst;
247159b3361Sopenharmony_ci}
248159b3361Sopenharmony_ci
249159b3361Sopenharmony_cistatic
250159b3361Sopenharmony_cichar* fromUtf16( char* src )
251159b3361Sopenharmony_ci{
252159b3361Sopenharmony_ci    char* dst = 0;
253159b3361Sopenharmony_ci    if (src != 0) {
254159b3361Sopenharmony_ci        size_t const l = strlenMultiByte(src, 2);
255159b3361Sopenharmony_ci        size_t const n = l*4;
256159b3361Sopenharmony_ci        dst = calloc(n+4, 4);
257159b3361Sopenharmony_ci        if (dst != 0) {
258159b3361Sopenharmony_ci            char* cur_code = currentCharacterEncoding();
259159b3361Sopenharmony_ci            iconv_t xiconv = iconv_open(cur_code, "UTF-16LE");
260159b3361Sopenharmony_ci            if (xiconv != (iconv_t)-1) {
261159b3361Sopenharmony_ci                char* i_ptr = (char*)src;
262159b3361Sopenharmony_ci                char* o_ptr = dst;
263159b3361Sopenharmony_ci                size_t srcln = l*2;
264159b3361Sopenharmony_ci                size_t avail = n;
265159b3361Sopenharmony_ci                iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
266159b3361Sopenharmony_ci                iconv_close(xiconv);
267159b3361Sopenharmony_ci            }
268159b3361Sopenharmony_ci        }
269159b3361Sopenharmony_ci    }
270159b3361Sopenharmony_ci    return dst;
271159b3361Sopenharmony_ci}
272159b3361Sopenharmony_ci#endif
273159b3361Sopenharmony_ci
274159b3361Sopenharmony_cistatic
275159b3361Sopenharmony_cichar* toLatin1( char* src )
276159b3361Sopenharmony_ci{
277159b3361Sopenharmony_ci    size_t w = currCharCodeSize();
278159b3361Sopenharmony_ci    char* dst = 0;
279159b3361Sopenharmony_ci    if (src != 0) {
280159b3361Sopenharmony_ci        size_t const l = strlenMultiByte(src, w);
281159b3361Sopenharmony_ci        size_t const n = l*4;
282159b3361Sopenharmony_ci        dst = calloc(n+4, 4);
283159b3361Sopenharmony_ci        if (dst != 0) {
284159b3361Sopenharmony_ci            char* cur_code = currentCharacterEncoding();
285159b3361Sopenharmony_ci            iconv_t xiconv = iconv_open("ISO_8859-1//TRANSLIT", cur_code);
286159b3361Sopenharmony_ci            if (xiconv != (iconv_t)-1) {
287159b3361Sopenharmony_ci                char* i_ptr = (char*)src;
288159b3361Sopenharmony_ci                char* o_ptr = dst;
289159b3361Sopenharmony_ci                size_t srcln = l*w;
290159b3361Sopenharmony_ci                size_t avail = n;
291159b3361Sopenharmony_ci                iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
292159b3361Sopenharmony_ci                iconv_close(xiconv);
293159b3361Sopenharmony_ci            }
294159b3361Sopenharmony_ci        }
295159b3361Sopenharmony_ci    }
296159b3361Sopenharmony_ci    return dst;
297159b3361Sopenharmony_ci}
298159b3361Sopenharmony_ci
299159b3361Sopenharmony_ci
300159b3361Sopenharmony_cistatic
301159b3361Sopenharmony_cichar* toUtf16( char* src )
302159b3361Sopenharmony_ci{
303159b3361Sopenharmony_ci    size_t w = currCharCodeSize();
304159b3361Sopenharmony_ci    char* dst = 0;
305159b3361Sopenharmony_ci    if (src != 0) {
306159b3361Sopenharmony_ci        size_t const l = strlenMultiByte(src, w);
307159b3361Sopenharmony_ci        size_t const n = (l+1)*4;
308159b3361Sopenharmony_ci        dst = calloc(n+4, 4);
309159b3361Sopenharmony_ci        if (dst != 0) {
310159b3361Sopenharmony_ci            char* cur_code = currentCharacterEncoding();
311159b3361Sopenharmony_ci            iconv_t xiconv = iconv_open("UTF-16LE//TRANSLIT", cur_code);
312159b3361Sopenharmony_ci            dst[0] = 0xff;
313159b3361Sopenharmony_ci            dst[1] = 0xfe;
314159b3361Sopenharmony_ci            if (xiconv != (iconv_t)-1) {
315159b3361Sopenharmony_ci                char* i_ptr = (char*)src;
316159b3361Sopenharmony_ci                char* o_ptr = &dst[2];
317159b3361Sopenharmony_ci                size_t srcln = l*w;
318159b3361Sopenharmony_ci                size_t avail = n;
319159b3361Sopenharmony_ci                iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
320159b3361Sopenharmony_ci                iconv_close(xiconv);
321159b3361Sopenharmony_ci            }
322159b3361Sopenharmony_ci        }
323159b3361Sopenharmony_ci    }
324159b3361Sopenharmony_ci    return dst;
325159b3361Sopenharmony_ci}
326159b3361Sopenharmony_ci#endif
327159b3361Sopenharmony_ci
328159b3361Sopenharmony_ci#if defined( _WIN32 ) && !defined(__MINGW32__)
329159b3361Sopenharmony_ci#define ID3TAGS_EXTENDED
330159b3361Sopenharmony_ci
331159b3361Sopenharmony_cichar* toLatin1(char const* s)
332159b3361Sopenharmony_ci{
333159b3361Sopenharmony_ci    return utf8ToLatin1(s);
334159b3361Sopenharmony_ci}
335159b3361Sopenharmony_ci
336159b3361Sopenharmony_ciunsigned short* toUtf16(char const* s)
337159b3361Sopenharmony_ci{
338159b3361Sopenharmony_ci    return utf8ToUtf16(s);
339159b3361Sopenharmony_ci}
340159b3361Sopenharmony_ci#endif
341159b3361Sopenharmony_ci
342159b3361Sopenharmony_cistatic int evaluateArgument(char const* token, char const* arg, char* _EndPtr)
343159b3361Sopenharmony_ci{
344159b3361Sopenharmony_ci    if (arg != 0 && arg != _EndPtr)
345159b3361Sopenharmony_ci        return 1;
346159b3361Sopenharmony_ci    error_printf("WARNING: argument missing for '%s'\n", token);
347159b3361Sopenharmony_ci    return 0;
348159b3361Sopenharmony_ci}
349159b3361Sopenharmony_ci
350159b3361Sopenharmony_cistatic int getDoubleValue(char const* token, char const* arg, double* ptr)
351159b3361Sopenharmony_ci{
352159b3361Sopenharmony_ci    char *_EndPtr=0;
353159b3361Sopenharmony_ci    double d = strtod(arg, &_EndPtr);
354159b3361Sopenharmony_ci    if (ptr != 0) {
355159b3361Sopenharmony_ci        *ptr = d;
356159b3361Sopenharmony_ci    }
357159b3361Sopenharmony_ci    return evaluateArgument(token, arg, _EndPtr);
358159b3361Sopenharmony_ci}
359159b3361Sopenharmony_ci
360159b3361Sopenharmony_cistatic int getIntValue(char const* token, char const* arg, int* ptr)
361159b3361Sopenharmony_ci{
362159b3361Sopenharmony_ci    char *_EndPtr=0;
363159b3361Sopenharmony_ci    long d = strtol(arg, &_EndPtr, 10);
364159b3361Sopenharmony_ci    if (ptr != 0) {
365159b3361Sopenharmony_ci        *ptr = d;
366159b3361Sopenharmony_ci    }
367159b3361Sopenharmony_ci    return evaluateArgument(token, arg, _EndPtr);
368159b3361Sopenharmony_ci}
369159b3361Sopenharmony_ci
370159b3361Sopenharmony_ci#ifdef ID3TAGS_EXTENDED
371159b3361Sopenharmony_cistatic int
372159b3361Sopenharmony_ciset_id3v2tag(lame_global_flags* gfp, int type, unsigned short const* str)
373159b3361Sopenharmony_ci{
374159b3361Sopenharmony_ci    switch (type)
375159b3361Sopenharmony_ci    {
376159b3361Sopenharmony_ci        case 'a': return id3tag_set_textinfo_utf16(gfp, "TPE1", str);
377159b3361Sopenharmony_ci        case 't': return id3tag_set_textinfo_utf16(gfp, "TIT2", str);
378159b3361Sopenharmony_ci        case 'l': return id3tag_set_textinfo_utf16(gfp, "TALB", str);
379159b3361Sopenharmony_ci        case 'g': return id3tag_set_textinfo_utf16(gfp, "TCON", str);
380159b3361Sopenharmony_ci        case 'c': return id3tag_set_comment_utf16(gfp, 0, 0, str);
381159b3361Sopenharmony_ci        case 'n': return id3tag_set_textinfo_utf16(gfp, "TRCK", str);
382159b3361Sopenharmony_ci        case 'y': return id3tag_set_textinfo_utf16(gfp, "TYER", str);
383159b3361Sopenharmony_ci        case 'v': return id3tag_set_fieldvalue_utf16(gfp, str);
384159b3361Sopenharmony_ci    }
385159b3361Sopenharmony_ci    return 0;
386159b3361Sopenharmony_ci}
387159b3361Sopenharmony_ci#endif
388159b3361Sopenharmony_ci
389159b3361Sopenharmony_cistatic int
390159b3361Sopenharmony_ciset_id3tag(lame_global_flags* gfp, int type, char const* str)
391159b3361Sopenharmony_ci{
392159b3361Sopenharmony_ci    switch (type)
393159b3361Sopenharmony_ci    {
394159b3361Sopenharmony_ci        case 'a': return id3tag_set_artist(gfp, str), 0;
395159b3361Sopenharmony_ci        case 't': return id3tag_set_title(gfp, str), 0;
396159b3361Sopenharmony_ci        case 'l': return id3tag_set_album(gfp, str), 0;
397159b3361Sopenharmony_ci        case 'g': return id3tag_set_genre(gfp, str);
398159b3361Sopenharmony_ci        case 'c': return id3tag_set_comment(gfp, str), 0;
399159b3361Sopenharmony_ci        case 'n': return id3tag_set_track(gfp, str);
400159b3361Sopenharmony_ci        case 'y': return id3tag_set_year(gfp, str), 0;
401159b3361Sopenharmony_ci        case 'v': return id3tag_set_fieldvalue(gfp, str);
402159b3361Sopenharmony_ci    }
403159b3361Sopenharmony_ci    return 0;
404159b3361Sopenharmony_ci}
405159b3361Sopenharmony_ci
406159b3361Sopenharmony_cistatic int
407159b3361Sopenharmony_ciid3_tag(lame_global_flags* gfp, int type, TextEncoding enc, char* str)
408159b3361Sopenharmony_ci{
409159b3361Sopenharmony_ci    void* x = 0;
410159b3361Sopenharmony_ci    int result;
411159b3361Sopenharmony_ci    if (enc == TENC_UTF16 && type != 'v' ) {
412159b3361Sopenharmony_ci        id3_tag(gfp, type, TENC_LATIN1, str); /* for id3v1 */
413159b3361Sopenharmony_ci    }
414159b3361Sopenharmony_ci    switch (enc)
415159b3361Sopenharmony_ci    {
416159b3361Sopenharmony_ci        default:
417159b3361Sopenharmony_ci#ifdef ID3TAGS_EXTENDED
418159b3361Sopenharmony_ci        case TENC_LATIN1: x = toLatin1(str); break;
419159b3361Sopenharmony_ci        case TENC_UTF16:  x = toUtf16(str);   break;
420159b3361Sopenharmony_ci#else
421159b3361Sopenharmony_ci        case TENC_RAW:    x = strdup(str);   break;
422159b3361Sopenharmony_ci#endif
423159b3361Sopenharmony_ci    }
424159b3361Sopenharmony_ci    switch (enc)
425159b3361Sopenharmony_ci    {
426159b3361Sopenharmony_ci        default:
427159b3361Sopenharmony_ci#ifdef ID3TAGS_EXTENDED
428159b3361Sopenharmony_ci        case TENC_LATIN1: result = set_id3tag(gfp, type, x);   break;
429159b3361Sopenharmony_ci        case TENC_UTF16:  result = set_id3v2tag(gfp, type, x); break;
430159b3361Sopenharmony_ci#else
431159b3361Sopenharmony_ci        case TENC_RAW:    result = set_id3tag(gfp, type, x);   break;
432159b3361Sopenharmony_ci#endif
433159b3361Sopenharmony_ci    }
434159b3361Sopenharmony_ci    free(x);
435159b3361Sopenharmony_ci    return result;
436159b3361Sopenharmony_ci}
437159b3361Sopenharmony_ci
438159b3361Sopenharmony_ci
439159b3361Sopenharmony_ci
440159b3361Sopenharmony_ci
441159b3361Sopenharmony_ci/************************************************************************
442159b3361Sopenharmony_ci*
443159b3361Sopenharmony_ci* license
444159b3361Sopenharmony_ci*
445159b3361Sopenharmony_ci* PURPOSE:  Writes version and license to the file specified by fp
446159b3361Sopenharmony_ci*
447159b3361Sopenharmony_ci************************************************************************/
448159b3361Sopenharmony_ci
449159b3361Sopenharmony_cistatic int
450159b3361Sopenharmony_cilame_version_print(FILE * const fp)
451159b3361Sopenharmony_ci{
452159b3361Sopenharmony_ci    const char *b = get_lame_os_bitness();
453159b3361Sopenharmony_ci    const char *v = get_lame_version();
454159b3361Sopenharmony_ci    const char *u = get_lame_url();
455159b3361Sopenharmony_ci    const size_t lenb = strlen(b);
456159b3361Sopenharmony_ci    const size_t lenv = strlen(v);
457159b3361Sopenharmony_ci    const size_t lenu = strlen(u);
458159b3361Sopenharmony_ci    const size_t lw = 80;       /* line width of terminal in characters */
459159b3361Sopenharmony_ci    const size_t sw = 16;       /* static width of text */
460159b3361Sopenharmony_ci
461159b3361Sopenharmony_ci    if (lw >= lenb + lenv + lenu + sw || lw < lenu + 2)
462159b3361Sopenharmony_ci        /* text fits in 80 chars per line, or line even too small for url */
463159b3361Sopenharmony_ci        if (lenb > 0)
464159b3361Sopenharmony_ci            fprintf(fp, "LAME %s version %s (%s)\n\n", b, v, u);
465159b3361Sopenharmony_ci        else
466159b3361Sopenharmony_ci            fprintf(fp, "LAME version %s (%s)\n\n", v, u);
467159b3361Sopenharmony_ci    else {
468159b3361Sopenharmony_ci        int const n_white_spaces = (int)((lenu+2) > lw ? 0 : lw-2-lenu);
469159b3361Sopenharmony_ci        /* text too long, wrap url into next line, right aligned */
470159b3361Sopenharmony_ci        if (lenb > 0)
471159b3361Sopenharmony_ci            fprintf(fp, "LAME %s version %s\n%*s(%s)\n\n", b, v, n_white_spaces, "", u);
472159b3361Sopenharmony_ci        else
473159b3361Sopenharmony_ci            fprintf(fp, "LAME version %s\n%*s(%s)\n\n", v, n_white_spaces, "", u);
474159b3361Sopenharmony_ci    }
475159b3361Sopenharmony_ci    if (lame_alpha_version_enabled)
476159b3361Sopenharmony_ci        fprintf(fp, "warning: alpha versions should be used for testing only\n\n");
477159b3361Sopenharmony_ci
478159b3361Sopenharmony_ci
479159b3361Sopenharmony_ci    return 0;
480159b3361Sopenharmony_ci}
481159b3361Sopenharmony_ci
482159b3361Sopenharmony_cistatic int
483159b3361Sopenharmony_ciprint_license(FILE * const fp)
484159b3361Sopenharmony_ci{                       /* print version & license */
485159b3361Sopenharmony_ci    lame_version_print(fp);
486159b3361Sopenharmony_ci    fprintf(fp,
487159b3361Sopenharmony_ci            "Copyright (c) 1999-2011 by The LAME Project\n"
488159b3361Sopenharmony_ci            "Copyright (c) 1999,2000,2001 by Mark Taylor\n"
489159b3361Sopenharmony_ci            "Copyright (c) 1998 by Michael Cheng\n"
490159b3361Sopenharmony_ci            "Copyright (c) 1995,1996,1997 by Michael Hipp: mpglib\n" "\n");
491159b3361Sopenharmony_ci    fprintf(fp,
492159b3361Sopenharmony_ci            "This library is free software; you can redistribute it and/or\n"
493159b3361Sopenharmony_ci            "modify it under the terms of the GNU Library General Public\n"
494159b3361Sopenharmony_ci            "License as published by the Free Software Foundation; either\n"
495159b3361Sopenharmony_ci            "version 2 of the License, or (at your option) any later version.\n"
496159b3361Sopenharmony_ci            "\n");
497159b3361Sopenharmony_ci    fprintf(fp,
498159b3361Sopenharmony_ci            "This library is distributed in the hope that it will be useful,\n"
499159b3361Sopenharmony_ci            "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
500159b3361Sopenharmony_ci            "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
501159b3361Sopenharmony_ci            "Library General Public License for more details.\n"
502159b3361Sopenharmony_ci            "\n");
503159b3361Sopenharmony_ci    fprintf(fp,
504159b3361Sopenharmony_ci            "You should have received a copy of the GNU Library General Public\n"
505159b3361Sopenharmony_ci            "License along with this program. If not, see\n"
506159b3361Sopenharmony_ci            "<http://www.gnu.org/licenses/>.\n");
507159b3361Sopenharmony_ci    return 0;
508159b3361Sopenharmony_ci}
509159b3361Sopenharmony_ci
510159b3361Sopenharmony_ci
511159b3361Sopenharmony_ci/************************************************************************
512159b3361Sopenharmony_ci*
513159b3361Sopenharmony_ci* usage
514159b3361Sopenharmony_ci*
515159b3361Sopenharmony_ci* PURPOSE:  Writes command line syntax to the file specified by fp
516159b3361Sopenharmony_ci*
517159b3361Sopenharmony_ci************************************************************************/
518159b3361Sopenharmony_ci
519159b3361Sopenharmony_ciint
520159b3361Sopenharmony_ciusage(FILE * const fp, const char *ProgramName)
521159b3361Sopenharmony_ci{                       /* print general syntax */
522159b3361Sopenharmony_ci    lame_version_print(fp);
523159b3361Sopenharmony_ci    fprintf(fp,
524159b3361Sopenharmony_ci            "usage: %s [options] <infile> [outfile]\n"
525159b3361Sopenharmony_ci            "\n"
526159b3361Sopenharmony_ci            "    <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n"
527159b3361Sopenharmony_ci            "\n"
528159b3361Sopenharmony_ci            "Try:\n"
529159b3361Sopenharmony_ci            "     \"%s --help\"           for general usage information\n"
530159b3361Sopenharmony_ci            " or:\n"
531159b3361Sopenharmony_ci            "     \"%s --preset help\"    for information on suggested predefined settings\n"
532159b3361Sopenharmony_ci            " or:\n"
533159b3361Sopenharmony_ci            "     \"%s --longhelp\"\n"
534159b3361Sopenharmony_ci            "  or \"%s -?\"              for a complete options list\n\n",
535159b3361Sopenharmony_ci            ProgramName, ProgramName, ProgramName, ProgramName, ProgramName);
536159b3361Sopenharmony_ci    return 0;
537159b3361Sopenharmony_ci}
538159b3361Sopenharmony_ci
539159b3361Sopenharmony_ci
540159b3361Sopenharmony_ci/************************************************************************
541159b3361Sopenharmony_ci*
542159b3361Sopenharmony_ci* usage
543159b3361Sopenharmony_ci*
544159b3361Sopenharmony_ci* PURPOSE:  Writes command line syntax to the file specified by fp
545159b3361Sopenharmony_ci*           but only the most important ones, to fit on a vt100 terminal
546159b3361Sopenharmony_ci*
547159b3361Sopenharmony_ci************************************************************************/
548159b3361Sopenharmony_ci
549159b3361Sopenharmony_ciint
550159b3361Sopenharmony_cishort_help(const lame_global_flags * gfp, FILE * const fp, const char *ProgramName)
551159b3361Sopenharmony_ci{                       /* print short syntax help */
552159b3361Sopenharmony_ci    lame_version_print(fp);
553159b3361Sopenharmony_ci    fprintf(fp,
554159b3361Sopenharmony_ci            "usage: %s [options] <infile> [outfile]\n"
555159b3361Sopenharmony_ci            "\n"
556159b3361Sopenharmony_ci            "    <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n"
557159b3361Sopenharmony_ci            "\n" "RECOMMENDED:\n" "    lame -V2 input.wav output.mp3\n" "\n", ProgramName);
558159b3361Sopenharmony_ci    fprintf(fp,
559159b3361Sopenharmony_ci            "OPTIONS:\n"
560159b3361Sopenharmony_ci            "    -b bitrate      set the bitrate, default 128 kbps\n"
561159b3361Sopenharmony_ci            "    -h              higher quality, but a little slower.\n"
562159b3361Sopenharmony_ci            "    -f              fast mode (lower quality)\n"
563159b3361Sopenharmony_ci            "    -V n            quality setting for VBR.  default n=%i\n"
564159b3361Sopenharmony_ci            "                    0=high quality,bigger files. 9.999=smaller files\n",
565159b3361Sopenharmony_ci            lame_get_VBR_q(gfp));
566159b3361Sopenharmony_ci    fprintf(fp,
567159b3361Sopenharmony_ci            "    --preset type   type must be \"medium\", \"standard\", \"extreme\", \"insane\",\n"
568159b3361Sopenharmony_ci            "                    or a value for an average desired bitrate and depending\n"
569159b3361Sopenharmony_ci            "                    on the value specified, appropriate quality settings will\n"
570159b3361Sopenharmony_ci            "                    be used.\n"
571159b3361Sopenharmony_ci            "                    \"--preset help\" gives more info on these\n" "\n");
572159b3361Sopenharmony_ci    fprintf(fp,
573159b3361Sopenharmony_ci#if defined(WIN32)
574159b3361Sopenharmony_ci            "    --priority type  sets the process priority\n"
575159b3361Sopenharmony_ci            "                     0,1 = Low priority\n"
576159b3361Sopenharmony_ci            "                     2   = normal priority\n"
577159b3361Sopenharmony_ci            "                     3,4 = High priority\n" "\n"
578159b3361Sopenharmony_ci#endif
579159b3361Sopenharmony_ci#if defined(__OS2__)
580159b3361Sopenharmony_ci            "    --priority type  sets the process priority\n"
581159b3361Sopenharmony_ci            "                     0 = Low priority\n"
582159b3361Sopenharmony_ci            "                     1 = Medium priority\n"
583159b3361Sopenharmony_ci            "                     2 = Regular priority\n"
584159b3361Sopenharmony_ci            "                     3 = High priority\n"
585159b3361Sopenharmony_ci            "                     4 = Maximum priority\n" "\n"
586159b3361Sopenharmony_ci#endif
587159b3361Sopenharmony_ci            "    --help id3      ID3 tagging related options\n" "\n"
588159b3361Sopenharmony_ci            DEV_HELP(
589159b3361Sopenharmony_ci            "    --help dev      developer options\n" "\n"
590159b3361Sopenharmony_ci            )
591159b3361Sopenharmony_ci            "    --longhelp      full list of options\n" "\n"
592159b3361Sopenharmony_ci            "    --license       print License information\n\n"
593159b3361Sopenharmony_ci            );
594159b3361Sopenharmony_ci
595159b3361Sopenharmony_ci    return 0;
596159b3361Sopenharmony_ci}
597159b3361Sopenharmony_ci
598159b3361Sopenharmony_ci/************************************************************************
599159b3361Sopenharmony_ci*
600159b3361Sopenharmony_ci* usage
601159b3361Sopenharmony_ci*
602159b3361Sopenharmony_ci* PURPOSE:  Writes command line syntax to the file specified by fp
603159b3361Sopenharmony_ci*
604159b3361Sopenharmony_ci************************************************************************/
605159b3361Sopenharmony_ci
606159b3361Sopenharmony_cistatic void
607159b3361Sopenharmony_ciwait_for(FILE * const fp, int lessmode)
608159b3361Sopenharmony_ci{
609159b3361Sopenharmony_ci    if (lessmode) {
610159b3361Sopenharmony_ci        fflush(fp);
611159b3361Sopenharmony_ci        getchar();
612159b3361Sopenharmony_ci    }
613159b3361Sopenharmony_ci    else {
614159b3361Sopenharmony_ci        fprintf(fp, "\n");
615159b3361Sopenharmony_ci    }
616159b3361Sopenharmony_ci    fprintf(fp, "\n");
617159b3361Sopenharmony_ci}
618159b3361Sopenharmony_ci
619159b3361Sopenharmony_cistatic void
620159b3361Sopenharmony_cihelp_id3tag(FILE * const fp)
621159b3361Sopenharmony_ci{
622159b3361Sopenharmony_ci    fprintf(fp,
623159b3361Sopenharmony_ci            "  ID3 tag options:\n"
624159b3361Sopenharmony_ci            "    --tt <title>    audio/song title (max 30 chars for version 1 tag)\n"
625159b3361Sopenharmony_ci            "    --ta <artist>   audio/song artist (max 30 chars for version 1 tag)\n"
626159b3361Sopenharmony_ci            "    --tl <album>    audio/song album (max 30 chars for version 1 tag)\n"
627159b3361Sopenharmony_ci            "    --ty <year>     audio/song year of issue (1 to 9999)\n"
628159b3361Sopenharmony_ci            "    --tc <comment>  user-defined text (max 30 chars for v1 tag, 28 for v1.1)\n");
629159b3361Sopenharmony_ci    fprintf(fp,
630159b3361Sopenharmony_ci            "    --tn <track[/total]>   audio/song track number and (optionally) the total\n"
631159b3361Sopenharmony_ci            "                           number of tracks on the original recording. (track\n"
632159b3361Sopenharmony_ci            "                           and total each 1 to 255. just the track number\n"
633159b3361Sopenharmony_ci            "                           creates v1.1 tag, providing a total forces v2.0).\n");
634159b3361Sopenharmony_ci    fprintf(fp,
635159b3361Sopenharmony_ci            "    --tg <genre>    audio/song genre (name or number in list)\n"
636159b3361Sopenharmony_ci            "    --ti <file>     audio/song albumArt (jpeg/png/gif file, v2.3 tag)\n"
637159b3361Sopenharmony_ci            "    --tv <id=value> user-defined frame specified by id and value (v2.3 tag)\n"
638159b3361Sopenharmony_ci            "                    syntax: --tv \"TXXX=description=content\"\n"
639159b3361Sopenharmony_ci            );
640159b3361Sopenharmony_ci    fprintf(fp,
641159b3361Sopenharmony_ci            "    --add-id3v2     force addition of version 2 tag\n"
642159b3361Sopenharmony_ci            "    --id3v1-only    add only a version 1 tag\n"
643159b3361Sopenharmony_ci            "    --id3v2-only    add only a version 2 tag\n"
644159b3361Sopenharmony_ci#ifdef ID3TAGS_EXTENDED
645159b3361Sopenharmony_ci            "    --id3v2-utf16   add following options in unicode text encoding\n"
646159b3361Sopenharmony_ci            "    --id3v2-latin1  add following options in latin-1 text encoding\n"
647159b3361Sopenharmony_ci#endif
648159b3361Sopenharmony_ci            "    --space-id3v1   pad version 1 tag with spaces instead of nulls\n"
649159b3361Sopenharmony_ci            "    --pad-id3v2     same as '--pad-id3v2-size 128'\n"
650159b3361Sopenharmony_ci            "    --pad-id3v2-size <value> adds version 2 tag, pad with extra <value> bytes\n"
651159b3361Sopenharmony_ci            "    --genre-list    print alphabetically sorted ID3 genre list and exit\n"
652159b3361Sopenharmony_ci            "    --ignore-tag-errors  ignore errors in values passed for tags\n" "\n"
653159b3361Sopenharmony_ci            );
654159b3361Sopenharmony_ci    fprintf(fp,
655159b3361Sopenharmony_ci            "    Note: A version 2 tag will NOT be added unless one of the input fields\n"
656159b3361Sopenharmony_ci            "    won't fit in a version 1 tag (e.g. the title string is longer than 30\n"
657159b3361Sopenharmony_ci            "    characters), or the '--add-id3v2' or '--id3v2-only' options are used,\n"
658159b3361Sopenharmony_ci            "    or output is redirected to stdout.\n"
659159b3361Sopenharmony_ci            );
660159b3361Sopenharmony_ci}
661159b3361Sopenharmony_ci
662159b3361Sopenharmony_cistatic void
663159b3361Sopenharmony_cihelp_developer_switches(FILE * const fp)
664159b3361Sopenharmony_ci{
665159b3361Sopenharmony_ci    if ( !internal_opts_enabled ) {
666159b3361Sopenharmony_ci    fprintf(fp,
667159b3361Sopenharmony_ci            "    Note: Almost all of the following switches aren't available in this build!\n\n"
668159b3361Sopenharmony_ci            );
669159b3361Sopenharmony_ci    }
670159b3361Sopenharmony_ci    fprintf(fp,
671159b3361Sopenharmony_ci            "  ATH related:\n"
672159b3361Sopenharmony_ci            "    --noath         turns ATH down to a flat noise floor\n"
673159b3361Sopenharmony_ci            "    --athshort      ignore GPSYCHO for short blocks, use ATH only\n"
674159b3361Sopenharmony_ci            "    --athonly       ignore GPSYCHO completely, use ATH only\n"
675159b3361Sopenharmony_ci            "    --athtype n     selects between different ATH types [0-4]\n"
676159b3361Sopenharmony_ci            "    --athlower x    lowers ATH by x dB\n"
677159b3361Sopenharmony_ci            );
678159b3361Sopenharmony_ci    fprintf(fp,
679159b3361Sopenharmony_ci            "    --athaa-type n  ATH auto adjust: 0 'no' else 'loudness based'\n"
680159b3361Sopenharmony_ci/** OBSOLETE "    --athaa-loudapprox n   n=1 total energy or n=2 equal loudness curve\n"*/
681159b3361Sopenharmony_ci            "    --athaa-sensitivity x  activation offset in -/+ dB for ATH auto-adjustment\n"
682159b3361Sopenharmony_ci            "\n");
683159b3361Sopenharmony_ci    fprintf(fp,
684159b3361Sopenharmony_ci            "  PSY related:\n"
685159b3361Sopenharmony_ci            "    --short         use short blocks when appropriate\n"
686159b3361Sopenharmony_ci            "    --noshort       do not use short blocks\n"
687159b3361Sopenharmony_ci            "    --allshort      use only short blocks\n"
688159b3361Sopenharmony_ci            );
689159b3361Sopenharmony_ci    fprintf(fp,
690159b3361Sopenharmony_ci            "(1) --temporal-masking x   x=0 disables, x=1 enables temporal masking effect\n"
691159b3361Sopenharmony_ci            "    --nssafejoint   M/S switching criterion\n"
692159b3361Sopenharmony_ci            "    --nsmsfix <arg> M/S switching tuning [effective 0-3.5]\n"
693159b3361Sopenharmony_ci            "(2) --interch x     adjust inter-channel masking ratio\n"
694159b3361Sopenharmony_ci            "    --ns-bass x     adjust masking for sfbs  0 -  6 (long)  0 -  5 (short)\n"
695159b3361Sopenharmony_ci            "    --ns-alto x     adjust masking for sfbs  7 - 13 (long)  6 - 10 (short)\n"
696159b3361Sopenharmony_ci            "    --ns-treble x   adjust masking for sfbs 14 - 21 (long) 11 - 12 (short)\n"
697159b3361Sopenharmony_ci            );
698159b3361Sopenharmony_ci    fprintf(fp,
699159b3361Sopenharmony_ci            "    --ns-sfb21 x    change ns-treble by x dB for sfb21\n"
700159b3361Sopenharmony_ci            "    --shortthreshold x,y  short block switching threshold,\n"
701159b3361Sopenharmony_ci            "                          x for L/R/M channel, y for S channel\n"
702159b3361Sopenharmony_ci            "    -Z [n]          always do calculate short block maskings\n");
703159b3361Sopenharmony_ci    fprintf(fp,
704159b3361Sopenharmony_ci            "  Noise Shaping related:\n"
705159b3361Sopenharmony_ci            "(1) --substep n     use pseudo substep noise shaping method types 0-2\n"
706159b3361Sopenharmony_ci            "(1) -X n[,m]        selects between different noise measurements\n"
707159b3361Sopenharmony_ci            "                    n for long block, m for short. if m is omitted, m = n\n"
708159b3361Sopenharmony_ci            " 1: CBR, ABR and VBR-old encoding modes only\n"
709159b3361Sopenharmony_ci            " 2: ignored\n"
710159b3361Sopenharmony_ci           );
711159b3361Sopenharmony_ci}
712159b3361Sopenharmony_ci
713159b3361Sopenharmony_ciint
714159b3361Sopenharmony_cilong_help(const lame_global_flags * gfp, FILE * const fp, const char *ProgramName, int lessmode)
715159b3361Sopenharmony_ci{                       /* print long syntax help */
716159b3361Sopenharmony_ci    lame_version_print(fp);
717159b3361Sopenharmony_ci    fprintf(fp,
718159b3361Sopenharmony_ci            "usage: %s [options] <infile> [outfile]\n"
719159b3361Sopenharmony_ci            "\n"
720159b3361Sopenharmony_ci            "    <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n"
721159b3361Sopenharmony_ci            "\n" "RECOMMENDED:\n" "    lame -V2 input.wav output.mp3\n" "\n", ProgramName);
722159b3361Sopenharmony_ci    fprintf(fp,
723159b3361Sopenharmony_ci            "OPTIONS:\n"
724159b3361Sopenharmony_ci            "  Input options:\n"
725159b3361Sopenharmony_ci            "    --scale <arg>   scale input (multiply PCM data) by <arg>\n"
726159b3361Sopenharmony_ci            "    --scale-l <arg> scale channel 0 (left) input (multiply PCM data) by <arg>\n"
727159b3361Sopenharmony_ci            "    --scale-r <arg> scale channel 1 (right) input (multiply PCM data) by <arg>\n"
728159b3361Sopenharmony_ci            "    --swap-channel  swap L/R channels\n"
729159b3361Sopenharmony_ci            "    --ignorelength  ignore file length in WAV header\n"
730159b3361Sopenharmony_ci            "    --gain <arg>    apply Gain adjustment in decibels, range -20.0 to +12.0\n"
731159b3361Sopenharmony_ci           );
732159b3361Sopenharmony_ci#if (defined HAVE_MPGLIB || defined AMIGA_MPEGA)
733159b3361Sopenharmony_ci    fprintf(fp,
734159b3361Sopenharmony_ci            "    --mp1input      input file is a MPEG Layer I   file\n"
735159b3361Sopenharmony_ci            "    --mp2input      input file is a MPEG Layer II  file\n"
736159b3361Sopenharmony_ci            "    --mp3input      input file is a MPEG Layer III file\n"
737159b3361Sopenharmony_ci           );
738159b3361Sopenharmony_ci#endif
739159b3361Sopenharmony_ci    fprintf(fp,
740159b3361Sopenharmony_ci            "    --nogap <file1> <file2> <...>\n"
741159b3361Sopenharmony_ci            "                    gapless encoding for a set of contiguous files\n"
742159b3361Sopenharmony_ci            "    --nogapout <dir>\n"
743159b3361Sopenharmony_ci            "                    output dir for gapless encoding (must precede --nogap)\n"
744159b3361Sopenharmony_ci            "    --nogaptags     allow the use of VBR tags in gapless encoding\n"
745159b3361Sopenharmony_ci            "    --out-dir <dir> output dir, must exist\n"
746159b3361Sopenharmony_ci           );
747159b3361Sopenharmony_ci    fprintf(fp,
748159b3361Sopenharmony_ci            "\n"
749159b3361Sopenharmony_ci            "  Input options for RAW PCM:\n"
750159b3361Sopenharmony_ci            "    -r              input is raw pcm\n"
751159b3361Sopenharmony_ci            "    -s sfreq        sampling frequency of input file (kHz) - default 44.1 kHz\n"
752159b3361Sopenharmony_ci            "    --signed        input is signed (default)\n"
753159b3361Sopenharmony_ci            "    --unsigned      input is unsigned\n"
754159b3361Sopenharmony_ci            "    --bitwidth w    input bit width is w (default 16)\n"
755159b3361Sopenharmony_ci            "    -x              force byte-swapping of input\n"
756159b3361Sopenharmony_ci            "    --little-endian input is little-endian (default)\n"
757159b3361Sopenharmony_ci            "    --big-endian    input is big-endian\n"
758159b3361Sopenharmony_ci            "    -a              downmix from stereo to mono file for mono encoding\n"
759159b3361Sopenharmony_ci           );
760159b3361Sopenharmony_ci
761159b3361Sopenharmony_ci    wait_for(fp, lessmode);
762159b3361Sopenharmony_ci    fprintf(fp,
763159b3361Sopenharmony_ci            "  Operational options:\n"
764159b3361Sopenharmony_ci            "    -m <mode>       (j)oint, (s)imple, (f)orce, (d)ual-mono, (m)ono (l)eft (r)ight\n"
765159b3361Sopenharmony_ci            "                    default is (j)\n"
766159b3361Sopenharmony_ci            "                    joint  = Uses the best possible of MS and LR stereo\n"
767159b3361Sopenharmony_ci            "                    simple = force LR stereo on all frames\n"
768159b3361Sopenharmony_ci            "                    force  = force MS stereo on all frames.\n"
769159b3361Sopenharmony_ci	   );
770159b3361Sopenharmony_ci    fprintf(fp,
771159b3361Sopenharmony_ci            "    --preset type   type must be \"medium\", \"standard\", \"extreme\", \"insane\",\n"
772159b3361Sopenharmony_ci            "                    or a value for an average desired bitrate and depending\n"
773159b3361Sopenharmony_ci            "                    on the value specified, appropriate quality settings will\n"
774159b3361Sopenharmony_ci            "                    be used.\n"
775159b3361Sopenharmony_ci            "                    \"--preset help\" gives more info on these\n"
776159b3361Sopenharmony_ci            "    --comp  <arg>   choose bitrate to achieve a compression ratio of <arg>\n");
777159b3361Sopenharmony_ci    fprintf(fp, "    --replaygain-fast   compute RG fast but slightly inaccurately (default)\n"
778159b3361Sopenharmony_ci#ifdef DECODE_ON_THE_FLY
779159b3361Sopenharmony_ci            "    --replaygain-accurate   compute RG more accurately and find the peak sample\n"
780159b3361Sopenharmony_ci#endif
781159b3361Sopenharmony_ci            "    --noreplaygain  disable ReplayGain analysis\n"
782159b3361Sopenharmony_ci#ifdef DECODE_ON_THE_FLY
783159b3361Sopenharmony_ci            "    --clipdetect    enable --replaygain-accurate and print a message whether\n"
784159b3361Sopenharmony_ci            "                    clipping occurs and how far the waveform is from full scale\n"
785159b3361Sopenharmony_ci#endif
786159b3361Sopenharmony_ci        );
787159b3361Sopenharmony_ci    fprintf(fp,
788159b3361Sopenharmony_ci            "    --flush         flush output stream as soon as possible\n"
789159b3361Sopenharmony_ci            "    --freeformat    produce a free format bitstream\n"
790159b3361Sopenharmony_ci            "    --decode        input=mp3 file, output=wav\n"
791159b3361Sopenharmony_ci            "    -t              disable writing wav header when using --decode\n");
792159b3361Sopenharmony_ci
793159b3361Sopenharmony_ci    wait_for(fp, lessmode);
794159b3361Sopenharmony_ci    fprintf(fp,
795159b3361Sopenharmony_ci            "  Verbosity:\n"
796159b3361Sopenharmony_ci            "    --disptime <arg>print progress report every arg seconds\n"
797159b3361Sopenharmony_ci            "    -S              don't print progress report, VBR histograms\n"
798159b3361Sopenharmony_ci            "    --nohist        disable VBR histogram display\n"
799159b3361Sopenharmony_ci            "    --quiet         don't print anything on screen\n"
800159b3361Sopenharmony_ci            "    --silent        don't print anything on screen, but fatal errors\n"
801159b3361Sopenharmony_ci            "    --brief         print more useful information\n"
802159b3361Sopenharmony_ci            "    --verbose       print a lot of useful information\n" "\n");
803159b3361Sopenharmony_ci    fprintf(fp,
804159b3361Sopenharmony_ci            "  Noise shaping & psycho acoustic algorithms:\n"
805159b3361Sopenharmony_ci            "    -q <arg>        <arg> = 0...9.  Default  -q 3 \n"
806159b3361Sopenharmony_ci            "                    -q 0:  Highest quality, very slow \n"
807159b3361Sopenharmony_ci            "                    -q 9:  Poor quality, but fast \n"
808159b3361Sopenharmony_ci            "    -h              Same as -q 2.   \n"
809159b3361Sopenharmony_ci            "    -f              Same as -q 7.   Fast, ok quality\n");
810159b3361Sopenharmony_ci
811159b3361Sopenharmony_ci    wait_for(fp, lessmode);
812159b3361Sopenharmony_ci    fprintf(fp,
813159b3361Sopenharmony_ci            "  CBR (constant bitrate, the default) options:\n"
814159b3361Sopenharmony_ci            "    -b <bitrate>    set the bitrate in kbps, default 128 kbps\n"
815159b3361Sopenharmony_ci            "    --cbr           enforce use of constant bitrate\n"
816159b3361Sopenharmony_ci            "\n"
817159b3361Sopenharmony_ci            "  ABR options:\n"
818159b3361Sopenharmony_ci            "    --abr <bitrate> specify average bitrate desired (instead of quality)\n" "\n");
819159b3361Sopenharmony_ci    fprintf(fp,
820159b3361Sopenharmony_ci            "  VBR options:\n"
821159b3361Sopenharmony_ci            "    -V n            quality setting for VBR.  default n=%i\n"
822159b3361Sopenharmony_ci            "                    0=high quality,bigger files. 9=smaller files\n"
823159b3361Sopenharmony_ci            "    -v              the same as -V 4\n"
824159b3361Sopenharmony_ci            "    --vbr-old       use old variable bitrate (VBR) routine\n"
825159b3361Sopenharmony_ci            "    --vbr-new       use new variable bitrate (VBR) routine (default)\n"
826159b3361Sopenharmony_ci            "    -Y              lets LAME ignore noise in sfb21, like in CBR\n"
827159b3361Sopenharmony_ci			"                    (Default for V3 to V9.999)\n"
828159b3361Sopenharmony_ci            ,
829159b3361Sopenharmony_ci            lame_get_VBR_q(gfp));
830159b3361Sopenharmony_ci    fprintf(fp,
831159b3361Sopenharmony_ci            "    -b <bitrate>    specify minimum allowed bitrate, default  32 kbps\n"
832159b3361Sopenharmony_ci            "    -B <bitrate>    specify maximum allowed bitrate, default 320 kbps\n"
833159b3361Sopenharmony_ci            "    -F              strictly enforce the -b option, for use with players that\n"
834159b3361Sopenharmony_ci            "                    do not support low bitrate mp3\n"
835159b3361Sopenharmony_ci            "    -t              disable writing LAME Tag\n"
836159b3361Sopenharmony_ci            "    -T              enable and force writing LAME Tag\n");
837159b3361Sopenharmony_ci
838159b3361Sopenharmony_ci    wait_for(fp, lessmode);
839159b3361Sopenharmony_ci    DEV_HELP(
840159b3361Sopenharmony_ci        help_developer_switches(fp);
841159b3361Sopenharmony_ci        wait_for(fp, lessmode);
842159b3361Sopenharmony_ci            )
843159b3361Sopenharmony_ci
844159b3361Sopenharmony_ci    fprintf(fp,
845159b3361Sopenharmony_ci            "  MP3 header/stream options:\n"
846159b3361Sopenharmony_ci            "    -e <emp>        de-emphasis n/5/c  (obsolete)\n"
847159b3361Sopenharmony_ci            "    -c              mark as copyright\n"
848159b3361Sopenharmony_ci            "    -o              mark as non-original\n"
849159b3361Sopenharmony_ci            "    -p              error protection.  adds 16 bit checksum to every frame\n"
850159b3361Sopenharmony_ci            "                    (the checksum is computed correctly)\n"
851159b3361Sopenharmony_ci            "    --nores         disable the bit reservoir\n"
852159b3361Sopenharmony_ci            "    --strictly-enforce-ISO   comply as much as possible to ISO MPEG spec\n");
853159b3361Sopenharmony_ci    fprintf(fp,
854159b3361Sopenharmony_ci            "    --buffer-constraint <constraint> available values for constraint:\n"
855159b3361Sopenharmony_ci            "                                     default, strict, maximum\n"
856159b3361Sopenharmony_ci            "\n"
857159b3361Sopenharmony_ci            );
858159b3361Sopenharmony_ci    fprintf(fp,
859159b3361Sopenharmony_ci            "  Filter options:\n"
860159b3361Sopenharmony_ci            "  --lowpass <freq>        frequency(kHz), lowpass filter cutoff above freq\n"
861159b3361Sopenharmony_ci            "  --lowpass-width <freq>  frequency(kHz) - default 15%% of lowpass freq\n"
862159b3361Sopenharmony_ci            "  --highpass <freq>       frequency(kHz), highpass filter cutoff below freq\n"
863159b3361Sopenharmony_ci            "  --highpass-width <freq> frequency(kHz) - default 15%% of highpass freq\n");
864159b3361Sopenharmony_ci    fprintf(fp,
865159b3361Sopenharmony_ci            "  --resample <sfreq>  sampling frequency of output file(kHz)- default=automatic\n");
866159b3361Sopenharmony_ci
867159b3361Sopenharmony_ci    wait_for(fp, lessmode);
868159b3361Sopenharmony_ci    help_id3tag(fp);
869159b3361Sopenharmony_ci    fprintf(fp,
870159b3361Sopenharmony_ci#if defined(WIN32)
871159b3361Sopenharmony_ci            "\n\nMS-Windows-specific options:\n"
872159b3361Sopenharmony_ci            "    --priority <type>  sets the process priority:\n"
873159b3361Sopenharmony_ci            "                         0,1 = Low priority (IDLE_PRIORITY_CLASS)\n"
874159b3361Sopenharmony_ci            "                         2 = normal priority (NORMAL_PRIORITY_CLASS, default)\n"
875159b3361Sopenharmony_ci            "                         3,4 = High priority (HIGH_PRIORITY_CLASS))\n"
876159b3361Sopenharmony_ci            "    Note: Calling '--priority' without a parameter will select priority 0.\n"
877159b3361Sopenharmony_ci#endif
878159b3361Sopenharmony_ci#if defined(__OS2__)
879159b3361Sopenharmony_ci            "\n\nOS/2-specific options:\n"
880159b3361Sopenharmony_ci            "    --priority <type>  sets the process priority:\n"
881159b3361Sopenharmony_ci            "                         0 = Low priority (IDLE, delta = 0)\n"
882159b3361Sopenharmony_ci            "                         1 = Medium priority (IDLE, delta = +31)\n"
883159b3361Sopenharmony_ci            "                         2 = Regular priority (REGULAR, delta = -31)\n"
884159b3361Sopenharmony_ci            "                         3 = High priority (REGULAR, delta = 0)\n"
885159b3361Sopenharmony_ci            "                         4 = Maximum priority (REGULAR, delta = +31)\n"
886159b3361Sopenharmony_ci            "    Note: Calling '--priority' without a parameter will select priority 0.\n"
887159b3361Sopenharmony_ci#endif
888159b3361Sopenharmony_ci            "\nMisc:\n    --license       print License information\n\n"
889159b3361Sopenharmony_ci        );
890159b3361Sopenharmony_ci
891159b3361Sopenharmony_ci#if defined(HAVE_NASM)
892159b3361Sopenharmony_ci    wait_for(fp, lessmode);
893159b3361Sopenharmony_ci    fprintf(fp,
894159b3361Sopenharmony_ci            "  Platform specific:\n"
895159b3361Sopenharmony_ci            "    --noasm <instructions> disable assembly optimizations for mmx/3dnow/sse\n");
896159b3361Sopenharmony_ci    wait_for(fp, lessmode);
897159b3361Sopenharmony_ci#endif
898159b3361Sopenharmony_ci
899159b3361Sopenharmony_ci    display_bitrates(fp);
900159b3361Sopenharmony_ci
901159b3361Sopenharmony_ci    return 0;
902159b3361Sopenharmony_ci}
903159b3361Sopenharmony_ci
904159b3361Sopenharmony_cistatic void
905159b3361Sopenharmony_cidisplay_bitrate(FILE * const fp, const char *const version, const int d, const int indx)
906159b3361Sopenharmony_ci{
907159b3361Sopenharmony_ci    int     i;
908159b3361Sopenharmony_ci    int nBitrates = 14;
909159b3361Sopenharmony_ci    if (d == 4)
910159b3361Sopenharmony_ci        nBitrates = 8;
911159b3361Sopenharmony_ci
912159b3361Sopenharmony_ci
913159b3361Sopenharmony_ci    fprintf(fp,
914159b3361Sopenharmony_ci            "\nMPEG-%-3s layer III sample frequencies (kHz):  %2d  %2d  %g\n"
915159b3361Sopenharmony_ci            "bitrates (kbps):", version, 32 / d, 48 / d, 44.1 / d);
916159b3361Sopenharmony_ci    for (i = 1; i <= nBitrates; i++)
917159b3361Sopenharmony_ci        fprintf(fp, " %2i", lame_get_bitrate(indx, i));
918159b3361Sopenharmony_ci    fprintf(fp, "\n");
919159b3361Sopenharmony_ci}
920159b3361Sopenharmony_ci
921159b3361Sopenharmony_ciint
922159b3361Sopenharmony_cidisplay_bitrates(FILE * const fp)
923159b3361Sopenharmony_ci{
924159b3361Sopenharmony_ci    display_bitrate(fp, "1", 1, 1);
925159b3361Sopenharmony_ci    display_bitrate(fp, "2", 2, 0);
926159b3361Sopenharmony_ci    display_bitrate(fp, "2.5", 4, 0);
927159b3361Sopenharmony_ci    fprintf(fp, "\n");
928159b3361Sopenharmony_ci    fflush(fp);
929159b3361Sopenharmony_ci    return 0;
930159b3361Sopenharmony_ci}
931159b3361Sopenharmony_ci
932159b3361Sopenharmony_ci
933159b3361Sopenharmony_ci/*  note: for presets it would be better to externalize them in a file.
934159b3361Sopenharmony_ci    suggestion:  lame --preset <file-name> ...
935159b3361Sopenharmony_ci            or:  lame --preset my-setting  ... and my-setting is defined in lame.ini
936159b3361Sopenharmony_ci */
937159b3361Sopenharmony_ci
938159b3361Sopenharmony_ci/*
939159b3361Sopenharmony_ciNote from GB on 08/25/2002:
940159b3361Sopenharmony_ciI am merging --presets and --alt-presets. Old presets are now aliases for
941159b3361Sopenharmony_cicorresponding abr values from old alt-presets. This way we now have a
942159b3361Sopenharmony_ciunified preset system, and I hope than more people will use the new tuned
943159b3361Sopenharmony_cipresets instead of the old unmaintained ones.
944159b3361Sopenharmony_ci*/
945159b3361Sopenharmony_ci
946159b3361Sopenharmony_ci
947159b3361Sopenharmony_ci
948159b3361Sopenharmony_ci/************************************************************************
949159b3361Sopenharmony_ci*
950159b3361Sopenharmony_ci* usage
951159b3361Sopenharmony_ci*
952159b3361Sopenharmony_ci* PURPOSE:  Writes presetting info to #stdout#
953159b3361Sopenharmony_ci*
954159b3361Sopenharmony_ci************************************************************************/
955159b3361Sopenharmony_ci
956159b3361Sopenharmony_ci
957159b3361Sopenharmony_cistatic void
958159b3361Sopenharmony_cipresets_longinfo_dm(FILE * msgfp)
959159b3361Sopenharmony_ci{
960159b3361Sopenharmony_ci    fprintf(msgfp,
961159b3361Sopenharmony_ci            "\n"
962159b3361Sopenharmony_ci            "The --preset switches are aliases over LAME settings.\n"
963159b3361Sopenharmony_ci            "\n" "\n");
964159b3361Sopenharmony_ci    fprintf(msgfp,
965159b3361Sopenharmony_ci            "To activate these presets:\n"
966159b3361Sopenharmony_ci            "\n" "   For VBR modes (generally highest quality):\n" "\n");
967159b3361Sopenharmony_ci    fprintf(msgfp,
968159b3361Sopenharmony_ci            "     --preset medium      This preset should provide near transparency to most\n"
969159b3361Sopenharmony_ci            "                          people on most music.\n"
970159b3361Sopenharmony_ci            "\n"
971159b3361Sopenharmony_ci            "     --preset standard    This preset should generally be transparent to most\n"
972159b3361Sopenharmony_ci            "                          people on most music and is already quite high\n"
973159b3361Sopenharmony_ci            "                          in quality.\n" "\n");
974159b3361Sopenharmony_ci    fprintf(msgfp,
975159b3361Sopenharmony_ci            "     --preset extreme     If you have extremely good hearing and similar\n"
976159b3361Sopenharmony_ci            "                          equipment, this preset will generally provide\n"
977159b3361Sopenharmony_ci            "                          slightly higher quality than the \"standard\" mode.\n" "\n");
978159b3361Sopenharmony_ci    fprintf(msgfp,
979159b3361Sopenharmony_ci            "   For CBR 320kbps (highest quality possible from the --preset switches):\n"
980159b3361Sopenharmony_ci            "\n"
981159b3361Sopenharmony_ci            "     --preset insane      This preset will usually be overkill for most people\n"
982159b3361Sopenharmony_ci            "                          and most situations, but if you must have the\n"
983159b3361Sopenharmony_ci            "                          absolute highest quality with no regard to filesize,\n"
984159b3361Sopenharmony_ci            "                          this is the way to go.\n" "\n");
985159b3361Sopenharmony_ci    fprintf(msgfp,
986159b3361Sopenharmony_ci            "   For ABR modes (high quality per given bitrate but not as high as VBR):\n"
987159b3361Sopenharmony_ci            "\n"
988159b3361Sopenharmony_ci            "     --preset <kbps>      Using this preset will usually give you good quality\n"
989159b3361Sopenharmony_ci            "                          at a specified bitrate. Depending on the bitrate\n"
990159b3361Sopenharmony_ci            "                          entered, this preset will determine the optimal\n"
991159b3361Sopenharmony_ci            "                          settings for that particular situation. For example:\n"
992159b3361Sopenharmony_ci            "                          \"--preset 185\" activates this preset and uses 185\n"
993159b3361Sopenharmony_ci            "                          as an average kbps.\n" "\n");
994159b3361Sopenharmony_ci    fprintf(msgfp,
995159b3361Sopenharmony_ci            "   \"cbr\"  - If you use the ABR mode (read above) with a significant\n"
996159b3361Sopenharmony_ci            "            bitrate such as 80, 96, 112, 128, 160, 192, 224, 256, 320,\n"
997159b3361Sopenharmony_ci            "            you can use the \"cbr\" option to force CBR mode encoding\n"
998159b3361Sopenharmony_ci            "            instead of the standard abr mode. ABR does provide higher\n"
999159b3361Sopenharmony_ci            "            quality but CBR may be useful in situations such as when\n"
1000159b3361Sopenharmony_ci            "            streaming an mp3 over the internet may be important.\n" "\n");
1001159b3361Sopenharmony_ci    fprintf(msgfp,
1002159b3361Sopenharmony_ci            "    For example:\n"
1003159b3361Sopenharmony_ci            "\n"
1004159b3361Sopenharmony_ci            "    --preset standard <input file> <output file>\n"
1005159b3361Sopenharmony_ci            " or --preset cbr 192 <input file> <output file>\n"
1006159b3361Sopenharmony_ci            " or --preset 172 <input file> <output file>\n"
1007159b3361Sopenharmony_ci            " or --preset extreme <input file> <output file>\n" "\n" "\n");
1008159b3361Sopenharmony_ci    fprintf(msgfp,
1009159b3361Sopenharmony_ci            "A few aliases are also available for ABR mode:\n"
1010159b3361Sopenharmony_ci            "phone => 16kbps/mono        phon+/lw/mw-eu/sw => 24kbps/mono\n"
1011159b3361Sopenharmony_ci            "mw-us => 40kbps/mono        voice => 56kbps/mono\n"
1012159b3361Sopenharmony_ci            "fm/radio/tape => 112kbps    hifi => 160kbps\n"
1013159b3361Sopenharmony_ci            "cd => 192kbps               studio => 256kbps\n");
1014159b3361Sopenharmony_ci}
1015159b3361Sopenharmony_ci
1016159b3361Sopenharmony_ci
1017159b3361Sopenharmony_cistatic int
1018159b3361Sopenharmony_cipresets_set(lame_t gfp, int fast, int cbr, const char *preset_name, const char *ProgramName)
1019159b3361Sopenharmony_ci{
1020159b3361Sopenharmony_ci    int     mono = 0;
1021159b3361Sopenharmony_ci
1022159b3361Sopenharmony_ci    if ((strcmp(preset_name, "help") == 0) && (fast < 1)
1023159b3361Sopenharmony_ci        && (cbr < 1)) {
1024159b3361Sopenharmony_ci        lame_version_print(stdout);
1025159b3361Sopenharmony_ci        presets_longinfo_dm(stdout);
1026159b3361Sopenharmony_ci        return -1;
1027159b3361Sopenharmony_ci    }
1028159b3361Sopenharmony_ci
1029159b3361Sopenharmony_ci    /*aliases for compatibility with old presets */
1030159b3361Sopenharmony_ci
1031159b3361Sopenharmony_ci    if (strcmp(preset_name, "phone") == 0) {
1032159b3361Sopenharmony_ci        preset_name = "16";
1033159b3361Sopenharmony_ci        mono = 1;
1034159b3361Sopenharmony_ci    }
1035159b3361Sopenharmony_ci    if ((strcmp(preset_name, "phon+") == 0) ||
1036159b3361Sopenharmony_ci        (strcmp(preset_name, "lw") == 0) ||
1037159b3361Sopenharmony_ci        (strcmp(preset_name, "mw-eu") == 0) || (strcmp(preset_name, "sw") == 0)) {
1038159b3361Sopenharmony_ci        preset_name = "24";
1039159b3361Sopenharmony_ci        mono = 1;
1040159b3361Sopenharmony_ci    }
1041159b3361Sopenharmony_ci    if (strcmp(preset_name, "mw-us") == 0) {
1042159b3361Sopenharmony_ci        preset_name = "40";
1043159b3361Sopenharmony_ci        mono = 1;
1044159b3361Sopenharmony_ci    }
1045159b3361Sopenharmony_ci    if (strcmp(preset_name, "voice") == 0) {
1046159b3361Sopenharmony_ci        preset_name = "56";
1047159b3361Sopenharmony_ci        mono = 1;
1048159b3361Sopenharmony_ci    }
1049159b3361Sopenharmony_ci    if (strcmp(preset_name, "fm") == 0) {
1050159b3361Sopenharmony_ci        preset_name = "112";
1051159b3361Sopenharmony_ci    }
1052159b3361Sopenharmony_ci    if ((strcmp(preset_name, "radio") == 0) || (strcmp(preset_name, "tape") == 0)) {
1053159b3361Sopenharmony_ci        preset_name = "112";
1054159b3361Sopenharmony_ci    }
1055159b3361Sopenharmony_ci    if (strcmp(preset_name, "hifi") == 0) {
1056159b3361Sopenharmony_ci        preset_name = "160";
1057159b3361Sopenharmony_ci    }
1058159b3361Sopenharmony_ci    if (strcmp(preset_name, "cd") == 0) {
1059159b3361Sopenharmony_ci        preset_name = "192";
1060159b3361Sopenharmony_ci    }
1061159b3361Sopenharmony_ci    if (strcmp(preset_name, "studio") == 0) {
1062159b3361Sopenharmony_ci        preset_name = "256";
1063159b3361Sopenharmony_ci    }
1064159b3361Sopenharmony_ci
1065159b3361Sopenharmony_ci    if (strcmp(preset_name, "medium") == 0) {
1066159b3361Sopenharmony_ci        lame_set_VBR_q(gfp, 4);
1067159b3361Sopenharmony_ci        lame_set_VBR(gfp, vbr_default);
1068159b3361Sopenharmony_ci        return 0;
1069159b3361Sopenharmony_ci    }
1070159b3361Sopenharmony_ci
1071159b3361Sopenharmony_ci    if (strcmp(preset_name, "standard") == 0) {
1072159b3361Sopenharmony_ci        lame_set_VBR_q(gfp, 2);
1073159b3361Sopenharmony_ci        lame_set_VBR(gfp, vbr_default);
1074159b3361Sopenharmony_ci        return 0;
1075159b3361Sopenharmony_ci    }
1076159b3361Sopenharmony_ci
1077159b3361Sopenharmony_ci    else if (strcmp(preset_name, "extreme") == 0) {
1078159b3361Sopenharmony_ci        lame_set_VBR_q(gfp, 0);
1079159b3361Sopenharmony_ci        lame_set_VBR(gfp, vbr_default);
1080159b3361Sopenharmony_ci        return 0;
1081159b3361Sopenharmony_ci    }
1082159b3361Sopenharmony_ci
1083159b3361Sopenharmony_ci    else if ((strcmp(preset_name, "insane") == 0) && (fast < 1)) {
1084159b3361Sopenharmony_ci
1085159b3361Sopenharmony_ci        lame_set_preset(gfp, INSANE);
1086159b3361Sopenharmony_ci
1087159b3361Sopenharmony_ci        return 0;
1088159b3361Sopenharmony_ci    }
1089159b3361Sopenharmony_ci
1090159b3361Sopenharmony_ci    /* Generic ABR Preset */
1091159b3361Sopenharmony_ci    if (((atoi(preset_name)) > 0) && (fast < 1)) {
1092159b3361Sopenharmony_ci        if ((atoi(preset_name)) >= 8 && (atoi(preset_name)) <= 320) {
1093159b3361Sopenharmony_ci            lame_set_preset(gfp, atoi(preset_name));
1094159b3361Sopenharmony_ci
1095159b3361Sopenharmony_ci            if (cbr == 1)
1096159b3361Sopenharmony_ci                lame_set_VBR(gfp, vbr_off);
1097159b3361Sopenharmony_ci
1098159b3361Sopenharmony_ci            if (mono == 1) {
1099159b3361Sopenharmony_ci                lame_set_mode(gfp, MONO);
1100159b3361Sopenharmony_ci            }
1101159b3361Sopenharmony_ci
1102159b3361Sopenharmony_ci            return 0;
1103159b3361Sopenharmony_ci
1104159b3361Sopenharmony_ci        }
1105159b3361Sopenharmony_ci        else {
1106159b3361Sopenharmony_ci            lame_version_print(Console_IO.Error_fp);
1107159b3361Sopenharmony_ci            error_printf("Error: The bitrate specified is out of the valid range for this preset\n"
1108159b3361Sopenharmony_ci                         "\n"
1109159b3361Sopenharmony_ci                         "When using this mode you must enter a value between \"32\" and \"320\"\n"
1110159b3361Sopenharmony_ci                         "\n" "For further information try: \"%s --preset help\"\n", ProgramName);
1111159b3361Sopenharmony_ci            return -1;
1112159b3361Sopenharmony_ci        }
1113159b3361Sopenharmony_ci    }
1114159b3361Sopenharmony_ci
1115159b3361Sopenharmony_ci    lame_version_print(Console_IO.Error_fp);
1116159b3361Sopenharmony_ci    error_printf("Error: You did not enter a valid profile and/or options with --preset\n"
1117159b3361Sopenharmony_ci                 "\n"
1118159b3361Sopenharmony_ci                 "Available profiles are:\n"
1119159b3361Sopenharmony_ci                 "\n"
1120159b3361Sopenharmony_ci                 "                 medium\n"
1121159b3361Sopenharmony_ci                 "                 standard\n"
1122159b3361Sopenharmony_ci                 "                 extreme\n"
1123159b3361Sopenharmony_ci                 "                 insane\n"
1124159b3361Sopenharmony_ci                 "          <cbr> (ABR Mode) - The ABR Mode is implied. To use it,\n"
1125159b3361Sopenharmony_ci                 "                             simply specify a bitrate. For example:\n"
1126159b3361Sopenharmony_ci                 "                             \"--preset 185\" activates this\n"
1127159b3361Sopenharmony_ci                 "                             preset and uses 185 as an average kbps.\n" "\n");
1128159b3361Sopenharmony_ci    error_printf("    Some examples:\n"
1129159b3361Sopenharmony_ci                 "\n"
1130159b3361Sopenharmony_ci                 " or \"%s --preset standard <input file> <output file>\"\n"
1131159b3361Sopenharmony_ci                 " or \"%s --preset cbr 192 <input file> <output file>\"\n"
1132159b3361Sopenharmony_ci                 " or \"%s --preset 172 <input file> <output file>\"\n"
1133159b3361Sopenharmony_ci                 " or \"%s --preset extreme <input file> <output file>\"\n"
1134159b3361Sopenharmony_ci                 "\n"
1135159b3361Sopenharmony_ci                 "For further information try: \"%s --preset help\"\n", ProgramName, ProgramName,
1136159b3361Sopenharmony_ci                 ProgramName, ProgramName, ProgramName);
1137159b3361Sopenharmony_ci    return -1;
1138159b3361Sopenharmony_ci}
1139159b3361Sopenharmony_ci
1140159b3361Sopenharmony_cistatic void
1141159b3361Sopenharmony_cigenre_list_handler(int num, const char *name, void *cookie)
1142159b3361Sopenharmony_ci{
1143159b3361Sopenharmony_ci    (void) cookie;
1144159b3361Sopenharmony_ci    console_printf("%3d %s\n", num, name);
1145159b3361Sopenharmony_ci}
1146159b3361Sopenharmony_ci
1147159b3361Sopenharmony_ci
1148159b3361Sopenharmony_ci/************************************************************************
1149159b3361Sopenharmony_ci*
1150159b3361Sopenharmony_ci* parse_args
1151159b3361Sopenharmony_ci*
1152159b3361Sopenharmony_ci* PURPOSE:  Sets encoding parameters to the specifications of the
1153159b3361Sopenharmony_ci* command line.  Default settings are used for parameters
1154159b3361Sopenharmony_ci* not specified in the command line.
1155159b3361Sopenharmony_ci*
1156159b3361Sopenharmony_ci* If the input file is in WAVE or AIFF format, the sampling frequency is read
1157159b3361Sopenharmony_ci* from the AIFF header.
1158159b3361Sopenharmony_ci*
1159159b3361Sopenharmony_ci* The input and output filenames are read into #inpath# and #outpath#.
1160159b3361Sopenharmony_ci*
1161159b3361Sopenharmony_ci************************************************************************/
1162159b3361Sopenharmony_ci
1163159b3361Sopenharmony_ci/* would use real "strcasecmp" but it isn't portable */
1164159b3361Sopenharmony_cistatic int
1165159b3361Sopenharmony_cilocal_strcasecmp(const char *s1, const char *s2)
1166159b3361Sopenharmony_ci{
1167159b3361Sopenharmony_ci    unsigned char c1;
1168159b3361Sopenharmony_ci    unsigned char c2;
1169159b3361Sopenharmony_ci
1170159b3361Sopenharmony_ci    do {
1171159b3361Sopenharmony_ci        c1 = (unsigned char) tolower(*s1);
1172159b3361Sopenharmony_ci        c2 = (unsigned char) tolower(*s2);
1173159b3361Sopenharmony_ci        if (!c1) {
1174159b3361Sopenharmony_ci            break;
1175159b3361Sopenharmony_ci        }
1176159b3361Sopenharmony_ci        ++s1;
1177159b3361Sopenharmony_ci        ++s2;
1178159b3361Sopenharmony_ci    } while (c1 == c2);
1179159b3361Sopenharmony_ci    return c1 - c2;
1180159b3361Sopenharmony_ci}
1181159b3361Sopenharmony_ci
1182159b3361Sopenharmony_cistatic int
1183159b3361Sopenharmony_cilocal_strncasecmp(const char *s1, const char *s2, int n)
1184159b3361Sopenharmony_ci{
1185159b3361Sopenharmony_ci    unsigned char c1 = 0;
1186159b3361Sopenharmony_ci    unsigned char c2 = 0;
1187159b3361Sopenharmony_ci    int     cnt = 0;
1188159b3361Sopenharmony_ci
1189159b3361Sopenharmony_ci    do {
1190159b3361Sopenharmony_ci        if (cnt == n) {
1191159b3361Sopenharmony_ci            break;
1192159b3361Sopenharmony_ci        }
1193159b3361Sopenharmony_ci        c1 = (unsigned char) tolower(*s1);
1194159b3361Sopenharmony_ci        c2 = (unsigned char) tolower(*s2);
1195159b3361Sopenharmony_ci        if (!c1) {
1196159b3361Sopenharmony_ci            break;
1197159b3361Sopenharmony_ci        }
1198159b3361Sopenharmony_ci        ++s1;
1199159b3361Sopenharmony_ci        ++s2;
1200159b3361Sopenharmony_ci        ++cnt;
1201159b3361Sopenharmony_ci    } while (c1 == c2);
1202159b3361Sopenharmony_ci    return c1 - c2;
1203159b3361Sopenharmony_ci}
1204159b3361Sopenharmony_ci
1205159b3361Sopenharmony_ci
1206159b3361Sopenharmony_ci
1207159b3361Sopenharmony_ci/* LAME is a simple frontend which just uses the file extension */
1208159b3361Sopenharmony_ci/* to determine the file type.  Trying to analyze the file */
1209159b3361Sopenharmony_ci/* contents is well beyond the scope of LAME and should not be added. */
1210159b3361Sopenharmony_cistatic int
1211159b3361Sopenharmony_cifilename_to_type(const char *FileName)
1212159b3361Sopenharmony_ci{
1213159b3361Sopenharmony_ci    size_t  len = strlen(FileName);
1214159b3361Sopenharmony_ci
1215159b3361Sopenharmony_ci    if (len < 4)
1216159b3361Sopenharmony_ci        return sf_unknown;
1217159b3361Sopenharmony_ci
1218159b3361Sopenharmony_ci    FileName += len - 4;
1219159b3361Sopenharmony_ci    if (0 == local_strcasecmp(FileName, ".mpg"))
1220159b3361Sopenharmony_ci        return sf_mp123;
1221159b3361Sopenharmony_ci    if (0 == local_strcasecmp(FileName, ".mp1"))
1222159b3361Sopenharmony_ci        return sf_mp123;
1223159b3361Sopenharmony_ci    if (0 == local_strcasecmp(FileName, ".mp2"))
1224159b3361Sopenharmony_ci        return sf_mp123;
1225159b3361Sopenharmony_ci    if (0 == local_strcasecmp(FileName, ".mp3"))
1226159b3361Sopenharmony_ci        return sf_mp123;
1227159b3361Sopenharmony_ci    if (0 == local_strcasecmp(FileName, ".wav"))
1228159b3361Sopenharmony_ci        return sf_wave;
1229159b3361Sopenharmony_ci    if (0 == local_strcasecmp(FileName, ".aif"))
1230159b3361Sopenharmony_ci        return sf_aiff;
1231159b3361Sopenharmony_ci    if (0 == local_strcasecmp(FileName, ".raw"))
1232159b3361Sopenharmony_ci        return sf_raw;
1233159b3361Sopenharmony_ci    if (0 == local_strcasecmp(FileName, ".ogg"))
1234159b3361Sopenharmony_ci        return sf_ogg;
1235159b3361Sopenharmony_ci    return sf_unknown;
1236159b3361Sopenharmony_ci}
1237159b3361Sopenharmony_ci
1238159b3361Sopenharmony_cistatic int
1239159b3361Sopenharmony_ciresample_rate(double freq)
1240159b3361Sopenharmony_ci{
1241159b3361Sopenharmony_ci    if (freq >= 1.e3)
1242159b3361Sopenharmony_ci        freq *= 1.e-3;
1243159b3361Sopenharmony_ci
1244159b3361Sopenharmony_ci    switch ((int) freq) {
1245159b3361Sopenharmony_ci    case 8:
1246159b3361Sopenharmony_ci        return 8000;
1247159b3361Sopenharmony_ci    case 11:
1248159b3361Sopenharmony_ci        return 11025;
1249159b3361Sopenharmony_ci    case 12:
1250159b3361Sopenharmony_ci        return 12000;
1251159b3361Sopenharmony_ci    case 16:
1252159b3361Sopenharmony_ci        return 16000;
1253159b3361Sopenharmony_ci    case 22:
1254159b3361Sopenharmony_ci        return 22050;
1255159b3361Sopenharmony_ci    case 24:
1256159b3361Sopenharmony_ci        return 24000;
1257159b3361Sopenharmony_ci    case 32:
1258159b3361Sopenharmony_ci        return 32000;
1259159b3361Sopenharmony_ci    case 44:
1260159b3361Sopenharmony_ci        return 44100;
1261159b3361Sopenharmony_ci    case 48:
1262159b3361Sopenharmony_ci        return 48000;
1263159b3361Sopenharmony_ci    default:
1264159b3361Sopenharmony_ci        error_printf("Illegal resample frequency: %.3f kHz\n", freq);
1265159b3361Sopenharmony_ci        return 0;
1266159b3361Sopenharmony_ci    }
1267159b3361Sopenharmony_ci}
1268159b3361Sopenharmony_ci
1269159b3361Sopenharmony_ci#ifdef _WIN32
1270159b3361Sopenharmony_ci#define SLASH '\\'
1271159b3361Sopenharmony_ci#define COLON ':'
1272159b3361Sopenharmony_ci#elif __OS2__
1273159b3361Sopenharmony_ci#define SLASH '\\'
1274159b3361Sopenharmony_ci#else
1275159b3361Sopenharmony_ci#define SLASH '/'
1276159b3361Sopenharmony_ci#endif
1277159b3361Sopenharmony_ci
1278159b3361Sopenharmony_cistatic
1279159b3361Sopenharmony_cisize_t scanPath(char const* s, char const** a, char const** b)
1280159b3361Sopenharmony_ci{
1281159b3361Sopenharmony_ci    char const* s1 = s;
1282159b3361Sopenharmony_ci    char const* s2 = s;
1283159b3361Sopenharmony_ci    if (s != 0) {
1284159b3361Sopenharmony_ci        for (; *s; ++s) {
1285159b3361Sopenharmony_ci            switch (*s) {
1286159b3361Sopenharmony_ci            case SLASH:
1287159b3361Sopenharmony_ci#ifdef _WIN32
1288159b3361Sopenharmony_ci            case COLON:
1289159b3361Sopenharmony_ci#endif
1290159b3361Sopenharmony_ci                s2 = s;
1291159b3361Sopenharmony_ci                break;
1292159b3361Sopenharmony_ci            }
1293159b3361Sopenharmony_ci        }
1294159b3361Sopenharmony_ci#ifdef _WIN32
1295159b3361Sopenharmony_ci        if (*s2 == COLON) {
1296159b3361Sopenharmony_ci            ++s2;
1297159b3361Sopenharmony_ci        }
1298159b3361Sopenharmony_ci#endif
1299159b3361Sopenharmony_ci    }
1300159b3361Sopenharmony_ci    if (a) {
1301159b3361Sopenharmony_ci        *a = s1;
1302159b3361Sopenharmony_ci    }
1303159b3361Sopenharmony_ci    if (b) {
1304159b3361Sopenharmony_ci        *b = s2;
1305159b3361Sopenharmony_ci    }
1306159b3361Sopenharmony_ci    return s2-s1;
1307159b3361Sopenharmony_ci}
1308159b3361Sopenharmony_ci
1309159b3361Sopenharmony_cistatic
1310159b3361Sopenharmony_cisize_t scanBasename(char const* s, char const** a, char const** b)
1311159b3361Sopenharmony_ci{
1312159b3361Sopenharmony_ci    char const* s1 = s;
1313159b3361Sopenharmony_ci    char const* s2 = s;
1314159b3361Sopenharmony_ci    if (s != 0) {
1315159b3361Sopenharmony_ci        for (; *s; ++s) {
1316159b3361Sopenharmony_ci            switch (*s) {
1317159b3361Sopenharmony_ci            case SLASH:
1318159b3361Sopenharmony_ci#ifdef _WIN32
1319159b3361Sopenharmony_ci            case COLON:
1320159b3361Sopenharmony_ci#endif
1321159b3361Sopenharmony_ci                s1 = s2 = s;
1322159b3361Sopenharmony_ci                break;
1323159b3361Sopenharmony_ci            case '.':
1324159b3361Sopenharmony_ci                s2 = s;
1325159b3361Sopenharmony_ci                break;
1326159b3361Sopenharmony_ci            }
1327159b3361Sopenharmony_ci        }
1328159b3361Sopenharmony_ci        if (s2 == s1) {
1329159b3361Sopenharmony_ci            s2 = s;
1330159b3361Sopenharmony_ci        }
1331159b3361Sopenharmony_ci        if (*s1 == SLASH
1332159b3361Sopenharmony_ci#ifdef _WIN32
1333159b3361Sopenharmony_ci          || *s1 == COLON
1334159b3361Sopenharmony_ci#endif
1335159b3361Sopenharmony_ci           ) {
1336159b3361Sopenharmony_ci            ++s1;
1337159b3361Sopenharmony_ci        }
1338159b3361Sopenharmony_ci    }
1339159b3361Sopenharmony_ci    if (a != 0) {
1340159b3361Sopenharmony_ci        *a = s1;
1341159b3361Sopenharmony_ci    }
1342159b3361Sopenharmony_ci    if (b != 0) {
1343159b3361Sopenharmony_ci        *b = s2;
1344159b3361Sopenharmony_ci    }
1345159b3361Sopenharmony_ci    return s2-s1;
1346159b3361Sopenharmony_ci}
1347159b3361Sopenharmony_ci
1348159b3361Sopenharmony_cistatic
1349159b3361Sopenharmony_ciint isCommonSuffix(char const* s_ext)
1350159b3361Sopenharmony_ci{
1351159b3361Sopenharmony_ci    char const* suffixes[] =
1352159b3361Sopenharmony_ci    { ".WAV", ".RAW", ".MP1", ".MP2"
1353159b3361Sopenharmony_ci    , ".MP3", ".MPG", ".MPA", ".CDA"
1354159b3361Sopenharmony_ci    , ".OGG", ".AIF", ".AIFF", ".AU"
1355159b3361Sopenharmony_ci    , ".SND", ".FLAC", ".WV", ".OFR"
1356159b3361Sopenharmony_ci    , ".TAK", ".MP4", ".M4A", ".PCM"
1357159b3361Sopenharmony_ci    , ".W64"
1358159b3361Sopenharmony_ci    };
1359159b3361Sopenharmony_ci    size_t i;
1360159b3361Sopenharmony_ci    for (i = 0; i < dimension_of(suffixes); ++i) {
1361159b3361Sopenharmony_ci        if (local_strcasecmp(s_ext, suffixes[i]) == 0) {
1362159b3361Sopenharmony_ci            return 1;
1363159b3361Sopenharmony_ci        }
1364159b3361Sopenharmony_ci    }
1365159b3361Sopenharmony_ci    return 0;
1366159b3361Sopenharmony_ci}
1367159b3361Sopenharmony_ci
1368159b3361Sopenharmony_ci
1369159b3361Sopenharmony_ciint generateOutPath(char const* inPath, char const* outDir, char const* s_ext, char* outPath)
1370159b3361Sopenharmony_ci{
1371159b3361Sopenharmony_ci    size_t const max_path = PATH_MAX;
1372159b3361Sopenharmony_ci#if 1
1373159b3361Sopenharmony_ci    size_t i = 0;
1374159b3361Sopenharmony_ci    int out_dir_used = 0;
1375159b3361Sopenharmony_ci
1376159b3361Sopenharmony_ci    if (outDir != 0 && outDir[0] != 0) {
1377159b3361Sopenharmony_ci        out_dir_used = 1;
1378159b3361Sopenharmony_ci        while (*outDir) {
1379159b3361Sopenharmony_ci            outPath[i++] = *outDir++;
1380159b3361Sopenharmony_ci            if (i >= max_path) {
1381159b3361Sopenharmony_ci                goto err_generateOutPath;
1382159b3361Sopenharmony_ci            }
1383159b3361Sopenharmony_ci        }
1384159b3361Sopenharmony_ci        if (i > 0 && outPath[i-1] != SLASH) {
1385159b3361Sopenharmony_ci            outPath[i++] = SLASH;
1386159b3361Sopenharmony_ci            if (i >= max_path) {
1387159b3361Sopenharmony_ci                goto err_generateOutPath;
1388159b3361Sopenharmony_ci            }
1389159b3361Sopenharmony_ci        }
1390159b3361Sopenharmony_ci        outPath[i] = 0;
1391159b3361Sopenharmony_ci    }
1392159b3361Sopenharmony_ci    else {
1393159b3361Sopenharmony_ci        char const* pa;
1394159b3361Sopenharmony_ci        char const* pb;
1395159b3361Sopenharmony_ci        size_t j, n = scanPath(inPath, &pa, &pb);
1396159b3361Sopenharmony_ci        if (i+n >= max_path) {
1397159b3361Sopenharmony_ci            goto err_generateOutPath;
1398159b3361Sopenharmony_ci        }
1399159b3361Sopenharmony_ci        for (j = 0; j < n; ++j) {
1400159b3361Sopenharmony_ci            outPath[i++] = pa[j];
1401159b3361Sopenharmony_ci        }
1402159b3361Sopenharmony_ci        if (n > 0) {
1403159b3361Sopenharmony_ci            outPath[i++] = SLASH;
1404159b3361Sopenharmony_ci            if (i >= max_path) {
1405159b3361Sopenharmony_ci                goto err_generateOutPath;
1406159b3361Sopenharmony_ci            }
1407159b3361Sopenharmony_ci        }
1408159b3361Sopenharmony_ci        outPath[i] = 0;
1409159b3361Sopenharmony_ci    }
1410159b3361Sopenharmony_ci    {
1411159b3361Sopenharmony_ci        int replace_suffix = 0;
1412159b3361Sopenharmony_ci        char const* na;
1413159b3361Sopenharmony_ci        char const* nb;
1414159b3361Sopenharmony_ci        size_t j, n = scanBasename(inPath, &na, &nb);
1415159b3361Sopenharmony_ci        if (i+n >= max_path) {
1416159b3361Sopenharmony_ci            goto err_generateOutPath;
1417159b3361Sopenharmony_ci        }
1418159b3361Sopenharmony_ci        for (j = 0; j < n; ++j) {
1419159b3361Sopenharmony_ci            outPath[i++] = na[j];
1420159b3361Sopenharmony_ci        }
1421159b3361Sopenharmony_ci        outPath[i] = 0;
1422159b3361Sopenharmony_ci        if (isCommonSuffix(nb) == 1) {
1423159b3361Sopenharmony_ci            replace_suffix = 1;
1424159b3361Sopenharmony_ci            if (out_dir_used == 0) {
1425159b3361Sopenharmony_ci                if (local_strcasecmp(nb, s_ext) == 0) {
1426159b3361Sopenharmony_ci                    replace_suffix = 0;
1427159b3361Sopenharmony_ci                }
1428159b3361Sopenharmony_ci            }
1429159b3361Sopenharmony_ci        }
1430159b3361Sopenharmony_ci        if (replace_suffix == 0) {
1431159b3361Sopenharmony_ci            while (*nb) {
1432159b3361Sopenharmony_ci                outPath[i++] = *nb++;
1433159b3361Sopenharmony_ci                if (i >= max_path) {
1434159b3361Sopenharmony_ci                    goto err_generateOutPath;
1435159b3361Sopenharmony_ci                }
1436159b3361Sopenharmony_ci            }
1437159b3361Sopenharmony_ci            outPath[i] = 0;
1438159b3361Sopenharmony_ci        }
1439159b3361Sopenharmony_ci    }
1440159b3361Sopenharmony_ci    if (i+5 >= max_path) {
1441159b3361Sopenharmony_ci        goto err_generateOutPath;
1442159b3361Sopenharmony_ci    }
1443159b3361Sopenharmony_ci    while (*s_ext) {
1444159b3361Sopenharmony_ci        outPath[i++] = *s_ext++;
1445159b3361Sopenharmony_ci    }
1446159b3361Sopenharmony_ci    outPath[i] = 0;
1447159b3361Sopenharmony_ci    return 0;
1448159b3361Sopenharmony_cierr_generateOutPath:
1449159b3361Sopenharmony_ci    error_printf( "error: output file name too long\n" );
1450159b3361Sopenharmony_ci    return 1;
1451159b3361Sopenharmony_ci#else
1452159b3361Sopenharmony_ci    strncpy(outPath, inPath, PATH_MAX + 1 - 4);
1453159b3361Sopenharmony_ci    strncat(outPath, s_ext, 4);
1454159b3361Sopenharmony_ci    return 0;
1455159b3361Sopenharmony_ci#endif
1456159b3361Sopenharmony_ci}
1457159b3361Sopenharmony_ci
1458159b3361Sopenharmony_ci
1459159b3361Sopenharmony_cistatic int
1460159b3361Sopenharmony_ciset_id3_albumart(lame_t gfp, char const* file_name)
1461159b3361Sopenharmony_ci{
1462159b3361Sopenharmony_ci    int ret = -1;
1463159b3361Sopenharmony_ci    FILE *fpi = 0;
1464159b3361Sopenharmony_ci
1465159b3361Sopenharmony_ci    if (file_name == 0) {
1466159b3361Sopenharmony_ci        return 0;
1467159b3361Sopenharmony_ci    }
1468159b3361Sopenharmony_ci    fpi = lame_fopen(file_name, "rb");
1469159b3361Sopenharmony_ci    if (!fpi) {
1470159b3361Sopenharmony_ci        ret = 1;
1471159b3361Sopenharmony_ci    }
1472159b3361Sopenharmony_ci    else {
1473159b3361Sopenharmony_ci        size_t size;
1474159b3361Sopenharmony_ci        char *albumart = 0;
1475159b3361Sopenharmony_ci
1476159b3361Sopenharmony_ci        fseek(fpi, 0, SEEK_END);
1477159b3361Sopenharmony_ci        size = ftell(fpi);
1478159b3361Sopenharmony_ci        fseek(fpi, 0, SEEK_SET);
1479159b3361Sopenharmony_ci        albumart = (char *)malloc(size);
1480159b3361Sopenharmony_ci        if (!albumart) {
1481159b3361Sopenharmony_ci            ret = 2;
1482159b3361Sopenharmony_ci        }
1483159b3361Sopenharmony_ci        else {
1484159b3361Sopenharmony_ci            if (fread(albumart, 1, size, fpi) != size) {
1485159b3361Sopenharmony_ci                ret = 3;
1486159b3361Sopenharmony_ci            }
1487159b3361Sopenharmony_ci            else {
1488159b3361Sopenharmony_ci                ret = id3tag_set_albumart(gfp, albumart, size) ? 4 : 0;
1489159b3361Sopenharmony_ci            }
1490159b3361Sopenharmony_ci            free(albumart);
1491159b3361Sopenharmony_ci        }
1492159b3361Sopenharmony_ci        fclose(fpi);
1493159b3361Sopenharmony_ci    }
1494159b3361Sopenharmony_ci    switch (ret) {
1495159b3361Sopenharmony_ci    case 1: error_printf("Could not find: '%s'.\n", file_name); break;
1496159b3361Sopenharmony_ci    case 2: error_printf("Insufficient memory for reading the albumart.\n"); break;
1497159b3361Sopenharmony_ci    case 3: error_printf("Read error: '%s'.\n", file_name); break;
1498159b3361Sopenharmony_ci    case 4: error_printf("Unsupported image: '%s'.\nSpecify JPEG/PNG/GIF image\n", file_name); break;
1499159b3361Sopenharmony_ci    default: break;
1500159b3361Sopenharmony_ci    }
1501159b3361Sopenharmony_ci    return ret;
1502159b3361Sopenharmony_ci}
1503159b3361Sopenharmony_ci
1504159b3361Sopenharmony_ci
1505159b3361Sopenharmony_cienum ID3TAG_MODE
1506159b3361Sopenharmony_ci{ ID3TAG_MODE_DEFAULT
1507159b3361Sopenharmony_ci, ID3TAG_MODE_V1_ONLY
1508159b3361Sopenharmony_ci, ID3TAG_MODE_V2_ONLY
1509159b3361Sopenharmony_ci};
1510159b3361Sopenharmony_ci
1511159b3361Sopenharmony_cistatic int dev_only_with_arg(char const* str, char const* token, char const* nextArg, int* argIgnored, int* argUsed)
1512159b3361Sopenharmony_ci{
1513159b3361Sopenharmony_ci    if (0 != local_strcasecmp(token,str)) return 0;
1514159b3361Sopenharmony_ci    *argUsed = 1;
1515159b3361Sopenharmony_ci    if (internal_opts_enabled) return 1;
1516159b3361Sopenharmony_ci    *argIgnored = 1;
1517159b3361Sopenharmony_ci    error_printf("WARNING: ignoring developer-only switch --%s %s\n", token, nextArg);
1518159b3361Sopenharmony_ci    return 0;
1519159b3361Sopenharmony_ci}
1520159b3361Sopenharmony_ci
1521159b3361Sopenharmony_cistatic int dev_only_without_arg(char const* str, char const* token, int* argIgnored)
1522159b3361Sopenharmony_ci{
1523159b3361Sopenharmony_ci    if (0 != local_strcasecmp(token,str)) return 0;
1524159b3361Sopenharmony_ci    if (internal_opts_enabled) return 1;
1525159b3361Sopenharmony_ci    *argIgnored = 1;
1526159b3361Sopenharmony_ci    error_printf("WARNING: ignoring developer-only switch --%s\n", token);
1527159b3361Sopenharmony_ci    return 0;
1528159b3361Sopenharmony_ci}
1529159b3361Sopenharmony_ci
1530159b3361Sopenharmony_ci/* Ugly, NOT final version */
1531159b3361Sopenharmony_ci
1532159b3361Sopenharmony_ci#define T_IF(str)          if ( 0 == local_strcasecmp (token,str) ) {
1533159b3361Sopenharmony_ci#define T_ELIF(str)        } else if ( 0 == local_strcasecmp (token,str) ) {
1534159b3361Sopenharmony_ci#define T_ELIF2(str1,str2) } else if ( 0 == local_strcasecmp (token,str1)  ||  0 == local_strcasecmp (token,str2) ) {
1535159b3361Sopenharmony_ci#define T_ELSE             } else {
1536159b3361Sopenharmony_ci#define T_END              }
1537159b3361Sopenharmony_ci
1538159b3361Sopenharmony_ci#define T_ELIF_INTERNAL(str) \
1539159b3361Sopenharmony_ci                           } else if (dev_only_without_arg(str,token,&argIgnored)) {
1540159b3361Sopenharmony_ci
1541159b3361Sopenharmony_ci#define T_ELIF_INTERNAL_WITH_ARG(str) \
1542159b3361Sopenharmony_ci                           } else if (dev_only_with_arg(str,token,nextArg,&argIgnored,&argUsed)) {
1543159b3361Sopenharmony_ci
1544159b3361Sopenharmony_ci
1545159b3361Sopenharmony_cistatic int
1546159b3361Sopenharmony_ciparse_args_(lame_global_flags * gfp, int argc, char **argv,
1547159b3361Sopenharmony_ci           char *const inPath, char *const outPath, char **nogap_inPath, int *num_nogap)
1548159b3361Sopenharmony_ci{
1549159b3361Sopenharmony_ci    char    outDir[PATH_MAX+1] = "";
1550159b3361Sopenharmony_ci    int     input_file = 0;  /* set to 1 if we parse an input file name  */
1551159b3361Sopenharmony_ci    int     i;
1552159b3361Sopenharmony_ci    int     autoconvert = 0;
1553159b3361Sopenharmony_ci    int     nogap = 0;
1554159b3361Sopenharmony_ci    int     nogap_tags = 0;  /* set to 1 to use VBR tags in NOGAP mode */
1555159b3361Sopenharmony_ci    const char *ProgramName = argv[0];
1556159b3361Sopenharmony_ci    int     count_nogap = 0;
1557159b3361Sopenharmony_ci    int     noreplaygain = 0; /* is RG explicitly disabled by the user */
1558159b3361Sopenharmony_ci    int     id3tag_mode = ID3TAG_MODE_DEFAULT;
1559159b3361Sopenharmony_ci    int     ignore_tag_errors = 0;  /* Ignore errors in values passed for tags */
1560159b3361Sopenharmony_ci#ifdef ID3TAGS_EXTENDED
1561159b3361Sopenharmony_ci    enum TextEncoding id3_tenc = TENC_UTF16;
1562159b3361Sopenharmony_ci#else
1563159b3361Sopenharmony_ci    enum TextEncoding id3_tenc = TENC_LATIN1;
1564159b3361Sopenharmony_ci#endif
1565159b3361Sopenharmony_ci
1566159b3361Sopenharmony_ci#ifdef HAVE_LANGINFO_H
1567159b3361Sopenharmony_ci    setlocale(LC_CTYPE, "");
1568159b3361Sopenharmony_ci#endif
1569159b3361Sopenharmony_ci    inPath[0] = '\0';
1570159b3361Sopenharmony_ci    outPath[0] = '\0';
1571159b3361Sopenharmony_ci    /* turn on display options. user settings may turn them off below */
1572159b3361Sopenharmony_ci    global_ui_config.silent = 0; /* default */
1573159b3361Sopenharmony_ci    global_ui_config.brhist = 1;
1574159b3361Sopenharmony_ci    global_decoder.mp3_delay = 0;
1575159b3361Sopenharmony_ci    global_decoder.mp3_delay_set = 0;
1576159b3361Sopenharmony_ci    global_decoder.disable_wav_header = 0;
1577159b3361Sopenharmony_ci    global_ui_config.print_clipping_info = 0;
1578159b3361Sopenharmony_ci    id3tag_init(gfp);
1579159b3361Sopenharmony_ci
1580159b3361Sopenharmony_ci    /* process args */
1581159b3361Sopenharmony_ci    for (i = 0; ++i < argc;) {
1582159b3361Sopenharmony_ci        char   *token;
1583159b3361Sopenharmony_ci        int     argUsed;
1584159b3361Sopenharmony_ci        int     argIgnored=0;
1585159b3361Sopenharmony_ci
1586159b3361Sopenharmony_ci        token = argv[i];
1587159b3361Sopenharmony_ci        if (*token++ == '-') {
1588159b3361Sopenharmony_ci            char   *nextArg = i + 1 < argc ? argv[i + 1] : "";
1589159b3361Sopenharmony_ci            argUsed = 0;
1590159b3361Sopenharmony_ci            if (!*token) { /* The user wants to use stdin and/or stdout. */
1591159b3361Sopenharmony_ci                input_file = 1;
1592159b3361Sopenharmony_ci                if (inPath[0] == '\0')
1593159b3361Sopenharmony_ci                    strncpy(inPath, argv[i], PATH_MAX + 1);
1594159b3361Sopenharmony_ci                else if (outPath[0] == '\0')
1595159b3361Sopenharmony_ci                    strncpy(outPath, argv[i], PATH_MAX + 1);
1596159b3361Sopenharmony_ci            }
1597159b3361Sopenharmony_ci            if (*token == '-') { /* GNU style */
1598159b3361Sopenharmony_ci                double  double_value = 0;
1599159b3361Sopenharmony_ci                int     int_value = 0;
1600159b3361Sopenharmony_ci                token++;
1601159b3361Sopenharmony_ci
1602159b3361Sopenharmony_ci                T_IF("resample")
1603159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1604159b3361Sopenharmony_ci                    if (argUsed)
1605159b3361Sopenharmony_ci                        (void) lame_set_out_samplerate(gfp, resample_rate(double_value));
1606159b3361Sopenharmony_ci
1607159b3361Sopenharmony_ci                T_ELIF("vbr-old")
1608159b3361Sopenharmony_ci                    lame_set_VBR(gfp, vbr_rh);
1609159b3361Sopenharmony_ci
1610159b3361Sopenharmony_ci                T_ELIF("vbr-new")
1611159b3361Sopenharmony_ci                    lame_set_VBR(gfp, vbr_mt);
1612159b3361Sopenharmony_ci
1613159b3361Sopenharmony_ci                T_ELIF("vbr-mtrh")
1614159b3361Sopenharmony_ci                    lame_set_VBR(gfp, vbr_mtrh);
1615159b3361Sopenharmony_ci
1616159b3361Sopenharmony_ci                T_ELIF("cbr")
1617159b3361Sopenharmony_ci                    lame_set_VBR(gfp, vbr_off);
1618159b3361Sopenharmony_ci
1619159b3361Sopenharmony_ci                T_ELIF("abr")
1620159b3361Sopenharmony_ci                    /* values larger than 8000 are bps (like Fraunhofer), so it's strange to get 320000 bps MP3 when specifying 8000 bps MP3 */
1621159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
1622159b3361Sopenharmony_ci                    if (argUsed) {
1623159b3361Sopenharmony_ci                        if (int_value >= 8000) {
1624159b3361Sopenharmony_ci                            int_value = (int_value + 500) / 1000;
1625159b3361Sopenharmony_ci                        }
1626159b3361Sopenharmony_ci                        if (int_value > 320) {
1627159b3361Sopenharmony_ci                            int_value = 320;
1628159b3361Sopenharmony_ci                        }
1629159b3361Sopenharmony_ci                        if (int_value < 8) {
1630159b3361Sopenharmony_ci                            int_value = 8;
1631159b3361Sopenharmony_ci                        }
1632159b3361Sopenharmony_ci                        lame_set_VBR(gfp, vbr_abr);
1633159b3361Sopenharmony_ci                        lame_set_VBR_mean_bitrate_kbps(gfp, int_value);
1634159b3361Sopenharmony_ci                    }
1635159b3361Sopenharmony_ci
1636159b3361Sopenharmony_ci                T_ELIF("r3mix")
1637159b3361Sopenharmony_ci                    lame_set_preset(gfp, R3MIX);
1638159b3361Sopenharmony_ci
1639159b3361Sopenharmony_ci                T_ELIF("bitwidth")
1640159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
1641159b3361Sopenharmony_ci                    if (argUsed)
1642159b3361Sopenharmony_ci                        global_raw_pcm.in_bitwidth = int_value;
1643159b3361Sopenharmony_ci
1644159b3361Sopenharmony_ci                T_ELIF("signed")
1645159b3361Sopenharmony_ci                    global_raw_pcm.in_signed = 1;
1646159b3361Sopenharmony_ci
1647159b3361Sopenharmony_ci                T_ELIF("unsigned")
1648159b3361Sopenharmony_ci                    global_raw_pcm.in_signed = 0;
1649159b3361Sopenharmony_ci
1650159b3361Sopenharmony_ci                T_ELIF("little-endian")
1651159b3361Sopenharmony_ci                    global_raw_pcm.in_endian = ByteOrderLittleEndian;
1652159b3361Sopenharmony_ci
1653159b3361Sopenharmony_ci                T_ELIF("big-endian")
1654159b3361Sopenharmony_ci                    global_raw_pcm.in_endian = ByteOrderBigEndian;
1655159b3361Sopenharmony_ci
1656159b3361Sopenharmony_ci                T_ELIF("mp1input")
1657159b3361Sopenharmony_ci                    global_reader.input_format = sf_mp1;
1658159b3361Sopenharmony_ci
1659159b3361Sopenharmony_ci                T_ELIF("mp2input")
1660159b3361Sopenharmony_ci                    global_reader.input_format = sf_mp2;
1661159b3361Sopenharmony_ci
1662159b3361Sopenharmony_ci                T_ELIF("mp3input")
1663159b3361Sopenharmony_ci                    global_reader.input_format = sf_mp3;
1664159b3361Sopenharmony_ci
1665159b3361Sopenharmony_ci                T_ELIF("ogginput")
1666159b3361Sopenharmony_ci                    error_printf("sorry, vorbis support in LAME is deprecated.\n");
1667159b3361Sopenharmony_ci                return -1;
1668159b3361Sopenharmony_ci
1669159b3361Sopenharmony_ci                T_ELIF("decode")
1670159b3361Sopenharmony_ci                    (void) lame_set_decode_only(gfp, 1);
1671159b3361Sopenharmony_ci
1672159b3361Sopenharmony_ci                T_ELIF("flush")
1673159b3361Sopenharmony_ci                    global_writer.flush_write = 1;
1674159b3361Sopenharmony_ci
1675159b3361Sopenharmony_ci                T_ELIF("decode-mp3delay")
1676159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
1677159b3361Sopenharmony_ci                    if (argUsed) {
1678159b3361Sopenharmony_ci                        global_decoder.mp3_delay = int_value;
1679159b3361Sopenharmony_ci                        global_decoder.mp3_delay_set = 1;
1680159b3361Sopenharmony_ci                    }
1681159b3361Sopenharmony_ci
1682159b3361Sopenharmony_ci                T_ELIF("nores")
1683159b3361Sopenharmony_ci                    lame_set_disable_reservoir(gfp, 1);
1684159b3361Sopenharmony_ci
1685159b3361Sopenharmony_ci                T_ELIF("strictly-enforce-ISO")
1686159b3361Sopenharmony_ci                    lame_set_strict_ISO(gfp, MDB_STRICT_ISO);
1687159b3361Sopenharmony_ci
1688159b3361Sopenharmony_ci                T_ELIF("buffer-constraint")
1689159b3361Sopenharmony_ci                  argUsed = 1;
1690159b3361Sopenharmony_ci                if (strcmp(nextArg, "default") == 0)
1691159b3361Sopenharmony_ci                  (void) lame_set_strict_ISO(gfp, MDB_DEFAULT);
1692159b3361Sopenharmony_ci                else if (strcmp(nextArg, "strict") == 0)
1693159b3361Sopenharmony_ci                  (void) lame_set_strict_ISO(gfp, MDB_STRICT_ISO);
1694159b3361Sopenharmony_ci                else if (strcmp(nextArg, "maximum") == 0)
1695159b3361Sopenharmony_ci                  (void) lame_set_strict_ISO(gfp, MDB_MAXIMUM);
1696159b3361Sopenharmony_ci                else {
1697159b3361Sopenharmony_ci                    error_printf("unknown buffer constraint '%s'\n", nextArg);
1698159b3361Sopenharmony_ci                    return -1;
1699159b3361Sopenharmony_ci                }
1700159b3361Sopenharmony_ci
1701159b3361Sopenharmony_ci                T_ELIF("scale")
1702159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1703159b3361Sopenharmony_ci                    if (argUsed)
1704159b3361Sopenharmony_ci                        (void) lame_set_scale(gfp, (float) double_value);
1705159b3361Sopenharmony_ci
1706159b3361Sopenharmony_ci                T_ELIF("scale-l")
1707159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1708159b3361Sopenharmony_ci                    if (argUsed)
1709159b3361Sopenharmony_ci                        (void) lame_set_scale_left(gfp, (float) double_value);
1710159b3361Sopenharmony_ci
1711159b3361Sopenharmony_ci                T_ELIF("scale-r")
1712159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1713159b3361Sopenharmony_ci                    if (argUsed)
1714159b3361Sopenharmony_ci                        (void) lame_set_scale_right(gfp, (float) double_value);
1715159b3361Sopenharmony_ci
1716159b3361Sopenharmony_ci                T_ELIF("gain")
1717159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1718159b3361Sopenharmony_ci                    if (argUsed) {
1719159b3361Sopenharmony_ci                        double gain = double_value;
1720159b3361Sopenharmony_ci                        gain = gain > -20.f ? gain : -20.f;
1721159b3361Sopenharmony_ci                        gain = gain < 12.f ? gain : 12.f;
1722159b3361Sopenharmony_ci                        gain = pow(10.f, gain*0.05);
1723159b3361Sopenharmony_ci                        (void) lame_set_scale(gfp, (float) gain);
1724159b3361Sopenharmony_ci                    }
1725159b3361Sopenharmony_ci
1726159b3361Sopenharmony_ci                T_ELIF("noasm")
1727159b3361Sopenharmony_ci                    argUsed = 1;
1728159b3361Sopenharmony_ci                if (!strcmp(nextArg, "mmx"))
1729159b3361Sopenharmony_ci                    (void) lame_set_asm_optimizations(gfp, MMX, 0);
1730159b3361Sopenharmony_ci                if (!strcmp(nextArg, "3dnow"))
1731159b3361Sopenharmony_ci                    (void) lame_set_asm_optimizations(gfp, AMD_3DNOW, 0);
1732159b3361Sopenharmony_ci                if (!strcmp(nextArg, "sse"))
1733159b3361Sopenharmony_ci                    (void) lame_set_asm_optimizations(gfp, SSE, 0);
1734159b3361Sopenharmony_ci
1735159b3361Sopenharmony_ci                T_ELIF("freeformat")
1736159b3361Sopenharmony_ci                    lame_set_free_format(gfp, 1);
1737159b3361Sopenharmony_ci
1738159b3361Sopenharmony_ci                T_ELIF("replaygain-fast")
1739159b3361Sopenharmony_ci                    lame_set_findReplayGain(gfp, 1);
1740159b3361Sopenharmony_ci
1741159b3361Sopenharmony_ci#ifdef DECODE_ON_THE_FLY
1742159b3361Sopenharmony_ci                T_ELIF("replaygain-accurate")
1743159b3361Sopenharmony_ci                    lame_set_decode_on_the_fly(gfp, 1);
1744159b3361Sopenharmony_ci                lame_set_findReplayGain(gfp, 1);
1745159b3361Sopenharmony_ci#endif
1746159b3361Sopenharmony_ci
1747159b3361Sopenharmony_ci                T_ELIF("noreplaygain")
1748159b3361Sopenharmony_ci                    noreplaygain = 1;
1749159b3361Sopenharmony_ci                lame_set_findReplayGain(gfp, 0);
1750159b3361Sopenharmony_ci
1751159b3361Sopenharmony_ci
1752159b3361Sopenharmony_ci#ifdef DECODE_ON_THE_FLY
1753159b3361Sopenharmony_ci                T_ELIF("clipdetect")
1754159b3361Sopenharmony_ci                    global_ui_config.print_clipping_info = 1;
1755159b3361Sopenharmony_ci                    lame_set_decode_on_the_fly(gfp, 1);
1756159b3361Sopenharmony_ci#endif
1757159b3361Sopenharmony_ci
1758159b3361Sopenharmony_ci                T_ELIF("nohist")
1759159b3361Sopenharmony_ci                    global_ui_config.brhist = 0;
1760159b3361Sopenharmony_ci
1761159b3361Sopenharmony_ci#if defined(__OS2__) || defined(WIN32)
1762159b3361Sopenharmony_ci                T_ELIF("priority")
1763159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
1764159b3361Sopenharmony_ci                    if (argUsed)
1765159b3361Sopenharmony_ci                        setProcessPriority(int_value);
1766159b3361Sopenharmony_ci#endif
1767159b3361Sopenharmony_ci
1768159b3361Sopenharmony_ci                /* options for ID3 tag */
1769159b3361Sopenharmony_ci#ifdef ID3TAGS_EXTENDED
1770159b3361Sopenharmony_ci                T_ELIF2("id3v2-utf16","id3v2-ucs2") /* id3v2-ucs2 for compatibility only */
1771159b3361Sopenharmony_ci                    id3_tenc = TENC_UTF16;
1772159b3361Sopenharmony_ci                    id3tag_add_v2(gfp);
1773159b3361Sopenharmony_ci
1774159b3361Sopenharmony_ci                T_ELIF("id3v2-latin1")
1775159b3361Sopenharmony_ci                    id3_tenc = TENC_LATIN1;
1776159b3361Sopenharmony_ci                    id3tag_add_v2(gfp);
1777159b3361Sopenharmony_ci#endif
1778159b3361Sopenharmony_ci
1779159b3361Sopenharmony_ci                T_ELIF("tt")
1780159b3361Sopenharmony_ci                    argUsed = 1;
1781159b3361Sopenharmony_ci                    id3_tag(gfp, 't', id3_tenc, nextArg);
1782159b3361Sopenharmony_ci
1783159b3361Sopenharmony_ci                T_ELIF("ta")
1784159b3361Sopenharmony_ci                    argUsed = 1;
1785159b3361Sopenharmony_ci                    id3_tag(gfp, 'a', id3_tenc, nextArg);
1786159b3361Sopenharmony_ci
1787159b3361Sopenharmony_ci                T_ELIF("tl")
1788159b3361Sopenharmony_ci                    argUsed = 1;
1789159b3361Sopenharmony_ci                    id3_tag(gfp, 'l', id3_tenc, nextArg);
1790159b3361Sopenharmony_ci
1791159b3361Sopenharmony_ci                T_ELIF("ty")
1792159b3361Sopenharmony_ci                    argUsed = 1;
1793159b3361Sopenharmony_ci                    id3_tag(gfp, 'y', id3_tenc, nextArg);
1794159b3361Sopenharmony_ci
1795159b3361Sopenharmony_ci                T_ELIF("tc")
1796159b3361Sopenharmony_ci                    argUsed = 1;
1797159b3361Sopenharmony_ci                    id3_tag(gfp, 'c', id3_tenc, nextArg);
1798159b3361Sopenharmony_ci
1799159b3361Sopenharmony_ci                T_ELIF("tn")
1800159b3361Sopenharmony_ci                    int ret = id3_tag(gfp, 'n', id3_tenc, nextArg);
1801159b3361Sopenharmony_ci                    argUsed = 1;
1802159b3361Sopenharmony_ci                    if (ret != 0) {
1803159b3361Sopenharmony_ci                        if (0 == ignore_tag_errors) {
1804159b3361Sopenharmony_ci                            if (id3tag_mode == ID3TAG_MODE_V1_ONLY) {
1805159b3361Sopenharmony_ci                                if (global_ui_config.silent < 9) {
1806159b3361Sopenharmony_ci                                    error_printf("The track number has to be between 1 and 255 for ID3v1.\n");
1807159b3361Sopenharmony_ci                                }
1808159b3361Sopenharmony_ci                                return -1;
1809159b3361Sopenharmony_ci                            }
1810159b3361Sopenharmony_ci                            else if (id3tag_mode == ID3TAG_MODE_V2_ONLY) {
1811159b3361Sopenharmony_ci                                /* track will be stored as-is in ID3v2 case, so no problem here */
1812159b3361Sopenharmony_ci                            }
1813159b3361Sopenharmony_ci                            else {
1814159b3361Sopenharmony_ci                                if (global_ui_config.silent < 9) {
1815159b3361Sopenharmony_ci                                    error_printf("The track number has to be between 1 and 255 for ID3v1, ignored for ID3v1.\n");
1816159b3361Sopenharmony_ci                                }
1817159b3361Sopenharmony_ci                            }
1818159b3361Sopenharmony_ci                        }
1819159b3361Sopenharmony_ci                    }
1820159b3361Sopenharmony_ci
1821159b3361Sopenharmony_ci                T_ELIF("tg")
1822159b3361Sopenharmony_ci                    int ret = 0;
1823159b3361Sopenharmony_ci                    argUsed = 1;
1824159b3361Sopenharmony_ci                    if (nextArg != 0 && strlen(nextArg) > 0) {
1825159b3361Sopenharmony_ci                        ret = id3_tag(gfp, 'g', id3_tenc, nextArg);
1826159b3361Sopenharmony_ci                    }
1827159b3361Sopenharmony_ci                    if (ret != 0) {
1828159b3361Sopenharmony_ci                        if (0 == ignore_tag_errors) {
1829159b3361Sopenharmony_ci                            if (ret == -1) {
1830159b3361Sopenharmony_ci                                error_printf("Unknown ID3v1 genre number: '%s'.\n", nextArg);
1831159b3361Sopenharmony_ci                                return -1;
1832159b3361Sopenharmony_ci                            }
1833159b3361Sopenharmony_ci                            else if (ret == -2) {
1834159b3361Sopenharmony_ci                                if (id3tag_mode == ID3TAG_MODE_V1_ONLY) {
1835159b3361Sopenharmony_ci                                    error_printf("Unknown ID3v1 genre: '%s'.\n", nextArg);
1836159b3361Sopenharmony_ci                                    return -1;
1837159b3361Sopenharmony_ci                                }
1838159b3361Sopenharmony_ci                                else if (id3tag_mode == ID3TAG_MODE_V2_ONLY) {
1839159b3361Sopenharmony_ci                                    /* genre will be stored as-is in ID3v2 case, so no problem here */
1840159b3361Sopenharmony_ci                                }
1841159b3361Sopenharmony_ci                                else {
1842159b3361Sopenharmony_ci                                    if (global_ui_config.silent < 9) {
1843159b3361Sopenharmony_ci                                        error_printf("Unknown ID3v1 genre: '%s'.  Setting ID3v1 genre to 'Other'\n", nextArg);
1844159b3361Sopenharmony_ci                                    }
1845159b3361Sopenharmony_ci                                }
1846159b3361Sopenharmony_ci                            }
1847159b3361Sopenharmony_ci                            else {
1848159b3361Sopenharmony_ci                                if (global_ui_config.silent < 10)
1849159b3361Sopenharmony_ci                                    error_printf("Internal error.\n");
1850159b3361Sopenharmony_ci                                return -1;
1851159b3361Sopenharmony_ci                            }
1852159b3361Sopenharmony_ci                        }
1853159b3361Sopenharmony_ci                    }
1854159b3361Sopenharmony_ci
1855159b3361Sopenharmony_ci                T_ELIF("tv")
1856159b3361Sopenharmony_ci                    argUsed = 1;
1857159b3361Sopenharmony_ci                    if (id3_tag(gfp, 'v', id3_tenc, nextArg)) {
1858159b3361Sopenharmony_ci                        if (global_ui_config.silent < 9) {
1859159b3361Sopenharmony_ci                            error_printf("Invalid field value: '%s'. Ignored\n", nextArg);
1860159b3361Sopenharmony_ci                        }
1861159b3361Sopenharmony_ci                    }
1862159b3361Sopenharmony_ci
1863159b3361Sopenharmony_ci                T_ELIF("ti")
1864159b3361Sopenharmony_ci                    argUsed = 1;
1865159b3361Sopenharmony_ci                    if (set_id3_albumart(gfp, nextArg) != 0) {
1866159b3361Sopenharmony_ci                        if (! ignore_tag_errors) {
1867159b3361Sopenharmony_ci                            return -1;
1868159b3361Sopenharmony_ci                        }
1869159b3361Sopenharmony_ci                    }
1870159b3361Sopenharmony_ci
1871159b3361Sopenharmony_ci                T_ELIF("ignore-tag-errors")
1872159b3361Sopenharmony_ci                    ignore_tag_errors = 1;
1873159b3361Sopenharmony_ci
1874159b3361Sopenharmony_ci                T_ELIF("add-id3v2")
1875159b3361Sopenharmony_ci                    id3tag_add_v2(gfp);
1876159b3361Sopenharmony_ci
1877159b3361Sopenharmony_ci                T_ELIF("id3v1-only")
1878159b3361Sopenharmony_ci                    id3tag_v1_only(gfp);
1879159b3361Sopenharmony_ci                    id3tag_mode = ID3TAG_MODE_V1_ONLY;
1880159b3361Sopenharmony_ci
1881159b3361Sopenharmony_ci                T_ELIF("id3v2-only")
1882159b3361Sopenharmony_ci                    id3tag_v2_only(gfp);
1883159b3361Sopenharmony_ci                    id3tag_mode = ID3TAG_MODE_V2_ONLY;
1884159b3361Sopenharmony_ci
1885159b3361Sopenharmony_ci                T_ELIF("space-id3v1")
1886159b3361Sopenharmony_ci                    id3tag_space_v1(gfp);
1887159b3361Sopenharmony_ci
1888159b3361Sopenharmony_ci                T_ELIF("pad-id3v2")
1889159b3361Sopenharmony_ci                    id3tag_pad_v2(gfp);
1890159b3361Sopenharmony_ci
1891159b3361Sopenharmony_ci                T_ELIF("pad-id3v2-size")
1892159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
1893159b3361Sopenharmony_ci                    if (argUsed) {
1894159b3361Sopenharmony_ci                        int_value = int_value <= 128000 ? int_value : 128000;
1895159b3361Sopenharmony_ci                        int_value = int_value >= 0      ? int_value : 0;
1896159b3361Sopenharmony_ci                        id3tag_set_pad(gfp, int_value);
1897159b3361Sopenharmony_ci                    }
1898159b3361Sopenharmony_ci
1899159b3361Sopenharmony_ci                T_ELIF("genre-list")
1900159b3361Sopenharmony_ci                    id3tag_genre_list(genre_list_handler, NULL);
1901159b3361Sopenharmony_ci                    return -2;
1902159b3361Sopenharmony_ci
1903159b3361Sopenharmony_ci
1904159b3361Sopenharmony_ci                T_ELIF("lowpass")
1905159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1906159b3361Sopenharmony_ci                    if (argUsed) {
1907159b3361Sopenharmony_ci                        if (double_value < 0) {
1908159b3361Sopenharmony_ci                            lame_set_lowpassfreq(gfp, -1);
1909159b3361Sopenharmony_ci                        }
1910159b3361Sopenharmony_ci                        else {
1911159b3361Sopenharmony_ci                            /* useful are 0.001 kHz...50 kHz, 50 Hz...50000 Hz */
1912159b3361Sopenharmony_ci                            if (double_value < 0.001 || double_value > 50000.) {
1913159b3361Sopenharmony_ci                                error_printf("Must specify lowpass with --lowpass freq, freq >= 0.001 kHz\n");
1914159b3361Sopenharmony_ci                                return -1;
1915159b3361Sopenharmony_ci                            }
1916159b3361Sopenharmony_ci                            lame_set_lowpassfreq(gfp, (int) (double_value * (double_value < 50. ? 1.e3 : 1.e0) + 0.5));
1917159b3361Sopenharmony_ci                        }
1918159b3361Sopenharmony_ci                    }
1919159b3361Sopenharmony_ci
1920159b3361Sopenharmony_ci                T_ELIF("lowpass-width")
1921159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1922159b3361Sopenharmony_ci                    if (argUsed) {
1923159b3361Sopenharmony_ci                        /* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */
1924159b3361Sopenharmony_ci                        if (double_value < 0.001 || double_value > 50000.) {
1925159b3361Sopenharmony_ci                            error_printf
1926159b3361Sopenharmony_ci                                ("Must specify lowpass width with --lowpass-width freq, freq >= 0.001 kHz\n");
1927159b3361Sopenharmony_ci                            return -1;
1928159b3361Sopenharmony_ci                        }
1929159b3361Sopenharmony_ci                        lame_set_lowpasswidth(gfp, (int) (double_value * (double_value < 16. ? 1.e3 : 1.e0) + 0.5));
1930159b3361Sopenharmony_ci                    }
1931159b3361Sopenharmony_ci
1932159b3361Sopenharmony_ci                T_ELIF("highpass")
1933159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1934159b3361Sopenharmony_ci                    if (argUsed) {
1935159b3361Sopenharmony_ci                        if (double_value < 0.0) {
1936159b3361Sopenharmony_ci                            lame_set_highpassfreq(gfp, -1);
1937159b3361Sopenharmony_ci                        }
1938159b3361Sopenharmony_ci                        else {
1939159b3361Sopenharmony_ci                            /* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */
1940159b3361Sopenharmony_ci                            if (double_value < 0.001 || double_value > 50000.) {
1941159b3361Sopenharmony_ci                                error_printf("Must specify highpass with --highpass freq, freq >= 0.001 kHz\n");
1942159b3361Sopenharmony_ci                                return -1;
1943159b3361Sopenharmony_ci                            }
1944159b3361Sopenharmony_ci                            lame_set_highpassfreq(gfp, (int) (double_value * (double_value < 16. ? 1.e3 : 1.e0) + 0.5));
1945159b3361Sopenharmony_ci                        }
1946159b3361Sopenharmony_ci                    }
1947159b3361Sopenharmony_ci
1948159b3361Sopenharmony_ci                T_ELIF("highpass-width")
1949159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1950159b3361Sopenharmony_ci                    if (argUsed) {
1951159b3361Sopenharmony_ci                        /* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */
1952159b3361Sopenharmony_ci                        if (double_value < 0.001 || double_value > 50000.) {
1953159b3361Sopenharmony_ci                            error_printf
1954159b3361Sopenharmony_ci                                ("Must specify highpass width with --highpass-width freq, freq >= 0.001 kHz\n");
1955159b3361Sopenharmony_ci                            return -1;
1956159b3361Sopenharmony_ci                        }
1957159b3361Sopenharmony_ci                        lame_set_highpasswidth(gfp, (int) double_value);
1958159b3361Sopenharmony_ci                    }
1959159b3361Sopenharmony_ci
1960159b3361Sopenharmony_ci                T_ELIF("comp")
1961159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
1962159b3361Sopenharmony_ci                    if (argUsed) {
1963159b3361Sopenharmony_ci                        if (double_value < 1.0) {
1964159b3361Sopenharmony_ci                            error_printf("Must specify compression ratio >= 1.0\n");
1965159b3361Sopenharmony_ci                            return -1;
1966159b3361Sopenharmony_ci                        }
1967159b3361Sopenharmony_ci                        else {
1968159b3361Sopenharmony_ci                            lame_set_compression_ratio(gfp, (float) double_value);
1969159b3361Sopenharmony_ci                        }
1970159b3361Sopenharmony_ci                    }
1971159b3361Sopenharmony_ci
1972159b3361Sopenharmony_ci                /* some more GNU-ish options could be added
1973159b3361Sopenharmony_ci                 * brief         => few messages on screen (name, status report)
1974159b3361Sopenharmony_ci                 * o/output file => specifies output filename
1975159b3361Sopenharmony_ci                 * O             => stdout
1976159b3361Sopenharmony_ci                 * i/input file  => specifies input filename
1977159b3361Sopenharmony_ci                 * I             => stdin
1978159b3361Sopenharmony_ci                 */
1979159b3361Sopenharmony_ci                T_ELIF("quiet")
1980159b3361Sopenharmony_ci                    global_ui_config.silent = 10; /* on a scale from 1 to 10 be very silent */
1981159b3361Sopenharmony_ci
1982159b3361Sopenharmony_ci                T_ELIF("silent")
1983159b3361Sopenharmony_ci                    global_ui_config.silent = 9;
1984159b3361Sopenharmony_ci
1985159b3361Sopenharmony_ci                T_ELIF("brief")
1986159b3361Sopenharmony_ci                    global_ui_config.silent = -5; /* print few info on screen */
1987159b3361Sopenharmony_ci
1988159b3361Sopenharmony_ci                T_ELIF("verbose")
1989159b3361Sopenharmony_ci                    global_ui_config.silent = -10; /* print a lot on screen */
1990159b3361Sopenharmony_ci
1991159b3361Sopenharmony_ci                T_ELIF2("version", "license")
1992159b3361Sopenharmony_ci                    print_license(stdout);
1993159b3361Sopenharmony_ci                return -2;
1994159b3361Sopenharmony_ci
1995159b3361Sopenharmony_ci                T_ELIF2("help", "usage")
1996159b3361Sopenharmony_ci                    if (0 == local_strncasecmp(nextArg, "id3", 3)) {
1997159b3361Sopenharmony_ci                        help_id3tag(stdout);
1998159b3361Sopenharmony_ci                    }
1999159b3361Sopenharmony_ci                    else if (0 == local_strncasecmp(nextArg, "dev", 3)) {
2000159b3361Sopenharmony_ci                        help_developer_switches(stdout);
2001159b3361Sopenharmony_ci                    }
2002159b3361Sopenharmony_ci                    else {
2003159b3361Sopenharmony_ci                        short_help(gfp, stdout, ProgramName);
2004159b3361Sopenharmony_ci                    }
2005159b3361Sopenharmony_ci                return -2;
2006159b3361Sopenharmony_ci
2007159b3361Sopenharmony_ci                T_ELIF("longhelp")
2008159b3361Sopenharmony_ci                    long_help(gfp, stdout, ProgramName, 0 /* lessmode=NO */ );
2009159b3361Sopenharmony_ci                return -2;
2010159b3361Sopenharmony_ci
2011159b3361Sopenharmony_ci                T_ELIF("?")
2012159b3361Sopenharmony_ci#ifdef __unix__
2013159b3361Sopenharmony_ci                    FILE   *fp = popen("less -Mqc", "w");
2014159b3361Sopenharmony_ci                    long_help(gfp, fp, ProgramName, 0 /* lessmode=NO */ );
2015159b3361Sopenharmony_ci                    pclose(fp);
2016159b3361Sopenharmony_ci#else
2017159b3361Sopenharmony_ci                    long_help(gfp, stdout, ProgramName, 1 /* lessmode=YES */ );
2018159b3361Sopenharmony_ci#endif
2019159b3361Sopenharmony_ci                return -2;
2020159b3361Sopenharmony_ci
2021159b3361Sopenharmony_ci                T_ELIF2("preset", "alt-preset")
2022159b3361Sopenharmony_ci                    argUsed = 1;
2023159b3361Sopenharmony_ci                {
2024159b3361Sopenharmony_ci                    int     fast = 0, cbr = 0;
2025159b3361Sopenharmony_ci
2026159b3361Sopenharmony_ci                    while ((strcmp(nextArg, "fast") == 0) || (strcmp(nextArg, "cbr") == 0)) {
2027159b3361Sopenharmony_ci
2028159b3361Sopenharmony_ci                        if ((strcmp(nextArg, "fast") == 0) && (fast < 1))
2029159b3361Sopenharmony_ci                            fast = 1;
2030159b3361Sopenharmony_ci                        if ((strcmp(nextArg, "cbr") == 0) && (cbr < 1))
2031159b3361Sopenharmony_ci                            cbr = 1;
2032159b3361Sopenharmony_ci
2033159b3361Sopenharmony_ci                        argUsed++;
2034159b3361Sopenharmony_ci                        nextArg = i + argUsed < argc ? argv[i + argUsed] : "";
2035159b3361Sopenharmony_ci                    }
2036159b3361Sopenharmony_ci
2037159b3361Sopenharmony_ci                    if (presets_set(gfp, fast, cbr, nextArg, ProgramName) < 0)
2038159b3361Sopenharmony_ci                        return -1;
2039159b3361Sopenharmony_ci                }
2040159b3361Sopenharmony_ci
2041159b3361Sopenharmony_ci                T_ELIF("disptime")
2042159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2043159b3361Sopenharmony_ci                    if (argUsed)
2044159b3361Sopenharmony_ci                        global_ui_config.update_interval = (float) double_value;
2045159b3361Sopenharmony_ci
2046159b3361Sopenharmony_ci                T_ELIF("nogaptags")
2047159b3361Sopenharmony_ci                    nogap_tags = 1;
2048159b3361Sopenharmony_ci
2049159b3361Sopenharmony_ci                T_ELIF("nogapout")
2050159b3361Sopenharmony_ci                    int const arg_n = strnlen(nextArg, PATH_MAX);
2051159b3361Sopenharmony_ci                    if (arg_n >= PATH_MAX) {
2052159b3361Sopenharmony_ci                        error_printf("%s: %s argument length (%d) exceeds limit (%d)\n", ProgramName, token, arg_n, PATH_MAX);
2053159b3361Sopenharmony_ci                        return -1;
2054159b3361Sopenharmony_ci                    }
2055159b3361Sopenharmony_ci                    strncpy(outPath, nextArg, PATH_MAX);
2056159b3361Sopenharmony_ci                    outPath[PATH_MAX] = '\0';
2057159b3361Sopenharmony_ci                    argUsed = 1;
2058159b3361Sopenharmony_ci
2059159b3361Sopenharmony_ci                T_ELIF("out-dir")
2060159b3361Sopenharmony_ci                    int const arg_n = strnlen(nextArg, PATH_MAX);
2061159b3361Sopenharmony_ci                    if (arg_n >= PATH_MAX) {
2062159b3361Sopenharmony_ci                        error_printf("%s: %s argument length (%d) exceeds limit (%d)\n", ProgramName, token, arg_n, PATH_MAX);
2063159b3361Sopenharmony_ci                        return -1;
2064159b3361Sopenharmony_ci                    }
2065159b3361Sopenharmony_ci                    strncpy(outDir, nextArg, PATH_MAX);
2066159b3361Sopenharmony_ci                    outDir[PATH_MAX] = '\0';
2067159b3361Sopenharmony_ci                    argUsed = 1;
2068159b3361Sopenharmony_ci
2069159b3361Sopenharmony_ci                T_ELIF("nogap")
2070159b3361Sopenharmony_ci                    nogap = 1;
2071159b3361Sopenharmony_ci
2072159b3361Sopenharmony_ci                T_ELIF("swap-channel")
2073159b3361Sopenharmony_ci                    global_reader.swap_channel = 1;
2074159b3361Sopenharmony_ci
2075159b3361Sopenharmony_ci                T_ELIF("ignorelength")
2076159b3361Sopenharmony_ci                    global_reader.ignorewavlength = 1;
2077159b3361Sopenharmony_ci
2078159b3361Sopenharmony_ci                T_ELIF ("athaa-sensitivity")
2079159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2080159b3361Sopenharmony_ci                    if (argUsed)
2081159b3361Sopenharmony_ci                        lame_set_athaa_sensitivity(gfp, (float) double_value);
2082159b3361Sopenharmony_ci
2083159b3361Sopenharmony_ci                /* ---------------- lots of dead switches ---------------- */
2084159b3361Sopenharmony_ci
2085159b3361Sopenharmony_ci                T_ELIF_INTERNAL("noshort")
2086159b3361Sopenharmony_ci                    (void) lame_set_no_short_blocks(gfp, 1);
2087159b3361Sopenharmony_ci
2088159b3361Sopenharmony_ci                T_ELIF_INTERNAL("short")
2089159b3361Sopenharmony_ci                    (void) lame_set_no_short_blocks(gfp, 0);
2090159b3361Sopenharmony_ci
2091159b3361Sopenharmony_ci                T_ELIF_INTERNAL("allshort")
2092159b3361Sopenharmony_ci                    (void) lame_set_force_short_blocks(gfp, 1);
2093159b3361Sopenharmony_ci
2094159b3361Sopenharmony_ci                T_ELIF_INTERNAL("notemp")
2095159b3361Sopenharmony_ci                    (void) lame_set_useTemporal(gfp, 0);
2096159b3361Sopenharmony_ci
2097159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("interch")
2098159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2099159b3361Sopenharmony_ci                    if (argUsed)
2100159b3361Sopenharmony_ci                        (void) lame_set_interChRatio(gfp, (float) double_value);
2101159b3361Sopenharmony_ci
2102159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("temporal-masking")
2103159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
2104159b3361Sopenharmony_ci                    if (argUsed)
2105159b3361Sopenharmony_ci                        (void) lame_set_useTemporal(gfp, int_value ? 1 : 0);
2106159b3361Sopenharmony_ci
2107159b3361Sopenharmony_ci                T_ELIF_INTERNAL("nspsytune")
2108159b3361Sopenharmony_ci                    ;
2109159b3361Sopenharmony_ci
2110159b3361Sopenharmony_ci                T_ELIF_INTERNAL("nssafejoint")
2111159b3361Sopenharmony_ci                    lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2);
2112159b3361Sopenharmony_ci
2113159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("nsmsfix")
2114159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2115159b3361Sopenharmony_ci                    if (argUsed)
2116159b3361Sopenharmony_ci                        (void) lame_set_msfix(gfp, double_value);
2117159b3361Sopenharmony_ci
2118159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("ns-bass")
2119159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2120159b3361Sopenharmony_ci                    if (argUsed) {
2121159b3361Sopenharmony_ci                        int     k = (int) (double_value * 4);
2122159b3361Sopenharmony_ci                        if (k < -32)
2123159b3361Sopenharmony_ci                            k = -32;
2124159b3361Sopenharmony_ci                        if (k > 31)
2125159b3361Sopenharmony_ci                            k = 31;
2126159b3361Sopenharmony_ci                        if (k < 0)
2127159b3361Sopenharmony_ci                            k += 64;
2128159b3361Sopenharmony_ci                        lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 2));
2129159b3361Sopenharmony_ci                    }
2130159b3361Sopenharmony_ci
2131159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("ns-alto")
2132159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2133159b3361Sopenharmony_ci                    if (argUsed) {
2134159b3361Sopenharmony_ci                        int     k = (int) (double_value * 4);
2135159b3361Sopenharmony_ci                        if (k < -32)
2136159b3361Sopenharmony_ci                            k = -32;
2137159b3361Sopenharmony_ci                        if (k > 31)
2138159b3361Sopenharmony_ci                            k = 31;
2139159b3361Sopenharmony_ci                        if (k < 0)
2140159b3361Sopenharmony_ci                            k += 64;
2141159b3361Sopenharmony_ci                        lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 8));
2142159b3361Sopenharmony_ci                    }
2143159b3361Sopenharmony_ci
2144159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("ns-treble")
2145159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2146159b3361Sopenharmony_ci                    if (argUsed) {
2147159b3361Sopenharmony_ci                        int     k = (int) (double_value * 4);
2148159b3361Sopenharmony_ci                        if (k < -32)
2149159b3361Sopenharmony_ci                            k = -32;
2150159b3361Sopenharmony_ci                        if (k > 31)
2151159b3361Sopenharmony_ci                            k = 31;
2152159b3361Sopenharmony_ci                        if (k < 0)
2153159b3361Sopenharmony_ci                            k += 64;
2154159b3361Sopenharmony_ci                        lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 14));
2155159b3361Sopenharmony_ci                    }
2156159b3361Sopenharmony_ci
2157159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("ns-sfb21")
2158159b3361Sopenharmony_ci                    /*  to be compatible with Naoki's original code,
2159159b3361Sopenharmony_ci                     *  ns-sfb21 specifies how to change ns-treble for sfb21 */
2160159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2161159b3361Sopenharmony_ci                    if (argUsed) {
2162159b3361Sopenharmony_ci                        int     k = (int) (double_value * 4);
2163159b3361Sopenharmony_ci                        if (k < -32)
2164159b3361Sopenharmony_ci                            k = -32;
2165159b3361Sopenharmony_ci                        if (k > 31)
2166159b3361Sopenharmony_ci                            k = 31;
2167159b3361Sopenharmony_ci                        if (k < 0)
2168159b3361Sopenharmony_ci                            k += 64;
2169159b3361Sopenharmony_ci                        lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 20));
2170159b3361Sopenharmony_ci                    }
2171159b3361Sopenharmony_ci
2172159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("tune") /*without helptext */
2173159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2174159b3361Sopenharmony_ci                    if (argUsed)
2175159b3361Sopenharmony_ci                        lame_set_tune(gfp, (float) double_value);
2176159b3361Sopenharmony_ci
2177159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("shortthreshold")
2178159b3361Sopenharmony_ci                {
2179159b3361Sopenharmony_ci                    float   x, y;
2180159b3361Sopenharmony_ci                    int     n = sscanf(nextArg, "%f,%f", &x, &y);
2181159b3361Sopenharmony_ci                    if (n == 1) {
2182159b3361Sopenharmony_ci                        y = x;
2183159b3361Sopenharmony_ci                    }
2184159b3361Sopenharmony_ci                    (void) lame_set_short_threshold(gfp, x, y);
2185159b3361Sopenharmony_ci                }
2186159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("maskingadjust") /*without helptext */
2187159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2188159b3361Sopenharmony_ci                    if (argUsed)
2189159b3361Sopenharmony_ci                        (void) lame_set_maskingadjust(gfp, (float) double_value);
2190159b3361Sopenharmony_ci
2191159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("maskingadjustshort") /*without helptext */
2192159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2193159b3361Sopenharmony_ci                    if (argUsed)
2194159b3361Sopenharmony_ci                        (void) lame_set_maskingadjust_short(gfp, (float) double_value);
2195159b3361Sopenharmony_ci
2196159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("athcurve") /*without helptext */
2197159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2198159b3361Sopenharmony_ci                    if (argUsed)
2199159b3361Sopenharmony_ci                        (void) lame_set_ATHcurve(gfp, (float) double_value);
2200159b3361Sopenharmony_ci
2201159b3361Sopenharmony_ci                T_ELIF_INTERNAL("no-preset-tune") /*without helptext */
2202159b3361Sopenharmony_ci                    (void) lame_set_preset_notune(gfp, 0);
2203159b3361Sopenharmony_ci
2204159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("substep")
2205159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
2206159b3361Sopenharmony_ci                    if (argUsed)
2207159b3361Sopenharmony_ci                        (void) lame_set_substep(gfp, int_value);
2208159b3361Sopenharmony_ci
2209159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("sbgain") /*without helptext */
2210159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
2211159b3361Sopenharmony_ci                    if (argUsed)
2212159b3361Sopenharmony_ci                        (void) lame_set_subblock_gain(gfp, int_value);
2213159b3361Sopenharmony_ci
2214159b3361Sopenharmony_ci                T_ELIF_INTERNAL("sfscale") /*without helptext */
2215159b3361Sopenharmony_ci                    (void) lame_set_sfscale(gfp, 1);
2216159b3361Sopenharmony_ci
2217159b3361Sopenharmony_ci                T_ELIF_INTERNAL("noath")
2218159b3361Sopenharmony_ci                    (void) lame_set_noATH(gfp, 1);
2219159b3361Sopenharmony_ci
2220159b3361Sopenharmony_ci                T_ELIF_INTERNAL("athonly")
2221159b3361Sopenharmony_ci                    (void) lame_set_ATHonly(gfp, 1);
2222159b3361Sopenharmony_ci
2223159b3361Sopenharmony_ci                T_ELIF_INTERNAL("athshort")
2224159b3361Sopenharmony_ci                    (void) lame_set_ATHshort(gfp, 1);
2225159b3361Sopenharmony_ci
2226159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("athlower")
2227159b3361Sopenharmony_ci                    argUsed = getDoubleValue(token, nextArg, &double_value);
2228159b3361Sopenharmony_ci                    if (argUsed)
2229159b3361Sopenharmony_ci                        (void) lame_set_ATHlower(gfp, (float) double_value);
2230159b3361Sopenharmony_ci
2231159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("athtype")
2232159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
2233159b3361Sopenharmony_ci                    if (argUsed)
2234159b3361Sopenharmony_ci                        (void) lame_set_ATHtype(gfp, int_value);
2235159b3361Sopenharmony_ci
2236159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("athaa-type") /*  switch for developing, no DOCU */
2237159b3361Sopenharmony_ci                    /* once was 1:Gaby, 2:Robert, 3:Jon, else:off */
2238159b3361Sopenharmony_ci                    argUsed = getIntValue(token, nextArg, &int_value);
2239159b3361Sopenharmony_ci                    if (argUsed)
2240159b3361Sopenharmony_ci                        (void) lame_set_athaa_type(gfp, int_value); /* now: 0:off else:Jon */
2241159b3361Sopenharmony_ci
2242159b3361Sopenharmony_ci                T_ELIF_INTERNAL_WITH_ARG("debug-file") /* switch for developing, no DOCU */
2243159b3361Sopenharmony_ci                    /* file name to print debug info into */
2244159b3361Sopenharmony_ci                    set_debug_file(nextArg);
2245159b3361Sopenharmony_ci
2246159b3361Sopenharmony_ci                T_ELSE {
2247159b3361Sopenharmony_ci                    if (!argIgnored) {
2248159b3361Sopenharmony_ci                        error_printf("%s: unrecognized option --%s\n", ProgramName, token);
2249159b3361Sopenharmony_ci                        return -1;
2250159b3361Sopenharmony_ci                    }
2251159b3361Sopenharmony_ci                    argIgnored = 0;
2252159b3361Sopenharmony_ci                }
2253159b3361Sopenharmony_ci                T_END   i += argUsed;
2254159b3361Sopenharmony_ci
2255159b3361Sopenharmony_ci            }
2256159b3361Sopenharmony_ci            else {
2257159b3361Sopenharmony_ci                char    c;
2258159b3361Sopenharmony_ci                while ((c = *token++) != '\0') {
2259159b3361Sopenharmony_ci                    double double_value = 0;
2260159b3361Sopenharmony_ci                    int int_value = 0;
2261159b3361Sopenharmony_ci                    char const *arg = *token ? token : nextArg;
2262159b3361Sopenharmony_ci                    switch (c) {
2263159b3361Sopenharmony_ci                    case 'm':
2264159b3361Sopenharmony_ci                        argUsed = 1;
2265159b3361Sopenharmony_ci
2266159b3361Sopenharmony_ci                        switch (*arg) {
2267159b3361Sopenharmony_ci                        case 's':
2268159b3361Sopenharmony_ci                            (void) lame_set_mode(gfp, STEREO);
2269159b3361Sopenharmony_ci                            break;
2270159b3361Sopenharmony_ci                        case 'd':
2271159b3361Sopenharmony_ci                            (void) lame_set_mode(gfp, DUAL_CHANNEL);
2272159b3361Sopenharmony_ci                            break;
2273159b3361Sopenharmony_ci                        case 'f':
2274159b3361Sopenharmony_ci                            lame_set_force_ms(gfp, 1);
2275159b3361Sopenharmony_ci                            (void) lame_set_mode(gfp, JOINT_STEREO);
2276159b3361Sopenharmony_ci                            break;
2277159b3361Sopenharmony_ci                        case 'j':
2278159b3361Sopenharmony_ci                            lame_set_force_ms(gfp, 0);
2279159b3361Sopenharmony_ci                            (void) lame_set_mode(gfp, JOINT_STEREO);
2280159b3361Sopenharmony_ci                            break;
2281159b3361Sopenharmony_ci                        case 'm':
2282159b3361Sopenharmony_ci                            (void) lame_set_mode(gfp, MONO);
2283159b3361Sopenharmony_ci                            break;
2284159b3361Sopenharmony_ci                        case 'l':
2285159b3361Sopenharmony_ci                            (void) lame_set_mode(gfp, MONO);
2286159b3361Sopenharmony_ci                            (void) lame_set_scale_left(gfp, 2);
2287159b3361Sopenharmony_ci                            (void) lame_set_scale_right(gfp, 0);
2288159b3361Sopenharmony_ci                            break;
2289159b3361Sopenharmony_ci                        case 'r':
2290159b3361Sopenharmony_ci                            (void) lame_set_mode(gfp, MONO);
2291159b3361Sopenharmony_ci                            (void) lame_set_scale_left(gfp, 0);
2292159b3361Sopenharmony_ci                            (void) lame_set_scale_right(gfp, 2);
2293159b3361Sopenharmony_ci                            break;
2294159b3361Sopenharmony_ci                        case 'a': /* same as 'j' ??? */
2295159b3361Sopenharmony_ci                            lame_set_force_ms(gfp, 0);
2296159b3361Sopenharmony_ci                            (void) lame_set_mode(gfp, JOINT_STEREO);
2297159b3361Sopenharmony_ci                            break;
2298159b3361Sopenharmony_ci                        default:
2299159b3361Sopenharmony_ci                            error_printf("%s: -m mode must be s/d/f/j/m/l/r not %s\n", ProgramName,
2300159b3361Sopenharmony_ci                                         arg);
2301159b3361Sopenharmony_ci                            return -1;
2302159b3361Sopenharmony_ci                        }
2303159b3361Sopenharmony_ci                        break;
2304159b3361Sopenharmony_ci
2305159b3361Sopenharmony_ci                    case 'V':
2306159b3361Sopenharmony_ci                        argUsed = getDoubleValue("V", arg, &double_value);
2307159b3361Sopenharmony_ci                        if (argUsed) {
2308159b3361Sopenharmony_ci                            /* to change VBR default look in lame.h */
2309159b3361Sopenharmony_ci                            if (lame_get_VBR(gfp) == vbr_off)
2310159b3361Sopenharmony_ci                                lame_set_VBR(gfp, vbr_default);
2311159b3361Sopenharmony_ci                            lame_set_VBR_quality(gfp, (float) double_value);
2312159b3361Sopenharmony_ci                        }
2313159b3361Sopenharmony_ci                        break;
2314159b3361Sopenharmony_ci                    case 'v':
2315159b3361Sopenharmony_ci                        /* to change VBR default look in lame.h */
2316159b3361Sopenharmony_ci                        if (lame_get_VBR(gfp) == vbr_off)
2317159b3361Sopenharmony_ci                            lame_set_VBR(gfp, vbr_default);
2318159b3361Sopenharmony_ci                        break;
2319159b3361Sopenharmony_ci
2320159b3361Sopenharmony_ci                    case 'q':
2321159b3361Sopenharmony_ci                        argUsed = getIntValue("q", arg, &int_value);
2322159b3361Sopenharmony_ci                        if (argUsed)
2323159b3361Sopenharmony_ci                            (void) lame_set_quality(gfp, int_value);
2324159b3361Sopenharmony_ci                        break;
2325159b3361Sopenharmony_ci                    case 'f':
2326159b3361Sopenharmony_ci                        (void) lame_set_quality(gfp, 7);
2327159b3361Sopenharmony_ci                        break;
2328159b3361Sopenharmony_ci                    case 'h':
2329159b3361Sopenharmony_ci                        (void) lame_set_quality(gfp, 2);
2330159b3361Sopenharmony_ci                        break;
2331159b3361Sopenharmony_ci
2332159b3361Sopenharmony_ci                    case 's':
2333159b3361Sopenharmony_ci                        argUsed = getDoubleValue("s", arg, &double_value);
2334159b3361Sopenharmony_ci                        if (argUsed) {
2335159b3361Sopenharmony_ci                            double_value = (int) (double_value * (double_value <= 192 ? 1.e3 : 1.e0) + 0.5);
2336159b3361Sopenharmony_ci                            global_reader.input_samplerate = (int)double_value;
2337159b3361Sopenharmony_ci                            (void) lame_set_in_samplerate(gfp, (int)double_value);
2338159b3361Sopenharmony_ci                        }
2339159b3361Sopenharmony_ci                        break;
2340159b3361Sopenharmony_ci                    case 'b':
2341159b3361Sopenharmony_ci                        argUsed = getIntValue("b", arg, &int_value);
2342159b3361Sopenharmony_ci                        if (argUsed) {
2343159b3361Sopenharmony_ci                            lame_set_brate(gfp, int_value);
2344159b3361Sopenharmony_ci                            lame_set_VBR_min_bitrate_kbps(gfp, lame_get_brate(gfp));
2345159b3361Sopenharmony_ci                        }
2346159b3361Sopenharmony_ci                        break;
2347159b3361Sopenharmony_ci                    case 'B':
2348159b3361Sopenharmony_ci                        argUsed = getIntValue("B", arg, &int_value);
2349159b3361Sopenharmony_ci                        if (argUsed) {
2350159b3361Sopenharmony_ci                            lame_set_VBR_max_bitrate_kbps(gfp, int_value);
2351159b3361Sopenharmony_ci                        }
2352159b3361Sopenharmony_ci                        break;
2353159b3361Sopenharmony_ci                    case 'F':
2354159b3361Sopenharmony_ci                        lame_set_VBR_hard_min(gfp, 1);
2355159b3361Sopenharmony_ci                        break;
2356159b3361Sopenharmony_ci                    case 't': /* dont write VBR tag */
2357159b3361Sopenharmony_ci                        (void) lame_set_bWriteVbrTag(gfp, 0);
2358159b3361Sopenharmony_ci                        global_decoder.disable_wav_header = 1;
2359159b3361Sopenharmony_ci                        break;
2360159b3361Sopenharmony_ci                    case 'T': /* do write VBR tag */
2361159b3361Sopenharmony_ci                        (void) lame_set_bWriteVbrTag(gfp, 1);
2362159b3361Sopenharmony_ci                        nogap_tags = 1;
2363159b3361Sopenharmony_ci                        global_decoder.disable_wav_header = 0;
2364159b3361Sopenharmony_ci                        break;
2365159b3361Sopenharmony_ci                    case 'r': /* force raw pcm input file */
2366159b3361Sopenharmony_ci#if defined(LIBSNDFILE)
2367159b3361Sopenharmony_ci                        error_printf
2368159b3361Sopenharmony_ci                            ("WARNING: libsndfile may ignore -r and perform fseek's on the input.\n"
2369159b3361Sopenharmony_ci                             "Compile without libsndfile if this is a problem.\n");
2370159b3361Sopenharmony_ci#endif
2371159b3361Sopenharmony_ci                        global_reader.input_format = sf_raw;
2372159b3361Sopenharmony_ci                        break;
2373159b3361Sopenharmony_ci                    case 'x': /* force byte swapping */
2374159b3361Sopenharmony_ci                        global_reader.swapbytes = 1;
2375159b3361Sopenharmony_ci                        break;
2376159b3361Sopenharmony_ci                    case 'p': /* (jo) error_protection: add crc16 information to stream */
2377159b3361Sopenharmony_ci                        lame_set_error_protection(gfp, 1);
2378159b3361Sopenharmony_ci                        break;
2379159b3361Sopenharmony_ci                    case 'a': /* autoconvert input file from stereo to mono - for mono mp3 encoding */
2380159b3361Sopenharmony_ci                        autoconvert = 1;
2381159b3361Sopenharmony_ci                        (void) lame_set_mode(gfp, MONO);
2382159b3361Sopenharmony_ci                        break;
2383159b3361Sopenharmony_ci                    case 'd':   /*(void) lame_set_allow_diff_short( gfp, 1 ); */
2384159b3361Sopenharmony_ci                    case 'k':   /*lame_set_lowpassfreq(gfp, -1);
2385159b3361Sopenharmony_ci                                  lame_set_highpassfreq(gfp, -1); */
2386159b3361Sopenharmony_ci                        error_printf("WARNING: -%c is obsolete.\n", c);
2387159b3361Sopenharmony_ci                        break;
2388159b3361Sopenharmony_ci                    case 'S':
2389159b3361Sopenharmony_ci                        global_ui_config.silent = 5;
2390159b3361Sopenharmony_ci                        break;
2391159b3361Sopenharmony_ci                    case 'X':
2392159b3361Sopenharmony_ci                        /*  experimental switch -X:
2393159b3361Sopenharmony_ci                            the differnt types of quant compare are tough
2394159b3361Sopenharmony_ci                            to communicate to endusers, so they shouldn't
2395159b3361Sopenharmony_ci                            bother to toy around with them
2396159b3361Sopenharmony_ci                         */
2397159b3361Sopenharmony_ci                        {
2398159b3361Sopenharmony_ci                            int     x, y;
2399159b3361Sopenharmony_ci                            int     n = sscanf(arg, "%d,%d", &x, &y);
2400159b3361Sopenharmony_ci                            if (n == 1) {
2401159b3361Sopenharmony_ci                                y = x;
2402159b3361Sopenharmony_ci                            }
2403159b3361Sopenharmony_ci                            argUsed = 1;
2404159b3361Sopenharmony_ci                            if (internal_opts_enabled) {
2405159b3361Sopenharmony_ci                                lame_set_quant_comp(gfp, x);
2406159b3361Sopenharmony_ci                                lame_set_quant_comp_short(gfp, y);
2407159b3361Sopenharmony_ci                            }
2408159b3361Sopenharmony_ci                        }
2409159b3361Sopenharmony_ci                        break;
2410159b3361Sopenharmony_ci                    case 'Y':
2411159b3361Sopenharmony_ci                        lame_set_experimentalY(gfp, 1);
2412159b3361Sopenharmony_ci                        break;
2413159b3361Sopenharmony_ci                    case 'Z':
2414159b3361Sopenharmony_ci                        /*  experimental switch -Z:
2415159b3361Sopenharmony_ci                         */
2416159b3361Sopenharmony_ci                        {
2417159b3361Sopenharmony_ci                            int     n = 1;
2418159b3361Sopenharmony_ci                            argUsed = sscanf(arg, "%d", &n);
2419159b3361Sopenharmony_ci                            /*if (internal_opts_enabled)*/
2420159b3361Sopenharmony_ci                            {
2421159b3361Sopenharmony_ci                                lame_set_experimentalZ(gfp, n);
2422159b3361Sopenharmony_ci                            }
2423159b3361Sopenharmony_ci                        }
2424159b3361Sopenharmony_ci                        break;
2425159b3361Sopenharmony_ci                    case 'e':
2426159b3361Sopenharmony_ci                        argUsed = 1;
2427159b3361Sopenharmony_ci
2428159b3361Sopenharmony_ci                        switch (*arg) {
2429159b3361Sopenharmony_ci                        case 'n':
2430159b3361Sopenharmony_ci                            lame_set_emphasis(gfp, 0);
2431159b3361Sopenharmony_ci                            break;
2432159b3361Sopenharmony_ci                        case '5':
2433159b3361Sopenharmony_ci                            lame_set_emphasis(gfp, 1);
2434159b3361Sopenharmony_ci                            break;
2435159b3361Sopenharmony_ci                        case 'c':
2436159b3361Sopenharmony_ci                            lame_set_emphasis(gfp, 3);
2437159b3361Sopenharmony_ci                            break;
2438159b3361Sopenharmony_ci                        default:
2439159b3361Sopenharmony_ci                            error_printf("%s: -e emp must be n/5/c not %s\n", ProgramName, arg);
2440159b3361Sopenharmony_ci                            return -1;
2441159b3361Sopenharmony_ci                        }
2442159b3361Sopenharmony_ci                        break;
2443159b3361Sopenharmony_ci                    case 'c':
2444159b3361Sopenharmony_ci                        lame_set_copyright(gfp, 1);
2445159b3361Sopenharmony_ci                        break;
2446159b3361Sopenharmony_ci                    case 'o':
2447159b3361Sopenharmony_ci                        lame_set_original(gfp, 0);
2448159b3361Sopenharmony_ci                        break;
2449159b3361Sopenharmony_ci
2450159b3361Sopenharmony_ci                    case '?':
2451159b3361Sopenharmony_ci                        long_help(gfp, stdout, ProgramName, 0 /* LESSMODE=NO */ );
2452159b3361Sopenharmony_ci                        return -1;
2453159b3361Sopenharmony_ci
2454159b3361Sopenharmony_ci                    default:
2455159b3361Sopenharmony_ci                        error_printf("%s: unrecognized option -%c\n", ProgramName, c);
2456159b3361Sopenharmony_ci                        return -1;
2457159b3361Sopenharmony_ci                    }
2458159b3361Sopenharmony_ci                    if (argUsed) {
2459159b3361Sopenharmony_ci                        if (arg == token)
2460159b3361Sopenharmony_ci                            token = ""; /* no more from token */
2461159b3361Sopenharmony_ci                        else
2462159b3361Sopenharmony_ci                            ++i; /* skip arg we used */
2463159b3361Sopenharmony_ci                        arg = "";
2464159b3361Sopenharmony_ci                        argUsed = 0;
2465159b3361Sopenharmony_ci                    }
2466159b3361Sopenharmony_ci                }
2467159b3361Sopenharmony_ci            }
2468159b3361Sopenharmony_ci        }
2469159b3361Sopenharmony_ci        else {
2470159b3361Sopenharmony_ci            if (nogap) {
2471159b3361Sopenharmony_ci                if ((num_nogap != NULL) && (count_nogap < *num_nogap)) {
2472159b3361Sopenharmony_ci                    strncpy(nogap_inPath[count_nogap++], argv[i], PATH_MAX + 1);
2473159b3361Sopenharmony_ci                    input_file = 1;
2474159b3361Sopenharmony_ci                }
2475159b3361Sopenharmony_ci                else {
2476159b3361Sopenharmony_ci                    /* sorry, calling program did not allocate enough space */
2477159b3361Sopenharmony_ci                    error_printf
2478159b3361Sopenharmony_ci                        ("Error: 'nogap option'.  Calling program does not allow nogap option, or\n"
2479159b3361Sopenharmony_ci                         "you have exceeded maximum number of input files for the nogap option\n");
2480159b3361Sopenharmony_ci                    if (num_nogap) {
2481159b3361Sopenharmony_ci                        *num_nogap = -1;
2482159b3361Sopenharmony_ci                    }
2483159b3361Sopenharmony_ci                    return -1;
2484159b3361Sopenharmony_ci                }
2485159b3361Sopenharmony_ci            }
2486159b3361Sopenharmony_ci            else {
2487159b3361Sopenharmony_ci                /* normal options:   inputfile  [outputfile], and
2488159b3361Sopenharmony_ci                   either one can be a '-' for stdin/stdout */
2489159b3361Sopenharmony_ci                if (inPath[0] == '\0') {
2490159b3361Sopenharmony_ci                    strncpy(inPath, argv[i], PATH_MAX + 1);
2491159b3361Sopenharmony_ci                    input_file = 1;
2492159b3361Sopenharmony_ci                }
2493159b3361Sopenharmony_ci                else {
2494159b3361Sopenharmony_ci                    if (outPath[0] == '\0')
2495159b3361Sopenharmony_ci                        strncpy(outPath, argv[i], PATH_MAX + 1);
2496159b3361Sopenharmony_ci                    else {
2497159b3361Sopenharmony_ci                        error_printf("%s: excess arg %s\n", ProgramName, argv[i]);
2498159b3361Sopenharmony_ci                        return -1;
2499159b3361Sopenharmony_ci                    }
2500159b3361Sopenharmony_ci                }
2501159b3361Sopenharmony_ci            }
2502159b3361Sopenharmony_ci        }
2503159b3361Sopenharmony_ci    }                   /* loop over args */
2504159b3361Sopenharmony_ci
2505159b3361Sopenharmony_ci    if (!input_file) {
2506159b3361Sopenharmony_ci        usage(Console_IO.Console_fp, ProgramName);
2507159b3361Sopenharmony_ci        return -1;
2508159b3361Sopenharmony_ci    }
2509159b3361Sopenharmony_ci
2510159b3361Sopenharmony_ci    if (lame_get_decode_only(gfp) && count_nogap > 0) {
2511159b3361Sopenharmony_ci        error_printf("combination of nogap and decode not supported!\n");
2512159b3361Sopenharmony_ci        return -1;
2513159b3361Sopenharmony_ci    }
2514159b3361Sopenharmony_ci
2515159b3361Sopenharmony_ci    if (inPath[0] == '-') {
2516159b3361Sopenharmony_ci        if (global_ui_config.silent == 0) { /* user didn't overrule default behaviour */
2517159b3361Sopenharmony_ci            global_ui_config.silent = 1;
2518159b3361Sopenharmony_ci        }
2519159b3361Sopenharmony_ci    }
2520159b3361Sopenharmony_ci#ifdef WIN32
2521159b3361Sopenharmony_ci    else
2522159b3361Sopenharmony_ci        dosToLongFileName(inPath);
2523159b3361Sopenharmony_ci#endif
2524159b3361Sopenharmony_ci
2525159b3361Sopenharmony_ci    if (outPath[0] == '\0') { /* no explicit output dir or file */
2526159b3361Sopenharmony_ci        if (count_nogap > 0) { /* in case of nogap encode */
2527159b3361Sopenharmony_ci            strncpy(outPath, outDir, PATH_MAX);
2528159b3361Sopenharmony_ci            outPath[PATH_MAX] = '\0'; /* whatever someone set via --out-dir <path> argument */
2529159b3361Sopenharmony_ci        }
2530159b3361Sopenharmony_ci        else if (inPath[0] == '-') {
2531159b3361Sopenharmony_ci            /* if input is stdin, default output is stdout */
2532159b3361Sopenharmony_ci            strcpy(outPath, "-");
2533159b3361Sopenharmony_ci        }
2534159b3361Sopenharmony_ci        else {
2535159b3361Sopenharmony_ci            char const* s_ext = lame_get_decode_only(gfp) ? ".wav" : ".mp3";
2536159b3361Sopenharmony_ci            if (generateOutPath(inPath, outDir, s_ext, outPath) != 0) {
2537159b3361Sopenharmony_ci                return -1;
2538159b3361Sopenharmony_ci            }
2539159b3361Sopenharmony_ci        }
2540159b3361Sopenharmony_ci    }
2541159b3361Sopenharmony_ci
2542159b3361Sopenharmony_ci    /* RG is enabled by default */
2543159b3361Sopenharmony_ci    if (!noreplaygain)
2544159b3361Sopenharmony_ci        lame_set_findReplayGain(gfp, 1);
2545159b3361Sopenharmony_ci
2546159b3361Sopenharmony_ci    /* disable VBR tags with nogap unless the VBR tags are forced */
2547159b3361Sopenharmony_ci    if (nogap && lame_get_bWriteVbrTag(gfp) && nogap_tags == 0) {
2548159b3361Sopenharmony_ci        console_printf("Note: Disabling VBR Xing/Info tag since it interferes with --nogap\n");
2549159b3361Sopenharmony_ci        lame_set_bWriteVbrTag(gfp, 0);
2550159b3361Sopenharmony_ci    }
2551159b3361Sopenharmony_ci
2552159b3361Sopenharmony_ci    /* some file options not allowed with stdout */
2553159b3361Sopenharmony_ci    if (outPath[0] == '-') {
2554159b3361Sopenharmony_ci        (void) lame_set_bWriteVbrTag(gfp, 0); /* turn off VBR tag */
2555159b3361Sopenharmony_ci    }
2556159b3361Sopenharmony_ci
2557159b3361Sopenharmony_ci    /* if user did not explicitly specify input is mp3, check file name */
2558159b3361Sopenharmony_ci    if (global_reader.input_format == sf_unknown)
2559159b3361Sopenharmony_ci        global_reader.input_format = filename_to_type(inPath);
2560159b3361Sopenharmony_ci
2561159b3361Sopenharmony_ci#if !(defined HAVE_MPGLIB || defined AMIGA_MPEGA || HAVE_MPG123)
2562159b3361Sopenharmony_ci    if (is_mpeg_file_format(global_reader.input_format)) {
2563159b3361Sopenharmony_ci        error_printf("Error: libmp3lame not compiled with mpg123 *decoding* support \n");
2564159b3361Sopenharmony_ci        return -1;
2565159b3361Sopenharmony_ci    }
2566159b3361Sopenharmony_ci#endif
2567159b3361Sopenharmony_ci
2568159b3361Sopenharmony_ci    /* default guess for number of channels */
2569159b3361Sopenharmony_ci    if (autoconvert)
2570159b3361Sopenharmony_ci        (void) lame_set_num_channels(gfp, 2);
2571159b3361Sopenharmony_ci    else if (MONO == lame_get_mode(gfp))
2572159b3361Sopenharmony_ci        (void) lame_set_num_channels(gfp, 1);
2573159b3361Sopenharmony_ci    else
2574159b3361Sopenharmony_ci        (void) lame_set_num_channels(gfp, 2);
2575159b3361Sopenharmony_ci
2576159b3361Sopenharmony_ci    if (lame_get_free_format(gfp)) {
2577159b3361Sopenharmony_ci        if (lame_get_brate(gfp) < 8 || lame_get_brate(gfp) > 640) {
2578159b3361Sopenharmony_ci            error_printf("For free format, specify a bitrate between 8 and 640 kbps\n");
2579159b3361Sopenharmony_ci            error_printf("with the -b <bitrate> option\n");
2580159b3361Sopenharmony_ci            return -1;
2581159b3361Sopenharmony_ci        }
2582159b3361Sopenharmony_ci    }
2583159b3361Sopenharmony_ci    if (num_nogap != NULL)
2584159b3361Sopenharmony_ci        *num_nogap = count_nogap;
2585159b3361Sopenharmony_ci    return 0;
2586159b3361Sopenharmony_ci}
2587159b3361Sopenharmony_ci
2588159b3361Sopenharmony_cistatic int
2589159b3361Sopenharmony_cistring_to_argv(char* str, char** argv, int N)
2590159b3361Sopenharmony_ci{
2591159b3361Sopenharmony_ci    int     argc = 0;
2592159b3361Sopenharmony_ci    if (str == 0) return argc;
2593159b3361Sopenharmony_ci    argv[argc++] = "lhama";
2594159b3361Sopenharmony_ci    for (;;) {
2595159b3361Sopenharmony_ci        int     quoted = 0;
2596159b3361Sopenharmony_ci        while (isspace(*str)) { /* skip blanks */
2597159b3361Sopenharmony_ci            ++str;
2598159b3361Sopenharmony_ci        }
2599159b3361Sopenharmony_ci        if (*str == '\"') { /* is quoted argument ? */
2600159b3361Sopenharmony_ci            quoted = 1;
2601159b3361Sopenharmony_ci            ++str;
2602159b3361Sopenharmony_ci        }
2603159b3361Sopenharmony_ci        if (*str == '\0') { /* end of string reached */
2604159b3361Sopenharmony_ci            break;
2605159b3361Sopenharmony_ci        }
2606159b3361Sopenharmony_ci        /* found beginning of some argument */
2607159b3361Sopenharmony_ci        if (argc < N) {
2608159b3361Sopenharmony_ci            argv[argc++] = str;
2609159b3361Sopenharmony_ci        }
2610159b3361Sopenharmony_ci        /* look out for end of argument, either end of string, blank or quote */
2611159b3361Sopenharmony_ci        for(; *str != '\0'; ++str) {
2612159b3361Sopenharmony_ci            if (quoted) {
2613159b3361Sopenharmony_ci                if (*str == '\"') { /* end of quotation reached */
2614159b3361Sopenharmony_ci                    *str++ = '\0';
2615159b3361Sopenharmony_ci                    break;
2616159b3361Sopenharmony_ci                }
2617159b3361Sopenharmony_ci            }
2618159b3361Sopenharmony_ci            else {
2619159b3361Sopenharmony_ci                if (isspace(*str)) { /* parameter separator reached */
2620159b3361Sopenharmony_ci                    *str++ = '\0';
2621159b3361Sopenharmony_ci                    break;
2622159b3361Sopenharmony_ci                }
2623159b3361Sopenharmony_ci            }
2624159b3361Sopenharmony_ci        }
2625159b3361Sopenharmony_ci    }
2626159b3361Sopenharmony_ci    return argc;
2627159b3361Sopenharmony_ci}
2628159b3361Sopenharmony_ci
2629159b3361Sopenharmony_cistatic int
2630159b3361Sopenharmony_cimerge_argv(int argc, char** argv, int str_argc, char** str_argv, int N)
2631159b3361Sopenharmony_ci{
2632159b3361Sopenharmony_ci    int     i;
2633159b3361Sopenharmony_ci    if (argc > 0) {
2634159b3361Sopenharmony_ci        str_argv[0] = argv[0];
2635159b3361Sopenharmony_ci        if (str_argc < 1) str_argc = 1;
2636159b3361Sopenharmony_ci    }
2637159b3361Sopenharmony_ci    for (i = 1; i < argc; ++i) {
2638159b3361Sopenharmony_ci        int     j = str_argc + i - 1;
2639159b3361Sopenharmony_ci        if (j < N) {
2640159b3361Sopenharmony_ci            str_argv[j] = argv[i];
2641159b3361Sopenharmony_ci        }
2642159b3361Sopenharmony_ci    }
2643159b3361Sopenharmony_ci    return argc + str_argc - 1;
2644159b3361Sopenharmony_ci}
2645159b3361Sopenharmony_ci
2646159b3361Sopenharmony_ci#ifdef DEBUG
2647159b3361Sopenharmony_cistatic void
2648159b3361Sopenharmony_cidump_argv(int argc, char** argv)
2649159b3361Sopenharmony_ci{
2650159b3361Sopenharmony_ci    int     i;
2651159b3361Sopenharmony_ci    for (i = 0; i < argc; ++i) {
2652159b3361Sopenharmony_ci        printf("%d: \"%s\"\n",i,argv[i]);
2653159b3361Sopenharmony_ci    }
2654159b3361Sopenharmony_ci}
2655159b3361Sopenharmony_ci#endif
2656159b3361Sopenharmony_ci
2657159b3361Sopenharmony_ci
2658159b3361Sopenharmony_ciint parse_args(lame_t gfp, int argc, char **argv, char *const inPath, char *const outPath, char **nogap_inPath, int *num_nogap)
2659159b3361Sopenharmony_ci{
2660159b3361Sopenharmony_ci    char   *str_argv[512], *str;
2661159b3361Sopenharmony_ci    int     str_argc, ret;
2662159b3361Sopenharmony_ci    str = lame_getenv("LAMEOPT");
2663159b3361Sopenharmony_ci    str_argc = string_to_argv(str, str_argv, dimension_of(str_argv));
2664159b3361Sopenharmony_ci    str_argc = merge_argv(argc, argv, str_argc, str_argv, dimension_of(str_argv));
2665159b3361Sopenharmony_ci#ifdef DEBUG
2666159b3361Sopenharmony_ci    dump_argv(str_argc, str_argv);
2667159b3361Sopenharmony_ci#endif
2668159b3361Sopenharmony_ci    ret = parse_args_(gfp, str_argc, str_argv, inPath, outPath, nogap_inPath, num_nogap);
2669159b3361Sopenharmony_ci    free(str);
2670159b3361Sopenharmony_ci    return ret;
2671159b3361Sopenharmony_ci}
2672159b3361Sopenharmony_ci
2673159b3361Sopenharmony_ci/* end of parse.c */
2674