|
|
@ -1364,6 +1364,28 @@ Music LoadMusicStreamFromMemory(const char *fileType, unsigned char* data, int d |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_FILEFORMAT_OGG) |
|
|
|
else if (TextIsEqual(fileExtLower, ".ogg")) |
|
|
|
{ |
|
|
|
// Open ogg audio stream |
|
|
|
music.ctxType = MUSIC_AUDIO_OGG; |
|
|
|
//music.ctxData = stb_vorbis_open_filename(fileName, NULL, NULL); |
|
|
|
music.ctxData = stb_vorbis_open_memory((const unsigned char*)data, dataSize, NULL, NULL); |
|
|
|
|
|
|
|
if (music.ctxData != NULL) |
|
|
|
{ |
|
|
|
stb_vorbis_info info = stb_vorbis_get_info((stb_vorbis *)music.ctxData); // Get Ogg file info |
|
|
|
|
|
|
|
// OGG bit rate defaults to 16 bit, it's enough for compressed format |
|
|
|
music.stream = InitAudioStream(info.sample_rate, 16, info.channels); |
|
|
|
|
|
|
|
// WARNING: It seems this function returns length in frames, not samples, so we multiply by channels |
|
|
|
music.sampleCount = (unsigned int)stb_vorbis_stream_length_in_samples((stb_vorbis *)music.ctxData)*info.channels; |
|
|
|
music.looping = true; // Looping enabled by default |
|
|
|
musicLoaded = true; |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_FILEFORMAT_XM) |
|
|
|
else if (TextIsEqual(fileExtLower, ".xm")) |
|
|
|
{ |
|
|
@ -1436,6 +1458,9 @@ Music LoadMusicStreamFromMemory(const char *fileType, unsigned char* data, int d |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_FILEFORMAT_MP3) |
|
|
|
else if (music.ctxType == MUSIC_AUDIO_MP3) { drmp3_uninit((drmp3 *)music.ctxData); RL_FREE(music.ctxData); } |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_FILEFORMAT_OGG) |
|
|
|
else if (music.ctxType == MUSIC_AUDIO_OGG) stb_vorbis_close((stb_vorbis *)music.ctxData); |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_FILEFORMAT_XM) |
|
|
|
else if (music.ctxType == MUSIC_MODULE_XM) jar_xm_free_context((jar_xm_context_t *)music.ctxData); |
|
|
|