Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13870
Modified Files: Tag: desiredata d_soundfile.c Log Message: THREADEDSF fixes
Index: d_soundfile.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/d_soundfile.c,v retrieving revision 1.4.4.11.2.10.2.26 retrieving revision 1.4.4.11.2.10.2.27 diff -C2 -d -r1.4.4.11.2.10.2.26 -r1.4.4.11.2.10.2.27 *** d_soundfile.c 20 Jul 2007 05:08:16 -0000 1.4.4.11.2.10.2.26 --- d_soundfile.c 20 Jul 2007 05:34:13 -0000 1.4.4.11.2.10.2.27 *************** *** 760,765 **** static t_int soundfiler_read_output(t_int *w); static void soundfiler_t_read(t_soundfiler *x, t_symbol *s, int argc, t_atom *argv) { ! int headersize = -1, channels = 0, bytespersample = 0, bigendian = 0, resize = 0, i, j; ! long skipframes = 0, nframes = 0, finalsize = 0, maxsize = DEFMAXSIZE, itemsread = 0, bytelimit = 0x7fffffff; int fd = -1; char endianness, *filename; --- 760,769 ---- static t_int soundfiler_read_output(t_int *w); static void soundfiler_t_read(t_soundfiler *x, t_symbol *s, int argc, t_atom *argv) { ! t_param p; ! int headersize = -1; ! p.nchannels = 0; p.bytespersample = 0; p.bigendian = 0; ! int resize = 0, i, j; ! long skipframes = 0, nframes = 0, finalsize = 0, maxsize = DEFMAXSIZE, itemsread = 0; ! p.bytelimit = 0x7fffffff; int fd = -1; char endianness, *filename; *************** *** 783,792 **** } else if (!strcmp(flag, "raw")) { EAT_ARG(A_FLOAT,headersize); if (headersize<0) goto usage; ! EAT_ARG(A_FLOAT,channels); if (channels<1) goto usage; ! EAT_ARG(A_FLOAT,bytespersample); if (bytespersample<2 || bytespersample>4) goto usage; EAT_ARG(A_SYMBOL,endianness); if (endianness!='b' && endianness!='l' && endianness!='n') goto usage; ! if (endianness == 'b') bigendian = 1; ! else if (endianness == 'l') bigendian = 0; ! else bigendian = garray_ambigendian(); } else if (!strcmp(flag, "resize")) { resize = 1; --- 787,796 ---- } else if (!strcmp(flag, "raw")) { EAT_ARG(A_FLOAT,headersize); if (headersize<0) goto usage; ! EAT_ARG(A_FLOAT,p.nchannels); if (p.nchannels<1) goto usage; ! EAT_ARG(A_FLOAT,p.bytespersample); if (p.bytespersample<2 || p.bytespersample>4) goto usage; EAT_ARG(A_SYMBOL,endianness); if (endianness!='b' && endianness!='l' && endianness!='n') goto usage; ! if (endianness == 'b') p.bigendian = 1; ! else if (endianness == 'l') p.bigendian = 0; ! else p.bigendian = garray_ambigendian(); } else if (!strcmp(flag, "resize")) { resize = 1; *************** *** 799,803 **** filename = argv[0].a_symbol->name; argc--; argv++; ! for (i = 0; i < argc; i++) { if (argv[i].a_type != A_SYMBOL) goto usage; garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_symbol, garray_class); --- 803,807 ---- filename = argv[0].a_symbol->name; argc--; argv++; ! for (int i=0; i<argc; i++) { if (argv[i].a_type != A_SYMBOL) goto usage; garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_symbol, garray_class); *************** *** 813,817 **** finalsize = vecsize[i]; } ! fd = open_soundfile(canvas_getdir(x->canvas)->name, filename, headersize, &bytespersample, &bigendian, &channels, &bytelimit, skipframes); if (fd < 0) { error("soundfiler_read: %s: %s", filename, (errno == EIO ? "unknown or bad header format" : strerror(errno))); --- 817,821 ---- finalsize = vecsize[i]; } ! fd = open_soundfile(canvas_getdir(x->canvas)->name, filename, headersize, &p, skipframes); if (fd < 0) { error("soundfiler_read: %s: %s", filename, (errno == EIO ? "unknown or bad header format" : strerror(errno))); *************** *** 825,843 **** if (poswas < 0 || eofis < 0) {error("lseek failed"); goto done;} lseek(fd, poswas, SEEK_SET); ! framesinfile = (eofis - poswas) / (channels * bytespersample); if (framesinfile > maxsize) { error("soundfiler_read: truncated to %d elements", maxsize); framesinfile = maxsize; } ! framesinfile = min(framesinfile, bytelimit / (channels * bytespersample)); finalsize = framesinfile; } if (!finalsize) finalsize = 0x7fffffff; ! finalsize = min(finalsize, bytelimit / (channels * bytespersample)); fp = fdopen(fd, "rb"); ! bufframes = SAMPBUFSIZE / (channels * bytespersample); if (debug) { post("buffers: %d", argc); ! post("channels: %d", channels); } munlockall(); --- 829,847 ---- if (poswas < 0 || eofis < 0) {error("lseek failed"); goto done;} lseek(fd, poswas, SEEK_SET); ! framesinfile = (eofis - poswas) / p.bytesperchannel(); if (framesinfile > maxsize) { error("soundfiler_read: truncated to %d elements", maxsize); framesinfile = maxsize; } ! framesinfile = min(framesinfile, p.bytelimit / p.bytesperchannel()); finalsize = framesinfile; } if (!finalsize) finalsize = 0x7fffffff; ! finalsize = min(finalsize, p.bytelimit / p.bytesperchannel()); fp = fdopen(fd, "rb"); ! bufframes = SAMPBUFSIZE / p.bytesperchannel(); if (debug) { post("buffers: %d", argc); ! post("channels: %d", p.nchannels); } munlockall(); *************** *** 865,876 **** } } ! if(i > channels) memset(nvecs[i],0,vecsize[i] * sizeof(t_float)); if (debug) post("transfer soundfile"); for (itemsread = 0; itemsread < finalsize; ) { int thisread = finalsize - itemsread; thisread = (thisread > bufframes ? bufframes : thisread); ! nitems = fread(sampbuf, channels * bytespersample, thisread, fp); if (nitems <= 0) break; ! soundfile_xferin(channels, argc, nvecs, itemsread, (unsigned char *)sampbuf, nitems, bytespersample, bigendian); itemsread += nitems; } --- 869,880 ---- } } ! if(i > p.nchannels) memset(nvecs[i],0,vecsize[i] * sizeof(t_float)); if (debug) post("transfer soundfile"); for (itemsread = 0; itemsread < finalsize; ) { int thisread = finalsize - itemsread; thisread = (thisread > bufframes ? bufframes : thisread); ! nitems = fread(sampbuf, p.bytesperchannel(), thisread, fp); if (nitems <= 0) break; ! soundfile_xferin(p.nchannels, argc, nvecs, itemsread, (unsigned char *)sampbuf, nitems, p.bytespersample, p.bigendian); itemsread += nitems; } *************** *** 916,926 ****
/* idle callback for threadsafe synchronisation */ ! static t_int soundfiler_read_update_garray(t_int * w) { ! t_garray* garray = (t_garray*)w[0]; t_int nvec = w[1]; t_int finalsize = w[2]; pthread_cond_t *conditional = (pthread_cond_t*) w[3]; ! garray->array.vec = (char *) nvec; ! garray->array.n = finalsize; if (garray->usedindsp) canvas_update_dsp(); /* signal helper thread */ --- 920,931 ----
/* idle callback for threadsafe synchronisation */ ! static t_int soundfiler_read_update_garray(t_int *w) { ! t_garray *garray = (t_garray*)w[0]; t_int nvec = w[1]; t_int finalsize = w[2]; pthread_cond_t *conditional = (pthread_cond_t*) w[3]; ! t_array *a = garray_getarray(garray); ! a->vec = (char *) nvec; ! a->n = finalsize; if (garray->usedindsp) canvas_update_dsp(); /* signal helper thread */ *************** *** 929,933 **** }
! static t_int soundfiler_read_update_graphics(t_int * w) { t_garray *garray = (t_garray*) w[0]; t_canvas *gl; --- 934,938 ---- }
! static t_int soundfiler_read_update_graphics(t_int *w) { t_garray *garray = (t_garray*) w[0]; t_canvas *gl; *************** *** 1049,1058 **** char *nvec; /* new array */ t_garray *x = (t_garray *)pd_findbyclass(argv[0].a_symbol, garray_class); ! if (!(x)) { ! error("%s: no such table", argv[0].a_symbol->name); ! goto usage; ! } ! vec = (t_float*) x->array.vec; ! was = x->array.n; if ((argv+1)->a_type == A_FLOAT) { n = (int) (argv+1)->a_float; --- 1054,1061 ---- char *nvec; /* new array */ t_garray *x = (t_garray *)pd_findbyclass(argv[0].a_symbol, garray_class); ! t_array *a = garray_getarray(x); ! if (!x) {error("%s: no such table", argv[0].a_symbol->name); goto usage;} ! vec = (t_float*) a->vec; ! was = a->n; if ((argv+1)->a_type == A_FLOAT) { n = (int) (argv+1)->a_float; *************** *** 1060,1081 **** if (n == was) return; if (n < 1) n = 1; ! elemsize = template_findbyname(x->array.a_templatesym)->t_n * sizeof(t_word); munlockall(); if (was > n) { ! nvec = (char*)copyalignedbytes(x->array.a_vec, was * elemsize); } else { ! nvec = getalignedbytes(n * elemsize); ! memcpy (nvec, x->array.a_vec, was * elemsize); memset(nvec + was*elemsize, 0, (n - was) * elemsize); } ! if (!nvec) { ! error("array resize failed: out of memory"); ! mlockall(MCL_FUTURE); ! return; ! } /* TB: we'll have to be sure that no one is accessing the array */ sys_lock(); ! x->array.vec = nvec; ! x->array.n = n; if (x->usedindsp) canvas_update_dsp(); sys_unlock(); --- 1063,1080 ---- if (n == was) return; if (n < 1) n = 1; ! elemsize = template_findbyname(a->templatesym)->t_n * sizeof(t_word); munlockall(); if (was > n) { ! nvec = (char *)copyalignedbytes(a->vec, was * elemsize); } else { ! nvec = (char *)getalignedbytes(n * elemsize); ! memcpy (nvec, a->vec, was * elemsize); memset(nvec + was*elemsize, 0, (n - was) * elemsize); } ! if (!nvec) {error("array resize failed: out of memory"); mlockall(MCL_FUTURE); return;} /* TB: we'll have to be sure that no one is accessing the array */ sys_lock(); ! a->vec = nvec; ! a->n = n; if (x->usedindsp) canvas_update_dsp(); sys_unlock(); *************** *** 1109,1122 **** char *nvec; /* new array */ t_garray * x = (t_garray *)pd_findbyclass(argv[0].a_symbol, garray_class); ! if (!(x)) { ! error("%s: no such table", argv[0].a_symbol->name); ! goto usage; ! } ! vec = (t_float*) x->array.a_vec; ! size = x->array.a_n; if ((argv+1)->a_type == A_FLOAT) { val = (int) (argv+1)->a_float; } else goto usage; ! elemsize = template_findbyname(x->array.a_templatesym)->t_n * sizeof(t_word); /* allocating memory */ munlockall(); --- 1108,1119 ---- char *nvec; /* new array */ t_garray * x = (t_garray *)pd_findbyclass(argv[0].a_symbol, garray_class); ! t_array *a = garray_getarray(x); ! if (!x) {error("%s: no such table", argv[0].a_symbol->name); goto usage;} ! vec = (t_float*) a->vec; ! size = a->n; if ((argv+1)->a_type == A_FLOAT) { val = (int) (argv+1)->a_float; } else goto usage; ! elemsize = template_findbyname(a->templatesym)->t_n * sizeof(t_word); /* allocating memory */ munlockall(); *************** *** 1131,1135 **** /* TB: we'll have to be sure that no one is accessing the array */ sys_lock(); ! x->array.a_vec = nvec; if (x->usedindsp) canvas_update_dsp(); sys_unlock(); --- 1128,1132 ---- /* TB: we'll have to be sure that no one is accessing the array */ sys_lock(); ! a->vec = nvec; if (x->usedindsp) canvas_update_dsp(); sys_unlock();