Пример #1
0
SAMPLE *alogg_create_sample_from_ogg(ALOGG_OGG *ogg) {
  SAMPLE *sample;
  char *data;
  int i, sample_len_bytes, sample_len, size_done, done;

  /* first we need to calculate the len of the sample in bytes */
  sample_len = ov_pcm_total(&(ogg->vf), -1);
  sample_len_bytes = (sample_len * (ogg->stereo ? 2 : 1)) * 2; /* / 2 = 16 bits */
  
  /* create the sample */
  sample = create_sample(16, ogg->stereo, ogg->freq, sample_len);

  /* return NULL if we were not able to allocate the memory for it */
  if (sample == NULL)
    return NULL;

  /* we need to stop and rewind the ogg */
  alogg_stop_ogg(ogg);
  alogg_rewind_ogg(ogg);

  /* set our pointer */
  data = (char *)sample->data;
  /* clear the sample buffer in unsigned format */
  {
    int i;
    unsigned short *j = (unsigned short *)data;
    for (i = 0; i < (sample_len_bytes / 2); i++, j++)
      *j = 0x8000;
  }

  /* decode */
  done = FALSE;
  size_done = 0;
  for (i = sample_len_bytes; !done && (i > 0); i -= size_done) {

    /* decode */
    size_done = ov_read(&(ogg->vf), data, i, 0, 2, 0, &(ogg->current_section));

    /* check if the decoding was not successful */
    if (size_done < 0) {
      if (size_done == OV_HOLE)
        size_done = 0;
      else {
        alogg_rewind_ogg(ogg);
        destroy_sample(sample);
        return NULL;
      }
    }
    else if (size_done == 0)
      done = TRUE;

    data += size_done;
  }

  alogg_rewind_ogg(ogg);

  return sample;
}
Пример #2
0
 void restart()
 {
   if (tune != NULL) {
     alogg_stop_ogg(tune);
     alogg_rewind_ogg(tune);
     alogg_play_ogg(tune, 16384, vol, panning);
     last_ms_offs = 0;
     last_but_one = 0;
     last_but_one_but_one = 0;
     done = 0;
     poll();
   }
 }
