42 #ifdef PLATFORM_WINDOWS
45 #include <arpa/inet.h>
50 #define MAX_VLQ_LENGTH 128
61 char *previous_file_buffer = (
char*)smf->
file_buffer;
67 g_critical(
"realloc(3) failed: %s", strerror(errno));
80 return ((
char *)smf->
file_buffer + previous_file_buffer_length);
94 g_critical(
"Cannot extend track buffer.");
98 memcpy(dest, buffer, buffer_length);
117 return (
smf_append(smf, &mthd_chunk,
sizeof(mthd_chunk)));
154 g_critical(
"Cannot extend track buffer.");
158 memcpy(dest, buffer, buffer_length);
167 unsigned long buffer;
170 buffer = value & 0x7F;
172 while ((value >>= 7)) {
174 buffer |= ((value & 0x7F) | 0x80);
195 int vlq_length, text_length, copied_length;
198 assert(type >= 1 && type <= 9);
200 text_length = strlen(text);
210 g_critical(
"Cannot allocate MIDI buffer structure: %s", strerror(errno));
216 event->midi_buffer[0] = 0xFF;
217 event->midi_buffer[1] = type;
223 (void) copied_length;
225 assert(copied_length == text_length);
228 event->midi_buffer_length = 2 + vlq_length + text_length;
263 unsigned char sysex_status = 0xF0;
290 unsigned char escape_status = 0xF7;
350 memcpy(mtrk_header.
id,
"MTrk", 4);
352 return (
track_append(track, &mtrk_header,
sizeof(mtrk_header)));
405 g_critical(
"fwrite(3) failed: %s", strerror(errno));
445 fprintf (stderr,
"SFB != null but == %p\n", smf->
file_buffer);
453 assert(track != NULL);
486 int trackno, eot_found;
492 g_critical(
"SMF error: smf->format is less than zero of greater than two.");
497 g_critical(
"SMF error: number of tracks is less than one.");
502 g_critical(
"SMF error: format is 0, but number of tracks is more than one.");
506 if (smf->
ppqn <= 0) {
507 g_critical(
"SMF error: PPQN has to be > 0.");
522 g_critical(
"Event #%zu on track #%d is invalid.", eventno, trackno);
528 g_critical(
"Duplicate End Of Track event on track #%d.", trackno);
538 g_critical(
"smf_track_add_eot_delta_pulses failed.");
550 #define CHECK(cond) if (!(cond)) { return -1; }
641 assert(track != NULL);
659 g_warning(
"SMF warning: Did not save correctly, possible data loss.");
void smf_rewind(smf_t *smf)
int32_t delta_time_pulses
int smf_event_is_valid(const smf_event_t *event) WARN_UNUSED_RESULT
static int write_sysex_contents(smf_event_t *event)
static int write_event_time(smf_event_t *event)
static int smf_validate(smf_t *smf)
static int check_smf_track_is_identical(const smf_track_t *a, const smf_track_t *b)
static int check_smf_is_identical(const smf_t *a, const smf_t *b)
static int write_mthd_header(smf_t *smf)
static int check_smf_saved_correctly(const smf_t *smf, FILE *file)
size_t midi_buffer_length
LIBPBD_API Transmitter error
static int write_escaped_event_contents(smf_event_t *event)
smf_event_t * smf_track_get_event_by_number(const smf_track_t *track, size_t event_number)
void smf_event_delete(smf_event_t *event)
static void * smf_extend(smf_t *smf, const int length)
int smf_event_is_system_common(const smf_event_t *event) WARN_UNUSED_RESULT
static void free_buffer(smf_t *smf)
static int write_event(smf_event_t *event)
int smf_event_is_sysex(const smf_event_t *event) WARN_UNUSED_RESULT
static int check_smf_event_is_identical(const smf_event_t *a, const smf_event_t *b)
void smf_delete(smf_t *smf)
int smf_format_vlq(unsigned char *buf, int length, unsigned long value)
smf_event_t * smf_event_new(void)
static int write_mtrk_length(smf_track_t *track)
static int smf_append(smf_t *smf, const void *buffer, const int buffer_length)
int smf_event_is_system_realtime(const smf_event_t *event) WARN_UNUSED_RESULT
static int track_append(smf_track_t *track, const void *buffer, const int buffer_length)
uint16_t number_of_tracks
static int write_vlq(smf_event_t *event, unsigned long value)
smf_event_t * smf_track_get_next_event(smf_track_t *track)
smf_track_t * smf_get_track_by_number(const smf_t *smf, int track_number)
static int write_event_contents(smf_event_t *event)
int smf_save(smf_t *smf, FILE *file)
size_t file_buffer_length
int smf_track_add_eot_delta_pulses(smf_track_t *track, uint32_t delta)
smf_event_t * smf_event_new_textual(int type, const char *text)
static void * track_extend(smf_track_t *track, const int length)
struct chunk_header_struct mthd_header
smf_t * smf_load(FILE *) WARN_UNUSED_RESULT
static int write_file(smf_t *smf, FILE *stream)
static int write_mtrk_header(smf_track_t *track)
size_t file_buffer_length
static int write_track(smf_track_t *track)
static int pointers_are_clear(smf_t *smf)
int smf_event_is_eot(const smf_event_t *event)
LIBARDOUR_API PBD::PropertyDescriptor< framecnt_t > length