summaryrefslogtreecommitdiff
path: root/mad123.c
blob: 943b3fa33d017d985e5043a7f5df935887278dc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*
 * 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: mad123.c,v 1.8 2004/01/23 09:41:31 rob Exp $
 */

# ifdef HAVE_CONFIG_H
#  include "config.h"
# endif

# include "global.h"

# include <stdio.h>
# include <stdlib.h>

# include "getopt.h"

/* banner output from mpg123 */
/*
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3.
Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp.
Uses code from various people. See 'README' for more!
THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!

*/

/* short usage output from mpg123 */
/*
usage: mpg123 [option(s)] [file(s) | URL(s) | -]
supported options [defaults in brackets]:
   -v    increase verbosity level       -q    quiet (don't print title)
   -t    testmode (no output)           -s    write to stdout
   -w <filename> write Output as WAV file
   -k n  skip first n frames [0]        -n n  decode only n frames [all]
   -c    check range violations         -y    DISABLE resync on errors
   -b n  output buffer: n Kbytes [0]    -f n  change scalefactor [32768]
   -r n  set/force samplerate [auto]    -g n  set audio hardware output gain
   -os,-ol,-oh  output to built-in speaker,line-out connector,headphones
                                        -a d  set audio device
   -2    downsample 1:2 (22 kHz)        -4    downsample 1:4 (11 kHz)
   -d n  play every n'th frame only     -h n  play every frame n times
   -0    decode channel 0 (left) only   -1    decode channel 1 (right) only
   -m    mix both channels (mono)       -p p  use HTTP proxy p [$HTTP_PROXY]
   -@ f  read filenames/URLs from f
   -z    shuffle play (with wildcards)  -Z    random play
   -u a  HTTP authentication string     -E f  Equalizer, data from file
   -C    enable control keys
See the manpage mpg123(1) or call mpg123 with --longhelp for more information.
*/

/* long usage output from mpg123 */
/*
usage: mpg123 [option(s)] [file(s) | URL(s) | -]
supported options:

 -k <n> --skip <n>         
 -a <f> --audiodevice <f>  
 -2     --2to1             2:1 Downsampling
 -4     --4to1             4:1 Downsampling
 -t     --test             
 -s     --stdout           
 -S     --STDOUT           Play AND output stream (not implemented yet)
 -c     --check            
 -v[*]  --verbose          Increase verboselevel
 -q     --quiet            Enables quiet mode
 -y     --resync           DISABLES resync on error
 -0     --left --single0   Play only left channel
 -1     --right --single1  Play only right channel
 -m     --mono --mix       Mix stereo to mono
        --stereo           Duplicate mono channel
        --reopen           Force close/open on audiodevice
 -g     --gain             Set audio hardware output gain
 -r     --rate             Force a specific audio output rate
        --8bit             Force 8 bit output
 -o h   --headphones       Output on headphones
 -o s   --speaker          Output on speaker
 -o l   --lineout          Output to lineout
 -f <n> --scale <n>        Scale output samples (soft gain)
 -n     --frames <n>       Play only <n> frames of every stream
 -b <n> --buffer <n>       Set play buffer ("output cache")
 -d     --doublespeed      Play only every second frame
 -h     --halfspeed        Play every frame twice
 -p <f> --proxy <f>        Set WWW proxy
 -@ <f> --list <f>         Play songs in <f> file-list
 -z     --shuffle          Shuffle song-list before playing
 -Z     --random           full random play
        --equalizer        Exp.: scales freq. bands acrd. to 'equalizer.dat'
        --aggressive       Tries to get higher priority (nice)
 -u     --auth             Set auth values for HTTP access
 -w <f> --wav <f>          Writes samples as WAV file in <f> (- is stdout)
        --au <f>           Writes samples as Sun AU file in <f> (- is stdout)
        --cdr <f>          Writes samples as CDR file in <f> (- is stdout)
 -E <s> --esd <s>          Plays to  ESD server <s> 

See the manpage mpg123(1) for more information.
*/

static
struct option const options[] = {
  { "skip",        required_argument, 0,  'k' },
  { "audiodevice", required_argument, 0,  'a' },
  { "2to1",        no_argument,       0,  '2' },
  { "4to1",        no_argument,       0,  '4' },
  { "test",        no_argument,       0,  't' },
  { "stdout",      no_argument,       0,  's' },
  { "STDOUT",      no_argument,       0,  'S' },
  { "check",       no_argument,       0,  'c' },
  { "verbose",     no_argument,       0,  'v' },
  { "quiet",       no_argument,       0,  'q' },
  { "resync",      no_argument,       0,  'y' },
  { "left",        no_argument,       0,  '0' },
  { "single0",     no_argument,       0,  '0' },
  { "right",       no_argument,       0,  '1' },
  { "single1",     no_argument,       0,  '1' },
  { "mono",        no_argument,       0,  'm' },
  { "mix",         no_argument,       0,  'm' },
  { "stereo",      no_argument,       0, -'s' },
  { "reopen",      no_argument,       0, -'r' },
  { "gain",        required_argument, 0,  'g' },
  { "rate",        required_argument, 0,  'r' },
  { "8bit",        no_argument,       0, -'8' },
  { "headphones",  no_argument,       0,  'o' },
  { "speaker",     no_argument,       0,  'o' },
  { "lineout",     no_argument,       0,  'o' },
  { "scale",       required_argument, 0,  'f' },
  { "frames",      required_argument, 0,  'n' },
  { "buffer",      required_argument, 0,  'b' },
  { "doublespeed", required_argument, 0,  'd' },
  { "halfspeed",   required_argument, 0,  'h' },
  { "proxy",       required_argument, 0,  'p' },
  { "list",        required_argument, 0,  '@' },
  { "shuffle",     no_argument,       0,  'z' },
  { "random",      no_argument,       0,  'Z' },
  { "equalizer",   required_argument, 0,  'E' },
  { "aggressive",  no_argument,       0, -'a' },
  { "auth",        required_argument, 0,  'u' },
  { "wav",         required_argument, 0,  'w' },
  { "au",          required_argument, 0, -'m' },
  { "cdr",         required_argument, 0, -'c' },
  { "esd",         required_argument, 0, -'e' },
  { 0 }
};

static
struct {
  int verbosity;
} config = {
  0	/* verbosity */
};

int main(int argc, char *argv[])
{
  int opt, index;

  while ((opt = getopt_long(argc, argv,
			    "vqtsSw:k:n:cyb:f:r:g:o:a:24d:h:01mp:@:zZu:E:C",
			    options, &index)) != -1) {
    switch (opt) {
    case 'v':
      ++config.verbosity;
      break;

    case 'q':
      config.verbosity = -1;
      break;

    case '?':
      exit(1);
    }
  }

  if (config.verbosity >= 0) {
    fprintf(stderr,
	    "High Quality MPEG 1.0/2.0/2.5 Audio Player"
	    " for Layer I, II, and III.\n"
	    "Version 0.59r (2000/Oct/04)."
	    " Written and copyright by Robert Leslie.\n"
	    "Uses mpg123 command interface. See the documentation!\n"
	    "THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY!"
	    " USE AT YOUR OWN RISK!\n");
  }

  /* ... */

  return 0;
}