clean up on buffering and preconditions

This commit is contained in:
Joshua Reisenauer
2016-05-14 16:30:32 -07:00
parent 8c5d403dda
commit d38d7a1bed

View File

@@ -889,7 +889,7 @@ int getMusicStreamCount(void)
void PauseMusicStream(int index) void PauseMusicStream(int index)
{ {
// Pause music stream if music available! // Pause music stream if music available!
if (currentMusic[index].ctx && musicEnabled_g) if (index < MAX_MUSIC_STREAMS && currentMusic[index].ctx && musicEnabled_g)
{ {
TraceLog(INFO, "Pausing music stream"); TraceLog(INFO, "Pausing music stream");
alSourcePause(currentMusic[index].ctx->alSource); alSourcePause(currentMusic[index].ctx->alSource);
@@ -902,7 +902,7 @@ void ResumeMusicStream(int index)
{ {
// Resume music playing... if music available! // Resume music playing... if music available!
ALenum state; ALenum state;
if(currentMusic[index].ctx){ if(index < MAX_MUSIC_STREAMS && currentMusic[index].ctx){
alGetSourcei(currentMusic[index].ctx->alSource, AL_SOURCE_STATE, &state); alGetSourcei(currentMusic[index].ctx->alSource, AL_SOURCE_STATE, &state);
if (state == AL_PAUSED) if (state == AL_PAUSED)
{ {
@@ -962,6 +962,8 @@ float GetMusicTimeLength(int index)
float GetMusicTimePlayed(int index) float GetMusicTimePlayed(int index)
{ {
float secondsPlayed; float secondsPlayed;
if(index < MAX_MUSIC_STREAMS && currentMusic[index].ctx)
{
if (currentMusic[index].chipTune) if (currentMusic[index].chipTune)
{ {
uint64_t samples; uint64_t samples;
@@ -974,6 +976,7 @@ float GetMusicTimePlayed(int index)
int samplesPlayed = totalSamples - currentMusic[index].totalSamplesLeft; int samplesPlayed = totalSamples - currentMusic[index].totalSamplesLeft;
secondsPlayed = (float)samplesPlayed / (currentMusic[index].ctx->sampleRate * currentMusic[index].ctx->channels); secondsPlayed = (float)samplesPlayed / (currentMusic[index].ctx->sampleRate * currentMusic[index].ctx->channels);
} }
}
return secondsPlayed; return secondsPlayed;
@@ -989,33 +992,42 @@ static bool BufferMusicStream(int index)
short pcm[MUSIC_BUFFER_SIZE_SHORT]; short pcm[MUSIC_BUFFER_SIZE_SHORT];
float pcmf[MUSIC_BUFFER_SIZE_FLOAT]; float pcmf[MUSIC_BUFFER_SIZE_FLOAT];
int size = 0; // Total size of data steamed (in bytes) int size = 0; // Total size of data steamed in L+R samples
bool active = true; // We can get more data from stream (not finished) bool active = true; // We can get more data from stream (not finished)
if (musicEnabled_g)
{ if(!currentMusic[index].ctx->playing && currentMusic[index].totalSamplesLeft > 0)
if(!currentMusic[index].ctx->playing)
{ {
UpdateAudioContext(currentMusic[index].ctx, NULL, 0); UpdateAudioContext(currentMusic[index].ctx, NULL, 0);
return false; return true; // it is still active, only it is paused
} }
if (currentMusic[index].chipTune) // There is no end of stream for xmfiles, once the end is reached zeros are generated for non looped chiptunes. if (currentMusic[index].chipTune) // There is no end of stream for xmfiles, once the end is reached zeros are generated for non looped chiptunes.
{ {
jar_xm_generate_samples(currentMusic[index].chipctx, pcmf, MUSIC_BUFFER_SIZE_FLOAT / 2); // reads 2*readlen shorts and moves them to buffer+size memory location if(currentMusic[index].totalSamplesLeft >= MUSIC_BUFFER_SIZE_FLOAT / 2)
UpdateAudioContext(currentMusic[index].ctx, pcmf, MUSIC_BUFFER_SIZE_FLOAT); size = MUSIC_BUFFER_SIZE_FLOAT / 2;
currentMusic[index].totalSamplesLeft -= MUSIC_BUFFER_SIZE_FLOAT; else
if(currentMusic[index].totalSamplesLeft <= 0) active = false; size = currentMusic[index].totalSamplesLeft / 2;
jar_xm_generate_samples(currentMusic[index].chipctx, pcmf, size); // reads 2*readlen shorts and moves them to buffer+size memory location
UpdateAudioContext(currentMusic[index].ctx, pcmf, size * 2);
currentMusic[index].totalSamplesLeft -= size * 2;
} }
else else
{ {
int streamedBytes = stb_vorbis_get_samples_short_interleaved(currentMusic[index].stream, currentMusic[index].ctx->channels, pcm, MUSIC_BUFFER_SIZE_SHORT); if(currentMusic[index].totalSamplesLeft >= MUSIC_BUFFER_SIZE_SHORT)
UpdateAudioContext(currentMusic[index].ctx, pcm, streamedBytes); size = MUSIC_BUFFER_SIZE_SHORT;
currentMusic[index].totalSamplesLeft -= streamedBytes*currentMusic[index].ctx->channels; else
if(currentMusic[index].totalSamplesLeft <= 0) active = false; size = currentMusic[index].totalSamplesLeft;
int streamedBytes = stb_vorbis_get_samples_short_interleaved(currentMusic[index].stream, currentMusic[index].ctx->channels, pcm, size);
UpdateAudioContext(currentMusic[index].ctx, pcm, streamedBytes * currentMusic[index].ctx->channels);
currentMusic[index].totalSamplesLeft -= streamedBytes * currentMusic[index].ctx->channels;
} }
TraceLog(DEBUG, "Buffering index:%i, chiptune:%i", index, (int)currentMusic[index].chipTune); TraceLog(DEBUG, "Buffering index:%i, chiptune:%i", index, (int)currentMusic[index].chipTune);
} if(currentMusic[index].totalSamplesLeft <= 0) active = false;
return active; return active;
} }
@@ -1042,8 +1054,7 @@ static bool isMusicStreamReady(int index)
ALint processed = 0; ALint processed = 0;
alGetSourcei(currentMusic[index].ctx->alSource, AL_BUFFERS_PROCESSED, &processed); alGetSourcei(currentMusic[index].ctx->alSource, AL_BUFFERS_PROCESSED, &processed);
if(processed) if(processed) return true;
return true;
return false; return false;
} }
@@ -1054,11 +1065,11 @@ void UpdateMusicStream(int index)
ALenum state; ALenum state;
bool active = true; bool active = true;
if (index < MAX_MUSIC_STREAMS && musicEnabled_g && isMusicStreamReady(index)) if (index < MAX_MUSIC_STREAMS && musicEnabled_g && currentMusic[index].ctx && isMusicStreamReady(index))
{ {
active = BufferMusicStream(index); active = BufferMusicStream(index);
if ((!active) && (currentMusic[index].loop)) if (!active && currentMusic[index].loop && currentMusic[index].ctx->playing)
{ {
if(currentMusic[index].chipTune) if(currentMusic[index].chipTune)
{ {
@@ -1067,7 +1078,7 @@ void UpdateMusicStream(int index)
else else
{ {
stb_vorbis_seek_start(currentMusic[index].stream); stb_vorbis_seek_start(currentMusic[index].stream);
currentMusic[index].totalSamplesLeft = stb_vorbis_stream_length_in_samples(currentMusic[index].stream)*currentMusic[index].ctx->channels; currentMusic[index].totalSamplesLeft = stb_vorbis_stream_length_in_samples(currentMusic[index].stream) * currentMusic[index].ctx->channels;
} }
active = BufferMusicStream(index); active = BufferMusicStream(index);
} }