Fix some segfaults for kits with invalid instrument entries. Also fix a couple in internal segfaults.
This commit is contained in:
parent
a2e14e6652
commit
9c1e713914
16
drmr.c
16
drmr.c
@ -35,7 +35,7 @@ int load_sample(char* path, drmr_sample* samp) {
|
|||||||
sndf = sf_open(path,SFM_READ,&(samp->info));
|
sndf = sf_open(path,SFM_READ,&(samp->info));
|
||||||
|
|
||||||
if (!sndf) {
|
if (!sndf) {
|
||||||
fprintf(stderr,"Failed to open sound file: %s\n",sf_strerror(sndf));
|
fprintf(stderr,"Failed to open sound file: %s - %s\n",path,sf_strerror(sndf));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +63,12 @@ static void* load_thread(void* arg) {
|
|||||||
for(;;) {
|
for(;;) {
|
||||||
pthread_cond_wait(&drmr->load_cond,
|
pthread_cond_wait(&drmr->load_cond,
|
||||||
&drmr->load_mutex);
|
&drmr->load_mutex);
|
||||||
load_hydrogen_kit(drmr,drmr->kits->kits[drmr->curKit].path);
|
if (drmr->curKit >= drmr->kits->num_kits) {
|
||||||
|
int os = drmr->num_samples;
|
||||||
|
drmr->num_samples = 0;
|
||||||
|
if (os > 0) free_samples(drmr->samples,os);
|
||||||
|
} else
|
||||||
|
load_hydrogen_kit(drmr,drmr->kits->kits[drmr->curKit].path);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&drmr->load_mutex);
|
pthread_mutex_unlock(&drmr->load_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
@ -118,6 +123,7 @@ instantiate(const LV2_Descriptor* descriptor,
|
|||||||
free(drmr);
|
free(drmr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
drmr->samples = NULL; // prevent attempted freeing in load
|
||||||
load_hydrogen_kit(drmr,drmr->kits->kits->path);
|
load_hydrogen_kit(drmr,drmr->kits->kits->path);
|
||||||
drmr->curKit = 0;
|
drmr->curKit = 0;
|
||||||
|
|
||||||
@ -247,7 +253,11 @@ static void run(LV2_Handle instance, uint32_t n_samples) {
|
|||||||
int pos,lim;
|
int pos,lim;
|
||||||
drmr_sample* cs = drmr->samples+i;
|
drmr_sample* cs = drmr->samples+i;
|
||||||
if (cs->active) {
|
if (cs->active) {
|
||||||
float gain = *(drmr->gains[i]);
|
float gain;
|
||||||
|
if (i < 16)
|
||||||
|
gain = *(drmr->gains[i]);
|
||||||
|
else
|
||||||
|
gain = 1.0f;
|
||||||
one_active = 1;
|
one_active = 1;
|
||||||
if (cs->info.channels == 1) { // play mono sample
|
if (cs->info.channels == 1) { // play mono sample
|
||||||
lim = (n_samples < (cs->limit - cs->offset)?n_samples:(cs->limit-cs->offset));
|
lim = (n_samples < (cs->limit - cs->offset)?n_samples:(cs->limit-cs->offset));
|
||||||
|
@ -112,8 +112,10 @@ endElement(void *userData, const char *name)
|
|||||||
|
|
||||||
info->cur_off = 0;
|
info->cur_off = 0;
|
||||||
|
|
||||||
if (!info->scan_only && info->in_instrument && !strcmp(name,"instrument")) {
|
if (!info->scan_only &&
|
||||||
// ending an instrument, add current struct to end of list
|
info->in_instrument &&
|
||||||
|
!strcmp(name,"instrument") &&
|
||||||
|
info->cur_instrument->filename) {
|
||||||
struct instrument_info * cur_i = info->kit_info->instruments;
|
struct instrument_info * cur_i = info->kit_info->instruments;
|
||||||
if (cur_i) {
|
if (cur_i) {
|
||||||
while(cur_i->next) cur_i = cur_i->next;
|
while(cur_i->next) cur_i = cur_i->next;
|
||||||
@ -249,7 +251,7 @@ kits* scan_kits() {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_samples(drmr_sample* samples, int num_samples) {
|
void free_samples(drmr_sample* samples, int num_samples) {
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<num_samples;i++)
|
for (i=0;i<num_samples;i++)
|
||||||
free(samples[i].data);
|
free(samples[i].data);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#define DRMR_HYDRO_H
|
#define DRMR_HYDRO_H
|
||||||
|
|
||||||
kits* scan_kits();
|
kits* scan_kits();
|
||||||
|
void free_samples(drmr_sample* samples, int num_samples);
|
||||||
int load_hydrogen_kit(DrMr* drmr, char* path);
|
int load_hydrogen_kit(DrMr* drmr, char* path);
|
||||||
|
|
||||||
#endif // DRMR_HYDRO_H
|
#endif // DRMR_HYDRO_H
|
||||||
|
Loading…
Reference in New Issue
Block a user