1#include "WaveSoundLoader.h"
5#include "Resources/ResourceStore.h"
7#include "Foundation/Logging/Logger.h"
9#define fourccRIFF 'FFIR'
10#define fourccDATA 'atad'
11#define fourccFMT ' tmf'
12#define fourccWAVE 'EVAW'
13#define fourccXWMA 'AMWX'
14#define fourccDPDS 'sdpd'
24 bool read(uint8_t * & begin, uint8_t * end, T & t)
26 if (
sizeof(T) >= (end - begin))
return false;
28 std::memcpy(&t, begin,
sizeof(T));
35 bool findChunk(uint8_t * begin, uint8_t * end, uint32_t fourCC, uint32_t & chunkSize, uint32_t & chunkPosition)
37 uint32_t RIFFDataSize;
43 if (!read(begin, end, chunkType)) {
47 uint32_t chunkDataSize;
48 if (!read(begin, end, chunkDataSize)) {
53 RIFFDataSize = chunkDataSize;
55 if (!read(begin, end, fileType)) {
61 begin += chunkDataSize;
65 offset +=
sizeof(uint32_t) * 2;
67 if (chunkType == fourCC) {
68 chunkSize = chunkDataSize;
69 chunkPosition = offset;
73 offset += chunkDataSize;
79 bool readChunkData(uint8_t * begin,
size_t size,
void * buffer, uint32_t bufferSize, uint32_t bufferOffset)
81 if (bufferOffset >= size)
return false;
83 std::memcpy(buffer, begin + bufferOffset, bufferSize);
89bool Cogs::Core::WaveSoundLoader::canLoad(Context * ,
const SoundLoadInfo & )
94bool Cogs::Core::WaveSoundLoader::load(Context * context,
const SoundLoadInfo & loadInfo)
96 auto content = context->resourceStore->getResourceContents(loadInfo.resourcePath);
98 if (content.empty()) {
99 LOG_ERROR(logger,
"Could not open %s.", loadInfo.resourcePath.c_str());
104 uint32_t chunkPosition;
107 findChunk(content.data(), content.data() + content.size(), fourccRIFF, chunkSize, chunkPosition);
110 readChunkData(content.data(), content.size(), &fileType,
sizeof(fileType), chunkPosition);
112 if (fileType != fourccWAVE) {
113 LOG_ERROR(logger,
"Only WAVE format supported.");
117 auto sound = (Sound *)(loadInfo.handle.get());
120 if (!findChunk(content.data(), content.data() + content.size(), fourccFMT, chunkSize, chunkPosition)) {
121 LOG_ERROR(logger,
"Could not locate sound format information in %s.", loadInfo.resourcePath.c_str());
125 readChunkData(content.data(), content.size(), &sound->format, chunkSize, chunkPosition);
128 if (!findChunk(content.data(), content.data() + content.size(), fourccDATA, chunkSize, chunkPosition)) {
129 LOG_ERROR(logger,
"Could not locate data chunk in sound.");
134 LOG_WARNING(logger,
"Empty sound data specified.");
137 sound->data.resize(chunkSize);
138 readChunkData(content.data(), content.size(), sound->data.data(), chunkSize, chunkPosition);
Log implementation class.
constexpr Log getLogger(const char(&name)[LEN]) noexcept