mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-13 09:35:23 -04:00
Start refactoring resource creation
This commit is contained in:
parent
cfa3676e44
commit
4b9ab4de5f
@ -335,7 +335,7 @@ static cc_result Music_Buffer(cc_int16* data, int maxSamples, struct VorbisState
|
|||||||
|
|
||||||
static cc_result Music_PlayOgg(struct Stream* source) {
|
static cc_result Music_PlayOgg(struct Stream* source) {
|
||||||
struct OggState ogg;
|
struct OggState ogg;
|
||||||
struct VorbisState vorbis = { 0 };
|
struct VorbisState vorbis;
|
||||||
int channels, sampleRate, volume;
|
int channels, sampleRate, volume;
|
||||||
|
|
||||||
int chunkSize, samplesPerSecond;
|
int chunkSize, samplesPerSecond;
|
||||||
@ -344,6 +344,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
|
|||||||
cc_result res;
|
cc_result res;
|
||||||
|
|
||||||
Ogg_Init(&ogg, source);
|
Ogg_Init(&ogg, source);
|
||||||
|
Vorbis_Init(&vorbis);
|
||||||
vorbis.source = &ogg;
|
vorbis.source = &ogg;
|
||||||
if ((res = Vorbis_DecodeHeaders(&vorbis))) goto cleanup;
|
if ((res = Vorbis_DecodeHeaders(&vorbis))) goto cleanup;
|
||||||
|
|
||||||
|
131
src/Resources.c
131
src/Resources.c
@ -44,6 +44,9 @@ struct ResourceZipEntry {
|
|||||||
union ResourceValue value;
|
union ResourceValue value;
|
||||||
cc_uint32 offset, crc32;
|
cc_uint32 offset, crc32;
|
||||||
};
|
};
|
||||||
|
#define RESOURCE_TYPE_DATA 1
|
||||||
|
#define RESOURCE_TYPE_PNG 2
|
||||||
|
#define RESOURCE_TYPE_CONST 3
|
||||||
|
|
||||||
static CC_NOINLINE cc_bool Fetcher_Get(int reqID, struct HttpRequest* item);
|
static CC_NOINLINE cc_bool Fetcher_Get(int reqID, struct HttpRequest* item);
|
||||||
CC_NOINLINE static struct ResourceZipEntry* ZipEntries_Find(const cc_string* name);
|
CC_NOINLINE static struct ResourceZipEntry* ZipEntries_Find(const cc_string* name);
|
||||||
@ -325,30 +328,36 @@ static void SoundPatcher_WriteWav(struct Stream* s, struct VorbisState* ctx) {
|
|||||||
/* Converts an OGG sound to a WAV sound for faster decoding later */
|
/* Converts an OGG sound to a WAV sound for faster decoding later */
|
||||||
static void SoundPatcher_Save(const char* name, struct HttpRequest* req) {
|
static void SoundPatcher_Save(const char* name, struct HttpRequest* req) {
|
||||||
cc_string path; char pathBuffer[STRING_SIZE];
|
cc_string path; char pathBuffer[STRING_SIZE];
|
||||||
struct OggState ogg;
|
struct OggState* ogg = NULL;
|
||||||
|
struct VorbisState* ctx = NULL;
|
||||||
struct Stream src, dst;
|
struct Stream src, dst;
|
||||||
struct VorbisState* ctx;
|
|
||||||
cc_result res;
|
cc_result res;
|
||||||
|
|
||||||
ctx = (struct VorbisState*)Mem_TryAllocCleared(1, sizeof(struct VorbisState));
|
ogg = (struct OggState*)Mem_TryAlloc(1, sizeof(struct OggState));
|
||||||
if (!ctx) { Logger_SysWarn(ERR_OUT_OF_MEMORY, "allocating memory"); return; }
|
if (!ogg) { Logger_SysWarn(ERR_OUT_OF_MEMORY, "allocating memory"); goto cleanup; }
|
||||||
|
|
||||||
|
ctx = (struct VorbisState*)Mem_TryAlloc(1, sizeof(struct VorbisState));
|
||||||
|
if (!ctx) { Logger_SysWarn(ERR_OUT_OF_MEMORY, "allocating memory"); goto cleanup; }
|
||||||
|
|
||||||
Stream_ReadonlyMemory(&src, req->data, req->size);
|
Stream_ReadonlyMemory(&src, req->data, req->size);
|
||||||
String_InitArray(path, pathBuffer);
|
String_InitArray(path, pathBuffer);
|
||||||
String_Format1(&path, "audio/%c.wav", name);
|
String_Format1(&path, "audio/%c.wav", name);
|
||||||
|
|
||||||
res = Stream_CreateFile(&dst, &path);
|
res = Stream_CreateFile(&dst, &path);
|
||||||
if (res) { Logger_SysWarn(res, "creating .wav file"); return; }
|
if (res) { Logger_SysWarn(res, "creating .wav file"); goto cleanup; }
|
||||||
|
|
||||||
Ogg_Init(&ogg, &src);
|
Ogg_Init(ogg, &src);
|
||||||
ctx->source = &ogg;
|
Vorbis_Init(ctx);
|
||||||
|
ctx->source = ogg;
|
||||||
SoundPatcher_WriteWav(&dst, ctx);
|
SoundPatcher_WriteWav(&dst, ctx);
|
||||||
|
|
||||||
res = dst.Close(&dst);
|
res = dst.Close(&dst);
|
||||||
if (res) Logger_SysWarn(res, "closing .wav file");
|
if (res) Logger_SysWarn(res, "closing .wav file");
|
||||||
|
|
||||||
Vorbis_Free(ctx);
|
cleanup:
|
||||||
|
if (ctx) Vorbis_Free(ctx);
|
||||||
Mem_Free(ctx);
|
Mem_Free(ctx);
|
||||||
|
Mem_Free(ogg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -463,7 +472,7 @@ static const struct AssetSet ccTexsAssetSet = {
|
|||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*---------------------------------------------------------Zip writer------------------------------------------------------*
|
*------------------------------------------------------Zip entry writer---------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
static void GetCurrentZipDate(int* modTime, int* modDate) {
|
static void GetCurrentZipDate(int* modTime, int* modDate) {
|
||||||
struct DateTime now;
|
struct DateTime now;
|
||||||
@ -598,13 +607,56 @@ static cc_result ZipWriter_WritePng(struct Stream* dst, struct ResourceZipEntry*
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Zip file writer----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
static cc_result ZipFile_WriteEntries(struct Stream* s, struct ResourceZipEntry* entries, int numEntries) {
|
||||||
|
struct ResourceZipEntry* e;
|
||||||
|
cc_uint32 beg, end;
|
||||||
|
int i;
|
||||||
|
cc_result res;
|
||||||
|
|
||||||
|
for (i = 0; i < numEntries; i++)
|
||||||
|
{
|
||||||
|
e = &entries[i];
|
||||||
|
|
||||||
|
if (e->type == RESOURCE_TYPE_PNG) {
|
||||||
|
if ((res = ZipWriter_WritePng(s, e))) return res;
|
||||||
|
} else {
|
||||||
|
if ((res = ZipWriter_WriteData(s, e))) return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((res = s->Position(s, &beg))) return res;
|
||||||
|
for (i = 0; i < numEntries; i++)
|
||||||
|
{
|
||||||
|
if ((res = ZipWriter_CentralDir(s, &entries[i]))) return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((res = s->Position(s, &end))) return res;
|
||||||
|
return ZipWriter_EndOfCentralDir(s, numEntries, beg, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ZipFile_Create(cc_string* path, struct ResourceZipEntry* entries, int numEntries) {
|
||||||
|
struct Stream s;
|
||||||
|
cc_result res;
|
||||||
|
|
||||||
|
res = Stream_CreateFile(&s, path);
|
||||||
|
if (res) {
|
||||||
|
Logger_SysWarn2(res, "creating", path); return;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ZipFile_WriteEntries(&s, entries, numEntries);
|
||||||
|
if (res) Logger_SysWarn2(res, "making", path);
|
||||||
|
|
||||||
|
res = s.Close(&s);
|
||||||
|
if (res) Logger_SysWarn2(res, "closing", path);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*----------------------------------------------------default.zip resources------------------------------------------------*
|
*----------------------------------------------------default.zip resources------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
#define RESOURCE_TYPE_DATA 1
|
|
||||||
#define RESOURCE_TYPE_PNG 2
|
|
||||||
#define RESOURCE_TYPE_CONST 3
|
|
||||||
|
|
||||||
#define ANIMS_TXT \
|
#define ANIMS_TXT \
|
||||||
"# This file defines the animations used in a texture pack for ClassiCube.\r\n" \
|
"# This file defines the animations used in a texture pack for ClassiCube.\r\n" \
|
||||||
"# Each line is in the format : <TileX> <TileY> <FrameX> <FrameY> <Frame size> <Frames count> <Tick delay>\r\n" \
|
"# Each line is in the format : <TileX> <TileY> <FrameX> <FrameY> <Frame size> <Frames count> <Tick delay>\r\n" \
|
||||||
@ -883,52 +935,6 @@ static cc_result Classic0023Patcher_OldGold(struct HttpRequest* req) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
|
||||||
*------------------------------------------------------default.zip writer-------------------------------------------------*
|
|
||||||
*#########################################################################################################################*/
|
|
||||||
static cc_result DefaultZip_WriteEntries(struct Stream* s) {
|
|
||||||
struct ResourceZipEntry* e;
|
|
||||||
cc_uint32 beg, end;
|
|
||||||
int i;
|
|
||||||
cc_result res;
|
|
||||||
|
|
||||||
for (i = 0; i < Array_Elems(defaultZipEntries); i++) {
|
|
||||||
e = &defaultZipEntries[i];
|
|
||||||
|
|
||||||
if (e->type == RESOURCE_TYPE_PNG) {
|
|
||||||
if ((res = ZipWriter_WritePng(s, e))) return res;
|
|
||||||
} else {
|
|
||||||
if ((res = ZipWriter_WriteData(s, e))) return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((res = s->Position(s, &beg))) return res;
|
|
||||||
for (i = 0; i < Array_Elems(defaultZipEntries); i++) {
|
|
||||||
if ((res = ZipWriter_CentralDir(s, &defaultZipEntries[i]))) return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((res = s->Position(s, &end))) return res;
|
|
||||||
return ZipWriter_EndOfCentralDir(s, Array_Elems(defaultZipEntries), beg, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DefaultZip_Create(void) {
|
|
||||||
cc_string path = String_FromReadonly(Game_Version.DefaultTexpack);
|
|
||||||
struct Stream s;
|
|
||||||
cc_result res;
|
|
||||||
|
|
||||||
res = Stream_CreateFile(&s, &path);
|
|
||||||
if (res) {
|
|
||||||
Logger_SysWarn2(res, "creating", &path); return;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = DefaultZip_WriteEntries(&s);
|
|
||||||
if (res) Logger_SysWarn2(res, "making", &path);
|
|
||||||
|
|
||||||
res = s.Close(&s);
|
|
||||||
if (res) Logger_SysWarn2(res, "closing", &path);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*-----------------------------------------------Minecraft Classic texture assets------------------------------------------*
|
*-----------------------------------------------Minecraft Classic texture assets------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -1008,6 +1014,11 @@ static const char* MCCTextures_GetRequestName(int reqID) {
|
|||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------Minecraft Classic texture assets processing -----------------------------------*
|
*------------------------------------------Minecraft Classic texture assets processing -----------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
|
static void MCCTextures_CreateDefaultZip(void) {
|
||||||
|
cc_string path = String_FromReadonly(Game_Version.DefaultTexpack);
|
||||||
|
ZipFile_Create(&path, defaultZipEntries, Array_Elems(defaultZipEntries));
|
||||||
|
}
|
||||||
|
|
||||||
static void MCCTextures_CheckSource(struct ZipfileSource* source) {
|
static void MCCTextures_CheckSource(struct ZipfileSource* source) {
|
||||||
struct HttpRequest item;
|
struct HttpRequest item;
|
||||||
cc_result res;
|
cc_result res;
|
||||||
@ -1023,7 +1034,7 @@ static void MCCTextures_CheckSource(struct ZipfileSource* source) {
|
|||||||
HttpRequest_Free(&item);
|
HttpRequest_Free(&item);
|
||||||
|
|
||||||
if (++numDefaultZipProcessed < numDefaultZipSources) return;
|
if (++numDefaultZipProcessed < numDefaultZipSources) return;
|
||||||
DefaultZip_Create();
|
MCCTextures_CreateDefaultZip();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MCCTextures_CheckStatus(void) {
|
static void MCCTextures_CheckStatus(void) {
|
||||||
|
@ -1229,6 +1229,10 @@ static void Vorbis_CalcWindow(struct VorbisWindow* window, int blockSize) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Vorbis_Init(struct VorbisState* ctx) {
|
||||||
|
Mem_Set(ctx, 0, sizeof(*ctx) - sizeof(ctx->imdct));
|
||||||
|
}
|
||||||
|
|
||||||
void Vorbis_Free(struct VorbisState* ctx) {
|
void Vorbis_Free(struct VorbisState* ctx) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < ctx->numCodebooks; i++)
|
for (i = 0; i < ctx->numCodebooks; i++)
|
||||||
|
@ -56,7 +56,9 @@ struct VorbisState {
|
|||||||
struct imdct_state imdct[2];
|
struct imdct_state imdct[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Frees all dynamic memory allocated to decode the given vorbis audio. */
|
/* Initialises the given context to defaults */
|
||||||
|
void Vorbis_Init(struct VorbisState* ctx);
|
||||||
|
/* Frees all memory dynamically allocated by the given context */
|
||||||
void Vorbis_Free(struct VorbisState* ctx);
|
void Vorbis_Free(struct VorbisState* ctx);
|
||||||
/* Reads and decodes the initial vorbis headers and setup data. */
|
/* Reads and decodes the initial vorbis headers and setup data. */
|
||||||
cc_result Vorbis_DecodeHeaders(struct VorbisState* ctx);
|
cc_result Vorbis_DecodeHeaders(struct VorbisState* ctx);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user