aboutsummaryrefslogtreecommitdiff
path: root/binfile
diff options
context:
space:
mode:
Diffstat (limited to 'binfile')
-rwxr-xr-xbinfile/binfile-help.pd98
-rwxr-xr-xbinfile/binfile.c42
2 files changed, 89 insertions, 51 deletions
diff --git a/binfile/binfile-help.pd b/binfile/binfile-help.pd
index 5bf63e2..5716866 100755
--- a/binfile/binfile-help.pd
+++ b/binfile/binfile-help.pd
@@ -1,81 +1,89 @@
-#N canvas 364 300 1105 584 12;
-#X msg 546 150 rewind;
+#N canvas 144 281 1220 588 12;
+#X msg 628 98 rewind;
#X obj 85 549 textfile;
-#X msg 536 120 bang;
-#X msg 545 204 clear;
-#X msg 545 305 set 2 4 6 8;
+#X msg 618 68 bang;
+#X msg 627 152 clear;
+#X msg 627 253 set 2 4 6 8;
#X obj 25 15 binfile;
#X text 88 14 read and write binary files;
#X text 25 144 You can also use this object simply for storing heterogeneous
sequences of bytes.;
-#X msg 545 231 add 10 20 255;
-#X msg 545 177 read afile.bin;
+#X msg 627 179 add 10 20 255;
+#X msg 627 125 read afile.bin;
#X obj 480 408 binfile;
#X text 814 548 Martin Peach 2007/09/24;
#X text 149 548 to read and write text files;
-#X msg 545 331 write afile.bin;
+#X msg 627 279 write afile.bin;
#X text 612 426 This outlet gives a bang when you hit the end of the
sequence.;
#X text 478 502 This outlet gives the bytes in sequence \, or bangs
if no more bytes.;
-#X text 645 230 add a list of byte-floats to the buffer;
-#X text 630 304 clear the buffer and then add some bytes;
-#X text 590 203 empty the buffer;
-#X text 597 149 set the read pointer to the beginnning of the buffer
+#X text 712 252 clear the buffer and then add some bytes;
+#X text 672 151 empty the buffer;
+#X text 679 97 set the read pointer to the beginnning of the buffer
;
-#X text 575 119 output one byte from the buffer as a float;
-#X text 661 330 write the entire buffer to a file;
-#X text 653 176 read a file into the buffer \, replacing any previous
+#X text 657 67 output one byte from the buffer as a float;
+#X text 743 278 write the entire buffer to a file;
+#X text 735 124 read a file into the buffer \, replacing any previous
contents;
#X obj 480 481 print one;
#X obj 526 437 bng 15 250 50 0 empty empty empty 17 7 0 10 -258113
-257985 -1;
-#X obj 495 123 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -257985
+#X obj 577 71 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -257985
-1;
#X text 16 548 See also:;
-#X obj 480 53 openpanel;
-#X obj 480 32 bng 15 250 50 0 empty empty read_any_file_into_buffer
+#X obj 470 40 openpanel;
+#X obj 470 19 bng 15 250 50 0 empty empty read_any_file_into_buffer
17 7 0 10 -4032 -258113 -1;
-#X msg 480 79 read \$1;
-#X obj 324 216 bng 15 250 50 0 empty empty save_buffer_as_any_file
+#X msg 470 66 read \$1;
+#X obj 383 139 bng 15 250 50 0 empty empty save_buffer_as_any_file
17 7 0 10 -4032 -258113 -1;
-#X msg 324 264 write \$1;
-#X obj 324 238 savepanel;
-#X text 514 120 or;
-#X msg 545 257 77 128 129 130;
+#X msg 383 187 write \$1;
+#X obj 383 161 savepanel;
+#X text 596 68 or;
+#X msg 627 205 77 128 129 130;
#X text 25 38 The binfile object reads and writes binary files to and
from a buffer in memory. You can read a file and output its contents
one byte at a time as floats.;
#X text 25 91 To add bytes to the buffer \, first send "clear" to empty
the buffer and then "add" to add bytes. Finally \, "write" will save
the entire buffer as a binary file.;
-#X floatatom 545 282 5 0 0 0 - - -;
-#X text 586 281 add one byte \, same as "add";
-#X text 654 256 add a list of bytes \, same as "add";
-#X msg 545 357 info;
+#X floatatom 627 230 5 0 0 0 - - -;
+#X text 668 229 add one byte \, same as "add";
+#X text 736 204 add a list of bytes \, same as "add";
+#X msg 123 287 info;
#X obj 503 455 print info;
#X obj 543 432 print end;
-#X text 583 454 This outlet gives a list of info from the info message.
-;
-#X text 583 356 output current buffer length and pointer values.;
+#X msg 626 334 readat 3;
+#X msg 626 361 writeat 3;
+#X text 705 360 set the write position;
+#X text 696 333 set the read position;
+#X text 583 454 This outlet gives a list of current parameters from
+the info message.;
+#X text 727 171 add a list of byte-floats to the buffer at the current
+write offset;
+#X text 21 269 output current buffer length and pointer values through
+the middle outlet.;
#X connect 0 0 10 0;
#X connect 2 0 10 0;
#X connect 3 0 10 0;
#X connect 4 0 10 0;
#X connect 8 0 10 0;
#X connect 9 0 10 0;
-#X connect 10 0 23 0;
-#X connect 10 1 41 0;
-#X connect 10 2 24 0;
-#X connect 10 2 42 0;
+#X connect 10 0 22 0;
+#X connect 10 1 40 0;
+#X connect 10 2 23 0;
+#X connect 10 2 41 0;
#X connect 13 0 10 0;
-#X connect 25 0 10 0;
-#X connect 27 0 29 0;
-#X connect 28 0 27 0;
-#X connect 29 0 10 0;
-#X connect 30 0 32 0;
-#X connect 31 0 10 0;
-#X connect 32 0 31 0;
-#X connect 34 0 10 0;
-#X connect 37 0 10 0;
-#X connect 40 0 10 0;
+#X connect 24 0 10 0;
+#X connect 26 0 28 0;
+#X connect 27 0 26 0;
+#X connect 28 0 10 0;
+#X connect 29 0 31 0;
+#X connect 30 0 10 0;
+#X connect 31 0 30 0;
+#X connect 33 0 10 0;
+#X connect 36 0 10 0;
+#X connect 39 0 10 0;
+#X connect 42 0 10 0;
+#X connect 43 0 10 0;
diff --git a/binfile/binfile.c b/binfile/binfile.c
index be65a70..1431674 100755
--- a/binfile/binfile.c
+++ b/binfile/binfile.c
@@ -39,6 +39,7 @@ typedef struct t_binfile
char x_fPath[MAXPDSTRING];
char *x_buf; /* read/write buffer in memory for file contents */
size_t x_buf_length; /* current length of buf */
+ size_t x_length; /* current length of valid data in buf */
size_t x_rd_offset; /* current read offset into the buffer */
size_t x_wr_offset; /* current write offset into the buffer */
} t_binfile;
@@ -55,6 +56,8 @@ static void binfile_add(t_binfile *x, t_symbol *s, int argc, t_atom *argv);
static void binfile_clear(t_binfile *x);
static void binfile_info(t_binfile *x);
static void binfile_set(t_binfile *x, t_symbol *s, int argc, t_atom *argv);
+static void binfile_set_read_index(t_binfile *x, t_float offset);
+static void binfile_set_write_index(t_binfile *x, t_float offset);
static void *binfile_new(t_symbol *s, int argc, t_atom *argv);
void binfile_setup(void);
@@ -73,6 +76,8 @@ void binfile_setup(void)
class_addmethod(binfile_class, (t_method)binfile_write, gensym("write"), A_DEFSYMBOL, 0);
class_addmethod(binfile_class, (t_method)binfile_add, gensym("add"), A_GIMME, 0);
class_addmethod(binfile_class, (t_method)binfile_set, gensym("set"), A_GIMME, 0);
+ class_addmethod(binfile_class, (t_method)binfile_set_read_index, gensym("readat"), A_DEFFLOAT, 0);
+ class_addmethod(binfile_class, (t_method)binfile_set_write_index, gensym("writeat"), A_DEFFLOAT, 0);
class_addmethod(binfile_class, (t_method)binfile_clear, gensym("clear"), 0);
class_addmethod(binfile_class, (t_method)binfile_rewind, gensym("rewind"), 0);
class_addmethod(binfile_class, (t_method)binfile_info, gensym("info"), 0);
@@ -92,6 +97,7 @@ static void *binfile_new(t_symbol *s, int argc, t_atom *argv)
x->x_fP = NULL;
x->x_fPath[0] = '\0';
x->x_buf_length = ALLOC_BLOCK_SIZE;
+ x->x_rd_offset = x->x_wr_offset = x->x_length = 0L;
/* find the first string in the arg list and interpret it as a path to a file */
for (i = 0; i < argc; ++i)
{
@@ -151,8 +157,8 @@ static void binfile_write(t_binfile *x, t_symbol *path)
if (0==(x->x_fP = binfile_open_path(x, path->s_name, "wb")))
error("binfile: Unable to open %s for writing", path->s_name);
- bytes_written = fwrite(x->x_buf, 1L, x->x_wr_offset, x->x_fP);
- if (bytes_written != x->x_wr_offset) post("binfile: %ld bytes written != %ld", bytes_written, x->x_wr_offset);
+ bytes_written = fwrite(x->x_buf, 1L, x->x_length, x->x_fP);
+ if (bytes_written != x->x_length) post("binfile: %ld bytes written != %ld", bytes_written, x->x_length);
else post("binfile: wrote %ld bytes to %s", bytes_written, path->s_name);
fclose(x->x_fP);
x->x_fP = NULL;
@@ -187,8 +193,9 @@ static void binfile_read(t_binfile *x, t_symbol *path)
rewind(x->x_fP);
bytes_read = fread(x->x_buf, 1L, file_length, x->x_fP);
x->x_buf_length = bytes_read;
- x->x_wr_offset = x->x_buf_length;
- x->x_rd_offset = 0L;
+ x->x_wr_offset = x->x_buf_length; /* write new data at end of file */
+ x->x_length = x->x_buf_length; /* file length is same as buffer size 7*/
+ x->x_rd_offset = 0L; /* read from start of file */
fclose (x->x_fP);
x->x_fP = NULL;
if (bytes_read != file_length) post("binfile length %ld not equal to bytes read (%ld)", file_length, bytes_read);
@@ -200,10 +207,10 @@ static void binfile_bang(t_binfile *x)
{
unsigned char c;
- if (x->x_rd_offset < x->x_wr_offset)
+ if (x->x_rd_offset < x->x_length)
{
c = x->x_buf[x->x_rd_offset++];
- if (x->x_rd_offset == x->x_wr_offset) outlet_bang(x->x_bang_outlet);
+ if (x->x_rd_offset == x->x_length) outlet_bang(x->x_bang_outlet);
outlet_float(x->x_bin_outlet, (float)c);
}
else outlet_bang(x->x_bin_outlet);
@@ -248,6 +255,7 @@ static void binfile_add(t_binfile *x, t_symbol *s, int argc, t_atom *argv)
x->x_buf_length += ALLOC_BLOCK_SIZE;
}
x->x_buf[x->x_wr_offset++] = j;
+ if (x->x_length < x->x_wr_offset) x->x_length = x->x_wr_offset;
}
else
{
@@ -269,10 +277,30 @@ static void binfile_set(t_binfile *x, t_symbol *s, int argc, t_atom *argv)
binfile_add(x, s, argc, argv);
}
+static void binfile_set_read_index(t_binfile *x, t_float offset)
+/* set the read offset, always < length */
+{
+ size_t intoffset = offset;
+
+ if (intoffset < x->x_length) x->x_rd_offset = intoffset;
+ else if (x->x_length > 0) x->x_rd_offset = x->x_length-1;
+ else x->x_rd_offset = 0L;
+}
+
+static void binfile_set_write_index(t_binfile *x, t_float offset)
+/* set the write offset, always <= length */
+{
+ size_t intoffset = offset;
+
+ if (intoffset <= x->x_length) x->x_wr_offset = intoffset;
+ else x->x_wr_offset = x->x_length;
+}
+
static void binfile_clear(t_binfile *x)
{
x->x_wr_offset = 0L;
x->x_rd_offset = 0L;
+ x->x_length = 0L;
}
static void binfile_float(t_binfile *x, t_float val)
@@ -294,6 +322,8 @@ static void binfile_info(t_binfile *x)
t_atom *output_atom = getbytes(sizeof(t_atom));
SETFLOAT(output_atom, x->x_buf_length);
outlet_anything( x->x_info_outlet, gensym("buflength"), 1, output_atom);
+ SETFLOAT(output_atom, x->x_length);
+ outlet_anything( x->x_info_outlet, gensym("length"), 1, output_atom);
SETFLOAT(output_atom, x->x_rd_offset);
outlet_anything( x->x_info_outlet, gensym("readoffset"), 1, output_atom);
SETFLOAT(output_atom, x->x_wr_offset);