Example #1
0
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;
}
Example #2
0
/* 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;
}
Example #3
0
void update_file(char *filename, char *dataname)
{
   PACKFILE *f, *ef, *df = NULL;
   char *tmpname;
   int c;

   #ifdef ALLEGRO_HAVE_MKSTEMP

      char tmp_buf[] = "XXXXXX";
      char tmp[512];
      int tmp_fd;

      tmp_fd = mkstemp(tmp_buf);
      close(tmp_fd);
      tmpname = uconvert_ascii(tmp_buf, tmp);

   #else

      tmpname = tmpnam(NULL);

   #endif

   get_stats();

   if (!err) {
      if ((!stat_hasdata) && (!dataname)) {
	 fprintf(stderr, "%s has no appended data: cannot remove it\n", filename);
	 err = 1;
	 return;
      }

      rename_file(filename, tmpname);

      ef = pack_fopen(tmpname, F_READ);
      if (!ef) {
	 delete_file(tmpname);
	 fprintf(stderr, "Error reading temporary file\n");
	 err = 1;
	 return;
      }

      f = pack_fopen(filename, F_WRITE);
      if (!f) {
	 pack_fclose(ef);
	 rename_file(tmpname, filename);
	 fprintf(stderr, "Error writing to %s\n", filename);
	 err = 1;
	 return;
      }

   #ifdef ALLEGRO_UNIX
      chmod(filename, stat_stat.st_mode);
   #endif

      for (c=0; c<stat_exe_size; c++)
	 pack_putc(pack_getc(ef), f);

      pack_fclose(ef);
      delete_file(tmpname);

      if (dataname) {
	 if (stat_hasdata)
	    printf("replacing %d bytes of currently appended data\n", stat_uncompressed_size);

	 if (opt_allegro) {
	    printf("reading %s as Allegro format compressed data\n", dataname);
	    df = pack_fopen(dataname, F_READ_PACKED);
	 }
	 else if (opt_binary) {
	    printf("reading %s as raw binary data\n", dataname);
	    df = pack_fopen(dataname, F_READ);
	 }
	 else {
	    printf("autodetecting format of %s: ", dataname);
	    df = pack_fopen(dataname, F_READ_PACKED);
	    if (df) {
	       printf("Allegro compressed data\n");
	    }
	    else {
	       df = pack_fopen(dataname, F_READ);
	       if (df)
		  printf("raw binary data\n");
	       else
		  printf("\n"); 
	    }
	 }

	 if (!df) {
	    pack_fclose(f);
	    fprintf(stderr, "Error opening %s\n", dataname);
	    err = 1;
	    return;
	 }

	 f = pack_fopen_chunk(f, opt_compress);

	 while ((c = pack_getc(df)) != EOF)
	    pack_putc(c, f);

	 f = pack_fclose_chunk(f);

	 pack_mputl(F_EXE_MAGIC, f);
	 pack_mputl(_packfile_filesize+16, f);

	 printf("%s has been appended onto %s\n"
		"original executable size: %d bytes (%dk)\n"
		"appended data size: %d bytes (%dk)\n"
		"compressed into: %d bytes (%dk)\n"
		"ratio: %d%%\n",
		dataname, filename, 
		stat_exe_size, stat_exe_size/1024, 
		_packfile_datasize, _packfile_datasize/1024, 
		_packfile_filesize, _packfile_filesize/1024, 
		(_packfile_datasize) ? _packfile_filesize*100/_packfile_datasize : 0);
      }
      else {
	 printf("%d bytes of appended data removed from %s\n", stat_uncompressed_size, filename);
      }

      pack_fclose(f);
      pack_fclose(df);
   }
}