blob: 1a703505352baad96a18f285579103bb529027a4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include "../../codec/codec.h"
#include "../backings/file.h"
#include "file.h"
static bool handler_file_can_seek(struct cch_handler *handler)
{
(void)handler;
return true;
}
static void handler_file_maybe_spawn_worker(struct cch_handler *handler, size_t index)
{
struct cch_handler_file *file = (struct cch_handler_file *)handler;
(void)file;
(void)index;
}
static bool handler_file_wait_for_range(struct cch_handler *handler, struct cch_wait *wait)
{
(void)handler;
(void)wait;
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_NO_POS) {
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.handler);
al_free(file);
*handler = NULL;
}
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;
struct cch_handler_file *file = al_alloc_object(struct cch_handler_file);
file->backing = backing;
struct cch_entry *entry = al_alloc_object(struct cch_entry);
entry->backing = backing;
entry->handler = (struct cch_handler *)file;
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->handler, handler);
return entry;
}
|