Subversion Repositories shark

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed


#include "mpg123/mpg123.h"
#include <stdlib.h>

/* stub */
FILE *http_open (char *url)
{
  return NULL;
}



static long rates[3][3] = {
 { 32000,44100,48000 } ,
 { 16000,22050,24000 } ,
 {  8000,11025,12000 }
};

int supported_rates = 0;

int outmode = DECODE_AUDIO;

char *listname = NULL;
long outscale  = 32768;
int checkrange = FALSE;
int tryresync  = TRUE;
int quiet      = FALSE;
int verbose    = 0;
int doublespeed= 0;
int halfspeed  = 0;
int shuffle = 0;
int change_always = 1;
int force_8bit = 0;
int force_frequency = -1;
long numframes = -1;
long startFrame= 0;
int usebuffer  = 0;
int frontend_type = 0;
int remote     = 0;
int buffer_fd[2];
int buffer_pid;


static int intflag = FALSE;
static int remflag = FALSE;


static char remote_buffer[1024];
static struct frame fr;
static struct audio_info_struct ai;
txfermem *buffermem;
#define FRAMEBUFUNIT (18 * 64 * 4)

void init_output(void)
{
  static int init_done = FALSE;

  if (init_done)
    return;
  init_done = TRUE;

  if (!(pcm_sample = (unsigned char *) malloc(audiobufsize * 2))) {
    perror ("malloc()");
    l1_exit (1);

  }

  if(outmode==DECODE_AUDIO) {
    //if(audio_open(&ai) < 0) {
    //  perror("audio");
    //  exit(1);
    // }
    /* audio_set_rate (&ai);  should already be done in audio_open() [OF] */
  }
}

static void reset_audio_samplerate(void)
{

  //if (outmode == DECODE_AUDIO) {
    /* audio_reset_parameters(&ai); */
    /*   close and re-open in order to flush
     *   the device's internal buffer before
     *   changing the sample rate.   [OF]
     */

  //audio_close (&ai);
    //if (audio_open(&ai) < 0) {
  //  perror("audio");
  //   exit(1);
  // }
  // }
}

void play_frame(int init,struct frame *fr)
{
  int clip;

  if((fr->header_change && change_always) || init) {
    int reset_audio = 0;

    if(remote)
      print_rheader(fr);

    if (!quiet && init) {
      if (verbose)
        print_header(fr);
      else
        print_header_compact(fr);
    }

    if(force_frequency < 0) {
      if(ai.rate != freqs[fr->sampling_frequency]>>(fr->down_sample)) {
        ai.rate = freqs[fr->sampling_frequency]>>(fr->down_sample);
        reset_audio = 1;
      }
    }
    else if(ai.rate != force_frequency) {
      ai.rate = force_frequency;
      reset_audio = 1;
    }

    init_output();

    if(reset_audio) {
      reset_audio_samplerate();
      if (intflag)
        return;
    }
  }

  if (fr->error_protection) {
    getbits(16); /* crc */
  }

  clip = (fr->do_layer)(fr,outmode,&ai);

  /*
  if(clip > 0 && checkrange)
    fprintf(stderr,"%d samples clipped\n", clip);
  */

}

void audio_info_struct_init(struct audio_info_struct *ai)
{
  ai->rate = -1;
  ai->gain = -1;
  ai->output = -1;
  ai->device = NULL;
  ai->channels = -1;
  ai->format = -1;
}

int audio_play_samples(struct audio_info_struct *ai, unsigned char *buf, int n)
{
  return 0;
}


int main(int argc,char *argv[])
{
  static char *fname="/MOSSE.MP3";
  int result;
  unsigned long frameNum = 0;
  //struct timeval start_time, now;
  unsigned long secdiff;
  int init;


  quiet=0;
  verbose=1;

  // DECODE_STDOUT stampa to 1
  // DECODE_AUDIO chiama la audio_play_samples
  // DECODE_BUFFER scrive su buffer_fd[1]
  outmode = DECODE_AUDIO;

  audio_info_struct_init(&ai);

  fr.single = -1; /* both channels */
  fr.synth = synth_1to1;
  fr.down_sample = 0;
 
  make_decode_tables(outscale);
  init_layer2();
  init_layer3(fr.down_sample);

  open_stream(fname,-1);
     
  //gettimeofday (&start_time, NULL);
  read_frame_init();

  init = 1;
  for(frameNum=0;read_frame(&fr) && numframes && !intflag;frameNum++) {
    if(frameNum < startFrame || (doublespeed && (frameNum % doublespeed))) {
      if(fr.lay == 3)
        set_pointer(512);
      continue;
    }
    numframes--;
    play_frame(init,&fr);
    init = 0;
      if (!(frameNum & 0xf))
        fprintf(stderr, "\r{%4lu} ",frameNum);
  }

  close_stream();

  {
    /* This formula seems to work at least for
     * MPEG 1.0/2.0 layer 3 streams.
     */

    int sfd = freqs[fr.sampling_frequency] * (fr.lsf + 1);
    int secs = (frameNum * (fr.lay==1 ? 384 : 1152) + sfd / 2) / sfd;
    fprintf(stderr,"[%d:%02d] Decoding of %s finished.\n", secs / 60,
            secs % 60, fname);
  }

}