mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-10 16:46:35 +01:00
somewhat better solution to prev commit.
parse up to 32bit VLQs, match smf_format_vlq()
This commit is contained in:
parent
2c197fd89a
commit
8d45eecd45
2 changed files with 12 additions and 13 deletions
|
|
@ -38,23 +38,16 @@ init_event_id_counter(event_id_t n)
|
||||||
event_id_t
|
event_id_t
|
||||||
next_event_id ()
|
next_event_id ()
|
||||||
{
|
{
|
||||||
/* libsmf supports reading variable-length data up to 4 bytes only.
|
/* TODO: handle 31bit overflow , event_id_t is an int32_t,
|
||||||
* so we wrap around at 2^(4 * 7) - 1
|
* and libsmf only supports loading uint32_t vlq's, see smf_extract_vlq()
|
||||||
*
|
|
||||||
* 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.");
|
|
||||||
*
|
*
|
||||||
* event-IDs only have to be unique per .mid file.
|
* event-IDs only have to be unique per .mid file.
|
||||||
* Previously (Ardour 4.2ish) Ardour re-generated those IDs when loading the
|
* 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.
|
* 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.
|
* current user-record: is event-counter="276390506" (just abov 2^28)
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
return g_atomic_int_add (&_event_id_counter, 1) & 268435455;
|
return g_atomic_int_add (&_event_id_counter, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EVORAL_EVENT_ALLOC
|
#ifdef EVORAL_EVENT_ALLOC
|
||||||
|
|
|
||||||
|
|
@ -214,13 +214,19 @@ smf_extract_vlq(const unsigned char *buf, const size_t buffer_length, uint32_t *
|
||||||
{
|
{
|
||||||
uint32_t val = 0;
|
uint32_t val = 0;
|
||||||
const unsigned char *c = buf;
|
const unsigned char *c = buf;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
for (;;) {
|
for (;; ++i) {
|
||||||
if (c >= buf + buffer_length) {
|
if (c >= buf + buffer_length) {
|
||||||
g_critical("End of buffer in extract_vlq().");
|
g_critical("End of buffer in extract_vlq().");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (i == 4 && (val & 0xfe000000)) {
|
||||||
|
g_critical("SMF error: Variable Length Quantities longer than four bytes are not supported yet.");
|
||||||
|
return (-2);
|
||||||
|
}
|
||||||
|
|
||||||
val = (val << 7) + (*c & 0x7F);
|
val = (val << 7) + (*c & 0x7F);
|
||||||
|
|
||||||
if (*c & 0x80)
|
if (*c & 0x80)
|
||||||
|
|
@ -233,7 +239,7 @@ smf_extract_vlq(const unsigned char *buf, const size_t buffer_length, uint32_t *
|
||||||
*value = val;
|
*value = val;
|
||||||
*len = c - buf + 1;
|
*len = c - buf + 1;
|
||||||
|
|
||||||
if (*len > 4) {
|
if (*len > 5) {
|
||||||
g_critical("SMF error: Variable Length Quantities longer than four bytes are not supported yet.");
|
g_critical("SMF error: Variable Length Quantities longer than four bytes are not supported yet.");
|
||||||
return (-2);
|
return (-2);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue