Update of /cvsroot/pure-data/externals/tb/sndfiler/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9029
Modified Files: sndfiler.c Log Message: using a semaphore instead of a condion variable for synchronization
Index: sndfiler.c =================================================================== RCS file: /cvsroot/pure-data/externals/tb/sndfiler/src/sndfiler.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** sndfiler.c 29 Nov 2005 18:34:32 -0000 1.3 --- sndfiler.c 16 Dec 2005 08:34:10 -0000 1.4 *************** *** 46,49 **** --- 46,50 ---- #include "m_fifo.h" #include "pthread.h" + #include "semaphore.h"
#endif /* USE_PD_MAIN */ *************** *** 90,94 **** } if (!template_find_field(_template, gensym("z"), ! &zonset, &ztype, &zarraytype)) { error("array: template %s has no 'z' field", templatesym->s_name); --- 91,95 ---- } if (!template_find_field(_template, gensym("z"), ! &zonset, &ztype, &zarraytype)) { error("array: template %s has no 'z' field", templatesym->s_name); *************** *** 98,102 **** { error("array: template %s, 'z' field is not an array", ! templatesym->s_name); return (0); } --- 99,103 ---- { error("array: template %s, 'z' field is not an array", ! templatesym->s_name); return (0); } *************** *** 129,135 **** { t_fifo* x_jobs; ! ! pthread_mutex_t mutex; ! pthread_cond_t cond; } t_sfqueue;
--- 130,134 ---- { t_fifo* x_jobs; ! sem_t sem; } t_sfqueue;
*************** *** 159,164 **** { t_sfprocess * me; ! pthread_cond_wait(&sndfiler_queue.cond, &sndfiler_queue.mutex); ! while (me = (t_sfprocess *)fifo_get(sndfiler_queue.x_jobs)) { --- 158,163 ---- { t_sfprocess * me; ! sem_wait(&sndfiler_queue.sem); ! while (me = (t_sfprocess *)fifo_get(sndfiler_queue.x_jobs)) { *************** *** 180,186 **** //initialize queue sndfiler_queue.x_jobs = fifo_init(); ! pthread_mutex_init (&sndfiler_queue.mutex,NULL); ! pthread_cond_init (&sndfiler_queue.cond,NULL); ! // initialize thread pthread_attr_init(&sf_attr); --- 179,184 ---- //initialize queue sndfiler_queue.x_jobs = fifo_init(); ! sem_init (&sndfiler_queue.sem,0,0); ! // initialize thread pthread_attr_init(&sf_attr); *************** *** 199,203 **** //start thread status = pthread_create(&sf_thread_id, &sf_attr, ! (void *) sndfiler_thread,NULL);
if (status != 0) --- 197,201 ---- //start thread status = pthread_create(&sf_thread_id, &sf_attr, ! (void *) sndfiler_thread,NULL);
if (status != 0) *************** *** 205,209 **** else post("Global sndfiler thread launched, priority: %d", ! sf_param.sched_priority); }
--- 203,207 ---- else post("Global sndfiler thread launched, priority: %d", ! sf_param.sched_priority); }
*************** *** 227,231 **** fifo_put(sndfiler_queue.x_jobs, process);
! pthread_cond_signal(&sndfiler_queue.cond); }
--- 225,229 ---- fifo_put(sndfiler_queue.x_jobs, process);
! sem_post(&sndfiler_queue.sem); }
*************** *** 248,267 **** // parse flags 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, "resize")) ! { ! resize = 1; ! argc -= 1; argv += 1; ! } ! else if (!strcmp(flag, "skip")) ! { ! if (argc < 2 || argv[1].a_type != A_FLOAT || ! ((seek = argv[1].a_w.w_float) == 0)) ! goto usage; ! argc -= 2; argv += 2; ! } ! else goto usage; }
--- 246,265 ---- // parse flags 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, "resize")) ! { ! resize = 1; ! argc -= 1; argv += 1; ! } ! else if (!strcmp(flag, "skip")) ! { ! if (argc < 2 || argv[1].a_type != A_FLOAT || ! ((seek = argv[1].a_w.w_float) == 0)) ! goto usage; ! argc -= 2; argv += 2; ! } ! else goto usage; }
*************** *** 278,307 **** { t_float *dummy; ! int size; t_garray *array;
if(!(array = (t_garray *)pd_findbyclass( ! atom_getsymbolarg(i+1, argc, argv), garray_class))) ! { ! pd_error(x, "%s: no such array", atom_getsymbolarg(i+1, ! argc, argv)->s_name); ! return; ! } ! if(garray_getfloatarray(array, &size, &dummy)) ! arrays[i] = array; ! else ! { ! pd_error(x, "%s: bad template for sndfiler", atom_getsymbolarg(i+1, ! argc, argv)->s_name); ! return; ! } ! // in multichannel mode: check if arrays have different length ! if (arraysize && arraysize != size && !resize) ! { ! post("sndfiler: arrays have different lengths, resizing to last one ..."); ! } ! arraysize = size; }
--- 276,305 ---- { t_float *dummy; ! int size; t_garray *array;
if(!(array = (t_garray *)pd_findbyclass( ! atom_getsymbolarg(i+1, argc, argv), garray_class))) ! { ! pd_error(x, "%s: no such array", atom_getsymbolarg(i+1, ! argc, argv)->s_name); ! return; ! } ! if(garray_getfloatarray(array, &size, &dummy)) ! arrays[i] = array; ! else ! { ! pd_error(x, "%s: bad template for sndfiler", atom_getsymbolarg(i+1, ! argc, argv)->s_name); ! return; ! } ! // in multichannel mode: check if arrays have different length ! if (arraysize && arraysize != size && !resize) ! { ! post("sndfiler: arrays have different lengths, resizing to last one ..."); ! } ! arraysize = size; }
*************** *** 312,316 **** int pos = 0; int maxchannels = (channel_count < info.channels) ? ! channel_count : info.channels;
t_float * item = alloca(maxchannels * sizeof(t_float)); --- 310,314 ---- int pos = 0; int maxchannels = (channel_count < info.channels) ? ! channel_count : info.channels;
t_float * item = alloca(maxchannels * sizeof(t_float)); *************** *** 318,344 **** t_int ** syncdata = getbytes(sizeof(t_int*) * 5); ! // negative seek: offset from the end of the file ! if(seek<0) ! { ! pos = sf_seek(sndfile, seek, SEEK_END); ! } ! if(seek>0) ! { ! pos = sf_seek(sndfile, seek, SEEK_SET); ! } ! if(pos == -1) ! { ! pd_error(x, "invalid seek in soundfile"); ! return; ! } ! if(resize) ! { ! writesize = (info.frames-pos); ! arraysize = writesize; ! } ! else ! writesize = (arraysize>(info.frames-pos)) ? ! info.frames-pos : arraysize;
#if (_POSIX_MEMLOCK - 0) >= 200112L --- 316,342 ---- t_int ** syncdata = getbytes(sizeof(t_int*) * 5); ! // negative seek: offset from the end of the file ! if(seek<0) ! { ! pos = sf_seek(sndfile, seek, SEEK_END); ! } ! if(seek>0) ! { ! pos = sf_seek(sndfile, seek, SEEK_SET); ! } ! if(pos == -1) ! { ! pd_error(x, "invalid seek in soundfile"); ! return; ! } ! if(resize) ! { ! writesize = (info.frames-pos); ! arraysize = writesize; ! } ! else ! writesize = (arraysize>(info.frames-pos)) ? ! info.frames-pos : arraysize;
#if (_POSIX_MEMLOCK - 0) >= 200112L *************** *** 364,381 **** } ! // fill remaining elements with zero ! if(!resize && (arraysize>(info.frames-pos))) ! { ! for (i = writesize; i != arraysize; ++i) ! { ! for (j = 0; j != info.channels; ++j) ! { ! if (j < channel_count) ! { ! helper_arrays[j][i] = 0; ! } ! } ! } ! }
#if (_POSIX_MEMLOCK - 0) >= 200112L --- 362,379 ---- } ! // fill remaining elements with zero ! if(!resize && (arraysize>(info.frames-pos))) ! { ! for (i = writesize; i != arraysize; ++i) ! { ! for (j = 0; j != info.channels; ++j) ! { ! if (j < channel_count) ! { ! helper_arrays[j][i] = 0; ! } ! } ! } ! }
#if (_POSIX_MEMLOCK - 0) >= 200112L *************** *** 392,406 ****
sys_callback(sndfiler_synchonize, (t_int*)syncdata, 5); ! return; } else { pd_error(x, "Error opening file"); ! return; }
! usage: pd_error(x, "usage: read [flags] filename array1 array2 ..."); ! post("flags: -skip <n> -resize "); }
--- 390,404 ----
sys_callback(sndfiler_synchonize, (t_int*)syncdata, 5); ! return; } else { pd_error(x, "Error opening file"); ! return; }
! usage: pd_error(x, "usage: read [flags] filename array1 array2 ..."); ! post("flags: -skip <n> -resize "); }
*************** *** 427,431 **** { vmess(&gl->gl_pd, gensym("bounds"), "ffff", 0., gl->gl_y1, ! (double)(frames > 1 ? frames-1 : 1), gl->gl_y2);
/* close any dialogs that might have the wrong info now... */ --- 425,429 ---- { vmess(&gl->gl_pd, gensym("bounds"), "ffff", 0., gl->gl_y1, ! (double)(frames > 1 ? frames-1 : 1), gl->gl_y2);
/* close any dialogs that might have the wrong info now... */ *************** *** 462,466 **** fifo_put(sndfiler_queue.x_jobs, process);
! pthread_cond_signal(&sndfiler_queue.cond); }
--- 460,464 ---- fifo_put(sndfiler_queue.x_jobs, process);
! sem_post(&sndfiler_queue.sem); }
*************** *** 562,567 **** return;
! usage: ! pd_error(x, "usage: resize tablename size"); }
--- 560,565 ---- return;
! usage: ! pd_error(x, "usage: resize tablename size"); }
*************** *** 569,579 **** { sndfiler_class = class_new(gensym("sndfiler"), ! (t_newmethod)sndfiler_new, 0, ! sizeof(t_sndfiler), 0, 0);
class_addmethod(sndfiler_class, (t_method)sndfiler_read, ! gensym("read"), A_GIMME, 0); class_addmethod(sndfiler_class, (t_method)sndfiler_resize, ! gensym("resize"), A_GIMME, 0);
#ifdef USE_PD_MAIN --- 567,577 ---- { sndfiler_class = class_new(gensym("sndfiler"), ! (t_newmethod)sndfiler_new, 0, ! sizeof(t_sndfiler), 0, 0);
class_addmethod(sndfiler_class, (t_method)sndfiler_read, ! gensym("read"), A_GIMME, 0); class_addmethod(sndfiler_class, (t_method)sndfiler_resize, ! gensym("resize"), A_GIMME, 0);
#ifdef USE_PD_MAIN