mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-12-18 09:25:53 +01:00
cleanup: api tweaks
This commit is contained in:
parent
f0897c7868
commit
81b341c448
@ -5,6 +5,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include "../src/base/api_internal.h"
|
#include "../src/base/api_internal.h"
|
||||||
|
#include "../src/streamfile.h"
|
||||||
|
|
||||||
|
|
||||||
static void usage(const char* progname) {
|
static void usage(const char* progname) {
|
||||||
@ -33,10 +34,10 @@ VGM_STEP();
|
|||||||
int err;
|
int err;
|
||||||
FILE* outfile = NULL;
|
FILE* outfile = NULL;
|
||||||
|
|
||||||
bool fill_test;
|
bool fill_test = true;
|
||||||
int pcm16_samples;
|
int fill_pcm16_samples;
|
||||||
int pcm16_bytes;
|
int fill_pcm16_bytes;
|
||||||
short* pcm16 = NULL;
|
short* fill_pcm16 = NULL;
|
||||||
|
|
||||||
|
|
||||||
// main init
|
// main init
|
||||||
@ -49,6 +50,7 @@ VGM_STEP();
|
|||||||
//.loop_count = 1.0,
|
//.loop_count = 1.0,
|
||||||
//.fade_time = 10.0,
|
//.fade_time = 10.0,
|
||||||
.ignore_loop = true,
|
.ignore_loop = true,
|
||||||
|
.force_pcm16 = fill_test,
|
||||||
};
|
};
|
||||||
libvgmstream_setup(lib, &cfg);
|
libvgmstream_setup(lib, &cfg);
|
||||||
|
|
||||||
@ -57,7 +59,7 @@ VGM_STEP();
|
|||||||
libvgmstream_options_t opt = {
|
libvgmstream_options_t opt = {
|
||||||
.libsf = get_streamfile(infile)
|
.libsf = get_streamfile(infile)
|
||||||
};
|
};
|
||||||
err = libvgmstream_open(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);
|
libvgmstream_streamfile_close(opt.libsf);
|
||||||
|
|
||||||
@ -94,33 +96,28 @@ VGM_STEP();
|
|||||||
printf("channels: %i\n", lib->format->channels);
|
printf("channels: %i\n", lib->format->channels);
|
||||||
printf("sample rate: %i\n", lib->format->sample_rate);
|
printf("sample rate: %i\n", lib->format->sample_rate);
|
||||||
printf("codec: %s\n", lib->format->codec_name);
|
printf("codec: %s\n", lib->format->codec_name);
|
||||||
printf("samples: %i\n", (int32_t)lib->format->sample_count);
|
printf("samples: %i\n", (int32_t)lib->format->stream_samples);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
printf("- decoding: %i\n" , (int32_t)lib->format->play_samples);
|
printf("- decoding: %i\n" , (int32_t)lib->format->play_samples);
|
||||||
|
|
||||||
|
fill_pcm16_samples = 512;
|
||||||
|
fill_pcm16_bytes = fill_pcm16_samples * sizeof(short) * lib->format->channels;
|
||||||
fill_test = true;
|
fill_pcm16 = malloc(fill_pcm16_bytes);
|
||||||
pcm16_samples = 512;
|
if (!fill_pcm16) goto fail;
|
||||||
pcm16_bytes = pcm16_samples * sizeof(short) * lib->format->channels;
|
|
||||||
pcm16 = malloc(pcm16_bytes);
|
|
||||||
if (!pcm16) goto fail;
|
|
||||||
|
|
||||||
// play file and do something with decoded samples
|
// play file and do something with decoded samples
|
||||||
while (true) {
|
while (!lib->decoder->done) {
|
||||||
//int pos;
|
//int pos;
|
||||||
void* buf;
|
void* buf;
|
||||||
int buf_bytes = 0;
|
int buf_bytes = 0;
|
||||||
|
|
||||||
if (lib->decoder->done)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// get current samples
|
// get current samples
|
||||||
if (fill_test) {
|
if (fill_test) {
|
||||||
err = libvgmstream_fill(lib, pcm16, pcm16_samples);
|
err = libvgmstream_fill(lib, fill_pcm16, fill_pcm16_samples);
|
||||||
if (err < 0) goto fail;
|
if (err < 0) goto fail;
|
||||||
|
|
||||||
buf = pcm16;
|
buf = fill_pcm16;
|
||||||
buf_bytes = err * sizeof(short) * lib->format->channels;
|
buf_bytes = err * sizeof(short) * lib->format->channels;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -140,12 +137,12 @@ VGM_STEP();
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
// close current streamfile before opening new ones, optional
|
// close current streamfile before opening new ones, optional
|
||||||
//libvgmstream_close(lib);
|
//libvgmstream_close_song(lib);
|
||||||
|
|
||||||
// process done
|
// process done
|
||||||
libvgmstream_free(lib);
|
libvgmstream_free(lib);
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
free(pcm16);
|
free(fill_pcm16);
|
||||||
|
|
||||||
printf("done\n");
|
printf("done\n");
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
@ -153,7 +150,7 @@ fail:
|
|||||||
// process failed
|
// process failed
|
||||||
libvgmstream_free(lib);
|
libvgmstream_free(lib);
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
free(pcm16);
|
free(fill_pcm16);
|
||||||
|
|
||||||
printf("failed!\n");
|
printf("failed!\n");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
@ -9,9 +9,9 @@ static void load_vgmstream(libvgmstream_priv_t* priv, libvgmstream_options_t* op
|
|||||||
if (!sf_api)
|
if (!sf_api)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//TODO: handle format_internal_id
|
//TODO: handle internal format_id
|
||||||
|
|
||||||
sf_api->stream_index = opt->subsong;
|
sf_api->stream_index = opt->subsong_index;
|
||||||
priv->vgmstream = init_vgmstream_from_STREAMFILE(sf_api);
|
priv->vgmstream = init_vgmstream_from_STREAMFILE(sf_api);
|
||||||
close_streamfile(sf_api);
|
close_streamfile(sf_api);
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ static void update_format_info(libvgmstream_priv_t* priv) {
|
|||||||
vgmstream_mixing_enable(v, 0, &fmt->input_channels, &fmt->channels);
|
vgmstream_mixing_enable(v, 0, &fmt->input_channels, &fmt->channels);
|
||||||
fmt->channel_layout = v->channel_layout;
|
fmt->channel_layout = v->channel_layout;
|
||||||
|
|
||||||
fmt->sample_count = v->num_samples;
|
fmt->stream_samples = v->num_samples;
|
||||||
fmt->loop_start = v->loop_start_sample;
|
fmt->loop_start = v->loop_start_sample;
|
||||||
fmt->loop_end = v->loop_end_sample;
|
fmt->loop_end = v->loop_end_sample;
|
||||||
fmt->loop_flag = v->loop_flag;
|
fmt->loop_flag = v->loop_flag;
|
||||||
@ -85,6 +85,8 @@ static void update_format_info(libvgmstream_priv_t* priv) {
|
|||||||
fmt->play_forever = priv->pos.play_forever;
|
fmt->play_forever = priv->pos.play_forever;
|
||||||
fmt->play_samples = priv->pos.play_samples;
|
fmt->play_samples = priv->pos.play_samples;
|
||||||
|
|
||||||
|
fmt->format_id = v->format_id;
|
||||||
|
|
||||||
fmt->stream_bitrate = get_vgmstream_average_bitrate(v);
|
fmt->stream_bitrate = get_vgmstream_average_bitrate(v);
|
||||||
|
|
||||||
get_vgmstream_coding_description(v, fmt->codec_name, sizeof(fmt->codec_name));
|
get_vgmstream_coding_description(v, fmt->codec_name, sizeof(fmt->codec_name));
|
||||||
@ -94,18 +96,16 @@ static void update_format_info(libvgmstream_priv_t* priv) {
|
|||||||
if (v->stream_name[0] != '\0') { //snprintf UB for NULL args
|
if (v->stream_name[0] != '\0') { //snprintf UB for NULL args
|
||||||
snprintf(fmt->stream_name, sizeof(fmt->stream_name), "%s", v->stream_name);
|
snprintf(fmt->stream_name, sizeof(fmt->stream_name), "%s", v->stream_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt->format_internal_id = 0; //TODO
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBVGMSTREAM_API int libvgmstream_open(libvgmstream_t* lib, libvgmstream_options_t* opt) {
|
LIBVGMSTREAM_API int libvgmstream_open_song(libvgmstream_t* lib, libvgmstream_options_t* opt) {
|
||||||
if (!lib ||!lib->priv)
|
if (!lib ||!lib->priv)
|
||||||
return LIBVGMSTREAM_ERROR_GENERIC;
|
return LIBVGMSTREAM_ERROR_GENERIC;
|
||||||
if (!opt || !opt->libsf || opt->subsong < 0)
|
if (!opt || !opt->libsf || opt->subsong_index < 0)
|
||||||
return LIBVGMSTREAM_ERROR_GENERIC;
|
return LIBVGMSTREAM_ERROR_GENERIC;
|
||||||
|
|
||||||
// close loaded song if any + reset
|
// close loaded song if any + reset
|
||||||
libvgmstream_close(lib);
|
libvgmstream_close_song(lib);
|
||||||
|
|
||||||
libvgmstream_priv_t* priv = lib->priv;
|
libvgmstream_priv_t* priv = lib->priv;
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ LIBVGMSTREAM_API int libvgmstream_open(libvgmstream_t* lib, libvgmstream_options
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LIBVGMSTREAM_API void libvgmstream_close(libvgmstream_t* lib) {
|
LIBVGMSTREAM_API void libvgmstream_close_song(libvgmstream_t* lib) {
|
||||||
if (!lib || !lib->priv)
|
if (!lib || !lib->priv)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#ifndef _LIBVGMSTREAM_H_
|
#ifndef _LIBVGMSTREAM_H_
|
||||||
#define _LIBVGMSTREAM_H_
|
#define _LIBVGMSTREAM_H_
|
||||||
|
|
||||||
//#define LIBVGMSTREAM_ENABLE 1
|
#define LIBVGMSTREAM_ENABLE 1
|
||||||
#if LIBVGMSTREAM_ENABLE
|
#if LIBVGMSTREAM_ENABLE
|
||||||
|
|
||||||
/* By default vgmstream behaves like a decoder (decode samples until stream end), but you can configure
|
/* By default vgmstream behaves like a decoder (decode samples until stream end), but you can configure
|
||||||
@ -21,7 +21,7 @@
|
|||||||
* Basic usage (also see api_example.c):
|
* Basic usage (also see api_example.c):
|
||||||
* - libvgmstream_init(...) // base context
|
* - libvgmstream_init(...) // base context
|
||||||
* - libvgmstream_setup(...) // config if needed
|
* - libvgmstream_setup(...) // config if needed
|
||||||
* - libvgmstream_open(...) // setup format
|
* - libvgmstream_open_song(...) // setup format
|
||||||
* - libvgmstream_play(...) // main decode
|
* - libvgmstream_play(...) // main decode
|
||||||
* - output samples + repeat libvgmstream_play until stream is done
|
* - output samples + repeat libvgmstream_play until stream is done
|
||||||
* - libvgmstream_free(...) // cleanup
|
* - libvgmstream_free(...) // cleanup
|
||||||
@ -104,7 +104,7 @@ typedef struct {
|
|||||||
//int frame_size; // when file has some configurable frame size
|
//int frame_size; // when file has some configurable frame size
|
||||||
|
|
||||||
/* sample info (may not be used depending on config) */
|
/* sample info (may not be used depending on config) */
|
||||||
int64_t sample_count; // file's max samples (not final play duration)
|
int64_t stream_samples; // file's max samples (not final play duration)
|
||||||
int64_t loop_start; // loop start sample
|
int64_t loop_start; // loop start sample
|
||||||
int64_t loop_end; // loop end sample
|
int64_t loop_end; // loop end sample
|
||||||
bool loop_flag; // if file loops (false + defined loops means looping was forcefully disabled)
|
bool loop_flag; // if file loops (false + defined loops means looping was forcefully disabled)
|
||||||
@ -130,7 +130,7 @@ typedef struct {
|
|||||||
/* misc */
|
/* misc */
|
||||||
//bool rough_samples; // signal cases where loop points or sample count can't exactly reflect actual behavior
|
//bool rough_samples; // signal cases where loop points or sample count can't exactly reflect actual behavior
|
||||||
|
|
||||||
int format_internal_id; // when reopening subfiles or similar formats without checking other all possible formats
|
int format_id; // when reopening subfiles or similar formats without checking other all possible formats
|
||||||
// ** this value WILL change without warning between vgmstream versions/commits
|
// ** this value WILL change without warning between vgmstream versions/commits
|
||||||
|
|
||||||
} libvgmstream_format_t;
|
} libvgmstream_format_t;
|
||||||
@ -202,10 +202,10 @@ typedef struct {
|
|||||||
libvgmstream_streamfile_t* libsf; // custom IO streamfile that provides reader info for vgmstream
|
libvgmstream_streamfile_t* libsf; // custom IO streamfile that provides reader info for vgmstream
|
||||||
// ** not needed after _open and should be closed, as vgmstream re-opens its own SFs internally as needed
|
// ** not needed after _open and should be closed, as vgmstream re-opens its own SFs internally as needed
|
||||||
|
|
||||||
int subsong; // target subsong (1..N) or 0 = default/first
|
int subsong_index; // target subsong (1..N) or 0 = default/first
|
||||||
// ** to check if a file has subsongs, _open first + check format->total_subsongs (then _open 2nd, 3rd, etc)
|
// ** to check if a file has subsongs, _open first + check format->total_subsongs (then _open 2nd, 3rd, etc)
|
||||||
|
|
||||||
int format_internal_id; // force a format (for example when loading new subsong of the same archive)
|
int format_id; // force a format (for example when loading new subsong of the same archive)
|
||||||
|
|
||||||
int stereo_track; // forces vgmstream to decode one 2ch+2ch+2ch... 'track' and discard other channels, where 0 = disabled, 1..N = Nth track
|
int stereo_track; // forces vgmstream to decode one 2ch+2ch+2ch... 'track' and discard other channels, where 0 = disabled, 1..N = Nth track
|
||||||
|
|
||||||
@ -215,11 +215,11 @@ typedef struct {
|
|||||||
* - returns < 0 on error (file not recognised, invalid subsong index, etc)
|
* - returns < 0 on error (file not recognised, invalid subsong index, etc)
|
||||||
* - will close currently loaded song if needed
|
* - will close currently loaded song if needed
|
||||||
*/
|
*/
|
||||||
LIBVGMSTREAM_API int libvgmstream_open(libvgmstream_t* lib, libvgmstream_options_t* open_options);
|
LIBVGMSTREAM_API int libvgmstream_open_song(libvgmstream_t* lib, libvgmstream_options_t* open_options);
|
||||||
|
|
||||||
/* Closes current song; may still use libvgmstream to open other songs
|
/* Closes current song; may still use libvgmstream to open other songs
|
||||||
*/
|
*/
|
||||||
LIBVGMSTREAM_API void libvgmstream_close(libvgmstream_t* lib);
|
LIBVGMSTREAM_API void libvgmstream_close_song(libvgmstream_t* lib);
|
||||||
|
|
||||||
|
|
||||||
/* Decodes next batch of samples
|
/* Decodes next batch of samples
|
||||||
|
Loading…
Reference in New Issue
Block a user