Пример #3
0
void MYSTATICOGG::restart()
{
    if (tune != NULL) {
        alogg_stop_ogg(tune);
        alogg_rewind_ogg(tune);
        alogg_play_ogg(tune, 16384, vol, panning);
        last_ms_offs = 0;
        last_but_one = 0;
        last_but_one_but_one = 0;
        done = 0;

        if (!psp_audio_multithreaded)
          poll();
    }
}
Пример #4
0
int alogg_poll_ogg(ALOGG_OGG *ogg) {
  void *audiobuf;
  char *audiobuf_p;
  int i, size_done;

  /* continue only if we are playing it */
  if (!alogg_is_playing_ogg(ogg))
    return ALOGG_POLL_NOTPLAYING;

  /* get the audio stream buffer and only continue if we need to fill it */
  audiobuf = get_audio_stream_buffer(ogg->audiostream);
  if (audiobuf == NULL)
    return ALOGG_OK;

  /* clear the buffer with 16bit unsigned data */
  {
    int i;
    unsigned short *j = (unsigned short *)audiobuf;
    for (i = 0; i < (ogg->audiostream_buffer_len / 2); i++, j++)
      *j = 0x8000;
  }

  /* if we need to fill it, but we were just waiting for it to finish */
  if (!ogg->loop) {
    if (ogg->wait_for_audio_stop > 0) {
      free_audio_stream_buffer(ogg->audiostream);
      if (--ogg->wait_for_audio_stop == 0) {
        /* stop it */
        //rest(500);
        alogg_stop_ogg(ogg);
        return ALOGG_POLL_PLAYJUSTFINISHED;
      }
      else
        return ALOGG_OK;
    }
  }

  audiobuf_p = (char *)audiobuf;
  size_done = 0;
  for (i = ogg->audiostream_buffer_len; i > 0; i -= size_done) {
    /* decode */
    size_done = ov_read(&(ogg->vf), audiobuf_p, i, 0, 2, 0, &(ogg->current_section));

    /* check if the decoding was not successful */
    if (size_done < 0) {
      if (size_done == OV_HOLE)
        size_done = 0;
      else {
        free_audio_stream_buffer(ogg->audiostream);
        alogg_stop_ogg(ogg);
        alogg_rewind_ogg(ogg);
        return ALOGG_POLL_FRAMECORRUPT;
      }
    }
    else if (size_done == 0) {
      /* we have reached the end */
      alogg_rewind_ogg(ogg);
      if (!ogg->loop) {
        free_audio_stream_buffer(ogg->audiostream);
        ogg->wait_for_audio_stop = 2;
        return ALOGG_OK;
      }
    }

    audiobuf_p += size_done;
  }

  /* lock the buffer */
  free_audio_stream_buffer(ogg->audiostream);

  return ALOGG_OK;
}
Пример #5
0
int alogg_poll_ogg_ts(ALOGG_OGG *ogg) {
  void *audiobuf;
  char *audiobuf_p;
  unsigned short *audiobuf_sp;
  int i, size_done, finished = 0;

  /* continue only if we are playing it */
  if (!alogg_is_playing_ogg(ogg))
    return ALOGG_POLL_NOTPLAYING;

  /* get the audio stream buffer and only continue if we need to fill it */
  audiobuf = get_audio_stream_buffer(ogg->audiostream);
  if (audiobuf == NULL)
    return ALOGG_OK;

  /* clear the buffer with 16bit unsigned data */
  {
    int i;
    unsigned short *j = (unsigned short *)audiobuf;
    for (i = 0; i < (ogg->audiostream_buffer_len / 2); i++, j++)
      *j = 0x8000;
  }

  /* if we need to fill it, but we were just waiting for it to finish */
  if (!ogg->loop) {
    if (ogg->wait_for_audio_stop > 0) {
      free_audio_stream_buffer(ogg->audiostream);
      if (--ogg->wait_for_audio_stop == 0) {
        /* stop it */
        alogg_stop_ogg(ogg);
        return ALOGG_POLL_PLAYJUSTFINISHED;
      }
      else
        return ALOGG_OK;
    }
  }

  audiobuf_sp = (unsigned short *)audiobuf;
  while (!finished && rubberband_available(ogg->time_stretch_state) < ogg->time_stretch_buffer_samples) {
    /* reset these each iteration so we don't overrun the buffer */
    audiobuf_p = (char *)audiobuf;
    size_done = 0;

    /* read samples from Ogg Vorbis file */
    for (i = ogg->audiostream_buffer_len; i > 0; i -= size_done) {
      /* decode */
      size_done = ov_read(&(ogg->vf), audiobuf_p, i, alogg_endianess, 2, 0, &(ogg->current_section));

      /* check if the decoding was not successful */
      if (size_done < 0) {
        if (size_done == OV_HOLE)
          size_done = 0;
        else {
          free_audio_stream_buffer(ogg->audiostream);
          alogg_stop_ogg(ogg);
          alogg_rewind_ogg(ogg);
          return ALOGG_POLL_FRAMECORRUPT;
        }
      }
      else if (size_done == 0) {
        alogg_rewind_ogg(ogg);
        ogg->wait_for_audio_stop = 2;
        finished = 1;
        break; // playback finished so get out of loop
      }
      audiobuf_p += size_done;
    }

    /* process samples with Rubber Band */
    if (ogg->stereo) {
      for (i = 0; i < ogg->time_stretch_buffer_samples; i++) {
        ogg->time_stretch_buffer[0][i] = (float)((long)audiobuf_sp[i * 2] - 0x8000) / (float)0x8000;		//Convert sample to signed floating point format
        ogg->time_stretch_buffer[1][i] = (float)((long)audiobuf_sp[i * 2 + 1] - 0x8000) / (float)0x8000;	//Repeat for the other channel's sample
      }
    }
    else {
      for (i = 0; i < ogg->time_stretch_buffer_samples; i++) {
        ogg->time_stretch_buffer[0][i] = (float)((long)audiobuf_sp[i] - 0x8000) / (float)0x8000;	//Convert sample to signed floating point format
      }
	}
    rubberband_process(ogg->time_stretch_state, (const float **)ogg->time_stretch_buffer, ogg->time_stretch_buffer_samples, 0);
  }

  /* retrieve audio from rubberband and put it into stream buffer */
  size_done = rubberband_retrieve(ogg->time_stretch_state, ogg->time_stretch_buffer, ogg->time_stretch_buffer_samples);
  if (ogg->stereo) {
    for (i = 0; i < size_done; i++) {
      if(ogg->time_stretch_buffer[0][i] > 1.0)
      {
        audiobuf_sp[i * 2] = 0xFFFF;
      }
      else if(ogg->time_stretch_buffer[0][i] < -1.0)
      {
        audiobuf_sp[i * 2] = 0;
      }
      else
      {
        audiobuf_sp[i * 2] = (ogg->time_stretch_buffer[0][i] * (float)0x8000) + (float)0x8000;		//Convert sample back to unsigned integer format
      }
      if(ogg->time_stretch_buffer[1][i] > 1.0)
      {
        audiobuf_sp[i * 2 + 1] = 0xFFFF;
      }
      else if(ogg->time_stretch_buffer[1][i] < -1.0)
      {
        audiobuf_sp[i * 2 + 1] = 0;
      }
      else
      {
        audiobuf_sp[i * 2 + 1] = (ogg->time_stretch_buffer[1][i] * (float)0x8000) + (float)0x8000;	//Repeat for the other channel's sample
      }
    }
  }
  else {
    for (i = 0; i < size_done; i++) {
      if(ogg->time_stretch_buffer[0][i] > 1.0)
      {
        audiobuf_sp[i] = 0xFFFF;
      }
      else if(ogg->time_stretch_buffer[0][i] < -1.0)
      {
        audiobuf_sp[i] = 0;
      }
      else
      {
        audiobuf_sp[i] = (ogg->time_stretch_buffer[0][i] * (float)0x8000) + (float)0x8000;		//Convert sample back to unsigned integer format
      }
    }
  }

  /* lock the buffer */
  if(alogg_buffer_callback)
  {
     alogg_buffer_callback(audiobuf, ogg->audiostream_buffer_len);
  }
  free_audio_stream_buffer(ogg->audiostream);
  return ALOGG_OK;
}