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.
This commit is contained in:
parent
173529e048
commit
ec2cbaa5eb
81
src/audio.c
81
src/audio.c
@ -42,6 +42,8 @@
|
||||
#include <string.h> // Required for strcmp()
|
||||
#include <stdio.h> // Used for .WAV loading
|
||||
|
||||
#include "jar_xm.h" // For playing .xm files
|
||||
|
||||
#if defined(AUDIO_STANDALONE)
|
||||
#include <stdarg.h> // 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;
|
||||
|
2647
src/jar_xm.h
Normal file
2647
src/jar_xm.h
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user