ADDED: LoadWaveFromMemory() #1327
This commit is contained in:
parent
768b29dd74
commit
5b60a743bd
2 changed files with 64 additions and 64 deletions
125
src/raudio.c
125
src/raudio.c
|
@ -370,17 +370,17 @@ static void InitAudioBufferPool(void); // Initialise the multic
|
||||||
static void CloseAudioBufferPool(void); // Close the audio buffers pool
|
static void CloseAudioBufferPool(void); // Close the audio buffers pool
|
||||||
|
|
||||||
#if defined(SUPPORT_FILEFORMAT_WAV)
|
#if defined(SUPPORT_FILEFORMAT_WAV)
|
||||||
static Wave LoadWAV(const char *fileName); // Load WAV file
|
static Wave LoadWAV(const char *fileData, unsigned int fileSize); // Load WAV file
|
||||||
static int SaveWAV(Wave wave, const char *fileName); // Save wave data as WAV file
|
static int SaveWAV(Wave wave, const char *fileName); // Save wave data as WAV file
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_OGG)
|
#if defined(SUPPORT_FILEFORMAT_OGG)
|
||||||
static Wave LoadOGG(const char *fileName); // Load OGG file
|
static Wave LoadOGG(const char *fileData, unsigned int fileSize); // Load OGG file
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
||||||
static Wave LoadFLAC(const char *fileName); // Load FLAC file
|
static Wave LoadFLAC(const char *fileData, unsigned int fileSize); // Load FLAC file
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_MP3)
|
#if defined(SUPPORT_FILEFORMAT_MP3)
|
||||||
static Wave LoadMP3(const char *fileName); // Load MP3 file
|
static Wave LoadMP3(const char *fileData, unsigned int fileSize); // Load MP3 file
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(RAUDIO_STANDALONE)
|
#if defined(RAUDIO_STANDALONE)
|
||||||
|
@ -690,20 +690,40 @@ Wave LoadWave(const char *fileName)
|
||||||
{
|
{
|
||||||
Wave wave = { 0 };
|
Wave wave = { 0 };
|
||||||
|
|
||||||
|
// Loading file to memory
|
||||||
|
unsigned int fileSize = 0;
|
||||||
|
unsigned char *fileData = LoadFileData(fileName, &fileSize);
|
||||||
|
|
||||||
|
// Loading wave from memory data
|
||||||
|
wave = LoadWaveFromMemory(GetFileExtension(fileName), (char *)fileData, fileSize);
|
||||||
|
|
||||||
|
RL_FREE(fileData);
|
||||||
|
|
||||||
|
return wave;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load wave from memory buffer, fileType refers to extension: i.e. "wav"
|
||||||
|
Wave LoadWaveFromMemory(const char *fileType, const char *fileData, int dataSize)
|
||||||
|
{
|
||||||
|
Wave wave = { 0 };
|
||||||
|
|
||||||
|
char fileExtLower[16] = { 0 };
|
||||||
|
strcpy(fileExtLower, TextToLower(fileType));
|
||||||
|
|
||||||
if (false) { }
|
if (false) { }
|
||||||
#if defined(SUPPORT_FILEFORMAT_WAV)
|
#if defined(SUPPORT_FILEFORMAT_WAV)
|
||||||
else if (IsFileExtension(fileName, ".wav")) wave = LoadWAV(fileName);
|
else if (TextIsEqual(fileExtLower, "wav")) wave = LoadWAV(fileData, dataSize);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_OGG)
|
#if defined(SUPPORT_FILEFORMAT_OGG)
|
||||||
else if (IsFileExtension(fileName, ".ogg")) wave = LoadOGG(fileName);
|
else if (TextIsEqual(fileExtLower, "ogg")) wave = LoadOGG(fileData, dataSize);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
||||||
else if (IsFileExtension(fileName, ".flac")) wave = LoadFLAC(fileName);
|
else if (TextIsEqual(fileExtLower, "flac")) wave = LoadFLAC(fileData, dataSize);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_FILEFORMAT_MP3)
|
#if defined(SUPPORT_FILEFORMAT_MP3)
|
||||||
else if (IsFileExtension(fileName, ".mp3")) wave = LoadMP3(fileName);
|
else if (TextIsEqual(fileExtLower, "mp3")) wave = LoadMP3(fileData, dataSize);
|
||||||
#endif
|
#endif
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] File format not supported", fileName);
|
else TRACELOG(LOG_WARNING, "WAVE: File format not supported");
|
||||||
|
|
||||||
return wave;
|
return wave;
|
||||||
}
|
}
|
||||||
|
@ -1889,15 +1909,11 @@ static void CloseAudioBufferPool(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(SUPPORT_FILEFORMAT_WAV)
|
#if defined(SUPPORT_FILEFORMAT_WAV)
|
||||||
// Load WAV file into Wave structure
|
// Load WAV file data into Wave structure
|
||||||
static Wave LoadWAV(const char *fileName)
|
// NOTE: Using dr_wav library
|
||||||
|
static Wave LoadWAV(const char *fileData, unsigned int fileSize)
|
||||||
{
|
{
|
||||||
Wave wave = { 0 };
|
Wave wave = { 0 };
|
||||||
|
|
||||||
// Loading WAV from memory to avoid FILE accesses
|
|
||||||
unsigned int fileSize = 0;
|
|
||||||
unsigned char *fileData = LoadFileData(fileName, &fileSize);
|
|
||||||
|
|
||||||
drwav wav = { 0 };
|
drwav wav = { 0 };
|
||||||
|
|
||||||
bool success = drwav_init_memory(&wav, fileData, fileSize, NULL);
|
bool success = drwav_init_memory(&wav, fileData, fileSize, NULL);
|
||||||
|
@ -1911,15 +1927,15 @@ static Wave LoadWAV(const char *fileName)
|
||||||
wave.data = (short *)RL_MALLOC(wave.sampleCount*sizeof(short));
|
wave.data = (short *)RL_MALLOC(wave.sampleCount*sizeof(short));
|
||||||
drwav_read_pcm_frames_s16(&wav, wav.totalPCMFrameCount, wave.data);
|
drwav_read_pcm_frames_s16(&wav, wav.totalPCMFrameCount, wave.data);
|
||||||
}
|
}
|
||||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to load WAV data", fileName);
|
else TRACELOG(LOG_WARNING, "WAVE: Failed to load WAV data");
|
||||||
|
|
||||||
drwav_uninit(&wav);
|
drwav_uninit(&wav);
|
||||||
RL_FREE(fileData);
|
|
||||||
|
|
||||||
return wave;
|
return wave;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save wave data as WAV file
|
// Save wave data as WAV file
|
||||||
|
// NOTE: Using dr_wav library
|
||||||
static int SaveWAV(Wave wave, const char *fileName)
|
static int SaveWAV(Wave wave, const char *fileName)
|
||||||
{
|
{
|
||||||
drwav wav = { 0 };
|
drwav wav = { 0 };
|
||||||
|
@ -1944,94 +1960,77 @@ static int SaveWAV(Wave wave, const char *fileName)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SUPPORT_FILEFORMAT_OGG)
|
#if defined(SUPPORT_FILEFORMAT_OGG)
|
||||||
// Load OGG file into Wave structure
|
// Load OGG file data into Wave structure
|
||||||
// NOTE: Using stb_vorbis library
|
// NOTE: Using stb_vorbis library
|
||||||
static Wave LoadOGG(const char *fileName)
|
static Wave LoadOGG(const char *fileData, unsigned int fileSize)
|
||||||
{
|
{
|
||||||
Wave wave = { 0 };
|
Wave wave = { 0 };
|
||||||
|
|
||||||
// Loading OGG from memory to avoid FILE accesses
|
stb_vorbis *oggData = stb_vorbis_open_memory((unsigned char *)fileData, fileSize, NULL, NULL);
|
||||||
unsigned int fileSize = 0;
|
|
||||||
unsigned char *fileData = LoadFileData(fileName, &fileSize);
|
|
||||||
|
|
||||||
stb_vorbis *oggFile = stb_vorbis_open_memory(fileData, fileSize, NULL, NULL);
|
if (oggData != NULL)
|
||||||
|
|
||||||
if (oggFile == NULL) TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open OGG file", fileName);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
stb_vorbis_info info = stb_vorbis_get_info(oggFile);
|
stb_vorbis_info info = stb_vorbis_get_info(oggData);
|
||||||
|
|
||||||
wave.sampleRate = info.sample_rate;
|
wave.sampleRate = info.sample_rate;
|
||||||
wave.sampleSize = 16; // 16 bit per sample (short)
|
wave.sampleSize = 16; // 16 bit per sample (short)
|
||||||
wave.channels = info.channels;
|
wave.channels = info.channels;
|
||||||
wave.sampleCount = (unsigned int)stb_vorbis_stream_length_in_samples(oggFile)*info.channels; // Independent by channel
|
wave.sampleCount = (unsigned int)stb_vorbis_stream_length_in_samples(oggData)*info.channels; // Independent by channel
|
||||||
|
|
||||||
float totalSeconds = stb_vorbis_stream_length_in_seconds(oggFile);
|
float totalSeconds = stb_vorbis_stream_length_in_seconds(oggData);
|
||||||
if (totalSeconds > 10) TRACELOG(LOG_WARNING, "WAVE: [%s] Ogg audio length larger than 10 seconds (%f), that's a big file in memory, consider music streaming", fileName, totalSeconds);
|
if (totalSeconds > 10) TRACELOG(LOG_WARNING, "WAVE: OGG audio length larger than 10 seconds (%f sec.), that's a big file in memory, consider music streaming", totalSeconds);
|
||||||
|
|
||||||
wave.data = (short *)RL_MALLOC(wave.sampleCount*wave.channels*sizeof(short));
|
wave.data = (short *)RL_MALLOC(wave.sampleCount*wave.channels*sizeof(short));
|
||||||
|
|
||||||
// NOTE: Returns the number of samples to process (be careful! we ask for number of shorts!)
|
// NOTE: Returns the number of samples to process (be careful! we ask for number of shorts!)
|
||||||
stb_vorbis_get_samples_short_interleaved(oggFile, info.channels, (short *)wave.data, wave.sampleCount*wave.channels);
|
stb_vorbis_get_samples_short_interleaved(oggData, info.channels, (short *)wave.data, wave.sampleCount*wave.channels);
|
||||||
TRACELOG(LOG_INFO, "WAVE: [%s] OGG file loaded successfully (%i Hz, %i bit, %s)", fileName, wave.sampleRate, wave.sampleSize, (wave.channels == 1)? "Mono" : "Stereo");
|
TRACELOG(LOG_INFO, "WAVE: OGG data loaded successfully (%i Hz, %i bit, %s)", wave.sampleRate, wave.sampleSize, (wave.channels == 1)? "Mono" : "Stereo");
|
||||||
|
|
||||||
stb_vorbis_close(oggFile);
|
stb_vorbis_close(oggData);
|
||||||
}
|
}
|
||||||
|
else TRACELOG(LOG_WARNING, "WAVE: Failed to load OGG data");
|
||||||
RL_FREE(fileData);
|
|
||||||
|
|
||||||
return wave;
|
return wave;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
#if defined(SUPPORT_FILEFORMAT_FLAC)
|
||||||
// Load FLAC file into Wave structure
|
// Load FLAC file data into Wave structure
|
||||||
// NOTE: Using dr_flac library
|
// NOTE: Using dr_flac library
|
||||||
static Wave LoadFLAC(const char *fileName)
|
static Wave LoadFLAC(const char *fileData, unsigned int fileSize)
|
||||||
{
|
{
|
||||||
Wave wave = { 0 };
|
Wave wave = { 0 };
|
||||||
|
|
||||||
// Loading FLAC from memory to avoid FILE accesses
|
// Decode the entire FLAC file in one go
|
||||||
unsigned int fileSize = 0;
|
|
||||||
unsigned char *fileData = LoadFileData(fileName, &fileSize);
|
|
||||||
|
|
||||||
// Decode an entire FLAC file in one go
|
|
||||||
unsigned long long int totalSampleCount = 0;
|
unsigned long long int totalSampleCount = 0;
|
||||||
wave.data = drflac_open_memory_and_read_pcm_frames_s16(fileData, fileSize, &wave.channels, &wave.sampleRate, &totalSampleCount);
|
wave.data = drflac_open_memory_and_read_pcm_frames_s16(fileData, fileSize, &wave.channels, &wave.sampleRate, &totalSampleCount);
|
||||||
|
|
||||||
if (wave.data == NULL) TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to load FLAC data", fileName);
|
if (wave.data != NULL)
|
||||||
else
|
|
||||||
{
|
{
|
||||||
wave.sampleCount = (unsigned int)totalSampleCount;
|
wave.sampleCount = (unsigned int)totalSampleCount;
|
||||||
wave.sampleSize = 16;
|
wave.sampleSize = 16;
|
||||||
|
|
||||||
TRACELOG(LOG_INFO, "WAVE: [%s] FLAC file loaded successfully (%i Hz, %i bit, %s)", fileName, wave.sampleRate, wave.sampleSize, (wave.channels == 1)? "Mono" : "Stereo");
|
TRACELOG(LOG_INFO, "WAVE: FLAC data loaded successfully (%i Hz, %i bit, %s)", wave.sampleRate, wave.sampleSize, (wave.channels == 1)? "Mono" : "Stereo");
|
||||||
}
|
}
|
||||||
|
else TRACELOG(LOG_WARNING, "WAVE: Failed to load FLAC data");
|
||||||
RL_FREE(fileData);
|
|
||||||
|
|
||||||
return wave;
|
return wave;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SUPPORT_FILEFORMAT_MP3)
|
#if defined(SUPPORT_FILEFORMAT_MP3)
|
||||||
// Load MP3 file into Wave structure
|
// Load MP3 file data into Wave structure
|
||||||
// NOTE: Using dr_mp3 library
|
// NOTE: Using dr_mp3 library
|
||||||
static Wave LoadMP3(const char *fileName)
|
static Wave LoadMP3(const char *fileData, unsigned int fileSize)
|
||||||
{
|
{
|
||||||
Wave wave = { 0 };
|
Wave wave = { 0 };
|
||||||
|
|
||||||
// Loading MP3 from memory to avoid FILE accesses
|
|
||||||
unsigned int fileSize = 0;
|
|
||||||
unsigned char *fileData = LoadFileData(fileName, &fileSize);
|
|
||||||
|
|
||||||
// Decode an entire MP3 file in one go
|
|
||||||
unsigned long long int totalFrameCount = 0;
|
|
||||||
drmp3_config config = { 0 };
|
drmp3_config config = { 0 };
|
||||||
|
|
||||||
|
// Decode the entire MP3 file in one go
|
||||||
|
unsigned long long int totalFrameCount = 0;
|
||||||
wave.data = drmp3_open_memory_and_read_f32(fileData, fileSize, &config, &totalFrameCount);
|
wave.data = drmp3_open_memory_and_read_f32(fileData, fileSize, &config, &totalFrameCount);
|
||||||
|
|
||||||
if (wave.data == NULL) TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to load MP3 data", fileName);
|
if (wave.data != NULL)
|
||||||
else
|
|
||||||
{
|
{
|
||||||
wave.channels = config.outputChannels;
|
wave.channels = config.outputChannels;
|
||||||
wave.sampleRate = config.outputSampleRate;
|
wave.sampleRate = config.outputSampleRate;
|
||||||
|
@ -2039,12 +2038,12 @@ static Wave LoadMP3(const char *fileName)
|
||||||
wave.sampleSize = 32;
|
wave.sampleSize = 32;
|
||||||
|
|
||||||
// NOTE: Only support up to 2 channels (mono, stereo)
|
// NOTE: Only support up to 2 channels (mono, stereo)
|
||||||
if (wave.channels > 2) TRACELOG(LOG_WARNING, "WAVE: [%s] MP3 channels number (%i) not supported", fileName, wave.channels);
|
// TODO: Really?
|
||||||
|
if (wave.channels > 2) TRACELOG(LOG_WARNING, "WAVE: MP3 channels number (%i) not supported", wave.channels);
|
||||||
|
|
||||||
TRACELOG(LOG_INFO, "WAVE: [%s] MP3 file loaded successfully (%i Hz, %i bit, %s)", fileName, wave.sampleRate, wave.sampleSize, (wave.channels == 1)? "Mono" : "Stereo");
|
TRACELOG(LOG_INFO, "WAVE: MP3 file loaded successfully (%i Hz, %i bit, %s)", wave.sampleRate, wave.sampleSize, (wave.channels == 1)? "Mono" : "Stereo");
|
||||||
}
|
}
|
||||||
|
else TRACELOG(LOG_WARNING, "WAVE: Failed to load MP3 data");
|
||||||
RL_FREE(fileData);
|
|
||||||
|
|
||||||
return wave;
|
return wave;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1417,6 +1417,7 @@ RLAPI void SetMasterVolume(float volume); // Set mas
|
||||||
|
|
||||||
// Wave/Sound loading/unloading functions
|
// Wave/Sound loading/unloading functions
|
||||||
RLAPI Wave LoadWave(const char *fileName); // Load wave data from file
|
RLAPI Wave LoadWave(const char *fileName); // Load wave data from file
|
||||||
|
RLAPI Wave LoadWaveFromMemory(const char *fileType, const char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. "wav"
|
||||||
RLAPI Sound LoadSound(const char *fileName); // Load sound from file
|
RLAPI Sound LoadSound(const char *fileName); // Load sound from file
|
||||||
RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data
|
RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data
|
||||||
RLAPI void UpdateSound(Sound sound, const void *data, int samplesCount);// Update sound buffer with new data
|
RLAPI void UpdateSound(Sound sound, const void *data, int samplesCount);// Update sound buffer with new data
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue