Some security checks in case music is not properly loaded
This commit is contained in:
parent
39e73ccc4d
commit
3f25c52a29
1 changed files with 22 additions and 20 deletions
36
src/raudio.c
36
src/raudio.c
|
@ -1100,7 +1100,6 @@ Music LoadMusicStream(const char *fileName)
|
||||||
else if (IsFileExtension(fileName, ".mod"))
|
else if (IsFileExtension(fileName, ".mod"))
|
||||||
{
|
{
|
||||||
jar_mod_context_t *ctxMod = RL_MALLOC(sizeof(jar_mod_context_t));
|
jar_mod_context_t *ctxMod = RL_MALLOC(sizeof(jar_mod_context_t));
|
||||||
music.ctxData = ctxMod;
|
|
||||||
|
|
||||||
jar_mod_init(ctxMod);
|
jar_mod_init(ctxMod);
|
||||||
int result = jar_mod_load_file(ctxMod, fileName);
|
int result = jar_mod_load_file(ctxMod, fileName);
|
||||||
|
@ -1114,6 +1113,8 @@ Music LoadMusicStream(const char *fileName)
|
||||||
music.sampleCount = (unsigned int)jar_mod_max_samples(ctxMod)*2;
|
music.sampleCount = (unsigned int)jar_mod_max_samples(ctxMod)*2;
|
||||||
music.loopCount = 0; // Infinite loop by default
|
music.loopCount = 0; // Infinite loop by default
|
||||||
musicLoaded = true;
|
musicLoaded = true;
|
||||||
|
|
||||||
|
music.ctxData = ctxMod;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1178,17 +1179,15 @@ void UnloadMusicStream(Music music)
|
||||||
// Start music playing (open stream)
|
// Start music playing (open stream)
|
||||||
void PlayMusicStream(Music music)
|
void PlayMusicStream(Music music)
|
||||||
{
|
{
|
||||||
AudioBuffer *audioBuffer = music.stream.buffer;
|
if (music.stream.buffer != NULL)
|
||||||
|
|
||||||
if (audioBuffer != NULL)
|
|
||||||
{
|
{
|
||||||
// For music streams, we need to make sure we maintain the frame cursor position
|
// For music streams, we need to make sure we maintain the frame cursor position
|
||||||
// This is a hack for this section of code in UpdateMusicStream()
|
// This is a hack for this section of code in UpdateMusicStream()
|
||||||
// NOTE: In case window is minimized, music stream is stopped, just make sure to
|
// NOTE: In case window is minimized, music stream is stopped, just make sure to
|
||||||
// play again on window restore: if (IsMusicPlaying(music)) PlayMusicStream(music);
|
// play again on window restore: if (IsMusicPlaying(music)) PlayMusicStream(music);
|
||||||
ma_uint32 frameCursorPos = audioBuffer->frameCursorPos;
|
ma_uint32 frameCursorPos = music.stream.buffer->frameCursorPos;
|
||||||
PlayAudioStream(music.stream); // WARNING: This resets the cursor position.
|
PlayAudioStream(music.stream); // WARNING: This resets the cursor position.
|
||||||
audioBuffer->frameCursorPos = frameCursorPos;
|
music.stream.buffer->frameCursorPos = frameCursorPos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1233,6 +1232,8 @@ void StopMusicStream(Music music)
|
||||||
// Update (re-fill) music buffers if data already processed
|
// Update (re-fill) music buffers if data already processed
|
||||||
void UpdateMusicStream(Music music)
|
void UpdateMusicStream(Music music)
|
||||||
{
|
{
|
||||||
|
if (music.stream.buffer == NULL) return;
|
||||||
|
|
||||||
bool streamEnding = false;
|
bool streamEnding = false;
|
||||||
|
|
||||||
unsigned int subBufferSizeInFrames = music.stream.buffer->sizeInFrames/2;
|
unsigned int subBufferSizeInFrames = music.stream.buffer->sizeInFrames/2;
|
||||||
|
@ -1374,9 +1375,12 @@ float GetMusicTimePlayed(Music music)
|
||||||
{
|
{
|
||||||
float secondsPlayed = 0.0f;
|
float secondsPlayed = 0.0f;
|
||||||
|
|
||||||
|
if (music.stream.buffer != NULL)
|
||||||
|
{
|
||||||
//ma_uint32 frameSizeInBytes = ma_get_bytes_per_sample(music.stream.buffer->dsp.formatConverterIn.config.formatIn)*music.stream.buffer->dsp.formatConverterIn.config.channels;
|
//ma_uint32 frameSizeInBytes = ma_get_bytes_per_sample(music.stream.buffer->dsp.formatConverterIn.config.formatIn)*music.stream.buffer->dsp.formatConverterIn.config.channels;
|
||||||
unsigned int samplesPlayed = music.stream.buffer->totalFramesProcessed*music.stream.channels;
|
unsigned int samplesPlayed = music.stream.buffer->totalFramesProcessed*music.stream.channels;
|
||||||
secondsPlayed = (float)samplesPlayed / (music.stream.sampleRate*music.stream.channels);
|
secondsPlayed = (float)samplesPlayed / (music.stream.sampleRate*music.stream.channels);
|
||||||
|
}
|
||||||
|
|
||||||
return secondsPlayed;
|
return secondsPlayed;
|
||||||
}
|
}
|
||||||
|
@ -1424,32 +1428,30 @@ void CloseAudioStream(AudioStream stream)
|
||||||
// NOTE 2: To unqueue a buffer it needs to be processed: IsAudioStreamProcessed()
|
// NOTE 2: To unqueue a buffer it needs to be processed: IsAudioStreamProcessed()
|
||||||
void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount)
|
void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount)
|
||||||
{
|
{
|
||||||
AudioBuffer *audioBuffer = stream.buffer;
|
if (stream.buffer != NULL)
|
||||||
|
|
||||||
if (audioBuffer != NULL)
|
|
||||||
{
|
{
|
||||||
if (audioBuffer->isSubBufferProcessed[0] || audioBuffer->isSubBufferProcessed[1])
|
if (stream.buffer->isSubBufferProcessed[0] || stream.buffer->isSubBufferProcessed[1])
|
||||||
{
|
{
|
||||||
ma_uint32 subBufferToUpdate = 0;
|
ma_uint32 subBufferToUpdate = 0;
|
||||||
|
|
||||||
if (audioBuffer->isSubBufferProcessed[0] && audioBuffer->isSubBufferProcessed[1])
|
if (stream.buffer->isSubBufferProcessed[0] && stream.buffer->isSubBufferProcessed[1])
|
||||||
{
|
{
|
||||||
// Both buffers are available for updating.
|
// Both buffers are available for updating.
|
||||||
// Update the first one and make sure the cursor is moved back to the front.
|
// Update the first one and make sure the cursor is moved back to the front.
|
||||||
subBufferToUpdate = 0;
|
subBufferToUpdate = 0;
|
||||||
audioBuffer->frameCursorPos = 0;
|
stream.buffer->frameCursorPos = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Just update whichever sub-buffer is processed.
|
// Just update whichever sub-buffer is processed.
|
||||||
subBufferToUpdate = (audioBuffer->isSubBufferProcessed[0])? 0 : 1;
|
subBufferToUpdate = (stream.buffer->isSubBufferProcessed[0])? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_uint32 subBufferSizeInFrames = audioBuffer->sizeInFrames/2;
|
ma_uint32 subBufferSizeInFrames = stream.buffer->sizeInFrames/2;
|
||||||
unsigned char *subBuffer = audioBuffer->data + ((subBufferSizeInFrames*stream.channels*(stream.sampleSize/8))*subBufferToUpdate);
|
unsigned char *subBuffer = stream.buffer->data + ((subBufferSizeInFrames*stream.channels*(stream.sampleSize/8))*subBufferToUpdate);
|
||||||
|
|
||||||
// TODO: Get total frames processed on this buffer... DOES NOT WORK.
|
// TODO: Get total frames processed on this buffer... DOES NOT WORK.
|
||||||
audioBuffer->totalFramesProcessed += subBufferSizeInFrames;
|
stream.buffer->totalFramesProcessed += subBufferSizeInFrames;
|
||||||
|
|
||||||
// Does this API expect a whole buffer to be updated in one go?
|
// Does this API expect a whole buffer to be updated in one go?
|
||||||
// Assuming so, but if not will need to change this logic.
|
// Assuming so, but if not will need to change this logic.
|
||||||
|
@ -1467,7 +1469,7 @@ void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount)
|
||||||
|
|
||||||
if (leftoverFrameCount > 0) memset(subBuffer + bytesToWrite, 0, leftoverFrameCount*stream.channels*(stream.sampleSize/8));
|
if (leftoverFrameCount > 0) memset(subBuffer + bytesToWrite, 0, leftoverFrameCount*stream.channels*(stream.sampleSize/8));
|
||||||
|
|
||||||
audioBuffer->isSubBufferProcessed[subBufferToUpdate] = false;
|
stream.buffer->isSubBufferProcessed[subBufferToUpdate] = false;
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_ERROR, "UpdateAudioStream() : Attempting to write too many frames to buffer");
|
else TRACELOG(LOG_ERROR, "UpdateAudioStream() : Attempting to write too many frames to buffer");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue