void alogg_destroy_oggstream(ALOGG_OGGSTREAM *ogg) { if (ogg == NULL) return; alogg_stop_oggstream(ogg); /* note alogg_stop_oggstream will */ /* remove autopolling interrupts */ ov_clear(&(ogg->vf)); free(ogg->full_databuf); free(ogg->databuf1); free(ogg->databuf2); free(ogg); }
void destroy() { if (!done) alogg_stop_oggstream(stream); alogg_destroy_oggstream(stream); stream = NULL; if (buffer != NULL) free(buffer); buffer = NULL; pack_fclose(in); }
void MYOGG::internal_destroy() { if (!done) alogg_stop_oggstream(stream); alogg_destroy_oggstream(stream); stream = NULL; if (buffer != NULL) free(buffer); buffer = NULL; pack_fclose(in); _destroyThis = false; done = 1; }
int alogg_poll_oggstream(ALOGG_OGGSTREAM *ogg) { void *audiobuf; char *audiobuf_p; int i, size_done; int last_block; /* continue only if we are playing it */ if (!alogg_is_playing_oggstream(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 unsinged 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->wait_for_audio_stop > 0) { free_audio_stream_buffer(ogg->audiostream); if (--ogg->wait_for_audio_stop == 0) { /* stop it */ alogg_stop_oggstream(ogg); return ALOGG_POLL_PLAYJUSTFINISHED; } else return ALOGG_OK; } /* get if this will be the last block to be processed */ if (ogg->bytes_used != -1) last_block = TRUE; else last_block = FALSE; audiobuf_p = (char *)audiobuf; size_done = 0; for (i = ogg->audiostream_buffer_len; i > 0; i -= size_done) { 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_oggstream(ogg); return ALOGG_POLL_FRAMECORRUPT; } } else if (size_done == 0) { free_audio_stream_buffer(ogg->audiostream); /* if this was not the last block, buffer underrun */ if (!last_block) { alogg_stop_oggstream(ogg); return ALOGG_POLL_BUFFERUNDERRUN; } /* else we just finished playing, we need to wait for audio to stop */ else { 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; }