Reviewed music loading

This commit is contained in:
raysan5 2018-07-28 18:07:06 +02:00
parent 6f61e26a3c
commit dc3327fba8
1 changed files with 29 additions and 32 deletions

View File

@ -1321,43 +1321,18 @@ float *GetWaveData(Wave wave)
// Module Functions Definition - Music loading and stream playing (.OGG) // Module Functions Definition - Music loading and stream playing (.OGG)
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Set music to NULL in case of error and print warning
static void LoadMusicStreamError(MusicData **music, const char *fileName, const char *format)
{
free(*music);
*music = NULL;
if ((*music)->ctxType == MUSIC_AUDIO_OGG) stb_vorbis_close((*music)->ctxOgg);
#if defined(SUPPORT_FILEFORMAT_FLAC)
else if ((*music)->ctxType == MUSIC_AUDIO_FLAC) drflac_free((*music)->ctxFlac);
#endif
#if defined(SUPPORT_FILEFORMAT_MP3)
else if ((*music)->ctxType == MUSIC_AUDIO_MP3) drmp3_uninit(&(*music)->ctxMp3);
#endif
#if defined(SUPPORT_FILEFORMAT_XM)
else if ((*music)->ctxType == MUSIC_MODULE_XM) jar_xm_free_context((*music)->ctxXm);
#endif
#if defined(SUPPORT_FILEFORMAT_MOD)
else if ((*music)->ctxType == MUSIC_MODULE_MOD) jar_mod_unload(&(*music)->ctxMod);
#endif
if (format)
TraceLog(LOG_WARNING, "[%s] %s audio file could not be opened", fileName, format);
else
TraceLog(LOG_WARNING, "[%s] Audio fileformat not supported, it can't be loaded", fileName);
}
// Load music stream from file // Load music stream from file
Music LoadMusicStream(const char *fileName) Music LoadMusicStream(const char *fileName)
{ {
Music music = (MusicData *)malloc(sizeof(MusicData)); Music music = (MusicData *)malloc(sizeof(MusicData));
bool musicLoaded = true;
if (IsFileExtension(fileName, ".ogg")) if (IsFileExtension(fileName, ".ogg"))
{ {
// Open ogg audio stream // Open ogg audio stream
music->ctxOgg = stb_vorbis_open_filename(fileName, NULL, NULL); music->ctxOgg = stb_vorbis_open_filename(fileName, NULL, NULL);
if (music->ctxOgg == NULL) LoadMusicStreamError(&music, fileName, "OGG"); if (music->ctxOgg == NULL) musicLoaded = false;
else else
{ {
stb_vorbis_info info = stb_vorbis_get_info(music->ctxOgg); // Get Ogg file info stb_vorbis_info info = stb_vorbis_get_info(music->ctxOgg); // Get Ogg file info
@ -1380,7 +1355,7 @@ Music LoadMusicStream(const char *fileName)
{ {
music->ctxFlac = drflac_open_file(fileName); music->ctxFlac = drflac_open_file(fileName);
if (music->ctxFlac == NULL) LoadMusicStreamError(&music, fileName, "FLAC"); if (music->ctxFlac == NULL) musicLoaded = false;
else else
{ {
music->stream = InitAudioStream(music->ctxFlac->sampleRate, music->ctxFlac->bitsPerSample, music->ctxFlac->channels); music->stream = InitAudioStream(music->ctxFlac->sampleRate, music->ctxFlac->bitsPerSample, music->ctxFlac->channels);
@ -1401,7 +1376,7 @@ Music LoadMusicStream(const char *fileName)
{ {
drmp3_init_file(&music->ctxMp3, fileName, NULL); drmp3_init_file(&music->ctxMp3, fileName, NULL);
if (music->ctxMp3.framesRemaining <= 0) LoadMusicStreamError(&music, fileName, "MP3"); if (music->ctxMp3.framesRemaining <= 0) musicLoaded = false;
else else
{ {
music->stream = InitAudioStream(music->ctxMp3.sampleRate, 16, music->ctxMp3.channels); music->stream = InitAudioStream(music->ctxMp3.sampleRate, 16, music->ctxMp3.channels);
@ -1436,7 +1411,7 @@ Music LoadMusicStream(const char *fileName)
TraceLog(LOG_DEBUG, "[%s] XM number of samples: %i", fileName, music->totalSamples); TraceLog(LOG_DEBUG, "[%s] XM number of samples: %i", fileName, music->totalSamples);
TraceLog(LOG_DEBUG, "[%s] XM track length: %11.6f sec", fileName, (float)music->totalSamples/48000.0f); TraceLog(LOG_DEBUG, "[%s] XM track length: %11.6f sec", fileName, (float)music->totalSamples/48000.0f);
} }
else LoadMusicStreamError(&music, fileName, "XM"); else musicLoaded = false;
} }
#endif #endif
#if defined(SUPPORT_FILEFORMAT_MOD) #if defined(SUPPORT_FILEFORMAT_MOD)
@ -1455,10 +1430,32 @@ Music LoadMusicStream(const char *fileName)
TraceLog(LOG_DEBUG, "[%s] MOD number of samples: %i", fileName, music->samplesLeft); TraceLog(LOG_DEBUG, "[%s] MOD number of samples: %i", fileName, music->samplesLeft);
TraceLog(LOG_DEBUG, "[%s] MOD track length: %11.6f sec", fileName, (float)music->totalSamples/48000.0f); TraceLog(LOG_DEBUG, "[%s] MOD track length: %11.6f sec", fileName, (float)music->totalSamples/48000.0f);
} }
else LoadMusicStreamError(&music, fileName, "MOD"); else musicLoaded = false;
} }
#endif #endif
else LoadMusicStreamError(&music, fileName, NULL); else musicLoaded = false;
if (!musicLoaded)
{
free(music);
music = NULL;
if ((*music)->ctxType == MUSIC_AUDIO_OGG) stb_vorbis_close(music->ctxOgg);
#if defined(SUPPORT_FILEFORMAT_FLAC)
else if ((*music)->ctxType == MUSIC_AUDIO_FLAC) drflac_free(music->ctxFlac);
#endif
#if defined(SUPPORT_FILEFORMAT_MP3)
else if ((*music)->ctxType == MUSIC_AUDIO_MP3) drmp3_uninit(&music->ctxMp3);
#endif
#if defined(SUPPORT_FILEFORMAT_XM)
else if ((*music)->ctxType == MUSIC_MODULE_XM) jar_xm_free_context(music->ctxXm);
#endif
#if defined(SUPPORT_FILEFORMAT_MOD)
else if ((*music)->ctxType == MUSIC_MODULE_MOD) jar_mod_unload(&music->ctxMod);
#endif
TraceLog(LOG_WARNING, "[%s] Music file could not be opened", fileName);
}
return music; return music;
} }