|
Packit |
47f805 |
/*
|
|
Packit |
47f805 |
* Command line parsing related functions
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* Copyright (c) 1999 Mark Taylor
|
|
Packit |
47f805 |
* 2000-2017 Robert Hegemann
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
47f805 |
* modify it under the terms of the GNU Library General Public
|
|
Packit |
47f805 |
* License as published by the Free Software Foundation; either
|
|
Packit |
47f805 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
47f805 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
47f805 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
47f805 |
* Library General Public License for more details.
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* You should have received a copy of the GNU Library General Public
|
|
Packit |
47f805 |
* License along with this library; if not, write to the
|
|
Packit |
47f805 |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit |
47f805 |
* Boston, MA 02111-1307, USA.
|
|
Packit |
47f805 |
*/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* $Id: parse.c,v 1.307 2017/09/26 12:25:07 robert Exp $ */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
47f805 |
# include <config.h>
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#include <assert.h>
|
|
Packit |
47f805 |
#include <ctype.h>
|
|
Packit |
47f805 |
#include <math.h>
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef STDC_HEADERS
|
|
Packit |
47f805 |
# include <stdio.h>
|
|
Packit |
47f805 |
# include <stdlib.h>
|
|
Packit |
47f805 |
# include <string.h>
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
# ifndef HAVE_STRCHR
|
|
Packit |
47f805 |
# define strchr index
|
|
Packit |
47f805 |
# define strrchr rindex
|
|
Packit |
47f805 |
# endif
|
|
Packit |
47f805 |
char *strchr(), *strrchr();
|
|
Packit |
47f805 |
# ifndef HAVE_MEMCPY
|
|
Packit |
47f805 |
# define memcpy(d, s, n) bcopy ((s), (d), (n))
|
|
Packit |
47f805 |
# define memmove(d, s, n) bcopy ((s), (d), (n))
|
|
Packit |
47f805 |
# endif
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef HAVE_LIMITS_H
|
|
Packit |
47f805 |
# include <limits.h>
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#include "lame.h"
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#include "parse.h"
|
|
Packit |
47f805 |
#include "main.h"
|
|
Packit |
47f805 |
#include "get_audio.h"
|
|
Packit |
47f805 |
#include "version.h"
|
|
Packit |
47f805 |
#include "console.h"
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#undef dimension_of
|
|
Packit |
47f805 |
#define dimension_of(array) (sizeof(array)/sizeof(array[0]))
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef WITH_DMALLOC
|
|
Packit |
47f805 |
#include <dmalloc.h>
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef HAVE_ICONV
|
|
Packit |
47f805 |
#include <iconv.h>
|
|
Packit |
47f805 |
#include <errno.h>
|
|
Packit |
47f805 |
#include <locale.h>
|
|
Packit |
47f805 |
#include <langinfo.h>
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#if defined _ALLOW_INTERNAL_OPTIONS
|
|
Packit |
47f805 |
#define INTERNAL_OPTS 1
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
#define INTERNAL_OPTS 0
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#if (INTERNAL_OPTS!=0)
|
|
Packit |
47f805 |
#include "set_get.h"
|
|
Packit |
47f805 |
#define DEV_HELP(a) a
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
#define DEV_HELP(a)
|
|
Packit |
47f805 |
#define lame_set_tune(a,b) (void)0
|
|
Packit |
47f805 |
#define lame_set_short_threshold(a,b,c) (void)0
|
|
Packit |
47f805 |
#define lame_set_maskingadjust(a,b) (void)0
|
|
Packit |
47f805 |
#define lame_set_maskingadjust_short(a,b) (void)0
|
|
Packit |
47f805 |
#define lame_set_ATHcurve(a,b) (void)0
|
|
Packit |
47f805 |
#define lame_set_preset_notune(a,b) (void)0
|
|
Packit |
47f805 |
#define lame_set_substep(a,b) (void)0
|
|
Packit |
47f805 |
#define lame_set_subblock_gain(a,b) (void)0
|
|
Packit |
47f805 |
#define lame_set_sfscale(a,b) (void)0
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int const lame_alpha_version_enabled = LAME_ALPHA_VERSION;
|
|
Packit |
47f805 |
static int const internal_opts_enabled = INTERNAL_OPTS;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* GLOBAL VARIABLES. set by parse_args() */
|
|
Packit |
47f805 |
/* we need to clean this up */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
ReaderConfig global_reader = { sf_unknown, 0, 0, 0, 0 };
|
|
Packit |
47f805 |
WriterConfig global_writer = { 0 };
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
UiConfig global_ui_config = {0,0,0,0};
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
DecoderConfig global_decoder;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
RawPCMConfig global_raw_pcm =
|
|
Packit |
47f805 |
{ /* in_bitwidth */ 16
|
|
Packit |
47f805 |
, /* in_signed */ -1
|
|
Packit |
47f805 |
, /* in_endian */ ByteOrderLittleEndian
|
|
Packit |
47f805 |
};
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* possible text encodings */
|
|
Packit |
47f805 |
typedef enum TextEncoding
|
|
Packit |
47f805 |
{ TENC_RAW /* bytes will be stored as-is into ID3 tags, which are Latin1 per definition */
|
|
Packit |
47f805 |
, TENC_LATIN1 /* text will be converted from local encoding to Latin1, as ID3 needs it */
|
|
Packit |
47f805 |
, TENC_UTF16 /* text will be converted from local encoding to Unicode, as ID3v2 wants it */
|
|
Packit |
47f805 |
} TextEncoding;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef HAVE_ICONV
|
|
Packit |
47f805 |
#define ID3TAGS_EXTENDED
|
|
Packit |
47f805 |
/* search for Zero termination in multi-byte strings */
|
|
Packit |
47f805 |
static size_t
|
|
Packit |
47f805 |
strlenMultiByte(char const* str, size_t w)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
size_t n = 0;
|
|
Packit |
47f805 |
if (str != 0) {
|
|
Packit |
47f805 |
size_t i, x = 0;
|
|
Packit |
47f805 |
for (n = 0; ; ++n) {
|
|
Packit |
47f805 |
x = 0;
|
|
Packit |
47f805 |
for (i = 0; i < w; ++i) {
|
|
Packit |
47f805 |
x += *str++ == 0 ? 1 : 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (x == w) {
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return n;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static size_t
|
|
Packit |
47f805 |
currCharCodeSize(void)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
size_t n = 1;
|
|
Packit |
47f805 |
char dst[32];
|
|
Packit |
47f805 |
char* src = "A";
|
|
Packit |
47f805 |
char* cur_code = nl_langinfo(CODESET);
|
|
Packit |
47f805 |
iconv_t xiconv = iconv_open(cur_code, "ISO_8859-1");
|
|
Packit |
47f805 |
if (xiconv != (iconv_t)-1) {
|
|
Packit |
47f805 |
for (n = 0; n < 32; ++n) {
|
|
Packit |
47f805 |
char* i_ptr = src;
|
|
Packit |
47f805 |
char* o_ptr = dst;
|
|
Packit |
47f805 |
size_t srcln = 1;
|
|
Packit |
47f805 |
size_t avail = n;
|
|
Packit |
47f805 |
size_t rc = iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
|
|
Packit |
47f805 |
if (rc != (size_t)-1) {
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
iconv_close(xiconv);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return n;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#if 0
|
|
Packit |
47f805 |
static
|
|
Packit |
47f805 |
char* fromLatin1( char* src )
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char* dst = 0;
|
|
Packit |
47f805 |
if (src != 0) {
|
|
Packit |
47f805 |
size_t const l = strlen(src);
|
|
Packit |
47f805 |
size_t const n = l*4;
|
|
Packit |
47f805 |
dst = calloc(n+4, 4);
|
|
Packit |
47f805 |
if (dst != 0) {
|
|
Packit |
47f805 |
char* cur_code = nl_langinfo(CODESET);
|
|
Packit |
47f805 |
iconv_t xiconv = iconv_open(cur_code, "ISO_8859-1");
|
|
Packit |
47f805 |
if (xiconv != (iconv_t)-1) {
|
|
Packit |
47f805 |
char* i_ptr = src;
|
|
Packit |
47f805 |
char* o_ptr = dst;
|
|
Packit |
47f805 |
size_t srcln = l;
|
|
Packit |
47f805 |
size_t avail = n;
|
|
Packit |
47f805 |
iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
|
|
Packit |
47f805 |
iconv_close(xiconv);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return dst;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static
|
|
Packit |
47f805 |
char* fromUtf16( char* src )
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char* dst = 0;
|
|
Packit |
47f805 |
if (src != 0) {
|
|
Packit |
47f805 |
size_t const l = strlenMultiByte(src, 2);
|
|
Packit |
47f805 |
size_t const n = l*4;
|
|
Packit |
47f805 |
dst = calloc(n+4, 4);
|
|
Packit |
47f805 |
if (dst != 0) {
|
|
Packit |
47f805 |
char* cur_code = nl_langinfo(CODESET);
|
|
Packit |
47f805 |
iconv_t xiconv = iconv_open(cur_code, "UTF-16LE");
|
|
Packit |
47f805 |
if (xiconv != (iconv_t)-1) {
|
|
Packit |
47f805 |
char* i_ptr = (char*)src;
|
|
Packit |
47f805 |
char* o_ptr = dst;
|
|
Packit |
47f805 |
size_t srcln = l*2;
|
|
Packit |
47f805 |
size_t avail = n;
|
|
Packit |
47f805 |
iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
|
|
Packit |
47f805 |
iconv_close(xiconv);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return dst;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static
|
|
Packit |
47f805 |
char* toLatin1( char* src )
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
size_t w = currCharCodeSize();
|
|
Packit |
47f805 |
char* dst = 0;
|
|
Packit |
47f805 |
if (src != 0) {
|
|
Packit |
47f805 |
size_t const l = strlenMultiByte(src, w);
|
|
Packit |
47f805 |
size_t const n = l*4;
|
|
Packit |
47f805 |
dst = calloc(n+4, 4);
|
|
Packit |
47f805 |
if (dst != 0) {
|
|
Packit |
47f805 |
char* cur_code = nl_langinfo(CODESET);
|
|
Packit |
47f805 |
iconv_t xiconv = iconv_open("ISO_8859-1//TRANSLIT", cur_code);
|
|
Packit |
47f805 |
if (xiconv != (iconv_t)-1) {
|
|
Packit |
47f805 |
char* i_ptr = (char*)src;
|
|
Packit |
47f805 |
char* o_ptr = dst;
|
|
Packit |
47f805 |
size_t srcln = l*w;
|
|
Packit |
47f805 |
size_t avail = n;
|
|
Packit |
47f805 |
iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
|
|
Packit |
47f805 |
iconv_close(xiconv);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return dst;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static
|
|
Packit |
47f805 |
char* toUtf16( char* src )
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
size_t w = currCharCodeSize();
|
|
Packit |
47f805 |
char* dst = 0;
|
|
Packit |
47f805 |
if (src != 0) {
|
|
Packit |
47f805 |
size_t const l = strlenMultiByte(src, w);
|
|
Packit |
47f805 |
size_t const n = (l+1)*4;
|
|
Packit |
47f805 |
dst = calloc(n+4, 4);
|
|
Packit |
47f805 |
if (dst != 0) {
|
|
Packit |
47f805 |
char* cur_code = nl_langinfo(CODESET);
|
|
Packit |
47f805 |
iconv_t xiconv = iconv_open("UTF-16LE//TRANSLIT", cur_code);
|
|
Packit |
47f805 |
dst[0] = 0xff;
|
|
Packit |
47f805 |
dst[1] = 0xfe;
|
|
Packit |
47f805 |
if (xiconv != (iconv_t)-1) {
|
|
Packit |
47f805 |
char* i_ptr = (char*)src;
|
|
Packit |
47f805 |
char* o_ptr = &dst[2];
|
|
Packit |
47f805 |
size_t srcln = l*w;
|
|
Packit |
47f805 |
size_t avail = n;
|
|
Packit |
47f805 |
iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail);
|
|
Packit |
47f805 |
iconv_close(xiconv);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return dst;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#if defined( _WIN32 ) && !defined(__MINGW32__)
|
|
Packit |
47f805 |
#define ID3TAGS_EXTENDED
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
char* toLatin1(char const* s)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
return utf8ToLatin1(s);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
unsigned short* toUtf16(char const* s)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
return utf8ToUtf16(s);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int evaluateArgument(char const* token, char const* arg, char* _EndPtr)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
if (arg != 0 && arg != _EndPtr)
|
|
Packit |
47f805 |
return 1;
|
|
Packit |
47f805 |
error_printf("WARNING: argument missing for '%s'\n", token);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int getDoubleValue(char const* token, char const* arg, double* ptr)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char *_EndPtr=0;
|
|
Packit |
47f805 |
double d = strtod(arg, &_EndPtr);
|
|
Packit |
47f805 |
if (ptr != 0) {
|
|
Packit |
47f805 |
*ptr = d;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return evaluateArgument(token, arg, _EndPtr);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int getIntValue(char const* token, char const* arg, int* ptr)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char *_EndPtr=0;
|
|
Packit |
47f805 |
long d = strtol(arg, &_EndPtr, 10);
|
|
Packit |
47f805 |
if (ptr != 0) {
|
|
Packit |
47f805 |
*ptr = d;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return evaluateArgument(token, arg, _EndPtr);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef ID3TAGS_EXTENDED
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
set_id3v2tag(lame_global_flags* gfp, int type, unsigned short const* str)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
switch (type)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
case 'a': return id3tag_set_textinfo_utf16(gfp, "TPE1", str);
|
|
Packit |
47f805 |
case 't': return id3tag_set_textinfo_utf16(gfp, "TIT2", str);
|
|
Packit |
47f805 |
case 'l': return id3tag_set_textinfo_utf16(gfp, "TALB", str);
|
|
Packit |
47f805 |
case 'g': return id3tag_set_textinfo_utf16(gfp, "TCON", str);
|
|
Packit |
47f805 |
case 'c': return id3tag_set_comment_utf16(gfp, 0, 0, str);
|
|
Packit |
47f805 |
case 'n': return id3tag_set_textinfo_utf16(gfp, "TRCK", str);
|
|
Packit |
47f805 |
case 'y': return id3tag_set_textinfo_utf16(gfp, "TYER", str);
|
|
Packit |
47f805 |
case 'v': return id3tag_set_fieldvalue_utf16(gfp, str);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
set_id3tag(lame_global_flags* gfp, int type, char const* str)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
switch (type)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
case 'a': return id3tag_set_artist(gfp, str), 0;
|
|
Packit |
47f805 |
case 't': return id3tag_set_title(gfp, str), 0;
|
|
Packit |
47f805 |
case 'l': return id3tag_set_album(gfp, str), 0;
|
|
Packit |
47f805 |
case 'g': return id3tag_set_genre(gfp, str);
|
|
Packit |
47f805 |
case 'c': return id3tag_set_comment(gfp, str), 0;
|
|
Packit |
47f805 |
case 'n': return id3tag_set_track(gfp, str);
|
|
Packit |
47f805 |
case 'y': return id3tag_set_year(gfp, str), 0;
|
|
Packit |
47f805 |
case 'v': return id3tag_set_fieldvalue(gfp, str);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
id3_tag(lame_global_flags* gfp, int type, TextEncoding enc, char* str)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
void* x = 0;
|
|
Packit |
47f805 |
int result;
|
|
Packit |
47f805 |
if (enc == TENC_UTF16 && type != 'v' ) {
|
|
Packit |
47f805 |
id3_tag(gfp, type, TENC_LATIN1, str); /* for id3v1 */
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
switch (enc)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
default:
|
|
Packit |
47f805 |
#ifdef ID3TAGS_EXTENDED
|
|
Packit |
47f805 |
case TENC_LATIN1: x = toLatin1(str); break;
|
|
Packit |
47f805 |
case TENC_UTF16: x = toUtf16(str); break;
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
case TENC_RAW: x = strdup(str); break;
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
switch (enc)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
default:
|
|
Packit |
47f805 |
#ifdef ID3TAGS_EXTENDED
|
|
Packit |
47f805 |
case TENC_LATIN1: result = set_id3tag(gfp, type, x); break;
|
|
Packit |
47f805 |
case TENC_UTF16: result = set_id3v2tag(gfp, type, x); break;
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
case TENC_RAW: result = set_id3tag(gfp, type, x); break;
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
free(x);
|
|
Packit |
47f805 |
return result;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/************************************************************************
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* license
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* PURPOSE: Writes version and license to the file specified by fp
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
************************************************************************/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
lame_version_print(FILE * const fp)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
const char *b = get_lame_os_bitness();
|
|
Packit |
47f805 |
const char *v = get_lame_version();
|
|
Packit |
47f805 |
const char *u = get_lame_url();
|
|
Packit |
47f805 |
const size_t lenb = strlen(b);
|
|
Packit |
47f805 |
const size_t lenv = strlen(v);
|
|
Packit |
47f805 |
const size_t lenu = strlen(u);
|
|
Packit |
47f805 |
const size_t lw = 80; /* line width of terminal in characters */
|
|
Packit |
47f805 |
const size_t sw = 16; /* static width of text */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (lw >= lenb + lenv + lenu + sw || lw < lenu + 2)
|
|
Packit |
47f805 |
/* text fits in 80 chars per line, or line even too small for url */
|
|
Packit |
47f805 |
if (lenb > 0)
|
|
Packit |
47f805 |
fprintf(fp, "LAME %s version %s (%s)\n\n", b, v, u);
|
|
Packit |
47f805 |
else
|
|
Packit |
47f805 |
fprintf(fp, "LAME version %s (%s)\n\n", v, u);
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
int const n_white_spaces = (int)((lenu+2) > lw ? 0 : lw-2-lenu);
|
|
Packit |
47f805 |
/* text too long, wrap url into next line, right aligned */
|
|
Packit |
47f805 |
if (lenb > 0)
|
|
Packit |
47f805 |
fprintf(fp, "LAME %s version %s\n%*s(%s)\n\n", b, v, n_white_spaces, "", u);
|
|
Packit |
47f805 |
else
|
|
Packit |
47f805 |
fprintf(fp, "LAME version %s\n%*s(%s)\n\n", v, n_white_spaces, "", u);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (lame_alpha_version_enabled)
|
|
Packit |
47f805 |
fprintf(fp, "warning: alpha versions should be used for testing only\n\n");
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
print_license(FILE * const fp)
|
|
Packit |
47f805 |
{ /* print version & license */
|
|
Packit |
47f805 |
lame_version_print(fp);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"Copyright (c) 1999-2011 by The LAME Project\n"
|
|
Packit |
47f805 |
"Copyright (c) 1999,2000,2001 by Mark Taylor\n"
|
|
Packit |
47f805 |
"Copyright (c) 1998 by Michael Cheng\n"
|
|
Packit |
47f805 |
"Copyright (c) 1995,1996,1997 by Michael Hipp: mpglib\n" "\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"This library is free software; you can redistribute it and/or\n"
|
|
Packit |
47f805 |
"modify it under the terms of the GNU Library General Public\n"
|
|
Packit |
47f805 |
"License as published by the Free Software Foundation; either\n"
|
|
Packit |
47f805 |
"version 2 of the License, or (at your option) any later version.\n"
|
|
Packit |
47f805 |
"\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"This library is distributed in the hope that it will be useful,\n"
|
|
Packit |
47f805 |
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
|
Packit |
47f805 |
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
|
|
Packit |
47f805 |
"Library General Public License for more details.\n"
|
|
Packit |
47f805 |
"\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"You should have received a copy of the GNU Library General Public\n"
|
|
Packit |
47f805 |
"License along with this program. If not, see\n"
|
|
Packit |
47f805 |
"<http://www.gnu.org/licenses/>.\n");
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/************************************************************************
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* usage
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* PURPOSE: Writes command line syntax to the file specified by fp
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
************************************************************************/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
int
|
|
Packit |
47f805 |
usage(FILE * const fp, const char *ProgramName)
|
|
Packit |
47f805 |
{ /* print general syntax */
|
|
Packit |
47f805 |
lame_version_print(fp);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"usage: %s [options] <infile> [outfile]\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
"Try:\n"
|
|
Packit |
47f805 |
" \"%s --help\" for general usage information\n"
|
|
Packit |
47f805 |
" or:\n"
|
|
Packit |
47f805 |
" \"%s --preset help\" for information on suggested predefined settings\n"
|
|
Packit |
47f805 |
" or:\n"
|
|
Packit |
47f805 |
" \"%s --longhelp\"\n"
|
|
Packit |
47f805 |
" or \"%s -?\" for a complete options list\n\n",
|
|
Packit |
47f805 |
ProgramName, ProgramName, ProgramName, ProgramName, ProgramName);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/************************************************************************
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* usage
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* PURPOSE: Writes command line syntax to the file specified by fp
|
|
Packit |
47f805 |
* but only the most important ones, to fit on a vt100 terminal
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
************************************************************************/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
int
|
|
Packit |
47f805 |
short_help(const lame_global_flags * gfp, FILE * const fp, const char *ProgramName)
|
|
Packit |
47f805 |
{ /* print short syntax help */
|
|
Packit |
47f805 |
lame_version_print(fp);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"usage: %s [options] <infile> [outfile]\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n"
|
|
Packit |
47f805 |
"\n" "RECOMMENDED:\n" " lame -V2 input.wav output.mp3\n" "\n", ProgramName);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"OPTIONS:\n"
|
|
Packit |
47f805 |
" -b bitrate set the bitrate, default 128 kbps\n"
|
|
Packit |
47f805 |
" -h higher quality, but a little slower.\n"
|
|
Packit |
47f805 |
" -f fast mode (lower quality)\n"
|
|
Packit |
47f805 |
" -V n quality setting for VBR. default n=%i\n"
|
|
Packit |
47f805 |
" 0=high quality,bigger files. 9.999=smaller files\n",
|
|
Packit |
47f805 |
lame_get_VBR_q(gfp));
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --preset type type must be \"medium\", \"standard\", \"extreme\", \"insane\",\n"
|
|
Packit |
47f805 |
" or a value for an average desired bitrate and depending\n"
|
|
Packit |
47f805 |
" on the value specified, appropriate quality settings will\n"
|
|
Packit |
47f805 |
" be used.\n"
|
|
Packit |
47f805 |
" \"--preset help\" gives more info on these\n" "\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
#if defined(WIN32)
|
|
Packit |
47f805 |
" --priority type sets the process priority\n"
|
|
Packit |
47f805 |
" 0,1 = Low priority\n"
|
|
Packit |
47f805 |
" 2 = normal priority\n"
|
|
Packit |
47f805 |
" 3,4 = High priority\n" "\n"
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
#if defined(__OS2__)
|
|
Packit |
47f805 |
" --priority type sets the process priority\n"
|
|
Packit |
47f805 |
" 0 = Low priority\n"
|
|
Packit |
47f805 |
" 1 = Medium priority\n"
|
|
Packit |
47f805 |
" 2 = Regular priority\n"
|
|
Packit |
47f805 |
" 3 = High priority\n"
|
|
Packit |
47f805 |
" 4 = Maximum priority\n" "\n"
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
" --help id3 ID3 tagging related options\n" "\n"
|
|
Packit |
47f805 |
DEV_HELP(
|
|
Packit |
47f805 |
" --help dev developer options\n" "\n"
|
|
Packit |
47f805 |
)
|
|
Packit |
47f805 |
" --longhelp full list of options\n" "\n"
|
|
Packit |
47f805 |
" --license print License information\n\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/************************************************************************
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* usage
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* PURPOSE: Writes command line syntax to the file specified by fp
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
************************************************************************/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static void
|
|
Packit |
47f805 |
wait_for(FILE * const fp, int lessmode)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
if (lessmode) {
|
|
Packit |
47f805 |
fflush(fp);
|
|
Packit |
47f805 |
getchar();
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
fprintf(fp, "\n");
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
fprintf(fp, "\n");
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static void
|
|
Packit |
47f805 |
help_id3tag(FILE * const fp)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" ID3 tag options:\n"
|
|
Packit |
47f805 |
" --tt <title> audio/song title (max 30 chars for version 1 tag)\n"
|
|
Packit |
47f805 |
" --ta <artist> audio/song artist (max 30 chars for version 1 tag)\n"
|
|
Packit |
47f805 |
" --tl <album> audio/song album (max 30 chars for version 1 tag)\n"
|
|
Packit |
47f805 |
" --ty <year> audio/song year of issue (1 to 9999)\n"
|
|
Packit |
47f805 |
" --tc <comment> user-defined text (max 30 chars for v1 tag, 28 for v1.1)\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --tn <track[/total]> audio/song track number and (optionally) the total\n"
|
|
Packit |
47f805 |
" number of tracks on the original recording. (track\n"
|
|
Packit |
47f805 |
" and total each 1 to 255. just the track number\n"
|
|
Packit |
47f805 |
" creates v1.1 tag, providing a total forces v2.0).\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --tg <genre> audio/song genre (name or number in list)\n"
|
|
Packit |
47f805 |
" --ti <file> audio/song albumArt (jpeg/png/gif file, v2.3 tag)\n"
|
|
Packit |
47f805 |
" --tv <id=value> user-defined frame specified by id and value (v2.3 tag)\n"
|
|
Packit |
47f805 |
" syntax: --tv \"TXXX=description=content\"\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --add-id3v2 force addition of version 2 tag\n"
|
|
Packit |
47f805 |
" --id3v1-only add only a version 1 tag\n"
|
|
Packit |
47f805 |
" --id3v2-only add only a version 2 tag\n"
|
|
Packit |
47f805 |
#ifdef ID3TAGS_EXTENDED
|
|
Packit |
47f805 |
" --id3v2-utf16 add following options in unicode text encoding\n"
|
|
Packit |
47f805 |
" --id3v2-latin1 add following options in latin-1 text encoding\n"
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
" --space-id3v1 pad version 1 tag with spaces instead of nulls\n"
|
|
Packit |
47f805 |
" --pad-id3v2 same as '--pad-id3v2-size 128'\n"
|
|
Packit |
47f805 |
" --pad-id3v2-size <value> adds version 2 tag, pad with extra <value> bytes\n"
|
|
Packit |
47f805 |
" --genre-list print alphabetically sorted ID3 genre list and exit\n"
|
|
Packit |
47f805 |
" --ignore-tag-errors ignore errors in values passed for tags\n" "\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" Note: A version 2 tag will NOT be added unless one of the input fields\n"
|
|
Packit |
47f805 |
" won't fit in a version 1 tag (e.g. the title string is longer than 30\n"
|
|
Packit |
47f805 |
" characters), or the '--add-id3v2' or '--id3v2-only' options are used,\n"
|
|
Packit |
47f805 |
" or output is redirected to stdout.\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static void
|
|
Packit |
47f805 |
help_developer_switches(FILE * const fp)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
if ( !internal_opts_enabled ) {
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" Note: Almost all of the following switches aren't available in this build!\n\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" ATH related:\n"
|
|
Packit |
47f805 |
" --noath turns ATH down to a flat noise floor\n"
|
|
Packit |
47f805 |
" --athshort ignore GPSYCHO for short blocks, use ATH only\n"
|
|
Packit |
47f805 |
" --athonly ignore GPSYCHO completely, use ATH only\n"
|
|
Packit |
47f805 |
" --athtype n selects between different ATH types [0-4]\n"
|
|
Packit |
47f805 |
" --athlower x lowers ATH by x dB\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --athaa-type n ATH auto adjust: 0 'no' else 'loudness based'\n"
|
|
Packit |
47f805 |
/** OBSOLETE " --athaa-loudapprox n n=1 total energy or n=2 equal loudness curve\n"*/
|
|
Packit |
47f805 |
" --athaa-sensitivity x activation offset in -/+ dB for ATH auto-adjustment\n"
|
|
Packit |
47f805 |
"\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" PSY related:\n"
|
|
Packit |
47f805 |
" --short use short blocks when appropriate\n"
|
|
Packit |
47f805 |
" --noshort do not use short blocks\n"
|
|
Packit |
47f805 |
" --allshort use only short blocks\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"(1) --temporal-masking x x=0 disables, x=1 enables temporal masking effect\n"
|
|
Packit |
47f805 |
" --nssafejoint M/S switching criterion\n"
|
|
Packit |
47f805 |
" --nsmsfix <arg> M/S switching tuning [effective 0-3.5]\n"
|
|
Packit |
47f805 |
"(2) --interch x adjust inter-channel masking ratio\n"
|
|
Packit |
47f805 |
" --ns-bass x adjust masking for sfbs 0 - 6 (long) 0 - 5 (short)\n"
|
|
Packit |
47f805 |
" --ns-alto x adjust masking for sfbs 7 - 13 (long) 6 - 10 (short)\n"
|
|
Packit |
47f805 |
" --ns-treble x adjust masking for sfbs 14 - 21 (long) 11 - 12 (short)\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --ns-sfb21 x change ns-treble by x dB for sfb21\n"
|
|
Packit |
47f805 |
" --shortthreshold x,y short block switching threshold,\n"
|
|
Packit |
47f805 |
" x for L/R/M channel, y for S channel\n"
|
|
Packit |
47f805 |
" -Z [n] always do calculate short block maskings\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" Noise Shaping related:\n"
|
|
Packit |
47f805 |
"(1) --substep n use pseudo substep noise shaping method types 0-2\n"
|
|
Packit |
47f805 |
"(1) -X n[,m] selects between different noise measurements\n"
|
|
Packit |
47f805 |
" n for long block, m for short. if m is omitted, m = n\n"
|
|
Packit |
47f805 |
" 1: CBR, ABR and VBR-old encoding modes only\n"
|
|
Packit |
47f805 |
" 2: ignored\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
int
|
|
Packit |
47f805 |
long_help(const lame_global_flags * gfp, FILE * const fp, const char *ProgramName, int lessmode)
|
|
Packit |
47f805 |
{ /* print long syntax help */
|
|
Packit |
47f805 |
lame_version_print(fp);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"usage: %s [options] <infile> [outfile]\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n"
|
|
Packit |
47f805 |
"\n" "RECOMMENDED:\n" " lame -V2 input.wav output.mp3\n" "\n", ProgramName);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"OPTIONS:\n"
|
|
Packit |
47f805 |
" Input options:\n"
|
|
Packit |
47f805 |
" --scale <arg> scale input (multiply PCM data) by <arg>\n"
|
|
Packit |
47f805 |
" --scale-l <arg> scale channel 0 (left) input (multiply PCM data) by <arg>\n"
|
|
Packit |
47f805 |
" --scale-r <arg> scale channel 1 (right) input (multiply PCM data) by <arg>\n"
|
|
Packit |
47f805 |
" --swap-channel swap L/R channels\n"
|
|
Packit |
47f805 |
" --ignorelength ignore file length in WAV header\n"
|
|
Packit |
47f805 |
" --gain <arg> apply Gain adjustment in decibels, range -20.0 to +12.0\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
#if (defined HAVE_MPGLIB || defined AMIGA_MPEGA)
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --mp1input input file is a MPEG Layer I file\n"
|
|
Packit |
47f805 |
" --mp2input input file is a MPEG Layer II file\n"
|
|
Packit |
47f805 |
" --mp3input input file is a MPEG Layer III file\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --nogap <file1> <file2> <...>\n"
|
|
Packit |
47f805 |
" gapless encoding for a set of contiguous files\n"
|
|
Packit |
47f805 |
" --nogapout <dir>\n"
|
|
Packit |
47f805 |
" output dir for gapless encoding (must precede --nogap)\n"
|
|
Packit |
47f805 |
" --nogaptags allow the use of VBR tags in gapless encoding\n"
|
|
Packit |
47f805 |
" --out-dir <dir> output dir, must exist\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" Input options for RAW PCM:\n"
|
|
Packit |
47f805 |
" -r input is raw pcm\n"
|
|
Packit |
47f805 |
" -s sfreq sampling frequency of input file (kHz) - default 44.1 kHz\n"
|
|
Packit |
47f805 |
" --signed input is signed (default)\n"
|
|
Packit |
47f805 |
" --unsigned input is unsigned\n"
|
|
Packit |
47f805 |
" --bitwidth w input bit width is w (default 16)\n"
|
|
Packit |
47f805 |
" -x force byte-swapping of input\n"
|
|
Packit |
47f805 |
" --little-endian input is little-endian (default)\n"
|
|
Packit |
47f805 |
" --big-endian input is big-endian\n"
|
|
Packit |
47f805 |
" -a downmix from stereo to mono file for mono encoding\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
wait_for(fp, lessmode);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" Operational options:\n"
|
|
Packit |
47f805 |
" -m <mode> (j)oint, (s)imple, (f)orce, (d)ual-mono, (m)ono (l)eft (r)ight\n"
|
|
Packit |
47f805 |
" default is (j)\n"
|
|
Packit |
47f805 |
" joint = Uses the best possible of MS and LR stereo\n"
|
|
Packit |
47f805 |
" simple = force LR stereo on all frames\n"
|
|
Packit |
47f805 |
" force = force MS stereo on all frames.\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --preset type type must be \"medium\", \"standard\", \"extreme\", \"insane\",\n"
|
|
Packit |
47f805 |
" or a value for an average desired bitrate and depending\n"
|
|
Packit |
47f805 |
" on the value specified, appropriate quality settings will\n"
|
|
Packit |
47f805 |
" be used.\n"
|
|
Packit |
47f805 |
" \"--preset help\" gives more info on these\n"
|
|
Packit |
47f805 |
" --comp <arg> choose bitrate to achieve a compression ratio of <arg>\n");
|
|
Packit |
47f805 |
fprintf(fp, " --replaygain-fast compute RG fast but slightly inaccurately (default)\n"
|
|
Packit |
47f805 |
#ifdef DECODE_ON_THE_FLY
|
|
Packit |
47f805 |
" --replaygain-accurate compute RG more accurately and find the peak sample\n"
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
" --noreplaygain disable ReplayGain analysis\n"
|
|
Packit |
47f805 |
#ifdef DECODE_ON_THE_FLY
|
|
Packit |
47f805 |
" --clipdetect enable --replaygain-accurate and print a message whether\n"
|
|
Packit |
47f805 |
" clipping occurs and how far the waveform is from full scale\n"
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --flush flush output stream as soon as possible\n"
|
|
Packit |
47f805 |
" --freeformat produce a free format bitstream\n"
|
|
Packit |
47f805 |
" --decode input=mp3 file, output=wav\n"
|
|
Packit |
47f805 |
" -t disable writing wav header when using --decode\n");
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
wait_for(fp, lessmode);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" Verbosity:\n"
|
|
Packit |
47f805 |
" --disptime <arg>print progress report every arg seconds\n"
|
|
Packit |
47f805 |
" -S don't print progress report, VBR histograms\n"
|
|
Packit |
47f805 |
" --nohist disable VBR histogram display\n"
|
|
Packit |
47f805 |
" --quiet don't print anything on screen\n"
|
|
Packit |
47f805 |
" --silent don't print anything on screen, but fatal errors\n"
|
|
Packit |
47f805 |
" --brief print more useful information\n"
|
|
Packit |
47f805 |
" --verbose print a lot of useful information\n" "\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" Noise shaping & psycho acoustic algorithms:\n"
|
|
Packit |
47f805 |
" -q <arg> <arg> = 0...9. Default -q 3 \n"
|
|
Packit |
47f805 |
" -q 0: Highest quality, very slow \n"
|
|
Packit |
47f805 |
" -q 9: Poor quality, but fast \n"
|
|
Packit |
47f805 |
" -h Same as -q 2. \n"
|
|
Packit |
47f805 |
" -f Same as -q 7. Fast, ok quality\n");
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
wait_for(fp, lessmode);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" CBR (constant bitrate, the default) options:\n"
|
|
Packit |
47f805 |
" -b <bitrate> set the bitrate in kbps, default 128 kbps\n"
|
|
Packit |
47f805 |
" --cbr enforce use of constant bitrate\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" ABR options:\n"
|
|
Packit |
47f805 |
" --abr <bitrate> specify average bitrate desired (instead of quality)\n" "\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" VBR options:\n"
|
|
Packit |
47f805 |
" -V n quality setting for VBR. default n=%i\n"
|
|
Packit |
47f805 |
" 0=high quality,bigger files. 9=smaller files\n"
|
|
Packit |
47f805 |
" -v the same as -V 4\n"
|
|
Packit |
47f805 |
" --vbr-old use old variable bitrate (VBR) routine\n"
|
|
Packit |
47f805 |
" --vbr-new use new variable bitrate (VBR) routine (default)\n"
|
|
Packit |
47f805 |
" -Y lets LAME ignore noise in sfb21, like in CBR\n"
|
|
Packit |
47f805 |
" (Default for V3 to V9.999)\n"
|
|
Packit |
47f805 |
,
|
|
Packit |
47f805 |
lame_get_VBR_q(gfp));
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" -b <bitrate> specify minimum allowed bitrate, default 32 kbps\n"
|
|
Packit |
47f805 |
" -B <bitrate> specify maximum allowed bitrate, default 320 kbps\n"
|
|
Packit |
47f805 |
" -F strictly enforce the -b option, for use with players that\n"
|
|
Packit |
47f805 |
" do not support low bitrate mp3\n"
|
|
Packit |
47f805 |
" -t disable writing LAME Tag\n"
|
|
Packit |
47f805 |
" -T enable and force writing LAME Tag\n");
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
wait_for(fp, lessmode);
|
|
Packit |
47f805 |
DEV_HELP(
|
|
Packit |
47f805 |
help_developer_switches(fp);
|
|
Packit |
47f805 |
wait_for(fp, lessmode);
|
|
Packit |
47f805 |
)
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" MP3 header/stream options:\n"
|
|
Packit |
47f805 |
" -e <emp> de-emphasis n/5/c (obsolete)\n"
|
|
Packit |
47f805 |
" -c mark as copyright\n"
|
|
Packit |
47f805 |
" -o mark as non-original\n"
|
|
Packit |
47f805 |
" -p error protection. adds 16 bit checksum to every frame\n"
|
|
Packit |
47f805 |
" (the checksum is computed correctly)\n"
|
|
Packit |
47f805 |
" --nores disable the bit reservoir\n"
|
|
Packit |
47f805 |
" --strictly-enforce-ISO comply as much as possible to ISO MPEG spec\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --buffer-constraint <constraint> available values for constraint:\n"
|
|
Packit |
47f805 |
" default, strict, maximum\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" Filter options:\n"
|
|
Packit |
47f805 |
" --lowpass <freq> frequency(kHz), lowpass filter cutoff above freq\n"
|
|
Packit |
47f805 |
" --lowpass-width <freq> frequency(kHz) - default 15%% of lowpass freq\n"
|
|
Packit |
47f805 |
" --highpass <freq> frequency(kHz), highpass filter cutoff below freq\n"
|
|
Packit |
47f805 |
" --highpass-width <freq> frequency(kHz) - default 15%% of highpass freq\n");
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" --resample <sfreq> sampling frequency of output file(kHz)- default=automatic\n");
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
wait_for(fp, lessmode);
|
|
Packit |
47f805 |
help_id3tag(fp);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
#if defined(WIN32)
|
|
Packit |
47f805 |
"\n\nMS-Windows-specific options:\n"
|
|
Packit |
47f805 |
" --priority <type> sets the process priority:\n"
|
|
Packit |
47f805 |
" 0,1 = Low priority (IDLE_PRIORITY_CLASS)\n"
|
|
Packit |
47f805 |
" 2 = normal priority (NORMAL_PRIORITY_CLASS, default)\n"
|
|
Packit |
47f805 |
" 3,4 = High priority (HIGH_PRIORITY_CLASS))\n"
|
|
Packit |
47f805 |
" Note: Calling '--priority' without a parameter will select priority 0.\n"
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
#if defined(__OS2__)
|
|
Packit |
47f805 |
"\n\nOS/2-specific options:\n"
|
|
Packit |
47f805 |
" --priority <type> sets the process priority:\n"
|
|
Packit |
47f805 |
" 0 = Low priority (IDLE, delta = 0)\n"
|
|
Packit |
47f805 |
" 1 = Medium priority (IDLE, delta = +31)\n"
|
|
Packit |
47f805 |
" 2 = Regular priority (REGULAR, delta = -31)\n"
|
|
Packit |
47f805 |
" 3 = High priority (REGULAR, delta = 0)\n"
|
|
Packit |
47f805 |
" 4 = Maximum priority (REGULAR, delta = +31)\n"
|
|
Packit |
47f805 |
" Note: Calling '--priority' without a parameter will select priority 0.\n"
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
"\nMisc:\n --license print License information\n\n"
|
|
Packit |
47f805 |
);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#if defined(HAVE_NASM)
|
|
Packit |
47f805 |
wait_for(fp, lessmode);
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
" Platform specific:\n"
|
|
Packit |
47f805 |
" --noasm <instructions> disable assembly optimizations for mmx/3dnow/sse\n");
|
|
Packit |
47f805 |
wait_for(fp, lessmode);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
display_bitrates(fp);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static void
|
|
Packit |
47f805 |
display_bitrate(FILE * const fp, const char *const version, const int d, const int indx)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int i;
|
|
Packit |
47f805 |
int nBitrates = 14;
|
|
Packit |
47f805 |
if (d == 4)
|
|
Packit |
47f805 |
nBitrates = 8;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
fprintf(fp,
|
|
Packit |
47f805 |
"\nMPEG-%-3s layer III sample frequencies (kHz): %2d %2d %g\n"
|
|
Packit |
47f805 |
"bitrates (kbps):", version, 32 / d, 48 / d, 44.1 / d);
|
|
Packit |
47f805 |
for (i = 1; i <= nBitrates; i++)
|
|
Packit |
47f805 |
fprintf(fp, " %2i", lame_get_bitrate(indx, i));
|
|
Packit |
47f805 |
fprintf(fp, "\n");
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
int
|
|
Packit |
47f805 |
display_bitrates(FILE * const fp)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
display_bitrate(fp, "1", 1, 1);
|
|
Packit |
47f805 |
display_bitrate(fp, "2", 2, 0);
|
|
Packit |
47f805 |
display_bitrate(fp, "2.5", 4, 0);
|
|
Packit |
47f805 |
fprintf(fp, "\n");
|
|
Packit |
47f805 |
fflush(fp);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* note: for presets it would be better to externalize them in a file.
|
|
Packit |
47f805 |
suggestion: lame --preset <file-name> ...
|
|
Packit |
47f805 |
or: lame --preset my-setting ... and my-setting is defined in lame.ini
|
|
Packit |
47f805 |
*/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/*
|
|
Packit |
47f805 |
Note from GB on 08/25/2002:
|
|
Packit |
47f805 |
I am merging --presets and --alt-presets. Old presets are now aliases for
|
|
Packit |
47f805 |
corresponding abr values from old alt-presets. This way we now have a
|
|
Packit |
47f805 |
unified preset system, and I hope than more people will use the new tuned
|
|
Packit |
47f805 |
presets instead of the old unmaintained ones.
|
|
Packit |
47f805 |
*/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/************************************************************************
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* usage
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* PURPOSE: Writes presetting info to #stdout#
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
************************************************************************/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static void
|
|
Packit |
47f805 |
presets_longinfo_dm(FILE * msgfp)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
"The --preset switches are aliases over LAME settings.\n"
|
|
Packit |
47f805 |
"\n" "\n");
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
"To activate these presets:\n"
|
|
Packit |
47f805 |
"\n" " For VBR modes (generally highest quality):\n" "\n");
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
" --preset medium This preset should provide near transparency to most\n"
|
|
Packit |
47f805 |
" people on most music.\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" --preset standard This preset should generally be transparent to most\n"
|
|
Packit |
47f805 |
" people on most music and is already quite high\n"
|
|
Packit |
47f805 |
" in quality.\n" "\n");
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
" --preset extreme If you have extremely good hearing and similar\n"
|
|
Packit |
47f805 |
" equipment, this preset will generally provide\n"
|
|
Packit |
47f805 |
" slightly higher quality than the \"standard\" mode.\n" "\n");
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
" For CBR 320kbps (highest quality possible from the --preset switches):\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" --preset insane This preset will usually be overkill for most people\n"
|
|
Packit |
47f805 |
" and most situations, but if you must have the\n"
|
|
Packit |
47f805 |
" absolute highest quality with no regard to filesize,\n"
|
|
Packit |
47f805 |
" this is the way to go.\n" "\n");
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
" For ABR modes (high quality per given bitrate but not as high as VBR):\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" --preset <kbps> Using this preset will usually give you good quality\n"
|
|
Packit |
47f805 |
" at a specified bitrate. Depending on the bitrate\n"
|
|
Packit |
47f805 |
" entered, this preset will determine the optimal\n"
|
|
Packit |
47f805 |
" settings for that particular situation. For example:\n"
|
|
Packit |
47f805 |
" \"--preset 185\" activates this preset and uses 185\n"
|
|
Packit |
47f805 |
" as an average kbps.\n" "\n");
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
" \"cbr\" - If you use the ABR mode (read above) with a significant\n"
|
|
Packit |
47f805 |
" bitrate such as 80, 96, 112, 128, 160, 192, 224, 256, 320,\n"
|
|
Packit |
47f805 |
" you can use the \"cbr\" option to force CBR mode encoding\n"
|
|
Packit |
47f805 |
" instead of the standard abr mode. ABR does provide higher\n"
|
|
Packit |
47f805 |
" quality but CBR may be useful in situations such as when\n"
|
|
Packit |
47f805 |
" streaming an mp3 over the internet may be important.\n" "\n");
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
" For example:\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" --preset standard <input file> <output file>\n"
|
|
Packit |
47f805 |
" or --preset cbr 192 <input file> <output file>\n"
|
|
Packit |
47f805 |
" or --preset 172 <input file> <output file>\n"
|
|
Packit |
47f805 |
" or --preset extreme <input file> <output file>\n" "\n" "\n");
|
|
Packit |
47f805 |
fprintf(msgfp,
|
|
Packit |
47f805 |
"A few aliases are also available for ABR mode:\n"
|
|
Packit |
47f805 |
"phone => 16kbps/mono phon+/lw/mw-eu/sw => 24kbps/mono\n"
|
|
Packit |
47f805 |
"mw-us => 40kbps/mono voice => 56kbps/mono\n"
|
|
Packit |
47f805 |
"fm/radio/tape => 112kbps hifi => 160kbps\n"
|
|
Packit |
47f805 |
"cd => 192kbps studio => 256kbps\n");
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
presets_set(lame_t gfp, int fast, int cbr, const char *preset_name, const char *ProgramName)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int mono = 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if ((strcmp(preset_name, "help") == 0) && (fast < 1)
|
|
Packit |
47f805 |
&& (cbr < 1)) {
|
|
Packit |
47f805 |
lame_version_print(stdout);
|
|
Packit |
47f805 |
presets_longinfo_dm(stdout);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/*aliases for compatibility with old presets */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (strcmp(preset_name, "phone") == 0) {
|
|
Packit |
47f805 |
preset_name = "16";
|
|
Packit |
47f805 |
mono = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if ((strcmp(preset_name, "phon+") == 0) ||
|
|
Packit |
47f805 |
(strcmp(preset_name, "lw") == 0) ||
|
|
Packit |
47f805 |
(strcmp(preset_name, "mw-eu") == 0) || (strcmp(preset_name, "sw") == 0)) {
|
|
Packit |
47f805 |
preset_name = "24";
|
|
Packit |
47f805 |
mono = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (strcmp(preset_name, "mw-us") == 0) {
|
|
Packit |
47f805 |
preset_name = "40";
|
|
Packit |
47f805 |
mono = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (strcmp(preset_name, "voice") == 0) {
|
|
Packit |
47f805 |
preset_name = "56";
|
|
Packit |
47f805 |
mono = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (strcmp(preset_name, "fm") == 0) {
|
|
Packit |
47f805 |
preset_name = "112";
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if ((strcmp(preset_name, "radio") == 0) || (strcmp(preset_name, "tape") == 0)) {
|
|
Packit |
47f805 |
preset_name = "112";
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (strcmp(preset_name, "hifi") == 0) {
|
|
Packit |
47f805 |
preset_name = "160";
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (strcmp(preset_name, "cd") == 0) {
|
|
Packit |
47f805 |
preset_name = "192";
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (strcmp(preset_name, "studio") == 0) {
|
|
Packit |
47f805 |
preset_name = "256";
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (strcmp(preset_name, "medium") == 0) {
|
|
Packit |
47f805 |
lame_set_VBR_q(gfp, 4);
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_default);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (strcmp(preset_name, "standard") == 0) {
|
|
Packit |
47f805 |
lame_set_VBR_q(gfp, 2);
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_default);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
else if (strcmp(preset_name, "extreme") == 0) {
|
|
Packit |
47f805 |
lame_set_VBR_q(gfp, 0);
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_default);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
else if ((strcmp(preset_name, "insane") == 0) && (fast < 1)) {
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
lame_set_preset(gfp, INSANE);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* Generic ABR Preset */
|
|
Packit |
47f805 |
if (((atoi(preset_name)) > 0) && (fast < 1)) {
|
|
Packit |
47f805 |
if ((atoi(preset_name)) >= 8 && (atoi(preset_name)) <= 320) {
|
|
Packit |
47f805 |
lame_set_preset(gfp, atoi(preset_name));
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (cbr == 1)
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_off);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (mono == 1) {
|
|
Packit |
47f805 |
lame_set_mode(gfp, MONO);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
lame_version_print(Console_IO.Error_fp);
|
|
Packit |
47f805 |
error_printf("Error: The bitrate specified is out of the valid range for this preset\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
"When using this mode you must enter a value between \"32\" and \"320\"\n"
|
|
Packit |
47f805 |
"\n" "For further information try: \"%s --preset help\"\n", ProgramName);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
lame_version_print(Console_IO.Error_fp);
|
|
Packit |
47f805 |
error_printf("Error: You did not enter a valid profile and/or options with --preset\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
"Available profiles are:\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" medium\n"
|
|
Packit |
47f805 |
" standard\n"
|
|
Packit |
47f805 |
" extreme\n"
|
|
Packit |
47f805 |
" insane\n"
|
|
Packit |
47f805 |
" <cbr> (ABR Mode) - The ABR Mode is implied. To use it,\n"
|
|
Packit |
47f805 |
" simply specify a bitrate. For example:\n"
|
|
Packit |
47f805 |
" \"--preset 185\" activates this\n"
|
|
Packit |
47f805 |
" preset and uses 185 as an average kbps.\n" "\n");
|
|
Packit |
47f805 |
error_printf(" Some examples:\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
" or \"%s --preset standard <input file> <output file>\"\n"
|
|
Packit |
47f805 |
" or \"%s --preset cbr 192 <input file> <output file>\"\n"
|
|
Packit |
47f805 |
" or \"%s --preset 172 <input file> <output file>\"\n"
|
|
Packit |
47f805 |
" or \"%s --preset extreme <input file> <output file>\"\n"
|
|
Packit |
47f805 |
"\n"
|
|
Packit |
47f805 |
"For further information try: \"%s --preset help\"\n", ProgramName, ProgramName,
|
|
Packit |
47f805 |
ProgramName, ProgramName, ProgramName);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static void
|
|
Packit |
47f805 |
genre_list_handler(int num, const char *name, void *cookie)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
(void) cookie;
|
|
Packit |
47f805 |
console_printf("%3d %s\n", num, name);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/************************************************************************
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* parse_args
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* PURPOSE: Sets encoding parameters to the specifications of the
|
|
Packit |
47f805 |
* command line. Default settings are used for parameters
|
|
Packit |
47f805 |
* not specified in the command line.
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* If the input file is in WAVE or AIFF format, the sampling frequency is read
|
|
Packit |
47f805 |
* from the AIFF header.
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
* The input and output filenames are read into #inpath# and #outpath#.
|
|
Packit |
47f805 |
*
|
|
Packit |
47f805 |
************************************************************************/
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* would use real "strcasecmp" but it isn't portable */
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
local_strcasecmp(const char *s1, const char *s2)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
unsigned char c1;
|
|
Packit |
47f805 |
unsigned char c2;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
do {
|
|
Packit |
47f805 |
c1 = (unsigned char) tolower(*s1);
|
|
Packit |
47f805 |
c2 = (unsigned char) tolower(*s2);
|
|
Packit |
47f805 |
if (!c1) {
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
++s1;
|
|
Packit |
47f805 |
++s2;
|
|
Packit |
47f805 |
} while (c1 == c2);
|
|
Packit |
47f805 |
return c1 - c2;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
local_strncasecmp(const char *s1, const char *s2, int n)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
unsigned char c1 = 0;
|
|
Packit |
47f805 |
unsigned char c2 = 0;
|
|
Packit |
47f805 |
int cnt = 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
do {
|
|
Packit |
47f805 |
if (cnt == n) {
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
c1 = (unsigned char) tolower(*s1);
|
|
Packit |
47f805 |
c2 = (unsigned char) tolower(*s2);
|
|
Packit |
47f805 |
if (!c1) {
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
++s1;
|
|
Packit |
47f805 |
++s2;
|
|
Packit |
47f805 |
++cnt;
|
|
Packit |
47f805 |
} while (c1 == c2);
|
|
Packit |
47f805 |
return c1 - c2;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* LAME is a simple frontend which just uses the file extension */
|
|
Packit |
47f805 |
/* to determine the file type. Trying to analyze the file */
|
|
Packit |
47f805 |
/* contents is well beyond the scope of LAME and should not be added. */
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
filename_to_type(const char *FileName)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
size_t len = strlen(FileName);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (len < 4)
|
|
Packit |
47f805 |
return sf_unknown;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
FileName += len - 4;
|
|
Packit |
47f805 |
if (0 == local_strcasecmp(FileName, ".mpg"))
|
|
Packit |
47f805 |
return sf_mp123;
|
|
Packit |
47f805 |
if (0 == local_strcasecmp(FileName, ".mp1"))
|
|
Packit |
47f805 |
return sf_mp123;
|
|
Packit |
47f805 |
if (0 == local_strcasecmp(FileName, ".mp2"))
|
|
Packit |
47f805 |
return sf_mp123;
|
|
Packit |
47f805 |
if (0 == local_strcasecmp(FileName, ".mp3"))
|
|
Packit |
47f805 |
return sf_mp123;
|
|
Packit |
47f805 |
if (0 == local_strcasecmp(FileName, ".wav"))
|
|
Packit |
47f805 |
return sf_wave;
|
|
Packit |
47f805 |
if (0 == local_strcasecmp(FileName, ".aif"))
|
|
Packit |
47f805 |
return sf_aiff;
|
|
Packit |
47f805 |
if (0 == local_strcasecmp(FileName, ".raw"))
|
|
Packit |
47f805 |
return sf_raw;
|
|
Packit |
47f805 |
if (0 == local_strcasecmp(FileName, ".ogg"))
|
|
Packit |
47f805 |
return sf_ogg;
|
|
Packit |
47f805 |
return sf_unknown;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
resample_rate(double freq)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
if (freq >= 1.e3)
|
|
Packit |
47f805 |
freq *= 1.e-3;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
switch ((int) freq) {
|
|
Packit |
47f805 |
case 8:
|
|
Packit |
47f805 |
return 8000;
|
|
Packit |
47f805 |
case 11:
|
|
Packit |
47f805 |
return 11025;
|
|
Packit |
47f805 |
case 12:
|
|
Packit |
47f805 |
return 12000;
|
|
Packit |
47f805 |
case 16:
|
|
Packit |
47f805 |
return 16000;
|
|
Packit |
47f805 |
case 22:
|
|
Packit |
47f805 |
return 22050;
|
|
Packit |
47f805 |
case 24:
|
|
Packit |
47f805 |
return 24000;
|
|
Packit |
47f805 |
case 32:
|
|
Packit |
47f805 |
return 32000;
|
|
Packit |
47f805 |
case 44:
|
|
Packit |
47f805 |
return 44100;
|
|
Packit |
47f805 |
case 48:
|
|
Packit |
47f805 |
return 48000;
|
|
Packit |
47f805 |
default:
|
|
Packit |
47f805 |
error_printf("Illegal resample frequency: %.3f kHz\n", freq);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef _WIN32
|
|
Packit |
47f805 |
#define SLASH '\\'
|
|
Packit |
47f805 |
#define COLON ':'
|
|
Packit |
47f805 |
#elif __OS2__
|
|
Packit |
47f805 |
#define SLASH '\\'
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
#define SLASH '/'
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static
|
|
Packit |
47f805 |
size_t scanPath(char const* s, char const** a, char const** b)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char const* s1 = s;
|
|
Packit |
47f805 |
char const* s2 = s;
|
|
Packit |
47f805 |
if (s != 0) {
|
|
Packit |
47f805 |
for (; *s; ++s) {
|
|
Packit |
47f805 |
switch (*s) {
|
|
Packit |
47f805 |
case SLASH:
|
|
Packit |
47f805 |
#ifdef _WIN32
|
|
Packit |
47f805 |
case COLON:
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
s2 = s;
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#ifdef _WIN32
|
|
Packit |
47f805 |
if (*s2 == COLON) {
|
|
Packit |
47f805 |
++s2;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (a) {
|
|
Packit |
47f805 |
*a = s1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (b) {
|
|
Packit |
47f805 |
*b = s2;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return s2-s1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static
|
|
Packit |
47f805 |
size_t scanBasename(char const* s, char const** a, char const** b)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char const* s1 = s;
|
|
Packit |
47f805 |
char const* s2 = s;
|
|
Packit |
47f805 |
if (s != 0) {
|
|
Packit |
47f805 |
for (; *s; ++s) {
|
|
Packit |
47f805 |
switch (*s) {
|
|
Packit |
47f805 |
case SLASH:
|
|
Packit |
47f805 |
#ifdef _WIN32
|
|
Packit |
47f805 |
case COLON:
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
s1 = s2 = s;
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case '.':
|
|
Packit |
47f805 |
s2 = s;
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (s2 == s1) {
|
|
Packit |
47f805 |
s2 = s;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (*s1 == SLASH
|
|
Packit |
47f805 |
#ifdef _WIN32
|
|
Packit |
47f805 |
|| *s1 == COLON
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
) {
|
|
Packit |
47f805 |
++s1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (a != 0) {
|
|
Packit |
47f805 |
*a = s1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (b != 0) {
|
|
Packit |
47f805 |
*b = s2;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return s2-s1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static
|
|
Packit |
47f805 |
int isCommonSuffix(char const* s_ext)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char const* suffixes[] =
|
|
Packit |
47f805 |
{ ".WAV", ".RAW", ".MP1", ".MP2"
|
|
Packit |
47f805 |
, ".MP3", ".MPG", ".MPA", ".CDA"
|
|
Packit |
47f805 |
, ".OGG", ".AIF", ".AIFF", ".AU"
|
|
Packit |
47f805 |
, ".SND", ".FLAC", ".WV", ".OFR"
|
|
Packit |
47f805 |
, ".TAK", ".MP4", ".M4A", ".PCM"
|
|
Packit |
47f805 |
, ".W64"
|
|
Packit |
47f805 |
};
|
|
Packit |
47f805 |
size_t i;
|
|
Packit |
47f805 |
for (i = 0; i < dimension_of(suffixes); ++i) {
|
|
Packit |
47f805 |
if (local_strcasecmp(s_ext, suffixes[i]) == 0) {
|
|
Packit |
47f805 |
return 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
int generateOutPath(char const* inPath, char const* outDir, char const* s_ext, char* outPath)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
size_t const max_path = PATH_MAX;
|
|
Packit |
47f805 |
#if 1
|
|
Packit |
47f805 |
size_t i = 0;
|
|
Packit |
47f805 |
int out_dir_used = 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (outDir != 0 && outDir[0] != 0) {
|
|
Packit |
47f805 |
out_dir_used = 1;
|
|
Packit |
47f805 |
while (*outDir) {
|
|
Packit |
47f805 |
outPath[i++] = *outDir++;
|
|
Packit |
47f805 |
if (i >= max_path) {
|
|
Packit |
47f805 |
goto err_generateOutPath;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (i > 0 && outPath[i-1] != SLASH) {
|
|
Packit |
47f805 |
outPath[i++] = SLASH;
|
|
Packit |
47f805 |
if (i >= max_path) {
|
|
Packit |
47f805 |
goto err_generateOutPath;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
outPath[i] = 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
char const* pa;
|
|
Packit |
47f805 |
char const* pb;
|
|
Packit |
47f805 |
size_t j, n = scanPath(inPath, &pa, &pb;;
|
|
Packit |
47f805 |
if (i+n >= max_path) {
|
|
Packit |
47f805 |
goto err_generateOutPath;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
for (j = 0; j < n; ++j) {
|
|
Packit |
47f805 |
outPath[i++] = pa[j];
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (n > 0) {
|
|
Packit |
47f805 |
outPath[i++] = SLASH;
|
|
Packit |
47f805 |
if (i >= max_path) {
|
|
Packit |
47f805 |
goto err_generateOutPath;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
outPath[i] = 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int replace_suffix = 0;
|
|
Packit |
47f805 |
char const* na;
|
|
Packit |
47f805 |
char const* nb;
|
|
Packit |
47f805 |
size_t j, n = scanBasename(inPath, &na, &nb);
|
|
Packit |
47f805 |
if (i+n >= max_path) {
|
|
Packit |
47f805 |
goto err_generateOutPath;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
for (j = 0; j < n; ++j) {
|
|
Packit |
47f805 |
outPath[i++] = na[j];
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
outPath[i] = 0;
|
|
Packit |
47f805 |
if (isCommonSuffix(nb) == 1) {
|
|
Packit |
47f805 |
replace_suffix = 1;
|
|
Packit |
47f805 |
if (out_dir_used == 0) {
|
|
Packit |
47f805 |
if (local_strcasecmp(nb, s_ext) == 0) {
|
|
Packit |
47f805 |
replace_suffix = 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (replace_suffix == 0) {
|
|
Packit |
47f805 |
while (*nb) {
|
|
Packit |
47f805 |
outPath[i++] = *nb++;
|
|
Packit |
47f805 |
if (i >= max_path) {
|
|
Packit |
47f805 |
goto err_generateOutPath;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
outPath[i] = 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (i+5 >= max_path) {
|
|
Packit |
47f805 |
goto err_generateOutPath;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
while (*s_ext) {
|
|
Packit |
47f805 |
outPath[i++] = *s_ext++;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
outPath[i] = 0;
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
err_generateOutPath:
|
|
Packit |
47f805 |
error_printf( "error: output file name too long\n" );
|
|
Packit |
47f805 |
return 1;
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
strncpy(outPath, inPath, PATH_MAX + 1 - 4);
|
|
Packit |
47f805 |
strncat(outPath, s_ext, 4);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
set_id3_albumart(lame_t gfp, char const* file_name)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int ret = -1;
|
|
Packit |
47f805 |
FILE *fpi = 0;
|
|
Packit |
47f805 |
char *albumart = 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (file_name == 0) {
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
fpi = lame_fopen(file_name, "rb");
|
|
Packit |
47f805 |
if (!fpi) {
|
|
Packit |
47f805 |
ret = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
size_t size;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
fseek(fpi, 0, SEEK_END);
|
|
Packit |
47f805 |
size = ftell(fpi);
|
|
Packit |
47f805 |
fseek(fpi, 0, SEEK_SET);
|
|
Packit |
47f805 |
albumart = (char *)malloc(size);
|
|
Packit |
47f805 |
if (!albumart) {
|
|
Packit |
47f805 |
ret = 2;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
if (fread(albumart, 1, size, fpi) != size) {
|
|
Packit |
47f805 |
ret = 3;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
ret = id3tag_set_albumart(gfp, albumart, size) ? 4 : 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
free(albumart);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
fclose(fpi);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
switch (ret) {
|
|
Packit |
47f805 |
case 1: error_printf("Could not find: '%s'.\n", file_name); break;
|
|
Packit |
47f805 |
case 2: error_printf("Insufficient memory for reading the albumart.\n"); break;
|
|
Packit |
47f805 |
case 3: error_printf("Read error: '%s'.\n", file_name); break;
|
|
Packit |
47f805 |
case 4: error_printf("Unsupported image: '%s'.\nSpecify JPEG/PNG/GIF image\n", file_name); break;
|
|
Packit |
47f805 |
default: break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return ret;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
enum ID3TAG_MODE
|
|
Packit |
47f805 |
{ ID3TAG_MODE_DEFAULT
|
|
Packit |
47f805 |
, ID3TAG_MODE_V1_ONLY
|
|
Packit |
47f805 |
, ID3TAG_MODE_V2_ONLY
|
|
Packit |
47f805 |
};
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int dev_only_with_arg(char const* str, char const* token, char const* nextArg, int* argIgnored, int* argUsed)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
if (0 != local_strcasecmp(token,str)) return 0;
|
|
Packit |
47f805 |
*argUsed = 1;
|
|
Packit |
47f805 |
if (internal_opts_enabled) return 1;
|
|
Packit |
47f805 |
*argIgnored = 1;
|
|
Packit |
47f805 |
error_printf("WARNING: ignoring developer-only switch --%s %s\n", token, nextArg);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int dev_only_without_arg(char const* str, char const* token, int* argIgnored)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
if (0 != local_strcasecmp(token,str)) return 0;
|
|
Packit |
47f805 |
if (internal_opts_enabled) return 1;
|
|
Packit |
47f805 |
*argIgnored = 1;
|
|
Packit |
47f805 |
error_printf("WARNING: ignoring developer-only switch --%s\n", token);
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* Ugly, NOT final version */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#define T_IF(str) if ( 0 == local_strcasecmp (token,str) ) {
|
|
Packit |
47f805 |
#define T_ELIF(str) } else if ( 0 == local_strcasecmp (token,str) ) {
|
|
Packit |
47f805 |
#define T_ELIF2(str1,str2) } else if ( 0 == local_strcasecmp (token,str1) || 0 == local_strcasecmp (token,str2) ) {
|
|
Packit |
47f805 |
#define T_ELSE } else {
|
|
Packit |
47f805 |
#define T_END }
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#define T_ELIF_INTERNAL(str) \
|
|
Packit |
47f805 |
} else if (dev_only_without_arg(str,token,&argIgnored)) {
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#define T_ELIF_INTERNAL_WITH_ARG(str) \
|
|
Packit |
47f805 |
} else if (dev_only_with_arg(str,token,nextArg,&argIgnored,&argUsed)) {
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
parse_args_(lame_global_flags * gfp, int argc, char **argv,
|
|
Packit |
47f805 |
char *const inPath, char *const outPath, char **nogap_inPath, int *num_nogap)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char outDir[PATH_MAX+1] = "";
|
|
Packit |
47f805 |
int input_file = 0; /* set to 1 if we parse an input file name */
|
|
Packit |
47f805 |
int i;
|
|
Packit |
47f805 |
int autoconvert = 0;
|
|
Packit |
47f805 |
int nogap = 0;
|
|
Packit |
47f805 |
int nogap_tags = 0; /* set to 1 to use VBR tags in NOGAP mode */
|
|
Packit |
47f805 |
const char *ProgramName = argv[0];
|
|
Packit |
47f805 |
int count_nogap = 0;
|
|
Packit |
47f805 |
int noreplaygain = 0; /* is RG explicitly disabled by the user */
|
|
Packit |
47f805 |
int id3tag_mode = ID3TAG_MODE_DEFAULT;
|
|
Packit |
47f805 |
int ignore_tag_errors = 0; /* Ignore errors in values passed for tags */
|
|
Packit |
47f805 |
#ifdef ID3TAGS_EXTENDED
|
|
Packit |
47f805 |
enum TextEncoding id3_tenc = TENC_UTF16;
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
enum TextEncoding id3_tenc = TENC_LATIN1;
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef HAVE_ICONV
|
|
Packit |
47f805 |
setlocale(LC_CTYPE, "");
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
inPath[0] = '\0';
|
|
Packit |
47f805 |
outPath[0] = '\0';
|
|
Packit |
47f805 |
/* turn on display options. user settings may turn them off below */
|
|
Packit |
47f805 |
global_ui_config.silent = 0; /* default */
|
|
Packit |
47f805 |
global_ui_config.brhist = 1;
|
|
Packit |
47f805 |
global_decoder.mp3_delay = 0;
|
|
Packit |
47f805 |
global_decoder.mp3_delay_set = 0;
|
|
Packit |
47f805 |
global_decoder.disable_wav_header = 0;
|
|
Packit |
47f805 |
global_ui_config.print_clipping_info = 0;
|
|
Packit |
47f805 |
id3tag_init(gfp);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* process args */
|
|
Packit |
47f805 |
for (i = 0; ++i < argc;) {
|
|
Packit |
47f805 |
char c;
|
|
Packit |
47f805 |
char *token;
|
|
Packit |
47f805 |
char *arg;
|
|
Packit |
47f805 |
char *nextArg;
|
|
Packit |
47f805 |
int argUsed;
|
|
Packit |
47f805 |
int argIgnored=0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
token = argv[i];
|
|
Packit |
47f805 |
if (*token++ == '-') {
|
|
Packit |
47f805 |
argUsed = 0;
|
|
Packit |
47f805 |
nextArg = i + 1 < argc ? argv[i + 1] : "";
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (!*token) { /* The user wants to use stdin and/or stdout. */
|
|
Packit |
47f805 |
input_file = 1;
|
|
Packit |
47f805 |
if (inPath[0] == '\0')
|
|
Packit |
47f805 |
strncpy(inPath, argv[i], PATH_MAX + 1);
|
|
Packit |
47f805 |
else if (outPath[0] == '\0')
|
|
Packit |
47f805 |
strncpy(outPath, argv[i], PATH_MAX + 1);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (*token == '-') { /* GNU style */
|
|
Packit |
47f805 |
double double_value = 0;
|
|
Packit |
47f805 |
int int_value = 0;
|
|
Packit |
47f805 |
token++;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_IF("resample")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_out_samplerate(gfp, resample_rate(double_value));
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("vbr-old")
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_rh);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("vbr-new")
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_mt);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("vbr-mtrh")
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_mtrh);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("cbr")
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_off);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("abr")
|
|
Packit |
47f805 |
/* values larger than 8000 are bps (like Fraunhofer), so it's strange to get 320000 bps MP3 when specifying 8000 bps MP3 */
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
if (int_value >= 8000) {
|
|
Packit |
47f805 |
int_value = (int_value + 500) / 1000;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (int_value > 320) {
|
|
Packit |
47f805 |
int_value = 320;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (int_value < 8) {
|
|
Packit |
47f805 |
int_value = 8;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_abr);
|
|
Packit |
47f805 |
lame_set_VBR_mean_bitrate_kbps(gfp, int_value);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("r3mix")
|
|
Packit |
47f805 |
lame_set_preset(gfp, R3MIX);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("bitwidth")
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
global_raw_pcm.in_bitwidth = int_value;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("signed")
|
|
Packit |
47f805 |
global_raw_pcm.in_signed = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("unsigned")
|
|
Packit |
47f805 |
global_raw_pcm.in_signed = 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("little-endian")
|
|
Packit |
47f805 |
global_raw_pcm.in_endian = ByteOrderLittleEndian;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("big-endian")
|
|
Packit |
47f805 |
global_raw_pcm.in_endian = ByteOrderBigEndian;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("mp1input")
|
|
Packit |
47f805 |
global_reader.input_format = sf_mp1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("mp2input")
|
|
Packit |
47f805 |
global_reader.input_format = sf_mp2;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("mp3input")
|
|
Packit |
47f805 |
global_reader.input_format = sf_mp3;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("ogginput")
|
|
Packit |
47f805 |
error_printf("sorry, vorbis support in LAME is deprecated.\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("decode")
|
|
Packit |
47f805 |
(void) lame_set_decode_only(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("flush")
|
|
Packit |
47f805 |
global_writer.flush_write = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("decode-mp3delay")
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
global_decoder.mp3_delay = int_value;
|
|
Packit |
47f805 |
global_decoder.mp3_delay_set = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("nores")
|
|
Packit |
47f805 |
lame_set_disable_reservoir(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("strictly-enforce-ISO")
|
|
Packit |
47f805 |
lame_set_strict_ISO(gfp, MDB_STRICT_ISO);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("buffer-constraint")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
if (strcmp(nextArg, "default") == 0)
|
|
Packit |
47f805 |
(void) lame_set_strict_ISO(gfp, MDB_DEFAULT);
|
|
Packit |
47f805 |
else if (strcmp(nextArg, "strict") == 0)
|
|
Packit |
47f805 |
(void) lame_set_strict_ISO(gfp, MDB_STRICT_ISO);
|
|
Packit |
47f805 |
else if (strcmp(nextArg, "maximum") == 0)
|
|
Packit |
47f805 |
(void) lame_set_strict_ISO(gfp, MDB_MAXIMUM);
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
error_printf("unknown buffer constraint '%s'\n", nextArg);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("scale")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_scale(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("scale-l")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_scale_left(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("scale-r")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_scale_right(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("gain")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
double gain = double_value;
|
|
Packit |
47f805 |
gain = gain > -20.f ? gain : -20.f;
|
|
Packit |
47f805 |
gain = gain < 12.f ? gain : 12.f;
|
|
Packit |
47f805 |
gain = pow(10.f, gain*0.05);
|
|
Packit |
47f805 |
(void) lame_set_scale(gfp, (float) gain);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("noasm")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
if (!strcmp(nextArg, "mmx"))
|
|
Packit |
47f805 |
(void) lame_set_asm_optimizations(gfp, MMX, 0);
|
|
Packit |
47f805 |
if (!strcmp(nextArg, "3dnow"))
|
|
Packit |
47f805 |
(void) lame_set_asm_optimizations(gfp, AMD_3DNOW, 0);
|
|
Packit |
47f805 |
if (!strcmp(nextArg, "sse"))
|
|
Packit |
47f805 |
(void) lame_set_asm_optimizations(gfp, SSE, 0);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("freeformat")
|
|
Packit |
47f805 |
lame_set_free_format(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("replaygain-fast")
|
|
Packit |
47f805 |
lame_set_findReplayGain(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef DECODE_ON_THE_FLY
|
|
Packit |
47f805 |
T_ELIF("replaygain-accurate")
|
|
Packit |
47f805 |
lame_set_decode_on_the_fly(gfp, 1);
|
|
Packit |
47f805 |
lame_set_findReplayGain(gfp, 1);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("noreplaygain")
|
|
Packit |
47f805 |
noreplaygain = 1;
|
|
Packit |
47f805 |
lame_set_findReplayGain(gfp, 0);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef DECODE_ON_THE_FLY
|
|
Packit |
47f805 |
T_ELIF("clipdetect")
|
|
Packit |
47f805 |
global_ui_config.print_clipping_info = 1;
|
|
Packit |
47f805 |
lame_set_decode_on_the_fly(gfp, 1);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("nohist")
|
|
Packit |
47f805 |
global_ui_config.brhist = 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#if defined(__OS2__) || defined(WIN32)
|
|
Packit |
47f805 |
T_ELIF("priority")
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
setProcessPriority(int_value);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* options for ID3 tag */
|
|
Packit |
47f805 |
#ifdef ID3TAGS_EXTENDED
|
|
Packit |
47f805 |
T_ELIF2("id3v2-utf16","id3v2-ucs2") /* id3v2-ucs2 for compatibility only */
|
|
Packit |
47f805 |
id3_tenc = TENC_UTF16;
|
|
Packit |
47f805 |
id3tag_add_v2(gfp);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("id3v2-latin1")
|
|
Packit |
47f805 |
id3_tenc = TENC_LATIN1;
|
|
Packit |
47f805 |
id3tag_add_v2(gfp);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("tt")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
id3_tag(gfp, 't', id3_tenc, nextArg);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("ta")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
id3_tag(gfp, 'a', id3_tenc, nextArg);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("tl")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
id3_tag(gfp, 'l', id3_tenc, nextArg);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("ty")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
id3_tag(gfp, 'y', id3_tenc, nextArg);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("tc")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
id3_tag(gfp, 'c', id3_tenc, nextArg);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("tn")
|
|
Packit |
47f805 |
int ret = id3_tag(gfp, 'n', id3_tenc, nextArg);
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
if (ret != 0) {
|
|
Packit |
47f805 |
if (0 == ignore_tag_errors) {
|
|
Packit |
47f805 |
if (id3tag_mode == ID3TAG_MODE_V1_ONLY) {
|
|
Packit |
47f805 |
if (global_ui_config.silent < 9) {
|
|
Packit |
47f805 |
error_printf("The track number has to be between 1 and 255 for ID3v1.\n");
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else if (id3tag_mode == ID3TAG_MODE_V2_ONLY) {
|
|
Packit |
47f805 |
/* track will be stored as-is in ID3v2 case, so no problem here */
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
if (global_ui_config.silent < 9) {
|
|
Packit |
47f805 |
error_printf("The track number has to be between 1 and 255 for ID3v1, ignored for ID3v1.\n");
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("tg")
|
|
Packit |
47f805 |
int ret = 0;
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
if (nextArg != 0 && strlen(nextArg) > 0) {
|
|
Packit |
47f805 |
ret = id3_tag(gfp, 'g', id3_tenc, nextArg);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (ret != 0) {
|
|
Packit |
47f805 |
if (0 == ignore_tag_errors) {
|
|
Packit |
47f805 |
if (ret == -1) {
|
|
Packit |
47f805 |
error_printf("Unknown ID3v1 genre number: '%s'.\n", nextArg);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else if (ret == -2) {
|
|
Packit |
47f805 |
if (id3tag_mode == ID3TAG_MODE_V1_ONLY) {
|
|
Packit |
47f805 |
error_printf("Unknown ID3v1 genre: '%s'.\n", nextArg);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else if (id3tag_mode == ID3TAG_MODE_V2_ONLY) {
|
|
Packit |
47f805 |
/* genre will be stored as-is in ID3v2 case, so no problem here */
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
if (global_ui_config.silent < 9) {
|
|
Packit |
47f805 |
error_printf("Unknown ID3v1 genre: '%s'. Setting ID3v1 genre to 'Other'\n", nextArg);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
if (global_ui_config.silent < 10)
|
|
Packit |
47f805 |
error_printf("Internal error.\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("tv")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
if (id3_tag(gfp, 'v', id3_tenc, nextArg)) {
|
|
Packit |
47f805 |
if (global_ui_config.silent < 9) {
|
|
Packit |
47f805 |
error_printf("Invalid field value: '%s'. Ignored\n", nextArg);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("ti")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
if (set_id3_albumart(gfp, nextArg) != 0) {
|
|
Packit |
47f805 |
if (! ignore_tag_errors) {
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("ignore-tag-errors")
|
|
Packit |
47f805 |
ignore_tag_errors = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("add-id3v2")
|
|
Packit |
47f805 |
id3tag_add_v2(gfp);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("id3v1-only")
|
|
Packit |
47f805 |
id3tag_v1_only(gfp);
|
|
Packit |
47f805 |
id3tag_mode = ID3TAG_MODE_V1_ONLY;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("id3v2-only")
|
|
Packit |
47f805 |
id3tag_v2_only(gfp);
|
|
Packit |
47f805 |
id3tag_mode = ID3TAG_MODE_V2_ONLY;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("space-id3v1")
|
|
Packit |
47f805 |
id3tag_space_v1(gfp);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("pad-id3v2")
|
|
Packit |
47f805 |
id3tag_pad_v2(gfp);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("pad-id3v2-size")
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
int_value = int_value <= 128000 ? int_value : 128000;
|
|
Packit |
47f805 |
int_value = int_value >= 0 ? int_value : 0;
|
|
Packit |
47f805 |
id3tag_set_pad(gfp, int_value);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("genre-list")
|
|
Packit |
47f805 |
id3tag_genre_list(genre_list_handler, NULL);
|
|
Packit |
47f805 |
return -2;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("lowpass")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
if (double_value < 0) {
|
|
Packit |
47f805 |
lame_set_lowpassfreq(gfp, -1);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
/* useful are 0.001 kHz...50 kHz, 50 Hz...50000 Hz */
|
|
Packit |
47f805 |
if (double_value < 0.001 || double_value > 50000.) {
|
|
Packit |
47f805 |
error_printf("Must specify lowpass with --lowpass freq, freq >= 0.001 kHz\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
lame_set_lowpassfreq(gfp, (int) (double_value * (double_value < 50. ? 1.e3 : 1.e0) + 0.5));
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("lowpass-width")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
/* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */
|
|
Packit |
47f805 |
if (double_value < 0.001 || double_value > 50000.) {
|
|
Packit |
47f805 |
error_printf
|
|
Packit |
47f805 |
("Must specify lowpass width with --lowpass-width freq, freq >= 0.001 kHz\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
lame_set_lowpasswidth(gfp, (int) (double_value * (double_value < 16. ? 1.e3 : 1.e0) + 0.5));
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("highpass")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
if (double_value < 0.0) {
|
|
Packit |
47f805 |
lame_set_highpassfreq(gfp, -1);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
/* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */
|
|
Packit |
47f805 |
if (double_value < 0.001 || double_value > 50000.) {
|
|
Packit |
47f805 |
error_printf("Must specify highpass with --highpass freq, freq >= 0.001 kHz\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
lame_set_highpassfreq(gfp, (int) (double_value * (double_value < 16. ? 1.e3 : 1.e0) + 0.5));
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("highpass-width")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
/* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */
|
|
Packit |
47f805 |
if (double_value < 0.001 || double_value > 50000.) {
|
|
Packit |
47f805 |
error_printf
|
|
Packit |
47f805 |
("Must specify highpass width with --highpass-width freq, freq >= 0.001 kHz\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
lame_set_highpasswidth(gfp, (int) double_value);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("comp")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
if (double_value < 1.0) {
|
|
Packit |
47f805 |
error_printf("Must specify compression ratio >= 1.0\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
lame_set_compression_ratio(gfp, (float) double_value);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* some more GNU-ish options could be added
|
|
Packit |
47f805 |
* brief => few messages on screen (name, status report)
|
|
Packit |
47f805 |
* o/output file => specifies output filename
|
|
Packit |
47f805 |
* O => stdout
|
|
Packit |
47f805 |
* i/input file => specifies input filename
|
|
Packit |
47f805 |
* I => stdin
|
|
Packit |
47f805 |
*/
|
|
Packit |
47f805 |
T_ELIF("quiet")
|
|
Packit |
47f805 |
global_ui_config.silent = 10; /* on a scale from 1 to 10 be very silent */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("silent")
|
|
Packit |
47f805 |
global_ui_config.silent = 9;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("brief")
|
|
Packit |
47f805 |
global_ui_config.silent = -5; /* print few info on screen */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("verbose")
|
|
Packit |
47f805 |
global_ui_config.silent = -10; /* print a lot on screen */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF2("version", "license")
|
|
Packit |
47f805 |
print_license(stdout);
|
|
Packit |
47f805 |
return -2;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF2("help", "usage")
|
|
Packit |
47f805 |
if (0 == local_strncasecmp(nextArg, "id3", 3)) {
|
|
Packit |
47f805 |
help_id3tag(stdout);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else if (0 == local_strncasecmp(nextArg, "dev", 3)) {
|
|
Packit |
47f805 |
help_developer_switches(stdout);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
short_help(gfp, stdout, ProgramName);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return -2;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("longhelp")
|
|
Packit |
47f805 |
long_help(gfp, stdout, ProgramName, 0 /* lessmode=NO */ );
|
|
Packit |
47f805 |
return -2;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("?")
|
|
Packit |
47f805 |
#ifdef __unix__
|
|
Packit |
47f805 |
FILE *fp = popen("less -Mqc", "w");
|
|
Packit |
47f805 |
long_help(gfp, fp, ProgramName, 0 /* lessmode=NO */ );
|
|
Packit |
47f805 |
pclose(fp);
|
|
Packit |
47f805 |
#else
|
|
Packit |
47f805 |
long_help(gfp, stdout, ProgramName, 1 /* lessmode=YES */ );
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
return -2;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF2("preset", "alt-preset")
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int fast = 0, cbr = 0;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
while ((strcmp(nextArg, "fast") == 0) || (strcmp(nextArg, "cbr") == 0)) {
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if ((strcmp(nextArg, "fast") == 0) && (fast < 1))
|
|
Packit |
47f805 |
fast = 1;
|
|
Packit |
47f805 |
if ((strcmp(nextArg, "cbr") == 0) && (cbr < 1))
|
|
Packit |
47f805 |
cbr = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
argUsed++;
|
|
Packit |
47f805 |
nextArg = i + argUsed < argc ? argv[i + argUsed] : "";
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (presets_set(gfp, fast, cbr, nextArg, ProgramName) < 0)
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("disptime")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
global_ui_config.update_interval = (float) double_value;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("nogaptags")
|
|
Packit |
47f805 |
nogap_tags = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("nogapout")
|
|
Packit |
47f805 |
int const arg_n = strnlen(nextArg, PATH_MAX);
|
|
Packit |
47f805 |
if (arg_n >= PATH_MAX) {
|
|
Packit |
47f805 |
error_printf("%s: %s argument length (%d) exceeds limit (%d)\n", ProgramName, token, arg_n, PATH_MAX);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
strncpy(outPath, nextArg, PATH_MAX);
|
|
Packit |
47f805 |
outPath[PATH_MAX] = '\0';
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("out-dir")
|
|
Packit |
47f805 |
int const arg_n = strnlen(nextArg, PATH_MAX);
|
|
Packit |
47f805 |
if (arg_n >= PATH_MAX) {
|
|
Packit |
47f805 |
error_printf("%s: %s argument length (%d) exceeds limit (%d)\n", ProgramName, token, arg_n, PATH_MAX);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
strncpy(outDir, nextArg, PATH_MAX);
|
|
Packit |
47f805 |
outDir[PATH_MAX] = '\0';
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("nogap")
|
|
Packit |
47f805 |
nogap = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("swap-channel")
|
|
Packit |
47f805 |
global_reader.swap_channel = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF("ignorelength")
|
|
Packit |
47f805 |
global_reader.ignorewavlength = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF ("athaa-sensitivity")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
lame_set_athaa_sensitivity(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* ---------------- lots of dead switches ---------------- */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("noshort")
|
|
Packit |
47f805 |
(void) lame_set_no_short_blocks(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("short")
|
|
Packit |
47f805 |
(void) lame_set_no_short_blocks(gfp, 0);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("allshort")
|
|
Packit |
47f805 |
(void) lame_set_force_short_blocks(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("notemp")
|
|
Packit |
47f805 |
(void) lame_set_useTemporal(gfp, 0);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("interch")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_interChRatio(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("temporal-masking")
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_useTemporal(gfp, int_value ? 1 : 0);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("nspsytune")
|
|
Packit |
47f805 |
;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("nssafejoint")
|
|
Packit |
47f805 |
lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("nsmsfix")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_msfix(gfp, double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("ns-bass")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
int k = (int) (double_value * 4);
|
|
Packit |
47f805 |
if (k < -32)
|
|
Packit |
47f805 |
k = -32;
|
|
Packit |
47f805 |
if (k > 31)
|
|
Packit |
47f805 |
k = 31;
|
|
Packit |
47f805 |
if (k < 0)
|
|
Packit |
47f805 |
k += 64;
|
|
Packit |
47f805 |
lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 2));
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("ns-alto")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
int k = (int) (double_value * 4);
|
|
Packit |
47f805 |
if (k < -32)
|
|
Packit |
47f805 |
k = -32;
|
|
Packit |
47f805 |
if (k > 31)
|
|
Packit |
47f805 |
k = 31;
|
|
Packit |
47f805 |
if (k < 0)
|
|
Packit |
47f805 |
k += 64;
|
|
Packit |
47f805 |
lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 8));
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("ns-treble")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
int k = (int) (double_value * 4);
|
|
Packit |
47f805 |
if (k < -32)
|
|
Packit |
47f805 |
k = -32;
|
|
Packit |
47f805 |
if (k > 31)
|
|
Packit |
47f805 |
k = 31;
|
|
Packit |
47f805 |
if (k < 0)
|
|
Packit |
47f805 |
k += 64;
|
|
Packit |
47f805 |
lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 14));
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("ns-sfb21")
|
|
Packit |
47f805 |
/* to be compatible with Naoki's original code,
|
|
Packit |
47f805 |
* ns-sfb21 specifies how to change ns-treble for sfb21 */
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
int k = (int) (double_value * 4);
|
|
Packit |
47f805 |
if (k < -32)
|
|
Packit |
47f805 |
k = -32;
|
|
Packit |
47f805 |
if (k > 31)
|
|
Packit |
47f805 |
k = 31;
|
|
Packit |
47f805 |
if (k < 0)
|
|
Packit |
47f805 |
k += 64;
|
|
Packit |
47f805 |
lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 20));
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("tune") /*without helptext */
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
lame_set_tune(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("shortthreshold")
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
float x, y;
|
|
Packit |
47f805 |
int n = sscanf(nextArg, "%f,%f", &x, &y);
|
|
Packit |
47f805 |
if (n == 1) {
|
|
Packit |
47f805 |
y = x;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
(void) lame_set_short_threshold(gfp, x, y);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("maskingadjust") /*without helptext */
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_maskingadjust(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("maskingadjustshort") /*without helptext */
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_maskingadjust_short(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("athcurve") /*without helptext */
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_ATHcurve(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("no-preset-tune") /*without helptext */
|
|
Packit |
47f805 |
(void) lame_set_preset_notune(gfp, 0);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("substep")
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_substep(gfp, int_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("sbgain") /*without helptext */
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_subblock_gain(gfp, int_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("sfscale") /*without helptext */
|
|
Packit |
47f805 |
(void) lame_set_sfscale(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("noath")
|
|
Packit |
47f805 |
(void) lame_set_noATH(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("athonly")
|
|
Packit |
47f805 |
(void) lame_set_ATHonly(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL("athshort")
|
|
Packit |
47f805 |
(void) lame_set_ATHshort(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("athlower")
|
|
Packit |
47f805 |
argUsed = getDoubleValue(token, nextArg, &double_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_ATHlower(gfp, (float) double_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("athtype")
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_ATHtype(gfp, int_value);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("athaa-type") /* switch for developing, no DOCU */
|
|
Packit |
47f805 |
/* once was 1:Gaby, 2:Robert, 3:Jon, else:off */
|
|
Packit |
47f805 |
argUsed = getIntValue(token, nextArg, &int_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_athaa_type(gfp, int_value); /* now: 0:off else:Jon */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELIF_INTERNAL_WITH_ARG("debug-file") /* switch for developing, no DOCU */
|
|
Packit |
47f805 |
/* file name to print debug info into */
|
|
Packit |
47f805 |
set_debug_file(nextArg);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
T_ELSE {
|
|
Packit |
47f805 |
if (!argIgnored) {
|
|
Packit |
47f805 |
error_printf("%s: unrecognized option --%s\n", ProgramName, token);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
argIgnored = 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
T_END i += argUsed;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
while ((c = *token++) != '\0') {
|
|
Packit |
47f805 |
double double_value = 0;
|
|
Packit |
47f805 |
int int_value = 0;
|
|
Packit |
47f805 |
arg = *token ? token : nextArg;
|
|
Packit |
47f805 |
switch (c) {
|
|
Packit |
47f805 |
case 'm':
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
switch (*arg) {
|
|
Packit |
47f805 |
case 's':
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, STEREO);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'd':
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, DUAL_CHANNEL);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'f':
|
|
Packit |
47f805 |
lame_set_force_ms(gfp, 1);
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, JOINT_STEREO);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'j':
|
|
Packit |
47f805 |
lame_set_force_ms(gfp, 0);
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, JOINT_STEREO);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'm':
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, MONO);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'l':
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, MONO);
|
|
Packit |
47f805 |
(void) lame_set_scale_left(gfp, 2);
|
|
Packit |
47f805 |
(void) lame_set_scale_right(gfp, 0);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'r':
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, MONO);
|
|
Packit |
47f805 |
(void) lame_set_scale_left(gfp, 0);
|
|
Packit |
47f805 |
(void) lame_set_scale_right(gfp, 2);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'a': /* same as 'j' ??? */
|
|
Packit |
47f805 |
lame_set_force_ms(gfp, 0);
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, JOINT_STEREO);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
default:
|
|
Packit |
47f805 |
error_printf("%s: -m mode must be s/d/f/j/m/l/r not %s\n", ProgramName,
|
|
Packit |
47f805 |
arg);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
case 'V':
|
|
Packit |
47f805 |
argUsed = getDoubleValue("V", arg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
/* to change VBR default look in lame.h */
|
|
Packit |
47f805 |
if (lame_get_VBR(gfp) == vbr_off)
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_default);
|
|
Packit |
47f805 |
lame_set_VBR_quality(gfp, (float) double_value);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'v':
|
|
Packit |
47f805 |
/* to change VBR default look in lame.h */
|
|
Packit |
47f805 |
if (lame_get_VBR(gfp) == vbr_off)
|
|
Packit |
47f805 |
lame_set_VBR(gfp, vbr_default);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
case 'q':
|
|
Packit |
47f805 |
argUsed = getIntValue("q", arg, &int_value);
|
|
Packit |
47f805 |
if (argUsed)
|
|
Packit |
47f805 |
(void) lame_set_quality(gfp, int_value);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'f':
|
|
Packit |
47f805 |
(void) lame_set_quality(gfp, 7);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'h':
|
|
Packit |
47f805 |
(void) lame_set_quality(gfp, 2);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
case 's':
|
|
Packit |
47f805 |
argUsed = getDoubleValue("s", arg, &double_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
double_value = (int) (double_value * (double_value <= 192 ? 1.e3 : 1.e0) + 0.5);
|
|
Packit |
47f805 |
global_reader.input_samplerate = (int)double_value;
|
|
Packit |
47f805 |
(void) lame_set_in_samplerate(gfp, (int)double_value);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'b':
|
|
Packit |
47f805 |
argUsed = getIntValue("b", arg, &int_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
lame_set_brate(gfp, int_value);
|
|
Packit |
47f805 |
lame_set_VBR_min_bitrate_kbps(gfp, lame_get_brate(gfp));
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'B':
|
|
Packit |
47f805 |
argUsed = getIntValue("B", arg, &int_value);
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
lame_set_VBR_max_bitrate_kbps(gfp, int_value);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'F':
|
|
Packit |
47f805 |
lame_set_VBR_hard_min(gfp, 1);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 't': /* dont write VBR tag */
|
|
Packit |
47f805 |
(void) lame_set_bWriteVbrTag(gfp, 0);
|
|
Packit |
47f805 |
global_decoder.disable_wav_header = 1;
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'T': /* do write VBR tag */
|
|
Packit |
47f805 |
(void) lame_set_bWriteVbrTag(gfp, 1);
|
|
Packit |
47f805 |
nogap_tags = 1;
|
|
Packit |
47f805 |
global_decoder.disable_wav_header = 0;
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'r': /* force raw pcm input file */
|
|
Packit |
47f805 |
#if defined(LIBSNDFILE)
|
|
Packit |
47f805 |
error_printf
|
|
Packit |
47f805 |
("WARNING: libsndfile may ignore -r and perform fseek's on the input.\n"
|
|
Packit |
47f805 |
"Compile without libsndfile if this is a problem.\n");
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
global_reader.input_format = sf_raw;
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'x': /* force byte swapping */
|
|
Packit |
47f805 |
global_reader.swapbytes = 1;
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'p': /* (jo) error_protection: add crc16 information to stream */
|
|
Packit |
47f805 |
lame_set_error_protection(gfp, 1);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'a': /* autoconvert input file from stereo to mono - for mono mp3 encoding */
|
|
Packit |
47f805 |
autoconvert = 1;
|
|
Packit |
47f805 |
(void) lame_set_mode(gfp, MONO);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'd': /*(void) lame_set_allow_diff_short( gfp, 1 ); */
|
|
Packit |
47f805 |
case 'k': /*lame_set_lowpassfreq(gfp, -1);
|
|
Packit |
47f805 |
lame_set_highpassfreq(gfp, -1); */
|
|
Packit |
47f805 |
error_printf("WARNING: -%c is obsolete.\n", c);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'S':
|
|
Packit |
47f805 |
global_ui_config.silent = 5;
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'X':
|
|
Packit |
47f805 |
/* experimental switch -X:
|
|
Packit |
47f805 |
the differnt types of quant compare are tough
|
|
Packit |
47f805 |
to communicate to endusers, so they shouldn't
|
|
Packit |
47f805 |
bother to toy around with them
|
|
Packit |
47f805 |
*/
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int x, y;
|
|
Packit |
47f805 |
int n = sscanf(arg, "%d,%d", &x, &y);
|
|
Packit |
47f805 |
if (n == 1) {
|
|
Packit |
47f805 |
y = x;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
if (internal_opts_enabled) {
|
|
Packit |
47f805 |
lame_set_quant_comp(gfp, x);
|
|
Packit |
47f805 |
lame_set_quant_comp_short(gfp, y);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'Y':
|
|
Packit |
47f805 |
lame_set_experimentalY(gfp, 1);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'Z':
|
|
Packit |
47f805 |
/* experimental switch -Z:
|
|
Packit |
47f805 |
*/
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int n = 1;
|
|
Packit |
47f805 |
argUsed = sscanf(arg, "%d", &n);
|
|
Packit |
47f805 |
/*if (internal_opts_enabled)*/
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
lame_set_experimentalZ(gfp, n);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'e':
|
|
Packit |
47f805 |
argUsed = 1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
switch (*arg) {
|
|
Packit |
47f805 |
case 'n':
|
|
Packit |
47f805 |
lame_set_emphasis(gfp, 0);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case '5':
|
|
Packit |
47f805 |
lame_set_emphasis(gfp, 1);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'c':
|
|
Packit |
47f805 |
lame_set_emphasis(gfp, 3);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
default:
|
|
Packit |
47f805 |
error_printf("%s: -e emp must be n/5/c not %s\n", ProgramName, arg);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'c':
|
|
Packit |
47f805 |
lame_set_copyright(gfp, 1);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
case 'o':
|
|
Packit |
47f805 |
lame_set_original(gfp, 0);
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
case '?':
|
|
Packit |
47f805 |
long_help(gfp, stdout, ProgramName, 0 /* LESSMODE=NO */ );
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
default:
|
|
Packit |
47f805 |
error_printf("%s: unrecognized option -%c\n", ProgramName, c);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (argUsed) {
|
|
Packit |
47f805 |
if (arg == token)
|
|
Packit |
47f805 |
token = ""; /* no more from token */
|
|
Packit |
47f805 |
else
|
|
Packit |
47f805 |
++i; /* skip arg we used */
|
|
Packit |
47f805 |
arg = "";
|
|
Packit |
47f805 |
argUsed = 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
if (nogap) {
|
|
Packit |
47f805 |
if ((num_nogap != NULL) && (count_nogap < *num_nogap)) {
|
|
Packit |
47f805 |
strncpy(nogap_inPath[count_nogap++], argv[i], PATH_MAX + 1);
|
|
Packit |
47f805 |
input_file = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
/* sorry, calling program did not allocate enough space */
|
|
Packit |
47f805 |
error_printf
|
|
Packit |
47f805 |
("Error: 'nogap option'. Calling program does not allow nogap option, or\n"
|
|
Packit |
47f805 |
"you have exceeded maximum number of input files for the nogap option\n");
|
|
Packit |
47f805 |
*num_nogap = -1;
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
/* normal options: inputfile [outputfile], and
|
|
Packit |
47f805 |
either one can be a '-' for stdin/stdout */
|
|
Packit |
47f805 |
if (inPath[0] == '\0') {
|
|
Packit |
47f805 |
strncpy(inPath, argv[i], PATH_MAX + 1);
|
|
Packit |
47f805 |
input_file = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
if (outPath[0] == '\0')
|
|
Packit |
47f805 |
strncpy(outPath, argv[i], PATH_MAX + 1);
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
error_printf("%s: excess arg %s\n", ProgramName, argv[i]);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
} /* loop over args */
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (!input_file) {
|
|
Packit |
47f805 |
usage(Console_IO.Console_fp, ProgramName);
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (lame_get_decode_only(gfp) && count_nogap > 0) {
|
|
Packit |
47f805 |
error_printf("combination of nogap and decode not supported!\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (inPath[0] == '-') {
|
|
Packit |
47f805 |
if (global_ui_config.silent == 0) { /* user didn't overrule default behaviour */
|
|
Packit |
47f805 |
global_ui_config.silent = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#ifdef WIN32
|
|
Packit |
47f805 |
else
|
|
Packit |
47f805 |
dosToLongFileName(inPath);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (outPath[0] == '\0') { /* no explicit output dir or file */
|
|
Packit |
47f805 |
if (count_nogap > 0) { /* in case of nogap encode */
|
|
Packit |
47f805 |
strncpy(outPath, outDir, PATH_MAX);
|
|
Packit |
47f805 |
outPath[PATH_MAX] = '\0'; /* whatever someone set via --out-dir <path> argument */
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else if (inPath[0] == '-') {
|
|
Packit |
47f805 |
/* if input is stdin, default output is stdout */
|
|
Packit |
47f805 |
strcpy(outPath, "-");
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
char const* s_ext = lame_get_decode_only(gfp) ? ".wav" : ".mp3";
|
|
Packit |
47f805 |
if (generateOutPath(inPath, outDir, s_ext, outPath) != 0) {
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* RG is enabled by default */
|
|
Packit |
47f805 |
if (!noreplaygain)
|
|
Packit |
47f805 |
lame_set_findReplayGain(gfp, 1);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* disable VBR tags with nogap unless the VBR tags are forced */
|
|
Packit |
47f805 |
if (nogap && lame_get_bWriteVbrTag(gfp) && nogap_tags == 0) {
|
|
Packit |
47f805 |
console_printf("Note: Disabling VBR Xing/Info tag since it interferes with --nogap\n");
|
|
Packit |
47f805 |
lame_set_bWriteVbrTag(gfp, 0);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* some file options not allowed with stdout */
|
|
Packit |
47f805 |
if (outPath[0] == '-') {
|
|
Packit |
47f805 |
(void) lame_set_bWriteVbrTag(gfp, 0); /* turn off VBR tag */
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* if user did not explicitly specify input is mp3, check file name */
|
|
Packit |
47f805 |
if (global_reader.input_format == sf_unknown)
|
|
Packit |
47f805 |
global_reader.input_format = filename_to_type(inPath);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#if !(defined HAVE_MPGLIB || defined AMIGA_MPEGA)
|
|
Packit |
47f805 |
if (is_mpeg_file_format(global_reader.input_format)) {
|
|
Packit |
47f805 |
error_printf("Error: libmp3lame not compiled with mpg123 *decoding* support \n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* default guess for number of channels */
|
|
Packit |
47f805 |
if (autoconvert)
|
|
Packit |
47f805 |
(void) lame_set_num_channels(gfp, 2);
|
|
Packit |
47f805 |
else if (MONO == lame_get_mode(gfp))
|
|
Packit |
47f805 |
(void) lame_set_num_channels(gfp, 1);
|
|
Packit |
47f805 |
else
|
|
Packit |
47f805 |
(void) lame_set_num_channels(gfp, 2);
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
if (lame_get_free_format(gfp)) {
|
|
Packit |
47f805 |
if (lame_get_brate(gfp) < 8 || lame_get_brate(gfp) > 640) {
|
|
Packit |
47f805 |
error_printf("For free format, specify a bitrate between 8 and 640 kbps\n");
|
|
Packit |
47f805 |
error_printf("with the -b <bitrate> option\n");
|
|
Packit |
47f805 |
return -1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (num_nogap != NULL)
|
|
Packit |
47f805 |
*num_nogap = count_nogap;
|
|
Packit |
47f805 |
return 0;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
string_to_argv(char* str, char** argv, int N)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int argc = 0;
|
|
Packit |
47f805 |
if (str == 0) return argc;
|
|
Packit |
47f805 |
argv[argc++] = "lhama";
|
|
Packit |
47f805 |
for (;;) {
|
|
Packit |
47f805 |
int quoted = 0;
|
|
Packit |
47f805 |
while (isspace(*str)) { /* skip blanks */
|
|
Packit |
47f805 |
++str;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (*str == '\"') { /* is quoted argument ? */
|
|
Packit |
47f805 |
quoted = 1;
|
|
Packit |
47f805 |
++str;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
if (*str == '\0') { /* end of string reached */
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
/* found beginning of some argument */
|
|
Packit |
47f805 |
if (argc < N) {
|
|
Packit |
47f805 |
argv[argc++] = str;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
/* look out for end of argument, either end of string, blank or quote */
|
|
Packit |
47f805 |
for(; *str != '\0'; ++str) {
|
|
Packit |
47f805 |
if (quoted) {
|
|
Packit |
47f805 |
if (*str == '\"') { /* end of quotation reached */
|
|
Packit |
47f805 |
*str++ = '\0';
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
else {
|
|
Packit |
47f805 |
if (isspace(*str)) { /* parameter separator reached */
|
|
Packit |
47f805 |
*str++ = '\0';
|
|
Packit |
47f805 |
break;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return argc;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
static int
|
|
Packit |
47f805 |
merge_argv(int argc, char** argv, int str_argc, char** str_argv, int N)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int i;
|
|
Packit |
47f805 |
if (argc > 0) {
|
|
Packit |
47f805 |
str_argv[0] = argv[0];
|
|
Packit |
47f805 |
if (str_argc < 1) str_argc = 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
for (i = 1; i < argc; ++i) {
|
|
Packit |
47f805 |
int j = str_argc + i - 1;
|
|
Packit |
47f805 |
if (j < N) {
|
|
Packit |
47f805 |
str_argv[j] = argv[i];
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
return argc + str_argc - 1;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
#ifdef DEBUG
|
|
Packit |
47f805 |
static void
|
|
Packit |
47f805 |
dump_argv(int argc, char** argv)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
int i;
|
|
Packit |
47f805 |
for (i = 0; i < argc; ++i) {
|
|
Packit |
47f805 |
printf("%d: \"%s\"\n",i,argv[i]);
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
int parse_args(lame_t gfp, int argc, char **argv, char *const inPath, char *const outPath, char **nogap_inPath, int *num_nogap)
|
|
Packit |
47f805 |
{
|
|
Packit |
47f805 |
char *str_argv[512], *str;
|
|
Packit |
47f805 |
int str_argc, ret;
|
|
Packit |
47f805 |
str = lame_getenv("LAMEOPT");
|
|
Packit |
47f805 |
str_argc = string_to_argv(str, str_argv, dimension_of(str_argv));
|
|
Packit |
47f805 |
str_argc = merge_argv(argc, argv, str_argc, str_argv, dimension_of(str_argv));
|
|
Packit |
47f805 |
#ifdef DEBUG
|
|
Packit |
47f805 |
dump_argv(str_argc, str_argv);
|
|
Packit |
47f805 |
#endif
|
|
Packit |
47f805 |
ret = parse_args_(gfp, str_argc, str_argv, inPath, outPath, nogap_inPath, num_nogap);
|
|
Packit |
47f805 |
free(str);
|
|
Packit |
47f805 |
return ret;
|
|
Packit |
47f805 |
}
|
|
Packit |
47f805 |
|
|
Packit |
47f805 |
/* end of parse.c */
|