cOMS/audio/Audio.cpp

102 lines
2.3 KiB
C++

/**
* Jingga
*
* @copyright Jingga
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
#ifndef TOS_AUDIO_C
#define TOS_AUDIO_C
#include "../utils/StringUtils.h"
#include "../memory/RingMemory.h"
#if _WIN32
#include "../platform/win32/FileUtils.cpp"
#else
#include "../platform/linux/FileUtils.cpp"
#endif
#include "Audio.h"
#include "AudioSetting.h"
#include "Wav.h"
void audio_from_file(Audio* audio, const char* path, RingMemory* ring)
{
FileBody file;
file_read(path, &file, ring);
ASSERT_SIMPLE(file.size);
if (str_ends_with(path, ".wav")) {
wav_from_data(file.content, (uint32) file.size, audio, ring);
}
}
int32 audio_data_size(const Audio* audio)
{
return (int32) (audio->size
+ sizeof(audio->sample_rate)
+ sizeof(audio->sample_size)
+ sizeof(audio->channels)
+ sizeof(audio->bloc_size)
+ sizeof(audio->byte_per_sec)
+ sizeof(audio->size)
);
}
int32 audio_from_data(const byte* data, Audio* audio)
{
audio->sample_rate = SWAP_ENDIAN_LITTLE(*((uint16 *) data));
data += sizeof(audio->sample_rate);
audio->sample_size = *data;
data += sizeof(audio->sample_size);
audio->channels = *data;
data += sizeof(audio->channels);
audio->bloc_size = *data;
data += sizeof(audio->bloc_size);
audio->byte_per_sec = SWAP_ENDIAN_LITTLE(*((uint32 *) data));
data += sizeof(audio->byte_per_sec);
audio->size = SWAP_ENDIAN_LITTLE(*((uint32 *) data));
data += sizeof(audio->size);
memcpy(audio->data, data, audio->size);
data += audio->size;
return audio_data_size(audio);
}
int32 audio_to_data(const Audio* audio, byte* data)
{
*((uint16 *) data) = SWAP_ENDIAN_LITTLE(audio->sample_rate);
data += sizeof(audio->sample_rate);
*data = audio->sample_size;
data += sizeof(audio->sample_size);
*data = audio->channels;
data += sizeof(audio->channels);
*data = audio->bloc_size;
data += sizeof(audio->bloc_size);
*((uint32 *) data) = SWAP_ENDIAN_LITTLE(audio->byte_per_sec);
data += sizeof(audio->byte_per_sec);
*((uint32 *) data) = SWAP_ENDIAN_LITTLE(audio->size);
data += sizeof(audio->size);
memcpy(data, audio->data, audio->size);
data += audio->size;
return audio_data_size(audio);
}
#endif