📄 madplay.c
字号:
/* * madplay - MPEG audio decoder and player * Copyright (C) 2000-2004 Robert Leslie * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: madplay.c,v 1.85 2004/02/17 02:26:43 rob Exp $ */# ifdef HAVE_CONFIG_H# include "config.h"# endif# include "global.h"/* include this first to avoid conflicts with MinGW __argc et al. */# include "getopt.h"# include <locale.h># include <stdio.h># include <stdarg.h># include <stdlib.h># include <string.h># ifdef HAVE_ASSERT_H# include <assert.h># endif# ifdef HAVE_UNISTD_H# include <unistd.h># endif# ifdef HAVE_FCNTL_H# include <fcntl.h># endif# include <ctype.h>//# include <mad.h># include "mad.h"# include "gettext.h"# include "audio.h"# include "player.h"# define FADE_DEFAULT "0:05"# if defined(EXPERIMENTAL)static int external_mix;static int experimental;# endifstaticstruct option const options[] = { { "adjust-volume", required_argument, 0, 'A' }, { "amplify", required_argument, 0, 'a' }, { "ancillary-output", required_argument, 0, -'a' }, { "attenuate", required_argument, 0, 'a' }, { "bit-depth", required_argument, 0, 'b' }, { "display-time", required_argument, 0, -'t' }, { "downsample", no_argument, 0, -'d' }, { "fade-in", optional_argument, 0, -'i' }, { "help", no_argument, 0, 'h' }, { "ignore-crc", no_argument, 0, 'i' }, { "left", no_argument, 0, '1' }, { "license", no_argument, 0, -'l' }, { "mono", no_argument, 0, 'm' }, { "no-dither", no_argument, 0, 'd' }, { "output", required_argument, 0, 'o' }, { "pre-amp", required_argument, 0, 'a' }, { "quiet", no_argument, 0, 'q' }, { "repeat", optional_argument, 0, 'r' }, { "replay-gain", optional_argument, 0, 'G' }, { "right", no_argument, 0, '2' }, { "sample-rate", required_argument, 0, 'R' }, { "show-tags-only", no_argument, 0, 'T' }, { "shuffle", no_argument, 0, 'z' }, { "start", required_argument, 0, 's' }, { "stereo", no_argument, 0, 'S' }, { "time", required_argument, 0, 't' }, { "verbose", no_argument, 0, 'v' }, { "version", no_argument, 0, 'V' }, { "very-quiet", no_argument, 0, 'Q' },# if defined(USE_TTY) { "tty-control", no_argument, 0, -'c' }, { "no-tty-control", no_argument, 0, -'C' },# endif# if 0 { "cross-fade", no_argument, 0, 'x' }, { "fade-out", optional_argument, 0, -'o' }, { "gap", required_argument, 0, 'g' },# endif# if defined(EXPERIMENTAL) { "external-mix", no_argument, &external_mix, 1 }, { "experimental", no_argument, &experimental, 1 },# endif { 0 }};char const *argv0;# define EPUTS(str) fputs(str, stream)# undef EPUTS/* * NAME: verror() * DESCRIPTION: print error message with program title prefix */staticvoid verror(char const *message, va_list args){ fprintf(stderr, "%s: ", argv0); vfprintf(stderr, message, args); fputc('\n', stderr);}/* * NAME: warn() * DESCRIPTION: print warning message */staticvoid warn(char const *message, ...){ va_list args; va_start(args, message); verror(message, args); va_end(args);}/* * NAME: get_options() * DESCRIPTION: parse command-line options or die */staticvoid get_options(int argc, char *argv[], struct player *player){ int opt, index; int ttyset = 0, preamp = 0; while ((opt = getopt_long(argc, argv, "vqQ" /* verbosity options */ "i" /* decoding options */ "o:b:R:da:A:G::" /* audio output options */# if 0 "g:x"# endif "12mS" /* channel selection options */ "s:t:zr::" /* playback options */ "TVh", /* miscellaneous options */ options, &index)) != -1) { switch (opt) { case 'o': player->output.path = optarg; player->output.command = audio_output(&player->output.path); if (!ttyset) player->options &= ~PLAYER_OPTION_TTYCONTROL; break; default: assert(!"option handler"); } } if (optind == argc) { exit(2); }}/* * NAME: main() * DESCRIPTION: program entry point */int main(int argc, char *argv[]){ struct player player; int result = 0; argv0 = argv[0];
/* ensure binary standard I/O */# if defined(_WIN32) _setmode(_fileno(stdin), _O_BINARY); _setmode(_fileno(stdout), _O_BINARY);# endif
/* internationalization support */# if defined(ENABLE_NLS) setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE);# endif /* initialize and get options */ player_init(&player); get_options(argc, argv, &player); /* main processing */ if (player.options & PLAYER_OPTION_CROSSFADE) { if (!(player.options & PLAYER_OPTION_GAP)) warn(_("cross-fade ignored without gap")); else if (mad_timer_sign(player.gap) >= 0) warn(_("cross-fade ignored without negative gap")); } if (player.output.replay_gain & RGAIN_ENABLED) { if (player.options & PLAYER_OPTION_IGNOREVOLADJ) warn(_("volume adjustment ignored with Replay Gain enabled")); else player.options |= PLAYER_OPTION_IGNOREVOLADJ; } if ((player.options & PLAYER_OPTION_SHOWTAGSONLY) && player.repeat != 1) { warn(_("ignoring repeat")); player.repeat = 1; } /* make stop time absolute */ if (player.options & PLAYER_OPTION_TIMED) mad_timer_add(&player.global_stop, player.global_start); /* get default audio output module */ if (player.output.command == 0 && !(player.options & PLAYER_OPTION_SHOWTAGSONLY)) player.output.command = audio_output(0);# if defined(EXPERIMENTAL) if (external_mix) { player.options |= PLAYER_OPTION_EXTERNALMIX; player.output.command = 0; } if (experimental) player.options |= PLAYER_OPTION_EXPERIMENTAL;# endif /* run the player */ if (player_run(&player, argc - optind, (char const **) &argv[optind]) == -1) result = 4; /* finish up */ player_finish(&player); //无返回值一个操作 return result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -