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; }
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(); } }
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(); } }
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; }
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; }