mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-11-23 22:41:05 +01:00
cleanup: api tweaks
This commit is contained in:
parent
c8cc283e58
commit
8917fde7ac
@ -26,7 +26,7 @@ static FILE* get_output_file(const char* filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static libstreamfile_t* get_streamfile(const char* filename) {
|
static libstreamfile_t* get_streamfile(const char* filename) {
|
||||||
return libvgmstream_streamfile_open_from_stdio(filename);
|
return libstreamfile_open_from_stdio(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int api_example(const char* infile) {
|
static int api_example(const char* infile) {
|
||||||
@ -61,7 +61,7 @@ static int api_example(const char* infile) {
|
|||||||
};
|
};
|
||||||
err = libvgmstream_open_song(lib, &opt);
|
err = libvgmstream_open_song(lib, &opt);
|
||||||
// external SF is not needed after _open
|
// external SF is not needed after _open
|
||||||
libvgmstream_streamfile_close(opt.libsf);
|
libstreamfile_close(opt.libsf);
|
||||||
|
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
printf("not a valid file\n");
|
printf("not a valid file\n");
|
||||||
@ -204,10 +204,10 @@ static libstreamfile_t* test_libsf_open() {
|
|||||||
|
|
||||||
libstreamfile_t* libsf = NULL;
|
libstreamfile_t* libsf = NULL;
|
||||||
|
|
||||||
libsf = libvgmstream_streamfile_open_from_stdio("api.bin_wrong");
|
libsf = libstreamfile_open_from_stdio("api.bin_wrong");
|
||||||
assert(libsf == NULL);
|
assert(libsf == NULL);
|
||||||
|
|
||||||
libsf = libvgmstream_streamfile_open_from_stdio("api.bin");
|
libsf = libstreamfile_open_from_stdio("api.bin");
|
||||||
assert(libsf != NULL);
|
assert(libsf != NULL);
|
||||||
|
|
||||||
return libsf;
|
return libsf;
|
||||||
@ -335,7 +335,7 @@ static void test_lib_tags() {
|
|||||||
libvgmstream_tags_t* tags = NULL;
|
libvgmstream_tags_t* tags = NULL;
|
||||||
bool more = false;
|
bool more = false;
|
||||||
|
|
||||||
libsf = libvgmstream_streamfile_open_from_stdio("sample_!tags.m3u");
|
libsf = libstreamfile_open_from_stdio("sample_!tags.m3u");
|
||||||
assert(libsf != NULL);
|
assert(libsf != NULL);
|
||||||
|
|
||||||
tags = libvgmstream_tags_init(libsf);
|
tags = libvgmstream_tags_init(libsf);
|
||||||
@ -374,7 +374,7 @@ static void test_lib_tags() {
|
|||||||
assert(!more);
|
assert(!more);
|
||||||
|
|
||||||
libvgmstream_tags_free(tags);
|
libvgmstream_tags_free(tags);
|
||||||
libvgmstream_streamfile_close(libsf);
|
libstreamfile_close(libsf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
#include "api_internal.h"
|
#include "api_internal.h"
|
||||||
#if LIBVGMSTREAM_ENABLE
|
#if LIBVGMSTREAM_ENABLE
|
||||||
|
|
||||||
#define INTERNAL_BUF_SAMPLES 1024
|
|
||||||
|
|
||||||
|
|
||||||
static void load_vgmstream(libvgmstream_priv_t* priv, libvgmstream_options_t* opt) {
|
static void load_vgmstream(libvgmstream_priv_t* priv, libvgmstream_options_t* opt) {
|
||||||
STREAMFILE* sf_api = open_api_streamfile(opt->libsf);
|
STREAMFILE* sf_api = open_api_streamfile(opt->libsf);
|
||||||
|
@ -1,37 +1,41 @@
|
|||||||
#include "api_internal.h"
|
#include "api_internal.h"
|
||||||
#if LIBVGMSTREAM_ENABLE
|
#if LIBVGMSTREAM_ENABLE
|
||||||
|
|
||||||
#define INTERNAL_BUF_SAMPLES 1024
|
|
||||||
//TODO: use internal
|
|
||||||
|
|
||||||
static void reset_buf(libvgmstream_priv_t* priv) {
|
static bool reset_buf(libvgmstream_priv_t* priv) {
|
||||||
/* state reset */
|
// state reset
|
||||||
priv->buf.samples = 0;
|
priv->buf.samples = 0;
|
||||||
priv->buf.bytes = 0;
|
priv->buf.bytes = 0;
|
||||||
priv->buf.consumed = 0;
|
priv->buf.consumed = 0;
|
||||||
|
|
||||||
if (priv->buf.initialized)
|
if (priv->buf.initialized)
|
||||||
return;
|
return true;
|
||||||
int output_channels = priv->vgmstream->channels;
|
|
||||||
int input_channels = priv->vgmstream->channels;
|
|
||||||
vgmstream_mixing_enable(priv->vgmstream, 0, &input_channels, &output_channels); //query
|
|
||||||
|
|
||||||
/* static config */
|
vgmstream_mixing_enable(priv->vgmstream, 0, &priv->buf.input_channels, &priv->buf.output_channels); //query
|
||||||
priv->buf.channels = input_channels;
|
|
||||||
if (priv->buf.channels < output_channels)
|
// ???
|
||||||
priv->buf.channels = output_channels;
|
if (priv->buf.input_channels <= 0)
|
||||||
|
priv->buf.input_channels = priv->vgmstream->channels;
|
||||||
|
if (priv->buf.output_channels <= 0)
|
||||||
|
priv->buf.output_channels = priv->vgmstream->channels;
|
||||||
|
|
||||||
|
// should be as big as output
|
||||||
|
if (priv->buf.input_channels < priv->buf.output_channels)
|
||||||
|
priv->buf.input_channels = priv->buf.output_channels;
|
||||||
|
|
||||||
priv->buf.sample_size = sizeof(sample_t);
|
priv->buf.sample_size = sizeof(sample_t);
|
||||||
priv->buf.max_samples = INTERNAL_BUF_SAMPLES;
|
priv->buf.max_samples = INTERNAL_BUF_SAMPLES;
|
||||||
priv->buf.max_bytes = priv->buf.max_samples * priv->buf.sample_size * priv->buf.channels;
|
priv->buf.max_bytes = priv->buf.max_samples * priv->buf.sample_size * priv->buf.input_channels;
|
||||||
priv->buf.data = malloc(priv->buf.max_bytes);
|
priv->buf.data = malloc(priv->buf.max_bytes);
|
||||||
|
if (!priv->buf.data) return false;
|
||||||
|
|
||||||
priv->buf.initialized = true;
|
priv->buf.initialized = true;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_buf(libvgmstream_priv_t* priv, int samples_done) {
|
static void update_buf(libvgmstream_priv_t* priv, int samples_done) {
|
||||||
priv->buf.samples = samples_done;
|
priv->buf.samples = samples_done;
|
||||||
priv->buf.bytes = samples_done * priv->buf.sample_size * priv->buf.channels;
|
priv->buf.bytes = samples_done * priv->buf.sample_size * priv->buf.output_channels;
|
||||||
//priv->buf.consumed = 0; //external
|
//priv->buf.consumed = 0; //external
|
||||||
|
|
||||||
if (!priv->pos.play_forever) {
|
if (!priv->pos.play_forever) {
|
||||||
@ -59,8 +63,7 @@ LIBVGMSTREAM_API int libvgmstream_render(libvgmstream_t* lib) {
|
|||||||
if (priv->decode_done)
|
if (priv->decode_done)
|
||||||
return LIBVGMSTREAM_ERROR_GENERIC;
|
return LIBVGMSTREAM_ERROR_GENERIC;
|
||||||
|
|
||||||
reset_buf(priv);
|
if (!reset_buf(priv))
|
||||||
if (!priv->buf.data)
|
|
||||||
return LIBVGMSTREAM_ERROR_GENERIC;
|
return LIBVGMSTREAM_ERROR_GENERIC;
|
||||||
|
|
||||||
int to_get = priv->buf.max_samples;
|
int to_get = priv->buf.max_samples;
|
||||||
@ -92,8 +95,8 @@ LIBVGMSTREAM_API int libvgmstream_fill(libvgmstream_t* lib, void* buf, int buf_s
|
|||||||
int copy_samples = priv->buf.samples;
|
int copy_samples = priv->buf.samples;
|
||||||
if (copy_samples > buf_samples)
|
if (copy_samples > buf_samples)
|
||||||
copy_samples = buf_samples;
|
copy_samples = buf_samples;
|
||||||
int copy_bytes = priv->buf.sample_size * priv->buf.channels * copy_samples;
|
int copy_bytes = priv->buf.sample_size * priv->buf.output_channels * copy_samples;
|
||||||
int skip_bytes = priv->buf.sample_size * priv->buf.channels * priv->buf.consumed;
|
int skip_bytes = priv->buf.sample_size * priv->buf.output_channels * priv->buf.consumed;
|
||||||
|
|
||||||
memcpy(buf, ((uint8_t*)priv->buf.data) + skip_bytes, copy_bytes);
|
memcpy(buf, ((uint8_t*)priv->buf.data) + skip_bytes, copy_bytes);
|
||||||
priv->buf.consumed += copy_samples;
|
priv->buf.consumed += copy_samples;
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#define LIBVGMSTREAM_ERROR_GENERIC -1
|
#define LIBVGMSTREAM_ERROR_GENERIC -1
|
||||||
#define LIBVGMSTREAM_ERROR_DONE -2
|
#define LIBVGMSTREAM_ERROR_DONE -2
|
||||||
|
|
||||||
|
#define INTERNAL_BUF_SAMPLES 1024
|
||||||
|
|
||||||
/* self-note: various API functions are just bridges to internal stuff.
|
/* self-note: various API functions are just bridges to internal stuff.
|
||||||
* Rather than changing the internal stuff to handle API structs/etc,
|
* Rather than changing the internal stuff to handle API structs/etc,
|
||||||
* leave internals untouched for a while so external plugins/users may adapt.
|
* leave internals untouched for a while so external plugins/users may adapt.
|
||||||
@ -21,7 +23,8 @@ typedef struct {
|
|||||||
void* data;
|
void* data;
|
||||||
|
|
||||||
/* config */
|
/* config */
|
||||||
int channels;
|
int input_channels;
|
||||||
|
int output_channels;
|
||||||
int max_bytes;
|
int max_bytes;
|
||||||
int max_samples;
|
int max_samples;
|
||||||
int sample_size;
|
int sample_size;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "api_internal.h"
|
#include "api_internal.h"
|
||||||
#if LIBVGMSTREAM_ENABLE
|
#if LIBVGMSTREAM_ENABLE
|
||||||
|
|
||||||
static libstreamfile_t* libvgmstream_streamfile_from_streamfile(STREAMFILE* sf);
|
static libstreamfile_t* libstreamfile_from_streamfile(STREAMFILE* sf);
|
||||||
|
|
||||||
/* libstreamfile_t for external use, as a default implementation calling some internal SF */
|
/* libstreamfile_t for external use, as a default implementation calling some internal SF */
|
||||||
|
|
||||||
@ -29,12 +29,12 @@ static int64_t libsf_seek(void* user_data, int64_t offset, int whence) {
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
switch (whence) {
|
switch (whence) {
|
||||||
case LIBVGMSTREAM_STREAMFILE_SEEK_SET: /* absolute */
|
case LIBSTREAMFILE_SEEK_SET: /* absolute */
|
||||||
break;
|
break;
|
||||||
case LIBVGMSTREAM_STREAMFILE_SEEK_CUR: /* relative to current */
|
case LIBSTREAMFILE_SEEK_CUR: /* relative to current */
|
||||||
offset += data->offset;
|
offset += data->offset;
|
||||||
break;
|
break;
|
||||||
case LIBVGMSTREAM_STREAMFILE_SEEK_END: /* relative to file end (should be negative) */
|
case LIBSTREAMFILE_SEEK_END: /* relative to file end (should be negative) */
|
||||||
offset += data->size;
|
offset += data->size;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -80,7 +80,7 @@ struct libstreamfile_t* libsf_open(void* user_data, const char* filename) {
|
|||||||
if (!sf)
|
if (!sf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
libstreamfile_t* libsf = libvgmstream_streamfile_from_streamfile(sf);
|
libstreamfile_t* libsf = libstreamfile_from_streamfile(sf);
|
||||||
if (!libsf) {
|
if (!libsf) {
|
||||||
close_streamfile(sf);
|
close_streamfile(sf);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -101,7 +101,7 @@ static void libsf_close(struct libstreamfile_t* libsf) {
|
|||||||
free(libsf);
|
free(libsf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static libstreamfile_t* libvgmstream_streamfile_from_streamfile(STREAMFILE* sf) {
|
static libstreamfile_t* libstreamfile_from_streamfile(STREAMFILE* sf) {
|
||||||
if (!sf)
|
if (!sf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -132,12 +132,12 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LIBVGMSTREAM_API libstreamfile_t* libvgmstream_streamfile_open_from_stdio(const char* filename) {
|
LIBVGMSTREAM_API libstreamfile_t* libstreamfile_open_from_stdio(const char* filename) {
|
||||||
STREAMFILE* sf = open_stdio_streamfile(filename);
|
STREAMFILE* sf = open_stdio_streamfile(filename);
|
||||||
if (!sf)
|
if (!sf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
libstreamfile_t* libsf = libvgmstream_streamfile_from_streamfile(sf);
|
libstreamfile_t* libsf = libstreamfile_from_streamfile(sf);
|
||||||
if (!libsf) {
|
if (!libsf) {
|
||||||
close_streamfile(sf);
|
close_streamfile(sf);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -16,7 +16,7 @@ typedef struct {
|
|||||||
static size_t api_read(API_STREAMFILE* sf, uint8_t* dst, offv_t offset, size_t length) {
|
static size_t api_read(API_STREAMFILE* sf, uint8_t* dst, offv_t offset, size_t length) {
|
||||||
void* user_data = sf->libsf->user_data;
|
void* user_data = sf->libsf->user_data;
|
||||||
|
|
||||||
sf->libsf->seek(sf->libsf->user_data, offset, LIBVGMSTREAM_STREAMFILE_SEEK_SET);
|
sf->libsf->seek(sf->libsf->user_data, offset, LIBSTREAMFILE_SEEK_SET);
|
||||||
return sf->libsf->read(user_data, dst, length);
|
return sf->libsf->read(user_data, dst, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ static STREAMFILE* api_open(API_STREAMFILE* sf, const char* filename, size_t buf
|
|||||||
STREAMFILE* new_sf = open_api_streamfile_internal(libsf, false);
|
STREAMFILE* new_sf = open_api_streamfile_internal(libsf, false);
|
||||||
|
|
||||||
if (!new_sf) {
|
if (!new_sf) {
|
||||||
libvgmstream_streamfile_close(libsf);
|
libstreamfile_close(libsf);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new_sf;
|
return new_sf;
|
||||||
|
@ -12,14 +12,14 @@
|
|||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
LIBVGMSTREAM_STREAMFILE_SEEK_SET = 0,
|
LIBSTREAMFILE_SEEK_SET = 0,
|
||||||
LIBVGMSTREAM_STREAMFILE_SEEK_CUR = 1,
|
LIBSTREAMFILE_SEEK_CUR = 1,
|
||||||
LIBVGMSTREAM_STREAMFILE_SEEK_END = 2,
|
LIBSTREAMFILE_SEEK_END = 2,
|
||||||
//LIBVGMSTREAM_STREAMFILE_SEEK_GET_OFFSET = 3,
|
//LIBSTREAMFILE_SEEK_GET_OFFSET = 3,
|
||||||
//LIBVGMSTREAM_STREAMFILE_SEEK_GET_SIZE = 5,
|
//LIBSTREAMFILE_SEEK_GET_SIZE = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
// maybe libvgmstream_streamfile_t but it was getting unwieldly
|
// maybe "libvgmstream_streamfile_t" but it was getting unwieldly
|
||||||
typedef struct libstreamfile_t {
|
typedef struct libstreamfile_t {
|
||||||
//uint32_t flags; // info flags for vgmstream
|
//uint32_t flags; // info flags for vgmstream
|
||||||
void* user_data; // any internal structure
|
void* user_data; // any internal structure
|
||||||
@ -54,14 +54,14 @@ typedef struct libstreamfile_t {
|
|||||||
|
|
||||||
|
|
||||||
/* helper */
|
/* helper */
|
||||||
static inline void libvgmstream_streamfile_close(libstreamfile_t* libsf) {
|
static inline void libstreamfile_close(libstreamfile_t* libsf) {
|
||||||
if (!libsf || !libsf->close)
|
if (!libsf || !libsf->close)
|
||||||
return;
|
return;
|
||||||
libsf->close(libsf);
|
libsf->close(libsf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LIBVGMSTREAM_API libstreamfile_t* libvgmstream_streamfile_open_from_stdio(const char* filename);
|
LIBVGMSTREAM_API libstreamfile_t* libstreamfile_open_from_stdio(const char* filename);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user