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