Fix foobar leak

This commit is contained in:
bnnm 2019-09-21 13:29:12 +02:00
parent 15362e0b59
commit 01269554c5
2 changed files with 20 additions and 15 deletions

View File

@ -125,8 +125,7 @@ static void get_name_foo(FOO_STREAMFILE *streamfile,char *buffer,size_t length)
} }
} }
static void close_foo(FOO_STREAMFILE * streamfile) { static void close_foo(FOO_STREAMFILE * streamfile) {
if (streamfile->m_file_opened) streamfile->m_file.release(); //release alloc'ed ptr
streamfile->m_file.release();
free(streamfile->name); free(streamfile->name);
free(streamfile->buffer); free(streamfile->buffer);
free(streamfile); free(streamfile);
@ -215,7 +214,7 @@ static STREAMFILE * open_foo_streamfile_buffer(const char * const filename, size
streamFile = open_foo_streamfile_buffer_by_file(infile, infile_exists, filename, buffersize, p_abort); streamFile = open_foo_streamfile_buffer_by_file(infile, infile_exists, filename, buffersize, p_abort);
if (!streamFile) { if (!streamFile) {
//m_file.release(); //todo not needed after g_open_read? //m_file.release(); //refcounted and cleaned after it goes out of scope
} }
return streamFile; return streamFile;

View File

@ -38,7 +38,7 @@ extern "C" {
"https://github.com/kode54/vgmstream/\n" \ "https://github.com/kode54/vgmstream/\n" \
"https://sourceforge.net/projects/vgmstream/ (original)" "https://sourceforge.net/projects/vgmstream/ (original)"
// called every time a file is added to the playlist (to get info) or when playing
input_vgmstream::input_vgmstream() { input_vgmstream::input_vgmstream() {
vgmstream = NULL; vgmstream = NULL;
subsong = 0; // 0 = not set, will be properly changed on first setup_vgmstream subsong = 0; // 0 = not set, will be properly changed on first setup_vgmstream
@ -67,12 +67,13 @@ input_vgmstream::input_vgmstream() {
load_settings(); load_settings();
} }
// called on stop or when playlist info has been read
input_vgmstream::~input_vgmstream() { input_vgmstream::~input_vgmstream() {
close_vgmstream(vgmstream); close_vgmstream(vgmstream);
vgmstream = NULL; vgmstream = NULL;
} }
// called first when a new file is opened // called first when a new file is accepted, before playing it
void input_vgmstream::open(service_ptr_t<file> p_filehint, const char * p_path,t_input_open_reason p_reason,abort_callback & p_abort) { void input_vgmstream::open(service_ptr_t<file> p_filehint, const char * p_path,t_input_open_reason p_reason,abort_callback & p_abort) {
if (!p_path) { // shouldn't be possible if (!p_path) { // shouldn't be possible
@ -132,10 +133,12 @@ unsigned input_vgmstream::get_subsong_count() {
return subsong_count; return subsong_count;
} }
// called after get_subsong_count to play subsong N (even when count is 1)
t_uint32 input_vgmstream::get_subsong(unsigned p_index) { t_uint32 input_vgmstream::get_subsong(unsigned p_index) {
return p_index + 1; // translates index (0..N < subsong_count) for vgmstream: 1=first return p_index + 1; // translates index (0..N < subsong_count) for vgmstream: 1=first
} }
// called before playing to get info
void input_vgmstream::get_info(t_uint32 p_subsong, file_info & p_info, abort_callback & p_abort) { void input_vgmstream::get_info(t_uint32 p_subsong, file_info & p_info, abort_callback & p_abort) {
int length_in_ms=0, channels = 0, samplerate = 0; int length_in_ms=0, channels = 0, samplerate = 0;
int total_samples = -1; int total_samples = -1;
@ -252,6 +255,7 @@ void input_vgmstream::decode_initialize(t_uint32 p_subsong, unsigned p_flags, ab
decode_seek( 0, p_abort ); decode_seek( 0, p_abort );
}; };
// called when audio buffer needs to be filled
bool input_vgmstream::decode_run(audio_chunk & p_chunk,abort_callback & p_abort) { bool input_vgmstream::decode_run(audio_chunk & p_chunk,abort_callback & p_abort) {
if (!decoding) return false; if (!decoding) return false;
if (!vgmstream) return false; if (!vgmstream) return false;
@ -306,6 +310,7 @@ bool input_vgmstream::decode_run(audio_chunk & p_chunk,abort_callback & p_abort)
} }
} }
// called when seeking
void input_vgmstream::decode_seek(double p_seconds,abort_callback & p_abort) { void input_vgmstream::decode_seek(double p_seconds,abort_callback & p_abort) {
seek_pos_samples = (int) audio_math::time_to_samples(p_seconds, vgmstream->sample_rate); seek_pos_samples = (int) audio_math::time_to_samples(p_seconds, vgmstream->sample_rate);
int max_buffer_samples = SAMPLE_BUFFER_SIZE; int max_buffer_samples = SAMPLE_BUFFER_SIZE;
@ -377,6 +382,8 @@ void input_vgmstream::retag_set_info(t_uint32 p_subsong, const file_info & p_inf
void input_vgmstream::retag_commit(abort_callback & p_abort) { /*throw exception_io_data();*/ } void input_vgmstream::retag_commit(abort_callback & p_abort) { /*throw exception_io_data();*/ }
bool input_vgmstream::g_is_our_content_type(const char * p_content_type) {return false;} bool input_vgmstream::g_is_our_content_type(const char * p_content_type) {return false;}
// called to check if file can be processed by the plugin
bool input_vgmstream::g_is_our_path(const char * p_path,const char * p_extension) { bool input_vgmstream::g_is_our_path(const char * p_path,const char * p_extension) {
const char ** ext_list; const char ** ext_list;
size_t ext_list_len; size_t ext_list_len;
@ -397,7 +404,7 @@ bool input_vgmstream::g_is_our_path(const char * p_path,const char * p_extension
return 0; return 0;
} }
// internal util to create a VGMSTREAM
VGMSTREAM * input_vgmstream::init_vgmstream_foo(t_uint32 p_subsong, const char * const filename, abort_callback & p_abort) { VGMSTREAM * input_vgmstream::init_vgmstream_foo(t_uint32 p_subsong, const char * const filename, abort_callback & p_abort) {
VGMSTREAM *vgmstream = NULL; VGMSTREAM *vgmstream = NULL;
@ -410,6 +417,7 @@ VGMSTREAM * input_vgmstream::init_vgmstream_foo(t_uint32 p_subsong, const char *
return vgmstream; return vgmstream;
} }
// internal util to initialize vgmstream
void input_vgmstream::setup_vgmstream(abort_callback & p_abort) { void input_vgmstream::setup_vgmstream(abort_callback & p_abort) {
// close first in case of changing subsongs // close first in case of changing subsongs
if (vgmstream) { if (vgmstream) {
@ -447,6 +455,7 @@ void input_vgmstream::setup_vgmstream(abort_callback & p_abort) {
fade_samples = (int)(config.song_fade_time * vgmstream->sample_rate); fade_samples = (int)(config.song_fade_time * vgmstream->sample_rate);
} }
// internal util to get info
void input_vgmstream::get_subsong_info(t_uint32 p_subsong, pfc::string_base & title, int *length_in_ms, int *total_samples, int *loop_flag, int *loop_start, int *loop_end, int *sample_rate, int *channels, int *bitrate, pfc::string_base & description, abort_callback & p_abort) { void input_vgmstream::get_subsong_info(t_uint32 p_subsong, pfc::string_base & title, int *length_in_ms, int *total_samples, int *loop_flag, int *loop_start, int *loop_end, int *sample_rate, int *channels, int *bitrate, pfc::string_base & description, abort_callback & p_abort) {
VGMSTREAM * infostream = NULL; VGMSTREAM * infostream = NULL;
bool is_infostream = false; bool is_infostream = false;
@ -601,29 +610,26 @@ void input_vgmstream::apply_config(VGMSTREAM * vgmstream, foobar_song_config *cu
} }
} }
GUID input_vgmstream::g_get_guid() GUID input_vgmstream::g_get_guid() {
{
static const GUID guid = { 0x9e7263c7, 0x4cdd, 0x482c,{ 0x9a, 0xec, 0x5e, 0x71, 0x28, 0xcb, 0xc3, 0x4 } }; static const GUID guid = { 0x9e7263c7, 0x4cdd, 0x482c,{ 0x9a, 0xec, 0x5e, 0x71, 0x28, 0xcb, 0xc3, 0x4 } };
return guid; return guid;
} }
const char * input_vgmstream::g_get_name() const char * input_vgmstream::g_get_name() {
{
return "vgmstream"; return "vgmstream";
} }
GUID input_vgmstream::g_get_preferences_guid() GUID input_vgmstream::g_get_preferences_guid() {
{
static const GUID guid = { 0x2b5d0302, 0x165b, 0x409c,{ 0x94, 0x74, 0x2c, 0x8c, 0x2c, 0xd7, 0x6a, 0x25 } };; static const GUID guid = { 0x2b5d0302, 0x165b, 0x409c,{ 0x94, 0x74, 0x2c, 0x8c, 0x2c, 0xd7, 0x6a, 0x25 } };;
return guid; return guid;
} }
bool input_vgmstream::g_is_low_merit() // checks priority (foobar 1.4+)
{ bool input_vgmstream::g_is_low_merit() {
return true; return true;
} }
/* foobar plugin defs */ // foobar plugin defs
static input_factory_t<input_vgmstream> g_input_vgmstream_factory; static input_factory_t<input_vgmstream> g_input_vgmstream_factory;
DECLARE_COMPONENT_VERSION(APP_NAME,PLUGIN_VERSION,PLUGIN_DESCRIPTION); DECLARE_COMPONENT_VERSION(APP_NAME,PLUGIN_VERSION,PLUGIN_DESCRIPTION);