From ec2cbaa5eb5c4bca059c5592932746369e1e293d Mon Sep 17 00:00:00 2001 From: Joshua Reisenauer Date: Sun, 24 Apr 2016 15:25:48 -0700 Subject: Added proto version of jar_xm This is an early draft, needs lots of work. Still need to figure out way to calculate total length of song. This is hard because xm tracks stream out zeros when done, only position in track can be found. Position does not give any direct value of how much more time is left. I think that by setting the loop count to 1 and seeking until the end I can total up the number of samples and come up with a length. --- src/audio.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 16 deletions(-) (limited to 'src/audio.c') diff --git a/src/audio.c b/src/audio.c index 75383385..9baa2222 100644 --- a/src/audio.c +++ b/src/audio.c @@ -42,6 +42,8 @@ #include // Required for strcmp() #include // Used for .WAV loading +#include "jar_xm.h" // For playing .xm files + #if defined(AUDIO_STANDALONE) #include // Used for functions with variable number of parameters (TraceLog()) #else @@ -73,6 +75,7 @@ // NOTE: Anything longer than ~10 seconds should be streamed... typedef struct Music { stb_vorbis *stream; + jar_xm_context_t *chipctx; // Stores jar_xm context ALuint buffers[MUSIC_STREAM_BUFFERS]; ALuint source; @@ -82,7 +85,7 @@ typedef struct Music { int sampleRate; int totalSamplesLeft; bool loop; - + bool chipTune; // True if chiptune is loaded } Music; #if defined(AUDIO_STANDALONE) @@ -564,6 +567,22 @@ void PlayMusicStream(char *fileName) currentMusic.totalSamplesLeft = stb_vorbis_stream_length_in_samples(currentMusic.stream) * currentMusic.channels; } } + else if (strcmp(GetExtension(fileName),"xm") == 0) + { + currentMusic.chipTune = true; + currentMusic.channels = 2; + currentMusic.sampleRate = 48000; + currentMusic.loop = true; + + // only stereo/float is supported for xm + if(info.channels == 2 && !jar_xm_create_context_from_file(¤tMusic.chipctx, currentMusic.sampleRate, fileName)) + { + currentMusic.format = AL_FORMAT_STEREO_FLOAT32; + jar_xm_set_max_loop_count(currentMusic.chipctx, 0); //infinite number of loops + //currentMusic.totalSamplesLeft = ; // Unsure of how to calculate this + musicEnabled = true; + } + } else TraceLog(WARNING, "[%s] Music extension not recognized, it can't be loaded", fileName); } @@ -572,14 +591,19 @@ void StopMusicStream(void) { if (musicEnabled) { - alSourceStop(currentMusic.source); - - EmptyMusicStream(); // Empty music buffers - - alDeleteSources(1, ¤tMusic.source); - alDeleteBuffers(2, currentMusic.buffers); - - stb_vorbis_close(currentMusic.stream); + alSourceStop(currentMusic.source); + EmptyMusicStream(); // Empty music buffers + alDeleteSources(1, ¤tMusic.source); + alDeleteBuffers(2, currentMusic.buffers); + + if (currentMusic.chipTune) + { + jar_xm_free_context(currentMusic.chipctx); + } + else + { + stb_vorbis_close(currentMusic.stream); + } } musicEnabled = false; @@ -633,7 +657,15 @@ void SetMusicVolume(float volume) // Get current music time length (in seconds) float GetMusicTimeLength(void) { - float totalSeconds = stb_vorbis_stream_length_in_seconds(currentMusic.stream); + float totalSeconds; + if (currentMusic.chipTune) + { + //totalSeconds = (float)samples; // Need to figure out how toget this + } + else + { + totalSeconds = stb_vorbis_stream_length_in_seconds(currentMusic.stream); + } return totalSeconds; } @@ -641,11 +673,20 @@ float GetMusicTimeLength(void) // Get current music time played (in seconds) float GetMusicTimePlayed(void) { - int totalSamples = stb_vorbis_stream_length_in_samples(currentMusic.stream) * currentMusic.channels; - - int samplesPlayed = totalSamples - currentMusic.totalSamplesLeft; - - float secondsPlayed = (float)samplesPlayed / (currentMusic.sampleRate * currentMusic.channels); + float secondsPlayed; + if (currentMusic.chipTune) + { + uint64_t* samples; + jar_xm_get_position(currentMusic.chipctx, NULL, NULL, NULL, samples); // Unsure if this is the desired value + secondsPlayed = (float)samples; + } + else + { + int totalSamples = stb_vorbis_stream_length_in_samples(currentMusic.stream) * currentMusic.channels; + int samplesPlayed = totalSamples - currentMusic.totalSamplesLeft; + secondsPlayed = (float)samplesPlayed / (currentMusic.sampleRate * currentMusic.channels); + } + return secondsPlayed; } @@ -668,7 +709,15 @@ static bool BufferMusicStream(ALuint buffer) { while (size < MUSIC_BUFFER_SIZE) { - streamedBytes = stb_vorbis_get_samples_short_interleaved(currentMusic.stream, currentMusic.channels, pcm + size, MUSIC_BUFFER_SIZE - size); + if (currentMusic.chipTune) + { + jar_xm_generate_samples(currentMusic.chipctx, pcm + size, (MUSIC_BUFFER_SIZE - size)/2); + streamedBytes = (MUSIC_BUFFER_SIZE - size)/2; // There is no end of stream for xmfiles, once the end is reached zeros are generated for non looped chiptunes. + } + else + { + streamedBytes = stb_vorbis_get_samples_short_interleaved(currentMusic.stream, currentMusic.channels, pcm + size, MUSIC_BUFFER_SIZE - size); + } if (streamedBytes > 0) size += (streamedBytes*currentMusic.channels); else break; -- cgit v1.2.3 From cb05c51911fdc885c8e91e51cbaa2ab32e114c7b Mon Sep 17 00:00:00 2001 From: Joshua Reisenauer Date: Sun, 24 Apr 2016 18:18:18 -0700 Subject: tabs to spaces fix --- src/audio.c | 124 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 62 insertions(+), 62 deletions(-) (limited to 'src/audio.c') diff --git a/src/audio.c b/src/audio.c index 9baa2222..e5bd6819 100644 --- a/src/audio.c +++ b/src/audio.c @@ -75,7 +75,7 @@ // NOTE: Anything longer than ~10 seconds should be streamed... typedef struct Music { stb_vorbis *stream; - jar_xm_context_t *chipctx; // Stores jar_xm context + jar_xm_context_t *chipctx; // Stores jar_xm context ALuint buffers[MUSIC_STREAM_BUFFERS]; ALuint source; @@ -85,7 +85,7 @@ typedef struct Music { int sampleRate; int totalSamplesLeft; bool loop; - bool chipTune; // True if chiptune is loaded + bool chipTune; // True if chiptune is loaded } Music; #if defined(AUDIO_STANDALONE) @@ -567,22 +567,22 @@ void PlayMusicStream(char *fileName) currentMusic.totalSamplesLeft = stb_vorbis_stream_length_in_samples(currentMusic.stream) * currentMusic.channels; } } - else if (strcmp(GetExtension(fileName),"xm") == 0) - { - currentMusic.chipTune = true; - currentMusic.channels = 2; - currentMusic.sampleRate = 48000; - currentMusic.loop = true; - - // only stereo/float is supported for xm - if(info.channels == 2 && !jar_xm_create_context_from_file(¤tMusic.chipctx, currentMusic.sampleRate, fileName)) - { - currentMusic.format = AL_FORMAT_STEREO_FLOAT32; - jar_xm_set_max_loop_count(currentMusic.chipctx, 0); //infinite number of loops - //currentMusic.totalSamplesLeft = ; // Unsure of how to calculate this - musicEnabled = true; - } - } + else if (strcmp(GetExtension(fileName),"xm") == 0) + { + currentMusic.chipTune = true; + currentMusic.channels = 2; + currentMusic.sampleRate = 48000; + currentMusic.loop = true; + + // only stereo/float is supported for xm + if(info.channels == 2 && !jar_xm_create_context_from_file(¤tMusic.chipctx, currentMusic.sampleRate, fileName)) + { + currentMusic.format = AL_FORMAT_STEREO_FLOAT32; + jar_xm_set_max_loop_count(currentMusic.chipctx, 0); //infinite number of loops + //currentMusic.totalSamplesLeft = ; // Unsure of how to calculate this + musicEnabled = true; + } + } else TraceLog(WARNING, "[%s] Music extension not recognized, it can't be loaded", fileName); } @@ -591,19 +591,19 @@ void StopMusicStream(void) { if (musicEnabled) { - alSourceStop(currentMusic.source); - EmptyMusicStream(); // Empty music buffers - alDeleteSources(1, ¤tMusic.source); - alDeleteBuffers(2, currentMusic.buffers); - - if (currentMusic.chipTune) - { - jar_xm_free_context(currentMusic.chipctx); - } - else - { - stb_vorbis_close(currentMusic.stream); - } + alSourceStop(currentMusic.source); + EmptyMusicStream(); // Empty music buffers + alDeleteSources(1, ¤tMusic.source); + alDeleteBuffers(2, currentMusic.buffers); + + if (currentMusic.chipTune) + { + jar_xm_free_context(currentMusic.chipctx); + } + else + { + stb_vorbis_close(currentMusic.stream); + } } musicEnabled = false; @@ -657,15 +657,15 @@ void SetMusicVolume(float volume) // Get current music time length (in seconds) float GetMusicTimeLength(void) { - float totalSeconds; - if (currentMusic.chipTune) - { - //totalSeconds = (float)samples; // Need to figure out how toget this - } - else - { - totalSeconds = stb_vorbis_stream_length_in_seconds(currentMusic.stream); - } + float totalSeconds; + if (currentMusic.chipTune) + { + //totalSeconds = (float)samples; // Need to figure out how toget this + } + else + { + totalSeconds = stb_vorbis_stream_length_in_seconds(currentMusic.stream); + } return totalSeconds; } @@ -673,19 +673,19 @@ float GetMusicTimeLength(void) // Get current music time played (in seconds) float GetMusicTimePlayed(void) { - float secondsPlayed; - if (currentMusic.chipTune) - { - uint64_t* samples; - jar_xm_get_position(currentMusic.chipctx, NULL, NULL, NULL, samples); // Unsure if this is the desired value - secondsPlayed = (float)samples; - } - else - { - int totalSamples = stb_vorbis_stream_length_in_samples(currentMusic.stream) * currentMusic.channels; - int samplesPlayed = totalSamples - currentMusic.totalSamplesLeft; - secondsPlayed = (float)samplesPlayed / (currentMusic.sampleRate * currentMusic.channels); - } + float secondsPlayed; + if (currentMusic.chipTune) + { + uint64_t* samples; + jar_xm_get_position(currentMusic.chipctx, NULL, NULL, NULL, samples); // Unsure if this is the desired value + secondsPlayed = (float)samples; + } + else + { + int totalSamples = stb_vorbis_stream_length_in_samples(currentMusic.stream) * currentMusic.channels; + int samplesPlayed = totalSamples - currentMusic.totalSamplesLeft; + secondsPlayed = (float)samplesPlayed / (currentMusic.sampleRate * currentMusic.channels); + } return secondsPlayed; @@ -709,15 +709,15 @@ static bool BufferMusicStream(ALuint buffer) { while (size < MUSIC_BUFFER_SIZE) { - if (currentMusic.chipTune) - { - jar_xm_generate_samples(currentMusic.chipctx, pcm + size, (MUSIC_BUFFER_SIZE - size)/2); - streamedBytes = (MUSIC_BUFFER_SIZE - size)/2; // There is no end of stream for xmfiles, once the end is reached zeros are generated for non looped chiptunes. - } - else - { - streamedBytes = stb_vorbis_get_samples_short_interleaved(currentMusic.stream, currentMusic.channels, pcm + size, MUSIC_BUFFER_SIZE - size); - } + if (currentMusic.chipTune) + { + jar_xm_generate_samples(currentMusic.chipctx, pcm + size, (MUSIC_BUFFER_SIZE - size)/2); + streamedBytes = (MUSIC_BUFFER_SIZE - size)/2; // There is no end of stream for xmfiles, once the end is reached zeros are generated for non looped chiptunes. + } + else + { + streamedBytes = stb_vorbis_get_samples_short_interleaved(currentMusic.stream, currentMusic.channels, pcm + size, MUSIC_BUFFER_SIZE - size); + } if (streamedBytes > 0) size += (streamedBytes*currentMusic.channels); else break; -- cgit v1.2.3 From 1c370f5a179ab956d90d80e5a3b566ab14027557 Mon Sep 17 00:00:00 2001 From: Joshua Reisenauer Date: Sun, 24 Apr 2016 22:00:40 -0700 Subject: cleaned up calculations --- src/audio.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/audio.c') diff --git a/src/audio.c b/src/audio.c index e5bd6819..b8657336 100644 --- a/src/audio.c +++ b/src/audio.c @@ -676,9 +676,9 @@ float GetMusicTimePlayed(void) float secondsPlayed; if (currentMusic.chipTune) { - uint64_t* samples; - jar_xm_get_position(currentMusic.chipctx, NULL, NULL, NULL, samples); // Unsure if this is the desired value - secondsPlayed = (float)samples; + uint64_t samples; + jar_xm_get_position(currentMusic.chipctx, NULL, NULL, NULL, &samples); // Unsure if this is the desired value + secondsPlayed = (float)samples / (currentMusic.sampleRate * currentMusic.channels); } else { @@ -711,7 +711,7 @@ static bool BufferMusicStream(ALuint buffer) { if (currentMusic.chipTune) { - jar_xm_generate_samples(currentMusic.chipctx, pcm + size, (MUSIC_BUFFER_SIZE - size)/2); + jar_xm_generate_samples(currentMusic.chipctx, pcm + size, (MUSIC_BUFFER_SIZE - size) / 2); streamedBytes = (MUSIC_BUFFER_SIZE - size)/2; // There is no end of stream for xmfiles, once the end is reached zeros are generated for non looped chiptunes. } else -- cgit v1.2.3 From 89a84a621bb5bd3a6f17ebc788e143c2874cd55b Mon Sep 17 00:00:00 2001 From: Joshua Reisenauer Date: Sun, 24 Apr 2016 22:04:31 -0700 Subject: implement --- src/audio.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/audio.c') diff --git a/src/audio.c b/src/audio.c index b8657336..93b83599 100644 --- a/src/audio.c +++ b/src/audio.c @@ -42,6 +42,7 @@ #include // Required for strcmp() #include // Used for .WAV loading +#define JAR_XM_IMPLEMENTATION #include "jar_xm.h" // For playing .xm files #if defined(AUDIO_STANDALONE) -- cgit v1.2.3