summaryrefslogtreecommitdiff
path: root/src/cache/handlers
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-08-12 17:47:45 -0400
committerAndrew Opalach <andrew@akon.city> 2025-08-12 17:47:45 -0400
commit7e796649557bfeae6eccba751d4a1ffae75de45c (patch)
treed58251d50b5db4ecf34b5ef99ff3edf8b86735d2 /src/cache/handlers
parent2cc385b71e161eae39915bf24de53d5b704e7ea0 (diff)
downloadcamu-7e796649557bfeae6eccba751d4a1ffae75de45c.tar.gz
camu-7e796649557bfeae6eccba751d4a1ffae75de45c.tar.bz2
camu-7e796649557bfeae6eccba751d4a1ffae75de45c.zip
Runtime codec selection, Vulkan deconstruction
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/cache/handlers')
-rw-r--r--src/cache/handlers/cdio.c4
-rw-r--r--src/cache/handlers/file.c22
-rw-r--r--src/cache/handlers/file.h2
-rw-r--r--src/cache/handlers/http.c4
4 files changed, 24 insertions, 8 deletions
diff --git a/src/cache/handlers/cdio.c b/src/cache/handlers/cdio.c
index 7c83523..abebeb0 100644
--- a/src/cache/handlers/cdio.c
+++ b/src/cache/handlers/cdio.c
@@ -119,7 +119,7 @@ static void handler_cdio_free(struct cch_handler **handler)
cdio_cddap_close(cdio->drive);
}
cch_threaded_waits_close(&cdio->waits);
- al_str_free(&cdio->handler.liana);
+ al_str_free(&cdio->handler.handler);
al_free(cdio);
*handler = NULL;
}
@@ -198,7 +198,7 @@ struct cch_entry *cch_handler_cdio_create(void)
entry->handler->wait_for_range = handler_cdio_wait_for_range;
entry->handler->free = handler_cdio_free;
entry->handler->entry = entry;
- al_str_from(&entry->handler->liana, "cdio");
+ al_str_from(&entry->handler->handler, "cdio");
if (!open_cd_drive(cdio)) {
return NULL;
}
diff --git a/src/cache/handlers/file.c b/src/cache/handlers/file.c
index 345cdca..dba5649 100644
--- a/src/cache/handlers/file.c
+++ b/src/cache/handlers/file.c
@@ -1,3 +1,5 @@
+#include "../../codec/codec.h"
+
#include "../backings/file.h"
#include "file.h"
@@ -22,15 +24,28 @@ static bool handler_file_wait_for_range(struct cch_handler *handler, struct cch_
return true;
}
+static s32 handler_file_guess_format(struct cch_handler *handler)
+{
+ struct cch_handler_file *file = (struct cch_handler_file *)handler;
+ struct cch_backing_file *backing = (struct cch_backing_file *)file->backing;
+ str *path = &backing->file.path;
+ u32 dot = al_str_rfind(path, '.');
+ if (dot != AL_STR_NPOS) {
+ str ext = al_str_substr(path, dot, path->length);
+ return camu_guess_format(NULL, &ext, NULL);
+ }
+ return -1;
+}
+
static void handler_file_free(struct cch_handler **handler)
{
struct cch_handler_file *file = (struct cch_handler_file *)*handler;
- al_str_free(&file->handler.liana);
+ al_str_free(&file->handler.handler);
al_free(file);
*handler = NULL;
}
-struct cch_entry *cch_handler_file_create(str *path, str *liana)
+struct cch_entry *cch_handler_file_create(str *path, str *handler)
{
struct cch_backing *backing = cch_backing_file_create(path, 0);
if (!backing) return NULL;
@@ -42,8 +57,9 @@ struct cch_entry *cch_handler_file_create(str *path, str *liana)
entry->handler->can_seek = handler_file_can_seek;
entry->handler->maybe_spawn_worker = handler_file_maybe_spawn_worker;
entry->handler->wait_for_range = handler_file_wait_for_range;
+ entry->handler->guess_format = handler_file_guess_format;
entry->handler->free = handler_file_free;
entry->handler->entry = entry;
- al_str_clone(&entry->handler->liana, liana);
+ al_str_clone(&entry->handler->handler, handler);
return entry;
}
diff --git a/src/cache/handlers/file.h b/src/cache/handlers/file.h
index 4704387..f883498 100644
--- a/src/cache/handlers/file.h
+++ b/src/cache/handlers/file.h
@@ -10,4 +10,4 @@ struct cch_handler_file {
struct cch_backing *backing;
};
-struct cch_entry *cch_handler_file_create(str *path, str *liana);
+struct cch_entry *cch_handler_file_create(str *path, str *handler);
diff --git a/src/cache/handlers/http.c b/src/cache/handlers/http.c
index e48490b..1691ea9 100644
--- a/src/cache/handlers/http.c
+++ b/src/cache/handlers/http.c
@@ -102,7 +102,7 @@ static void handler_http_free(struct cch_handler **handler)
cch_threaded_waits_close(&http->waits);
al_array_free(http->requests);
al_str_free(&http->url);
- al_str_free(&http->handler.liana);
+ al_str_free(&http->handler.handler);
al_free(http);
*handler = NULL;
}
@@ -121,7 +121,7 @@ struct cch_entry *cch_handler_http_create(str *url, struct nn_event_loop *loop)
entry->handler->wait_for_range = handler_http_wait_for_range;
entry->handler->free = handler_http_free;
entry->handler->entry = entry;
- al_str_from(&entry->handler->liana, "codec");
+ al_str_from(&entry->handler->handler, "codec");
http->loop = loop;
al_str_clone(&http->url, url);
http->pointer = 0;