Subversion Repositories shark

Rev

Rev 1655 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1655 giacomo 1
 
2
#include "mpg123/mpg123.h"
3
#include <stdlib.h>
4
 
5
/* stub */
6
FILE *http_open (char *url)
7
{
8
  return NULL;
9
}
10
 
11
 
12
 
13
static long rates[3][3] = {
14
 { 32000,44100,48000 } ,
15
 { 16000,22050,24000 } ,
16
 {  8000,11025,12000 }
17
};
18
 
19
int supported_rates = 0;
20
 
21
int outmode = DECODE_AUDIO;
22
 
23
char *listname = NULL;
24
long outscale  = 32768;
25
int checkrange = FALSE;
26
int tryresync  = TRUE;
27
int quiet      = FALSE;
28
int verbose    = 0;
29
int doublespeed= 0;
30
int halfspeed  = 0;
31
int shuffle = 0;
32
int change_always = 1;
33
int force_8bit = 0;
34
int force_frequency = -1;
35
long numframes = -1;
36
long startFrame= 0;
37
int usebuffer  = 0;
38
int frontend_type = 0;
39
int remote     = 0;
40
int buffer_fd[2];
41
int buffer_pid;
42
 
43
 
44
static int intflag = FALSE;
45
static int remflag = FALSE;
46
 
47
 
48
static char remote_buffer[1024];
49
static struct frame fr;
50
static struct audio_info_struct ai;
51
txfermem *buffermem;
52
#define FRAMEBUFUNIT (18 * 64 * 4)
53
 
54
void init_output(void)
55
{
56
  static int init_done = FALSE;
57
 
58
  if (init_done)
59
    return;
60
  init_done = TRUE;
61
 
62
  if (!(pcm_sample = (unsigned char *) malloc(audiobufsize * 2))) {
63
    perror ("malloc()");
64
    l1_exit (1);
65
 
66
  }
67
 
68
  if(outmode==DECODE_AUDIO) {
69
    //if(audio_open(&ai) < 0) {
70
    //  perror("audio");
71
    //  exit(1);
72
    // }
73
    /* audio_set_rate (&ai);  should already be done in audio_open() [OF] */
74
  }
75
}
76
 
77
static void reset_audio_samplerate(void)
78
{
79
 
80
  //if (outmode == DECODE_AUDIO) {
81
    /* audio_reset_parameters(&ai); */
82
    /*   close and re-open in order to flush
83
     *   the device's internal buffer before
84
     *   changing the sample rate.   [OF]
85
     */
86
  //audio_close (&ai);
87
    //if (audio_open(&ai) < 0) {
88
  //  perror("audio");
89
  //   exit(1);
90
  // }
91
  // }
92
}
93
 
94
void play_frame(int init,struct frame *fr)
95
{
96
  int clip;
97
 
98
  if((fr->header_change && change_always) || init) {
99
    int reset_audio = 0;
100
 
101
    if(remote)
102
      print_rheader(fr);
103
 
104
    if (!quiet && init) {
105
      if (verbose)
106
        print_header(fr);
107
      else
108
        print_header_compact(fr);
109
    }
110
 
111
    if(force_frequency < 0) {
112
      if(ai.rate != freqs[fr->sampling_frequency]>>(fr->down_sample)) {
113
        ai.rate = freqs[fr->sampling_frequency]>>(fr->down_sample);
114
        reset_audio = 1;
115
      }
116
    }
117
    else if(ai.rate != force_frequency) {
118
      ai.rate = force_frequency;
119
      reset_audio = 1;
120
    }
121
 
122
    init_output();
123
 
124
    if(reset_audio) {
125
      reset_audio_samplerate();
126
      if (intflag)
127
        return;
128
    }
129
  }
130
 
131
  if (fr->error_protection) {
132
    getbits(16); /* crc */
133
  }
134
 
135
  clip = (fr->do_layer)(fr,outmode,&ai);
136
 
137
  /*
138
  if(clip > 0 && checkrange)
139
    fprintf(stderr,"%d samples clipped\n", clip);
140
  */
141
}
142
 
143
void audio_info_struct_init(struct audio_info_struct *ai)
144
{
145
  ai->rate = -1;
146
  ai->gain = -1;
147
  ai->output = -1;
148
  ai->device = NULL;
149
  ai->channels = -1;
150
  ai->format = -1;
151
}
152
 
153
int audio_play_samples(struct audio_info_struct *ai, unsigned char *buf, int n)
154
{
155
  return 0;
156
}
157
 
158
 
159
int main(int argc,char *argv[])
160
{
161
  static char *fname="/MOSSE.MP3";
162
  int result;
163
  unsigned long frameNum = 0;
164
  //struct timeval start_time, now;
165
  unsigned long secdiff;
166
  int init;
167
 
168
 
169
  quiet=0;
170
  verbose=1;
171
 
172
  // DECODE_STDOUT stampa to 1
173
  // DECODE_AUDIO chiama la audio_play_samples
174
  // DECODE_BUFFER scrive su buffer_fd[1]
175
  outmode = DECODE_AUDIO;
176
 
177
  audio_info_struct_init(&ai);
178
 
179
  fr.single = -1; /* both channels */
180
  fr.synth = synth_1to1;
181
  fr.down_sample = 0;
182
 
183
  make_decode_tables(outscale);
184
  init_layer2();
185
  init_layer3(fr.down_sample);
186
 
187
  open_stream(fname,-1);
188
 
189
  //gettimeofday (&start_time, NULL);
190
  read_frame_init();
191
 
192
  init = 1;
193
  for(frameNum=0;read_frame(&fr) && numframes && !intflag;frameNum++) {
194
    if(frameNum < startFrame || (doublespeed && (frameNum % doublespeed))) {
195
      if(fr.lay == 3)
196
        set_pointer(512);
197
      continue;
198
    }
199
    numframes--;
200
    play_frame(init,&fr);
201
    init = 0;
202
      if (!(frameNum & 0xf))
203
        fprintf(stderr, "\r{%4lu} ",frameNum);
204
  }
205
 
206
  close_stream();
207
 
208
  {
209
    /* This formula seems to work at least for
210
     * MPEG 1.0/2.0 layer 3 streams.
211
     */
212
    int sfd = freqs[fr.sampling_frequency] * (fr.lsf + 1);
213
    int secs = (frameNum * (fr.lay==1 ? 384 : 1152) + sfd / 2) / sfd;
214
    fprintf(stderr,"[%d:%02d] Decoding of %s finished.\n", secs / 60,
215
            secs % 60, fname);
216
  }
217
 
218
}
219