mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-12-22 03:15:54 +01:00
46f333cc8e
It was implemented for Audacious only to open companion NWA files, but current version has no need for it. In case there is some obscure thing that needs it, Audacious's vfs.cc should translate or return realnames transparently, without having to modify other streamfiles.
83 lines
2.3 KiB
C
83 lines
2.3 KiB
C
#ifndef _BAR_STREAMFILE_H_
|
|
#define _BAR_STREAMFILE_H_
|
|
#include "../streamfile.h"
|
|
|
|
/* a streamfile wrapping another for decryption */
|
|
|
|
enum {BAR_KEY_LENGTH = 16};
|
|
|
|
// don't know if this is unique, but seems accurate
|
|
static const uint8_t bar_key[BAR_KEY_LENGTH] = {
|
|
0xbd,0x14,0x0e,0x0a,0x91,0xeb,0xaa,0xf6,
|
|
0x11,0x44,0x17,0xc2,0x1c,0xe4,0x66,0x80
|
|
};
|
|
|
|
typedef struct _BARSTREAMFILE {
|
|
STREAMFILE sf;
|
|
STREAMFILE *real_file;
|
|
} BARSTREAMFILE;
|
|
|
|
|
|
/*static*/ STREAMFILE *wrap_bar_STREAMFILE(STREAMFILE *file);
|
|
|
|
|
|
static size_t read_bar(BARSTREAMFILE *streamFile, uint8_t *dest, off_t offset, size_t length) {
|
|
off_t i;
|
|
size_t read_length = streamFile->real_file->read(streamFile->real_file, dest, offset, length);
|
|
|
|
for (i = 0; i < read_length; i++) {
|
|
dest[i] = dest[i] ^ bar_key[(i+offset)%BAR_KEY_LENGTH];
|
|
}
|
|
|
|
return read_length;
|
|
}
|
|
|
|
static size_t get_size_bar(BARSTREAMFILE *streamFile) {
|
|
return streamFile->real_file->get_size(streamFile->real_file);
|
|
}
|
|
|
|
static size_t get_offset_bar(BARSTREAMFILE *streamFile) {
|
|
return streamFile->real_file->get_offset(streamFile->real_file);
|
|
}
|
|
|
|
static void get_name_bar(BARSTREAMFILE *streamFile, char *name, size_t length) {
|
|
streamFile->real_file->get_name(streamFile->real_file, name, length);
|
|
}
|
|
|
|
STREAMFILE *open_bar(BARSTREAMFILE *streamFile, const char * const filename, size_t buffersize) {
|
|
STREAMFILE *newfile = streamFile->real_file->open(streamFile->real_file,filename,buffersize);
|
|
if (!newfile)
|
|
return NULL;
|
|
|
|
return wrap_bar_STREAMFILE(newfile);
|
|
}
|
|
|
|
static void close_bar(BARSTREAMFILE *streamFile) {
|
|
streamFile->real_file->close(streamFile->real_file);
|
|
free(streamFile);
|
|
return;
|
|
}
|
|
|
|
|
|
/*static*/ STREAMFILE *wrap_bar_STREAMFILE(STREAMFILE *file) {
|
|
BARSTREAMFILE *streamfile = malloc(sizeof(BARSTREAMFILE));
|
|
|
|
if (!streamfile)
|
|
return NULL;
|
|
|
|
memset(streamfile, 0, sizeof(BARSTREAMFILE));
|
|
|
|
streamfile->sf.read = (void*)read_bar;
|
|
streamfile->sf.get_size = (void*)get_size_bar;
|
|
streamfile->sf.get_offset = (void*)get_offset_bar;
|
|
streamfile->sf.get_name = (void*)get_name_bar;
|
|
streamfile->sf.open = (void*)open_bar;
|
|
streamfile->sf.close = (void*)close_bar;
|
|
|
|
streamfile->real_file = file;
|
|
|
|
return &streamfile->sf;
|
|
}
|
|
|
|
#endif /* _BAR_STREAMFILE_H_ */
|