Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23673
Modified Files:
Tag: devel_0_37
d_soundfile.c
Log Message:
the threaded soundfiler is working now...
Index: d_soundfile.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/d_soundfile.c,v
retrieving revision 1.1.1.2.2.4
retrieving revision 1.1.1.2.2.5
diff -C2 -d -r1.1.1.2.2.4 -r1.1.1.2.2.5
*** d_soundfile.c 10 May 2004 18:18:26 -0000 1.1.1.2.2.4
--- d_soundfile.c 27 May 2004 18:27:42 -0000 1.1.1.2.2.5
***************
*** 871,877 ****
#define DEFMAXSIZE 40000000 /* threaded we should be able to hande a bit more */
#endif
-
#define SAMPBUFSIZE 1024
typedef struct _soundfiler
{
--- 871,878 ----
#define DEFMAXSIZE 40000000 /* threaded we should be able to hande a bit more */
#endif
#define SAMPBUFSIZE 1024
+ #include <string.h>
+
typedef struct _soundfiler
{
***************
*** 880,886 ****
--- 881,890 ----
} t_soundfiler;
+ static t_class *soundfiler_class;
+
#ifdef THREADED_SF
+ //#define DEBUG
#include <sched.h>
***************
*** 888,901 ****
static pthread_attr_t sf_attr;
typedef struct _sfprocess
{
! void (* process) (t_soundfiler *,
! t_symbol *, int, t_atom *); /* function to call */
! t_soundfiler * x; /* and arguments */
! int argc;
t_atom * argv;
struct _sfprocess * next; /* next object in queue */
} t_sfprocess;
/* this is the queue for all soundfiler objects */
typedef struct _sfqueue
--- 892,913 ----
static pthread_attr_t sf_attr;
+ typedef enum
+ {
+ S_SOUNDFILER,
+ S_ARRAY
+ } t_sfobjecttype;
+
typedef struct _sfprocess
{
! void (* process) (t_soundfiler *,t_symbol *,
! int, t_atom *); /* function to call */
! t_soundfiler * x; /* soundfiler */
! int argc;
t_atom * argv;
struct _sfprocess * next; /* next object in queue */
+ pthread_mutex_t mutex;
} t_sfprocess;
+
/* this is the queue for all soundfiler objects */
typedef struct _sfqueue
***************
*** 910,922 ****
/* we fill the queue */
! void soundfile_queue_add(void (* process) (t_soundfiler *,t_symbol *,
! int,t_atom *), t_soundfiler * x,
int argc, t_atom * argv)
{
! t_atom * largv = copybytes (argv, argc * sizeof(t_atom));
!
t_sfprocess * last_entry=getbytes(sizeof(t_sfprocess));
!
last_entry->process=process;
last_entry->x=x;
--- 922,953 ----
/* we fill the queue */
! void soundfiler_queue_add(void (* process) (t_soundfiler *,t_symbol *,
! int,t_atom *), void * x,
int argc, t_atom * argv)
{
+ /* preparing argument vector */
+ t_atom * largv = copybytes (argv, argc * sizeof(t_atom));
+ static int i;
! // make sure that the argument vector doesn't get lost
! for (i = 0; i != argc; ++i)
! {
! if ( (largv+i)->a_type == A_SYMBOL)
! {
! /* we'll have to free these again!!! */
! t_symbol * sym1 = getbytes(sizeof(t_symbol));
! sym1->s_name = copybytes((largv+i)->a_w.w_symbol->s_name,
! strlen((largv+i)->a_w.w_symbol->s_name)
! * (sizeof(char)+1) );
! sym1->s_thing = (largv+i)->a_w.w_symbol->s_thing;
! sym1->s_next = (largv+i)->a_w.w_symbol->s_next;
! (largv+i)->a_w.w_symbol=sym1;
! }
! }
!
! /* preparing entry */
t_sfprocess * last_entry=getbytes(sizeof(t_sfprocess));
! pthread_mutex_init(&(last_entry->mutex), NULL);
! pthread_mutex_lock(&(last_entry->mutex));
last_entry->process=process;
last_entry->x=x;
***************
*** 924,946 ****
last_entry->argv=largv;
last_entry->next=NULL;
!
/* inform the queue and the last element */
pthread_mutex_lock(&(soundfiler_queue->mutex));
if (soundfiler_queue->begin==NULL)
soundfiler_queue->begin=last_entry;
! if (soundfiler_queue->end!=NULL)
soundfiler_queue->end->next=last_entry;
! soundfiler_queue->end=last_entry;
! pthread_mutex_unlock(&(soundfiler_queue->mutex));
! /* and signal the helper thread */
! pthread_cond_signal(&(soundfiler_queue->cond));
}
/* global soundfiler thread ... sleeping until signaled */
! void soundfiler_thread()
{
-
struct sched_param sf_param;
sf_param.sched_priority=sched_get_priority_min(SCHED_FIFO);
--- 955,999 ----
last_entry->argv=largv;
last_entry->next=NULL;
! pthread_mutex_unlock(&(last_entry->mutex));
!
/* inform the queue and the last element */
pthread_mutex_lock(&(soundfiler_queue->mutex));
if (soundfiler_queue->begin==NULL)
+ {
soundfiler_queue->begin=last_entry;
! soundfiler_queue->end=last_entry;
! }
! else
! {
! pthread_mutex_lock(&(soundfiler_queue->end->mutex));
soundfiler_queue->end->next=last_entry;
! pthread_mutex_unlock(&(soundfiler_queue->end->mutex));
! soundfiler_queue->end=last_entry;
! }
! if ( soundfiler_queue->begin == soundfiler_queue->end )
! {
! /* we should start the helper thread */
! #ifdef DEBUG
! post("signaling");
! #endif
! pthread_mutex_unlock(&(soundfiler_queue->mutex));
! /* and signal the helper thread */
! pthread_cond_signal(&(soundfiler_queue->cond));
! }
! else
! {
! #ifdef DEBUG
! post("not signaling");
! #endif
! pthread_mutex_unlock(&(soundfiler_queue->mutex));
! }
! return;
}
/* global soundfiler thread ... sleeping until signaled */
! void soundfiler_thread(void)
{
struct sched_param sf_param;
sf_param.sched_priority=sched_get_priority_min(SCHED_FIFO);
***************
*** 956,977 ****
#endif
pthread_cond_wait(&soundfiler_queue->cond, &soundfiler_queue->mutex);
#ifdef DEBUG
post("Soundfiler awake");
#endif
/* work on the queue */
while (soundfiler_queue->begin!=NULL)
{
! t_sfprocess * me = soundfiler_queue->begin;
pthread_mutex_unlock(&(soundfiler_queue->mutex));
/* running the specific function */
me->process(me->x, NULL, me->argc, me->argv);
!
pthread_mutex_lock(&(soundfiler_queue->mutex));
! soundfiler_queue->begin=me->next;
! freebytes(me->argv,sizeof(t_atom)* me->argc);
! freebytes(me,sizeof(t_sfprocess));
};
soundfiler_queue->end=NULL;
--- 1009,1112 ----
#endif
pthread_cond_wait(&soundfiler_queue->cond, &soundfiler_queue->mutex);
+ pthread_mutex_unlock(&(soundfiler_queue->mutex));
#ifdef DEBUG
post("Soundfiler awake");
#endif
/* work on the queue */
+
+ pthread_mutex_lock(&(soundfiler_queue->mutex));
while (soundfiler_queue->begin!=NULL)
{
! /* locking process */
! pthread_mutex_lock(&(soundfiler_queue->begin->mutex));
!
! /* create a copy that we can work on */
! t_sfprocess * me = copybytes(soundfiler_queue->begin,
! sizeof(t_sfprocess));
!
! me->argv = copybytes (soundfiler_queue->begin->argv,
! soundfiler_queue->begin->argc * sizeof(t_atom));
!
! static int i;
! for (i = 0; i != me->argc; ++i)
! {
! if ( (soundfiler_queue->begin->argv+i)->a_type == A_SYMBOL)
! {
! t_symbol * sym1 = getbytes(sizeof(t_symbol));
! sym1->s_name = copybytes((soundfiler_queue->begin->argv+i)
! ->a_w.w_symbol-> s_name,
! strlen((soundfiler_queue->begin
! ->argv+i)->a_w.w_symbol
! ->s_name)
! * (sizeof(char)+1) );
! sym1->s_thing = (soundfiler_queue->begin->argv+i)
! ->a_w.w_symbol->s_thing;
! sym1->s_next = (soundfiler_queue->begin->argv+i)
! ->a_w.w_symbol->s_next;
! (me->argv+i)->a_w.w_symbol=sym1;
! }
! }
!
! pthread_mutex_unlock(&(soundfiler_queue->begin->mutex));
!
!
pthread_mutex_unlock(&(soundfiler_queue->mutex));
+ #ifdef DEBUG
+ post("soundfiler: mutex unlocked, running process");
+ #endif
/* running the specific function */
+
me->process(me->x, NULL, me->argc, me->argv);
! #ifdef DEBUG
! post("soundfiler: process done, locking mutex");
! #endif
!
pthread_mutex_lock(&(soundfiler_queue->mutex));
! pthread_mutex_lock(&(soundfiler_queue->begin->mutex));
!
! /* freeing the memory we allocated */
! for (i = 0; i != soundfiler_queue->begin->argc; ++i)
! {
! if ((soundfiler_queue->begin->argv+i)->a_type == A_SYMBOL)
! {
! /* the string */
! freebytes( (soundfiler_queue->begin->argv+i)->
! a_w.w_symbol->s_name,
! strlen((soundfiler_queue->begin->argv+i)->
! a_w.w_symbol->s_name)
! * (sizeof(char)+1) );
! /* the symbol */
! freebytes( (soundfiler_queue->begin->argv+i)->a_w.w_symbol,
! sizeof(t_symbol) );
! }
! }
!
! /* the argument vector */
! freebytes(soundfiler_queue->begin->argv,sizeof(t_atom)
! * soundfiler_queue->begin->argc);
! /* the process struct */
! t_sfprocess * next=soundfiler_queue->begin->next;
! freebytes(soundfiler_queue->begin,sizeof(t_sfprocess));
! soundfiler_queue->begin=next;
+ /* we'll have to free the memory again */
+ for (i = 0; i != me->argc; ++i)
+ {
+ if ( (me->argv+i)->a_type == A_SYMBOL)
+ {
+ /* the string */
+ freebytes( (me->argv+i)->a_w.w_symbol->s_name,
+ strlen((me->argv+i)->a_w.w_symbol->s_name)
+ * (sizeof(char)+1) );
+ /* the symbol */
+ freebytes( (me->argv+i)->a_w.w_symbol, sizeof(t_symbol) );
+ }
+ }
+ /* the argument vector */
+ freebytes(me->argv,sizeof(t_atom) * me->argc);
+ /* the process struct */
+ freebytes(me,sizeof(t_sfprocess));
};
soundfiler_queue->end=NULL;
***************
*** 981,985 ****
/* create soundfiler thread */
! void sys_start_sfthread()
{
soundfiler_queue = getbytes (sizeof(t_sfqueue));
--- 1116,1120 ----
/* create soundfiler thread */
! void sys_start_sfthread(void)
{
soundfiler_queue = getbytes (sizeof(t_sfqueue));
***************
*** 987,994 ****
pthread_mutex_init (&soundfiler_queue->mutex,NULL);
pthread_cond_init (&soundfiler_queue->cond,NULL);
soundfiler_queue->begin=soundfiler_queue->end=NULL;
if (pthread_create(&sf_thread_id, NULL ,
! soundfiler_thread,NULL) !=0)
error("Couldn't create soundfiler thread");
else
--- 1122,1132 ----
pthread_mutex_init (&soundfiler_queue->mutex,NULL);
pthread_cond_init (&soundfiler_queue->cond,NULL);
+
+ pthread_mutex_lock(&(soundfiler_queue->mutex));
soundfiler_queue->begin=soundfiler_queue->end=NULL;
+ pthread_mutex_unlock(&(soundfiler_queue->mutex));
if (pthread_create(&sf_thread_id, NULL ,
! (void *) soundfiler_thread,NULL) !=0)
error("Couldn't create soundfiler thread");
else
***************
*** 996,1002 ****
}
! #endif /* THREADED_SF */
! static t_class *soundfiler_class;
--- 1134,1525 ----
}
! static void soundfiler_t_write(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv);
!
! static void soundfiler_t_write_addq(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv)
! {
! soundfiler_queue_add(soundfiler_t_write,(void *)x,argc, argv);
! }
!
! static void soundfiler_t_read(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv);
!
! static void soundfiler_t_read_addq(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv)
! {
! soundfiler_queue_add(soundfiler_t_read,(void *)x,argc, argv);
! }
!
! /* soundfiler_read ...
!
! usage: read [flags] filename table ...
! flags:
! -skip <frames> ... frames to skip in file
! -nframes <frames>
! -onset <frames> ... onset in table to read into (NOT DONE YET)
! -raw <headersize channels bytes endian>
! -resize
! -maxsize <max-size>
! */
!
! static void soundfiler_t_read(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv)
! {
! int headersize = -1, channels = 0, bytespersamp = 0, bigendian = 0,
! resize = 0, i, j;
! long skipframes = 0, nframes = 0, finalsize = 0, itemsleft,
! maxsize = DEFMAXSIZE, itemsread = 0, bytelimit = 0x7fffffff;
! int fd = -1;
! char endianness, *filename;
! t_garray *garrays[MAXSFCHANS];
! t_float *vecs[MAXSFCHANS];
! char sampbuf[SAMPBUFSIZE];
! int bufframes, nitems;
! FILE *fp;
!
! while (argc > 0 && argv->a_type == A_SYMBOL &&
! *argv->a_w.w_symbol->s_name == '-')
! {
! char *flag = argv->a_w.w_symbol->s_name + 1;
! if (!strcmp(flag, "skip"))
! {
! if (argc < 2 || argv[1].a_type != A_FLOAT ||
! ((skipframes = argv[1].a_w.w_float) < 0))
! goto usage;
! argc -= 2; argv += 2;
! }
! else if (!strcmp(flag, "nframes"))
! {
! if (argc < 2 || argv[1].a_type != A_FLOAT ||
! ((nframes = argv[1].a_w.w_float) < 0))
! goto usage;
! argc -= 2; argv += 2;
! }
! else if (!strcmp(flag, "raw"))
! {
! if (argc < 5 ||
! argv[1].a_type != A_FLOAT ||
! ((headersize = argv[1].a_w.w_float) < 0) ||
! argv[2].a_type != A_FLOAT ||
! ((channels = argv[2].a_w.w_float) < 1) ||
! (channels > MAXSFCHANS) ||
! argv[3].a_type != A_FLOAT ||
! ((bytespersamp = argv[3].a_w.w_float) < 2) ||
! (bytespersamp > 4) ||
! argv[4].a_type != A_SYMBOL ||
! ((endianness = argv[4].a_w.w_symbol->s_name[0]) != 'b'
! && endianness != 'l' && endianness != 'n'))
! goto usage;
! if (endianness == 'b')
! bigendian = 1;
! else if (endianness == 'l')
! bigendian = 0;
! else
! bigendian = garray_ambigendian();
! argc -= 5; argv += 5;
! }
! else if (!strcmp(flag, "resize"))
! {
! resize = 1;
! argc -= 1; argv += 1;
! }
! else if (!strcmp(flag, "maxsize"))
! {
! if (argc < 2 || argv[1].a_type != A_FLOAT ||
! ((maxsize = argv[1].a_w.w_float) < 0))
! goto usage;
! resize = 1; /* maxsize implies resize. */
! argc -= 2; argv += 2;
! }
! else goto usage;
! }
! if (argc < 2 || argc > MAXSFCHANS + 1 || argv[0].a_type != A_SYMBOL)
! goto usage;
! filename = argv[0].a_w.w_symbol->s_name;
! argc--; argv++;
!
! for (i = 0; i < argc; i++)
! {
! int vecsize;
! //syntax correct?
! if (argv[i].a_type != A_SYMBOL)
! goto usage;
! //find table
! if (!(garrays[i] =
! (t_garray *)pd_findbyclass(argv[i].a_w.w_symbol, garray_class)))
! {
! pd_error(x, "%s: no such table", argv[i].a_w.w_symbol->s_name);
! goto done;
! }
! else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
! error("%s: bad template for tabwrite",
! argv[i].a_w.w_symbol->s_name);
! if (finalsize && finalsize != vecsize && !resize)
! {
! post("soundfiler_read: arrays have different lengths; resizing...");
! resize = 1;
! }
! finalsize = vecsize;
! }
! fd = open_soundfile(canvas_getdir(x->x_canvas)->s_name, filename,
! headersize, &bytespersamp, &bigendian, &channels, &bytelimit,
! skipframes);
!
! if (fd < 0)
! {
! pd_error(x, "soundfiler_read: %s: %s", filename, (errno == EIO ?
! "unknown or bad header format" : strerror(errno)));
! goto done;
! }
!
! if (resize)
! {
! /* figure out what to resize to */
! long poswas, eofis, framesinfile;
!
! poswas = lseek(fd, 0, SEEK_CUR);
! eofis = lseek(fd, 0, SEEK_END);
! if (poswas < 0 || eofis < 0)
! {
! pd_error(x, "lseek failed");
! goto done;
! }
! lseek(fd, poswas, SEEK_SET);
! framesinfile = (eofis - poswas) / (channels * bytespersamp);
! if (framesinfile > maxsize)
! {
! pd_error(x, "soundfiler_read: truncated to %d elements", maxsize);
! framesinfile = maxsize;
! }
! if (framesinfile > bytelimit / (channels * bytespersamp))
! framesinfile = bytelimit / (channels * bytespersamp);
! finalsize = framesinfile;
! for (i = 0; i < argc; i++)
! {
! int vecsize;
!
! sys_lock();
! garray_resize(garrays[i], finalsize);
! sys_unlock();
!
! /* for sanity's sake let's clear the save-in-patch flag here */
! garray_setsaveit(garrays[i], 0);
! garray_getfloatarray(garrays[i], &vecsize, &vecs[i]);
! /* if the resize failed, garray_resize reported the error */
! if (vecsize != framesinfile)
! {
! pd_error(x, "resize failed");
! goto done;
! }
! }
! }
! if (!finalsize) finalsize = 0x7fffffff;
! if (finalsize > bytelimit / (channels * bytespersamp))
! finalsize = bytelimit / (channels * bytespersamp);
! fp = fdopen(fd, "rb");
! bufframes = SAMPBUFSIZE / (channels * bytespersamp);
!
! sys_lock();
! for (itemsread = 0; itemsread < finalsize; )
! {
! int thisread = finalsize - itemsread;
! thisread = (thisread > bufframes ? bufframes : thisread);
! nitems = fread(sampbuf, channels * bytespersamp, thisread, fp);
! if (nitems <= 0) break;
! soundfile_xferin(channels, argc, vecs, itemsread,
! (unsigned char *)sampbuf, nitems, bytespersamp, bigendian);
! itemsread += nitems;
! }
! /* zero out remaining elements of vectors */
!
! for (i = 0; i < argc; i++)
! {
! int nzero, vecsize;
! garray_getfloatarray(garrays[i], &vecsize, &vecs[i]);
! for (j = itemsread; j < vecsize; j++)
! vecs[i][j] = 0;
! }
! /* zero out vectors in excess of number of channels */
! for (i = channels; i < argc; i++)
! {
! int vecsize;
! float *foo;
! garray_getfloatarray(garrays[i], &vecsize, &foo);
! for (j = 0; j < vecsize; j++)
! foo[j] = 0;
! }
! sys_unlock();
! /* do all graphics updates */
! for (i = 0; i < argc; i++)
! garray_redraw(garrays[i]);
! fclose(fp);
! fd = -1;
! goto done;
! usage:
! pd_error(x, "usage: read [flags] filename tablename...");
! post("flags: -skip <n> -nframes <n> -resize -maxsize <n> ...");
! post("-raw <headerbytes> <channels> <bytespersamp> <endian (b, l, or n)>.");
! done:
! if (fd >= 0)
! close (fd);
! outlet_float(x->x_obj.ob_outlet, (float)itemsread);
! }
!
! /* this is broken out from soundfiler_write below so garray_write can
! call it too... not done yet though. */
!
! long soundfiler_t_dowrite(void *obj, t_canvas *canvas,
! int argc, t_atom *argv)
! {
! int headersize, bytespersamp, bigendian,
! endianness, swap, filetype, normalize, i, j, nchannels;
! long onset, nframes, itemsleft,
! maxsize = DEFMAXSIZE, itemswritten = 0;
! t_garray *garrays[MAXSFCHANS];
! t_float *vecs[MAXSFCHANS];
! char sampbuf[SAMPBUFSIZE];
! int bufframes, nitems;
! int fd = -1;
! float normfactor, biggest = 0, samplerate;
! t_symbol *filesym;
!
! if (soundfiler_writeargparse(obj, &argc, &argv, &filesym, &filetype,
! &bytespersamp, &swap, &bigendian, &normalize, &onset, &nframes,
! &samplerate))
! goto usage;
! nchannels = argc;
! if (nchannels < 1 || nchannels > MAXSFCHANS)
! goto usage;
! if (samplerate < 0)
! samplerate = sys_getsr();
! for (i = 0; i < nchannels; i++)
! {
! int vecsize;
! if (argv[i].a_type != A_SYMBOL)
! goto usage;
! if (!(garrays[i] =
! (t_garray *)pd_findbyclass(argv[i].a_w.w_symbol, garray_class)))
! {
! pd_error(obj, "%s: no such table", argv[i].a_w.w_symbol->s_name);
! goto fail;
! }
! else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
! error("%s: bad template for tabwrite",
! argv[i].a_w.w_symbol->s_name);
! if (nframes > vecsize - onset)
! nframes = vecsize - onset;
!
! for (j = 0; j < vecsize; j++)
! {
! if (vecs[i][j] > biggest)
! biggest = vecs[i][j];
! else if (-vecs[i][j] > biggest)
! biggest = -vecs[i][j];
! }
! }
! if (nframes <= 0)
! {
! pd_error(obj, "soundfiler_write: no samples at onset %ld", onset);
! goto fail;
! }
!
! if ((fd = create_soundfile(canvas, filesym->s_name, filetype,
! nframes, bytespersamp, bigendian, nchannels,
! swap, samplerate)) < 0)
! {
! post("%s: %s\n", filesym->s_name, strerror(errno));
! goto fail;
! }
! if (!normalize)
! {
! if ((bytespersamp != 4) && (biggest > 1))
! {
! post("%s: normalizing max amplitude %f to 1", filesym->s_name, biggest);
! normalize = 1;
! }
! else post("%s: biggest amplitude = %f", filesym->s_name, biggest);
! }
! if (normalize)
! normfactor = (biggest > 0 ? 32767./(32768. * biggest) : 1);
! else normfactor = 1;
!
! bufframes = SAMPBUFSIZE / (nchannels * bytespersamp);
!
! for (itemswritten = 0; itemswritten < nframes; )
! {
! int thiswrite = nframes - itemswritten, nitems, nbytes;
! thiswrite = (thiswrite > bufframes ? bufframes : thiswrite);
! soundfile_xferout(argc, vecs, (unsigned char *)sampbuf, thiswrite,
! onset, bytespersamp, bigendian, normfactor);
! nbytes = write(fd, sampbuf, nchannels * bytespersamp * thiswrite);
! if (nbytes < nchannels * bytespersamp * thiswrite)
! {
! post("%s: %s", filesym->s_name, strerror(errno));
! if (nbytes > 0)
! itemswritten += nbytes / (nchannels * bytespersamp);
! break;
! }
! itemswritten += thiswrite;
! onset += thiswrite;
! }
! if (fd >= 0)
! {
! soundfile_finishwrite(obj, filesym->s_name, fd,
! filetype, nframes, itemswritten, nchannels * bytespersamp, swap);
! close (fd);
! }
! return ((float)itemswritten);
! usage:
! pd_error(obj, "usage: write [flags] filename tablename...");
! post("flags: -skip <n> -nframes <n> -bytes <n> -wave -aiff -nextstep ...");
! post("-big -little -normalize");
! post("(defaults to a 16-bit wave file).");
! fail:
! if (fd >= 0)
! close (fd);
! return (0);
! }
!
! static void soundfiler_t_write(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv)
! {
! long bozo = soundfiler_t_dowrite(x, x->x_canvas,
! argc, argv);
! outlet_float(x->x_obj.ob_outlet, (float)bozo);
! }
!
! static void soundfiler_t_resize(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv);
!
! static void soundfiler_t_resize_addq(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv)
! {
! soundfiler_queue_add(soundfiler_t_resize,(void *)x,argc, argv);
! }
!
!
! /* soundfiler_t_resize ...
! usage: resize table size ...
! */
! static void soundfiler_t_resize(t_soundfiler *x, t_symbol *s,
! int argc, t_atom *argv)
! {
! sys_lock();
! garray_resize((t_garray *)pd_findbyclass(argv[0].a_w.w_symbol, garray_class), atom_getintarg(1,argc,argv));
! sys_unlock();
!
! outlet_float(x->x_obj.ob_outlet, (float)atom_getintarg(1,argc,argv));
! return;
!
! usage:
! pd_error(x, "usage: read [flags] filename tablename...");
! post("flags: -skip <n> -nframes <n> -resize -maxsize <n> ...");
! post("-raw <headerbytes> <channels> <bytespersamp> <endian (b, l, or n)>.");
! }
!
!
! #endif /* THREADED_SF */
***************
*** 1341,1360 ****
- #ifdef THREADED_SF
-
- static void soundfiler_twrite(t_soundfiler *x, t_symbol *s,
- int argc, t_atom *argv)
- {
- soundfile_queue_add(soundfiler_write,x,argc, argv);
- }
-
- static void soundfiler_tread(t_soundfiler *x, t_symbol *s,
- int argc, t_atom *argv)
- {
- soundfile_queue_add(soundfiler_read,x,argc, argv);
- }
-
-
- #endif /* THREADED_SF */
static void soundfiler_setup(void)
--- 1864,1867 ----
***************
*** 1367,1374 ****
gensym("write"), A_GIMME, 0);
#ifdef THREADED_SF
! class_addmethod(soundfiler_class, (t_method)soundfiler_tread,
gensym("t_read"), A_GIMME, 0);
! class_addmethod(soundfiler_class, (t_method)soundfiler_twrite,
gensym("t_write"), A_GIMME, 0);
#endif /* THREADED_SF */
}
--- 1874,1883 ----
gensym("write"), A_GIMME, 0);
#ifdef THREADED_SF
! class_addmethod(soundfiler_class, (t_method)soundfiler_t_read_addq,
gensym("t_read"), A_GIMME, 0);
! class_addmethod(soundfiler_class, (t_method)soundfiler_t_write_addq,
gensym("t_write"), A_GIMME, 0);
+ class_addmethod(soundfiler_class, (t_method)soundfiler_t_resize_addq,
+ gensym("resize"), A_GIMME, 0);
#endif /* THREADED_SF */
}