somewhat better solution to prev commit.

parse up to 32bit VLQs, match smf_format_vlq()
This commit is contained in:
Robin Gareus
2015-12-27 03:40:48 +01:00
parent 2c197fd89a
commit 8d45eecd45
2 changed files with 12 additions and 13 deletions

View File

@@ -38,23 +38,16 @@ init_event_id_counter(event_id_t n)
event_id_t
next_event_id ()
{
/* libsmf supports reading variable-length data up to 4 bytes only.
* so we wrap around at 2^(4 * 7) - 1
*
* interestingly enough libsmf happily writes data longer than that, but then
* fails to load it in ./libs/evoral/src/libsmf/smf_load.c:237
* g_critical("SMF error: Variable Length Quantities longer than four bytes are not supported yet.");
/* TODO: handle 31bit overflow , event_id_t is an int32_t,
* and libsmf only supports loading uint32_t vlq's, see smf_extract_vlq()
*
* event-IDs only have to be unique per .mid file.
* Previously (Ardour 4.2ish) Ardour re-generated those IDs when loading the
* file but that lead to .mid files being modified on every load/save.
*
* For now just assume that by the time 2^28 is reached, files with low ids have vanished.
* There is only one user who managed to get to 268 million events so far.
* quite a feat: id-counter="6483089" event-counter="276390506"
* Eventually a proper solution will have to be implemented.
* current user-record: is event-counter="276390506" (just abov 2^28)
*/
return g_atomic_int_add (&_event_id_counter, 1) & 268435455;
return g_atomic_int_add (&_event_id_counter, 1);
}
#ifdef EVORAL_EVENT_ALLOC