78 lines
2.4 KiB
C++
78 lines
2.4 KiB
C++
|
|
#include "Resources/AudioLoader.h"
|
||
|
|
#include "Resources/ResourceManager.h"
|
||
|
|
#include "Resources/ResourceTypes.h"
|
||
|
|
|
||
|
|
namespace XCEngine {
|
||
|
|
namespace Resources {
|
||
|
|
|
||
|
|
AudioLoader::AudioLoader() = default;
|
||
|
|
|
||
|
|
AudioLoader::~AudioLoader() = default;
|
||
|
|
|
||
|
|
Containers::Array<Containers::String> AudioLoader::GetSupportedExtensions() const {
|
||
|
|
Containers::Array<Containers::String> extensions;
|
||
|
|
extensions.PushBack("wav");
|
||
|
|
extensions.PushBack("ogg");
|
||
|
|
extensions.PushBack("mp3");
|
||
|
|
extensions.PushBack("flac");
|
||
|
|
extensions.PushBack("aiff");
|
||
|
|
extensions.PushBack("aif");
|
||
|
|
return extensions;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool AudioLoader::CanLoad(const Containers::String& path) const {
|
||
|
|
Containers::String ext = GetExtension(path);
|
||
|
|
return ext == "wav" || ext == "ogg" || ext == "mp3" ||
|
||
|
|
ext == "flac" || ext == "aiff" || ext == "aif";
|
||
|
|
}
|
||
|
|
|
||
|
|
LoadResult AudioLoader::Load(const Containers::String& path, const ImportSettings* settings) {
|
||
|
|
Containers::Array<Core::uint8> data = ReadFileData(path);
|
||
|
|
if (data.Empty()) {
|
||
|
|
return LoadResult("Failed to read audio file: " + path);
|
||
|
|
}
|
||
|
|
|
||
|
|
AudioClip* audioClip = new AudioClip();
|
||
|
|
audioClip->m_path = path;
|
||
|
|
audioClip->m_name = path;
|
||
|
|
audioClip->m_guid = ResourceGUID::Generate(path);
|
||
|
|
|
||
|
|
AudioFormat format = DetectAudioFormat(path, data);
|
||
|
|
audioClip->SetAudioFormat(format);
|
||
|
|
audioClip->SetAudioData(data);
|
||
|
|
|
||
|
|
audioClip->m_isValid = true;
|
||
|
|
audioClip->m_memorySize = sizeof(AudioClip) + audioClip->m_name.Length() +
|
||
|
|
audioClip->m_path.Length() + audioClip->GetAudioData().Size();
|
||
|
|
|
||
|
|
return LoadResult(audioClip);
|
||
|
|
}
|
||
|
|
|
||
|
|
ImportSettings* AudioLoader::GetDefaultSettings() const {
|
||
|
|
return nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool AudioLoader::ParseWAVData(const Containers::Array<Core::uint8>& data, AudioClip* audioClip) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
AudioFormat AudioLoader::DetectAudioFormat(const Containers::String& path, const Containers::Array<Core::uint8>& data) {
|
||
|
|
Containers::String ext = GetExtension(path);
|
||
|
|
|
||
|
|
if (ext == "wav") return AudioFormat::WAV;
|
||
|
|
if (ext == "ogg") return AudioFormat::OGG;
|
||
|
|
if (ext == "mp3") return AudioFormat::MP3;
|
||
|
|
if (ext == "flac") return AudioFormat::FLAC;
|
||
|
|
|
||
|
|
if (data.Size() >= 4) {
|
||
|
|
if (data[0] == 'R' && data[1] == 'I' && data[2] == 'F' && data[3] == 'F') {
|
||
|
|
return AudioFormat::WAV;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return AudioFormat::Unknown;
|
||
|
|
}
|
||
|
|
|
||
|
|
} // namespace Resources
|
||
|
|
} // namespace XCEngine
|