/* saves a sample into the datafile format */ static int save_sample_in_datafile(DATAFILE *dat, AL_CONST int *fixed_prop, int pack, int pack_kids, int strip, int sort, int verbose, int extra, PACKFILE *f) { SAMPLE *spl = (SAMPLE *)dat->dat; *allegro_errno = 0; pack_mputw((spl->stereo) ? -spl->bits : spl->bits, f); pack_mputw(spl->freq, f); pack_mputl(spl->len, f); if (spl->bits == 8) { pack_fwrite(spl->data, spl->len * ((spl->stereo) ? 2 : 1), f); } else { int i; for (i=0; i < (int)spl->len * ((spl->stereo) ? 2 : 1); i++) { pack_iputw(((int16_t *)spl->data)[i], f); } } if (*allegro_errno) return FALSE; else return TRUE; }
int save_midi(char *filename, MIDI *midi) { int c; long len; PACKFILE *fp; int num_tracks = 0; if(!midi) return 1; fp = pack_fopen_password(filename, F_WRITE,""); /* open the file */ if(!fp) return 2; for(c=0; c<MIDI_TRACKS; c++) if(midi->track[c].len > 0) num_tracks++; pack_fwrite((void *) "MThd", 4, fp); /* write midi header */ pack_mputl(6, fp); /* header chunk length = 6 */ pack_mputw((num_tracks==1) ? 0 : 1, fp); /* MIDI file type */ pack_mputw(num_tracks, fp); /* number of tracks */ pack_mputw(midi->divisions, fp); /* beat divisions (negatives?) */ for(c=0; c<num_tracks; c++) /* write each track */ { pack_fwrite((void *) "MTrk", 4, fp); /* write track header */ len = midi->track[c].len; pack_mputl(len, fp); /* length of track chunk */ if(pack_fwrite(midi->track[c].data, len, fp) != len) goto err; } pack_fclose(fp); return 0; /* oh dear... */ err: pack_fclose(fp); delete_file(filename); return 3; }