t_handle and sysmem_newhandle crash help needed


    May 21 2006 | 1:12 am
    Hi, I'm trying to read in a text file with sysfile_readtextfile, but I'm running into crashes using sysmem commands. Specifically, the following code (called thru defer_low) crashes:
    ------------------------------
    void myrecorder_do_open(t_myrecorder* x, t_symbol *s, short ac, t_atom *av) {
    t_handle text_handle;
    long size;
    text_handle = sysmem_newhandle(20000);
    size = sysmem_handlesize(text_handle);
    }
    ------------------------------
    When I remove the sysmem_handlesize line it doesn't crash. I also printed out the text_handle pointer to make sure it wasn't NULL.
    Calls to sysmem_freehandle(&text_handle) crash Max as well.
    My plan was to sscanf thru the text_handle after filling it with the contents from a text file. Any suggestions or example code would be greatly appreciated. I'm developing using XCode, running Max 4.5.
    -Scott
    I've already been scouring the archives and only found this example of using t_handles: (which also crashes)
    short readtohandle(char *name, short volume, char ***h, long *sizep)
    {
    t_filehandle fh;
    long size;
    t_handle space;
    if (path_opensysfile(name, volume,&fh, PATH_READ_PERM)) {
    error("%s: can't open", name);
    return (1);
    }
    sysfile_geteof(fh,&size);
    if (!(space = sysmem_newhandle(size)))
    {
    ouchstring("Not enough memory to open %s",name);
    return (1);
    }
    if (sysfile_readtextfile(fh,space,0,TEXT_LB_NATIVE))
    {
    readerror(name);
    sysmem_freehandle(space);
    sysfile_close(fh);
    return (1);
    }
    *h = space;
    *sizep = sysmem_handlesize(space); // could change in sysfile_readtextfile
    sysfile_close(fh);
    return (0);
    }

    • May 22 2006 | 7:21 pm
      Hi Scott,
      This sounds like it may be a problem with the Mach-O interface
      exposed in previous versions of MaxAPI.framework. I would suggest
      waiting a little while for a new version of MaxAPI.framework
      (sometime in the next month or two) before calling these functions
      which are crashing (sysmem_handlesize and sysmem_freehandle). In the
      meantime, you could either use Apple APIs for reading files, or use
      CodeWarrior. Sorry for the inconvenience.
      -Joshua
    • May 22 2006 | 8:03 pm
      Thanks for the reply, I have since implemented my c-based text reader using the sysmem_newptr allocation function. I'm still not clear on the differences between t_handles and the memory allocated by sysmem_newptr. In any case, my function reads in a text file containing a list of notes, where each line contains things like vel, pitch, length. I'm posting my code since reading text files into max objects using c code (and Xcode) may be useful for others until new frameworks come out. WARNING: this is not "good" code, there is no error checking--a mis-formated input file would reap havoc. The code opens a dialog for the user to pick a file for reading, loads the entire contents into a newly allocated buffer, then parses that buffer line by line using sscanf and the 'n' char as a way to find the start and end of lines.
      void myrecorder_open(t_myrecorder* x, long arg) {
      t_atom myList[1];
      SETLONG(myList,arg); defer_low(x,(method)myrecorder_do_open,0,1,myList);
      }
      void myrecorder_do_open(t_myrecorder* x, t_symbol *s, short ac, t_atom *av) {
      unsigned char p = av->a_w.w_long;
      // text file contains notes that will be stored into a phrase, pointed to by pp
      struct phrase_type * pp = &(x->phrases[p]);
      char filename[128];
      short pathID;
      OSType dstType;
      t_filehandle *fh;
      char * text_handle;
      long size;
      int bytes_scanned;
      char teststring[128];
      long cur_note;
      int i, start_of_line;
      // note attributes
      long onset, time_from_prev, time_till_next, hand;
      float vel, pitch;
      if (!open_dialog(filename, &pathID, &dstType,0L,0)) {
      path_opensysfile(filename, pathID, &fh, READ_PERM);
      sysfile_geteof(fh,&size);
      post("Storing file into phrase %d", p);
      text_handle = sysmem_newptr(size);
      if(text_handle) { // successful allocation
      if (!sysfile_read(fh, &size, text_handle)) {
      // phrase variables to adjust:
      pp->count = 0;
      pp->current_pos = 0;
      pp->total_length = 0;
      pp->tempo = 1.0;
      pp->current_time = 0.0;
      // first read in the top header line and ignore it
      i=0;
      while(text_handle[i]!='n')
      i++;
      i++;
      start_of_line = i;
      for(i;i // search for a n character so we know there's a line
      if (text_handle[i]=='n') { // found the end of a line
      sscanf(&text_handle[start_of_line],"%d %f %f %d %d %d",&onset,&pitch,
      &vel,&time_from_prev,&time_till_next,&hand);
      cur_note = pp->count;
      pp->notes[cur_note].onset_time = onset;
      pp->notes[cur_note].pitch = pitch;
      pp->notes[cur_note].vel = vel;
      pp->notes[cur_note].time_from_prev = time_from_prev;
      pp->notes[cur_note].time_till_next = time_till_next;
      pp->notes[cur_note].hand = hand;
      pp->count++;
      start_of_line = i+1;
      }
      }
      }
      else
      post ("error reading file");
      }
      sysmem_freeptr(text_handle);
      else {
      post("memory allocation failed");
      }
      sysfile_close(fh);
      }
      }