shithub: sf2mid

Download patch

ref: 1adf351ed1e05372fb886d839dda126dc85727a0
parent: 8c0c2c00f49fe7b2405395cecb4f853e891311ac
parent: 472abcff8be97ff23f8196412041624fc3e34ce4
author: Ellie <64124388+ell1e@users.noreply.github.com>
date: Sun Nov 14 14:13:51 EST 2021

Merge branch 'master' into tsf-malloc-check

--- a/tml.h
+++ b/tml.h
@@ -88,8 +88,22 @@
 	// - pitch_bend for TML_PITCH_BEND messages
 	union
 	{
+		#ifdef _MSC_VER
+		#pragma warning(push)
+		#pragma warning(disable:4201) //nonstandard extension used: nameless struct/union
+		#elif defined(__GNUC__)
+		#pragma GCC diagnostic push
+		#pragma GCC diagnostic ignored "-Wpedantic" //ISO C++ prohibits anonymous structs
+		#endif
+
 		struct { union { char key, control, program, channel_pressure; }; union { char velocity, key_pressure, control_value; }; };
 		struct { unsigned short pitch_bend; };
+
+		#ifdef _MSC_VER
+		#pragma warning( pop )
+		#elif defined(__GNUC__)
+		#pragma GCC diagnostic pop
+		#endif
 	};
 
 	// The pointer to the next message in time following this event
--- a/tsf.h
+++ b/tsf.h
@@ -1316,16 +1316,9 @@
 				goto skipfontinit;
 			}
 			res->fontSamples = fontSamples;
-			res->outSampleRate = 44100.0f;
-			res->refCount = (int*)TSF_MALLOC(sizeof(int));
-			if (!res->refCount)
-			{
-				TSF_FREE(res);
-				res = TSF_NULL;
-				goto skipfontinit;
-			}
-			*res->refCount = 1;
 			fontSamples = TSF_NULL; //don't free below
+			res->outSampleRate = 44100.0f;
+			
 			if (!tsf_load_presets(res, &hydra, fontSampleCount))
 			{
 				TSF_FREE(res);
@@ -1349,8 +1342,10 @@
 
 TSFDEF tsf* tsf_copy(tsf* f)
 {
-	struct tsf* res;
+	tsf* res;
 	if (!f) return TSF_NULL;
+	if (!f->refCount)
+		*(f->refCount = (int*)TSF_MALLOC(sizeof(int))) = 1;
 	res = (tsf*)TSF_MALLOC(sizeof(tsf));
 	if (!res) return TSF_NULL;
 	TSF_MEMCPY(res, f, sizeof(tsf));
@@ -1365,7 +1360,7 @@
 {
 	struct tsf_preset *preset, *presetEnd;
 	if (!f) return;
-	if (--(*f->refCount) == 0)
+	if (!f->refCount || !--(*f->refCount))
 	{
 		for (preset = f->presets, presetEnd = preset + f->presetNum; preset != presetEnd; preset++)
 			TSF_FREE(preset->regions);
@@ -1373,8 +1368,8 @@
 		TSF_FREE(f->fontSamples);
 		TSF_FREE(f->refCount);
 	}
+	TSF_FREE(f->channels);
 	TSF_FREE(f->voices);
-	if (f->channels) TSF_FREE(f->channels);
 	TSF_FREE(f);
 }
 
@@ -1865,9 +1860,12 @@
 			c->midiVolume = c->midiExpression = 16383;
 			c->midiPan = 8192;
 			c->bank = 0;
+			c->midiRPN = 0xFFFF;
+			c->midiData = 0;
 			tsf_channel_set_volume(f, channel, 1.0f);
 			tsf_channel_set_pan(f, channel, 0.5f);
 			tsf_channel_set_pitchrange(f, channel, 2.0f);
+			tsf_channel_set_tuning(f, channel, 0);
 			return 1;
 	}
 	return 1;