summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAgnis "NeZvērs" Aldiņš <[email protected]>2021-02-24 10:22:21 +0200
committerGitHub <[email protected]>2021-02-24 09:22:21 +0100
commit0cb748f30b463c75254855ab67ec4b7350a47117 (patch)
treeee488399fdf6665d0ee0c93c4f6718ffb3f4b7f7
parent209445ccde2c1e984c0787b3d1b24fc3bf62a427 (diff)
downloadraylib-0cb748f30b463c75254855ab67ec4b7350a47117.tar.gz
raylib-0cb748f30b463c75254855ab67ec4b7350a47117.zip
LoadMusicStreamFromMemory wav mp3 flac support (#1609)
-rw-r--r--src/raudio.c70
1 files changed, 68 insertions, 2 deletions
diff --git a/src/raudio.c b/src/raudio.c
index 0a0474e1..9b135dc1 100644
--- a/src/raudio.c
+++ b/src/raudio.c
@@ -1307,8 +1307,65 @@ Music LoadMusicStreamFromMemory(const char *fileType, unsigned char* data, int d
strcpy(fileExtLower, TextToLower(fileType));
if (false) { }
+#if defined(SUPPORT_FILEFORMAT_WAV)
+ else if (TextIsEqual(fileExtLower, ".wav"))
+ {
+ drwav *ctxWav = RL_CALLOC(1, sizeof(drwav));
+
+ bool success = drwav_init_memory(ctxWav, (const void*)data, dataSize, NULL);
+
+ music.ctxType = MUSIC_AUDIO_WAV;
+ music.ctxData = ctxWav;
+
+ if (success)
+ {
+ int sampleSize = ctxWav->bitsPerSample;
+ if (ctxWav->bitsPerSample == 24) sampleSize = 16; // Forcing conversion to s16 on UpdateMusicStream()
+
+ music.stream = InitAudioStream(ctxWav->sampleRate, sampleSize, ctxWav->channels);
+ music.sampleCount = (unsigned int)ctxWav->totalPCMFrameCount*ctxWav->channels;
+ music.looping = true; // Looping enabled by default
+ musicLoaded = true;
+ }
+ }
+#endif
+#if defined(SUPPORT_FILEFORMAT_FLAC)
+ else if (TextIsEqual(fileExtLower, ".flac"))
+ {
+ music.ctxType = MUSIC_AUDIO_FLAC;
+ music.ctxData = drflac_open_memory((const void*)data, dataSize, NULL);
+
+ if (music.ctxData != NULL)
+ {
+ drflac *ctxFlac = (drflac *)music.ctxData;
+
+ music.stream = InitAudioStream(ctxFlac->sampleRate, ctxFlac->bitsPerSample, ctxFlac->channels);
+ music.sampleCount = (unsigned int)ctxFlac->totalPCMFrameCount*ctxFlac->channels;
+ music.looping = true; // Looping enabled by default
+ musicLoaded = true;
+ }
+ }
+#endif
+#if defined(SUPPORT_FILEFORMAT_MP3)
+ else if (TextIsEqual(fileExtLower, ".mp3"))
+ {
+ drmp3 *ctxMp3 = RL_CALLOC(1, sizeof(drmp3));
+ int success = drmp3_init_memory(ctxMp3, (const void*)data, dataSize, NULL);
+
+ music.ctxType = MUSIC_AUDIO_MP3;
+ music.ctxData = ctxMp3;
+
+ if (success)
+ {
+ music.stream = InitAudioStream(ctxMp3->sampleRate, 32, ctxMp3->channels);
+ music.sampleCount = (unsigned int)drmp3_get_pcm_frame_count(ctxMp3)*ctxMp3->channels;
+ music.looping = true; // Looping enabled by default
+ musicLoaded = true;
+ }
+ }
+#endif
#if defined(SUPPORT_FILEFORMAT_XM)
- if (TextIsEqual(fileExtLower, ".xm"))
+ else if (TextIsEqual(fileExtLower, ".xm"))
{
jar_xm_context_t *ctxXm = NULL;
int result = jar_xm_create_context_safe(&ctxXm, data, dataSize, 48000);
@@ -1371,7 +1428,16 @@ Music LoadMusicStreamFromMemory(const char *fileType, unsigned char* data, int d
if (!musicLoaded)
{
if (false) { }
- #if defined(SUPPORT_FILEFORMAT_XM)
+ #if defined(SUPPORT_FILEFORMAT_WAV)
+ else if (music.ctxType == MUSIC_AUDIO_WAV) drwav_uninit((drwav *)music.ctxData);
+ #endif
+ #if defined(SUPPORT_FILEFORMAT_FLAC)
+ else if (music.ctxType == MUSIC_AUDIO_FLAC) drflac_free((drflac *)music.ctxData, NULL);
+ #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_XM)
else if (music.ctxType == MUSIC_MODULE_XM) jar_xm_free_context((jar_xm_context_t *)music.ctxData);
#endif
#if defined(SUPPORT_FILEFORMAT_MOD)