[PD-cvs] pd/src SConscript, 1.1.4.61, 1.1.4.62 m_atomic.h, 1.1.2.1.2.1, 1.1.2.1.2.2 m_binbuf.c, 1.4.4.1.2.9, 1.4.4.1.2.10 m_sched.c, 1.5.4.35.2.21, 1.5.4.35.2.22 m_simd.c, 1.1.4.7, 1.1.4.7.2.1 m_simd_sse_gcc.c, 1.1.4.13.2.4, 1.1.4.13.2.5 m_simd_sse_vc.c, 1.1.4.6.2.1, 1.1.4.6.2.2 m_simd_ve_gcc.c, 1.1.4.2, 1.1.4.2.2.1 s_audio.c, 1.5.4.16.2.20, 1.5.4.16.2.21 s_audio_portaudio.c, 1.1.2.21, 1.1.2.22 s_entry.c, 1.2.4.2.2.2, 1.2.4.2.2.3 s_inter.c, 1.5.4.10.2.26, 1.5.4.10.2.27 s_midi_pm.c, 1.4.4.1.2.9, 1.4.4.1.2.10 s_print.c, 1.2.4.1.2.2, 1.2.4.1.2.3 s_stuff.h, 1.5.4.10.2.9, 1.5.4.10.2.10 t_tkcmd.c, 1.2.4.1.2.10, 1.2.4.1.2.11 x_connective.c, 1.3.4.1.2.11, 1.3.4.1.2.12
Thomas Grill
xovo at users.sourceforge.net
Fri Aug 17 15:56:45 CEST 2007
Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3884
Modified Files:
Tag: devel_0_39
SConscript m_atomic.h m_binbuf.c m_sched.c m_simd.c
m_simd_sse_gcc.c m_simd_sse_vc.c m_simd_ve_gcc.c s_audio.c
s_audio_portaudio.c s_entry.c s_inter.c s_midi_pm.c s_print.c
s_stuff.h t_tkcmd.c x_connective.c
Log Message:
partly recoded SIMD stuff using compiler intrinsics
fixes for portaudio interface
improved idle processing (esp. timing)
experimental code for patcher loading to idle time (#define PD_IDLE_LOADING)
postponed audio driver related messages to be serviced in the scheduler loop (not in the audio callback!)
various other small fixes
Index: m_binbuf.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_binbuf.c,v
retrieving revision 1.4.4.1.2.9
retrieving revision 1.4.4.1.2.10
diff -C2 -d -r1.4.4.1.2.9 -r1.4.4.1.2.10
*** m_binbuf.c 30 Nov 2006 01:43:23 -0000 1.4.4.1.2.9
--- m_binbuf.c 17 Aug 2007 13:56:41 -0000 1.4.4.1.2.10
***************
*** 1303,1307 ****
}
! void glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir)
{
t_pd *x = 0;
--- 1303,1307 ----
}
! static t_int _glob_evalfile(t_int *args)
{
t_pd *x = 0;
***************
*** 1312,1315 ****
--- 1312,1319 ----
int dspstate = canvas_suspend_dsp();
+
+ t_symbol *name = (t_symbol *)args[0];
+ t_symbol *dir = (t_symbol *)args[1];
+
binbuf_evalfile(name, dir);
while ((x != s__X.s_thing) && (x = s__X.s_thing))
***************
*** 1317,1319 ****
--- 1321,1337 ----
pd_doloadbang();
canvas_resume_dsp(dspstate);
+
+ return 0;
+ }
+
+ void glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir)
+ {
+ t_int args[2];
+ args[0] = (t_int)name;
+ args[1] = (t_int)dir;
+ #ifdef PD_IDLE_LOADING
+ sys_callback(_glob_evalfile,args,2);
+ #else
+ _glob_evalfile(args);
+ #endif
}
Index: t_tkcmd.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/t_tkcmd.c,v
retrieving revision 1.2.4.1.2.10
retrieving revision 1.2.4.1.2.11
diff -C2 -d -r1.2.4.1.2.10 -r1.2.4.1.2.11
*** t_tkcmd.c 14 Jun 2006 01:03:02 -0000 1.2.4.1.2.10
--- t_tkcmd.c 17 Aug 2007 13:56:42 -0000 1.2.4.1.2.11
***************
*** 622,626 ****
argument. If so. we're to connect to a previously running pd (i.e.,
pd got started first). If not, we start Pd from here. */
! #if defined(MSW) || defined(__APPLE__)
if (argv && (portno = atoi(argv)) > 1)
#else
--- 622,626 ----
argument. If so. we're to connect to a previously running pd (i.e.,
pd got started first). If not, we start Pd from here. */
! #if defined(MSW)
if (argv && (portno = atoi(argv)) > 1)
#else
Index: m_sched.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_sched.c,v
retrieving revision 1.5.4.35.2.21
retrieving revision 1.5.4.35.2.22
diff -C2 -d -r1.5.4.35.2.21 -r1.5.4.35.2.22
*** m_sched.c 23 Nov 2006 05:59:42 -0000 1.5.4.35.2.21
--- m_sched.c 17 Aug 2007 13:56:41 -0000 1.5.4.35.2.22
***************
*** 22,25 ****
--- 22,27 ----
#include "assert.h"
+ #include <stdio.h>
+ #include <string.h> /* for memcpy */
/* LATER consider making this variable. It's now the LCM of all sample
***************
*** 398,405 ****
dsp_tick();
!
/* rethink: should we really do all this midi messaging in the realtime thread ? */
sys_pollmidiqueue();
sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
}
--- 400,409 ----
dsp_tick();
! #if 0
/* rethink: should we really do all this midi messaging in the realtime thread ? */
+ /* grrrr: although i like midi to be real-time, it's also done below, in the m_scheduler loops */
sys_pollmidiqueue();
sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
+ #endif
}
***************
*** 419,422 ****
--- 423,429 ----
void sys_initmidiqueue( void);
+ void run_all_idle_callbacks(void);
+ int run_timed_idle_callbacks(int microsecs);
+
int m_scheduler(void)
{
***************
*** 433,437 ****
sys_update_sleepgrain();
! sched_set_using_dacs(0); /* tb: dsp is switched off */
sys_initmidiqueue();
--- 440,444 ----
sys_update_sleepgrain();
! sched_set_using_dacs(sched_usedacs); /* tb: dsp is switched off */
sys_initmidiqueue();
***************
*** 497,501 ****
if (!didsomething)
{
-
sched_pollformeters();
--- 504,507 ----
***************
*** 510,513 ****
--- 516,522 ----
while(sys_keepsched)
{
+ double time,rtime;
+ time = sys_getrealtime();
+
/* tb: allow the audio callback to run */
sys_unlock();
***************
*** 518,527 ****
sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
if (sys_pollgui())
continue;
! /* do graphics updates and run idle callbacks */
sched_pollformeters();
-
}
sys_keepsched = 1;
--- 527,543 ----
sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
+ rtime = (sys_getrealtime()-time)*1e6;
+ if(rtime >= 0) /* < 0 can happen when changing drivers etc. */
+ {
+ time = sys_schedadvance/4-rtime;
+ /* run once at least: use time = 0 if time < 0.... */
+ rtime = run_timed_idle_callbacks(time < 0?0:time);
+ }
+
if (sys_pollgui())
continue;
! /* do graphics updates */
sched_pollformeters();
}
sys_keepsched = 1;
***************
*** 573,609 ****
#endif
!
! #if 0
! /* osx doesn't define a pthread_mutex_timedlock ... maybe someday
! it will ... */
! int sys_timedlock(int microsec)
{
! struct timespec timeout;
! int ret;
! struct timeval now;
!
! /* timedlock seems to have a resolution of 1ms */
! if (microsec < 1e3)
! microsec = 1e3;
!
! gettimeofday(&now,0);
! timeout.tv_sec = now.tv_sec;
! timeout.tv_nsec = (now.tv_usec + microsec) * 1000;
!
! while (timeout.tv_nsec > 1e9)
! {
! timeout.tv_sec += 1;
! timeout.tv_nsec -= 1e9;
! }
!
! ret = pthread_mutex_timedlock(&sys_mutex, &timeout);
! if (ret)
! post("timeout, %d", ret);
!
! return ret;
}
! #else
int sys_timedlock(int microsec)
--- 589,621 ----
#endif
! /* grrrr.org { */
! #ifdef __APPLE__
! /* osx doesn't define a pthread_mutex_timedlock ... */
! static int pthread_mutex_timedlock(pthread_mutex_t *__restrict mutex, const struct timespec *__restrict abs_timeout)
{
! int result;
! struct timeval tv;
! long long remain;
! for(;;)
! {
! result = pthread_mutex_trylock(mutex);
! if(result != EBUSY) return 0;
! gettimeofday(&tv,0);
! remain = (abs_timeout->tv_sec-tv.tv_sec)*10000000000LL+(abs_timeout->tv_nsec-tv.tv_usec*1000LL);
! if(remain <= 0) return ETIMEDOUT;
!
! /* Sleep for 1,000,000 nanoseconds before trying again. */
! struct timespec ts;
! ts.tv_sec = 0;
! ts.tv_nsec = remain < 1000000?remain:1000000;
!
! int status;
! do { status = nanosleep(&ts, &ts); } while (status == -1);
! }
}
! #endif
! /* } grrrr.org */
int sys_timedlock(int microsec)
***************
*** 613,619 ****
struct timeval now;
! if (sys_trylock() == 0)
! return 0;
!
if (microsec < 1e3)
microsec = 1e3;
--- 625,629 ----
struct timeval now;
! /* timedlock seems to have a resolution of 1ms */
if (microsec < 1e3)
microsec = 1e3;
***************
*** 630,644 ****
}
!
! /* in case the lock has been released during the system call, try
! again before waiting for the signal */
! if (sys_trylock() == 0)
! return 0;
!
! ret = pthread_cond_timedwait(&sys_cond, &sys_mutex, &timeout);
!
! return ret;
}
! #endif
/* tb } */
--- 640,646 ----
}
! return pthread_mutex_timedlock(&sys_mutex, &timeout);
}
!
/* tb } */
***************
*** 675,680 ****
struct _sched_callback* next; /* next callback in ringbuffer / in fifo */
t_int (*function) (t_int* argv);
- t_int* argv;
t_int argc;
} t_sched_callback;
--- 677,682 ----
struct _sched_callback* next; /* next callback in ringbuffer / in fifo */
t_int (*function) (t_int* argv);
t_int argc;
+ t_int argv[0];
} t_sched_callback;
***************
*** 683,699 ****
{
t_sched_callback* noo = (t_sched_callback*) getbytes
! (sizeof(t_sched_callback));
noo->function = callback;
if (argv && argc)
{
- noo->argv = (t_int*) copybytes (argv, argc * sizeof (t_int));
noo->argc = argc;
}
else
- {
noo->argc = 0;
! noo->argv = NULL;
! }
noo->next = NULL;
--- 685,699 ----
{
t_sched_callback* noo = (t_sched_callback*) getbytes
! (sizeof(t_sched_callback)+argc*sizeof(*argv));
noo->function = callback;
if (argv && argc)
{
noo->argc = argc;
+ memcpy(noo->argv,argv,argc * sizeof(*argv));
}
else
noo->argc = 0;
!
noo->next = NULL;
***************
*** 712,718 ****
static t_sched_callback *ringbuffer_head = NULL;
! void run_all_idle_callbacks(void)
{
t_sched_callback * new_callback;
/* append idle callback to ringbuffer */
while (new_callback = (t_sched_callback*) fifo_get(callback_fifo))
--- 712,727 ----
static t_sched_callback *ringbuffer_head = NULL;
! /*
! \param microsec maximum time to take for idle processing (0 means, run all callbacks at least once)
! \return remaining time in usecs
! \note no sys_lock management here
! */
! int run_timed_idle_callbacks(int microsec)
{
t_sched_callback * new_callback;
+ double stop;
+
+ stop = sys_getrealtime()*1.e6 + (double)microsec;
+
/* append idle callback to ringbuffer */
while (new_callback = (t_sched_callback*) fifo_get(callback_fifo))
***************
*** 737,748 ****
if (ringbuffer_head != NULL)
{
t_sched_callback * idle_callback = ringbuffer_head;
t_sched_callback * last = NULL;
t_sched_callback * next;
! do
{
! int status;
! status = (idle_callback->function)(idle_callback->argv);
switch (status)
--- 746,757 ----
if (ringbuffer_head != NULL)
{
+ double remain = stop - sys_getrealtime() * 1.e6;
t_sched_callback * idle_callback = ringbuffer_head;
t_sched_callback * last = NULL;
t_sched_callback * next;
! for(;;)
{
! int status = (idle_callback->function)(idle_callback->argc?idle_callback->argv:NULL);
switch (status)
***************
*** 751,757 ****
case 0:
next = idle_callback->next;
! if (idle_callback->argv)
! freebytes (idle_callback->argv, idle_callback->argc*sizeof (t_int));
! freebytes ((void*)idle_callback, sizeof(t_sched_callback));
if (last == NULL)
--- 760,764 ----
case 0:
next = idle_callback->next;
! freebytes (idle_callback, sizeof(t_sched_callback)+idle_callback->argc*sizeof(*idle_callback->argv));
if (last == NULL)
***************
*** 761,839 ****
idle_callback = next;
-
- /* callbacks returning 1 will be run again */
- case 1:
break;
! /* callbacks returning 2 will be run during the next idle callback */
! case 2:
! last = idle_callback;
! idle_callback = idle_callback->next;
! }
!
! }
! while ((idle_callback != NULL));
! }
! }
!
! static void run_idle_callbacks(int microsec)
! {
! t_sched_callback * new_callback;
! double stop;
!
! stop = sys_getrealtime()*1.e6 + (double)microsec;
!
! /* append idle callback to ringbuffer */
! while (new_callback = (t_sched_callback*) fifo_get(callback_fifo))
! {
! t_sched_callback * next;
! /* set the next field to NULL ... it might be set in the fifo */
! new_callback->next = NULL;
! if (ringbuffer_head == NULL)
! {
! ringbuffer_head = new_callback;
! }
! else
{
! next = ringbuffer_head;
! while (next->next != 0)
! next = next->next;
! next->next = new_callback;
! }
}
! if (ringbuffer_head != NULL)
! {
! double remain = stop - sys_getrealtime() * 1.e6;
! t_sched_callback * idle_callback = ringbuffer_head;
! t_sched_callback * last = NULL;
! t_sched_callback * next;
!
! do
{
! int status;
! // sys_lock();
! status = (idle_callback->function)(idle_callback->argv);
! // sys_unlock();
!
! switch (status)
! {
! /* callbacks returning 0 will be deleted */
! case 0:
! next = idle_callback->next;
! if (idle_callback->argc)
! freebytes (idle_callback->argv, idle_callback->argc*sizeof (t_int));
! freebytes ((void*)idle_callback, sizeof(t_sched_callback));
if (last == NULL)
ringbuffer_head = next;
else
last->next = next;
! idle_callback = next;
! /* callbacks returning 1 will be run again */
! case 1:
break;
--- 768,803 ----
idle_callback = next;
break;
! /* callbacks returning 1 will be run again - enqueue at the tail
! , so that it is behind "last" in any case
! */
! case 1:
! next = idle_callback->next;
! if(!microsec)
{
! /* don't repeat */
! idle_callback = next;
! break;
}
! if(next)
{
! t_sched_callback *n;
+ /* remove the event from the list */
if (last == NULL)
ringbuffer_head = next;
else
last->next = next;
+ idle_callback->next = NULL;
! /* reinsert it at the end */
! for(n = next; n->next; n = n->next) {}
! n->next = idle_callback;
! idle_callback = next;
! }
break;
***************
*** 842,859 ****
last = idle_callback;
idle_callback = idle_callback->next;
}
remain = stop-sys_getrealtime()*1.e6;
}
- while ((idle_callback != NULL) && (remain > 0));
! /* sleep for the rest of the time */
! if(remain > 0) {
! sys_unlock();
! sys_microsleep(remain);
! sys_lock();
}
}
! else {
sys_unlock();
sys_microsleep(microsec);
--- 806,849 ----
last = idle_callback;
idle_callback = idle_callback->next;
+ break;
}
remain = stop-sys_getrealtime()*1.e6;
+ if(remain <= 0) break; /* time elapsed */
+
+ if(!idle_callback)
+ {
+ /* we arrived at the end of the list */
+
+ if(microsec)
+ {
+ /* restart */
+ idle_callback = last?last->next:ringbuffer_head;
+ if(!idle_callback) break;
+ }
+ else
+ /* don't traverse list once more */
+ break;
+ }
}
! return remain > 0?remain:0;
}
+ else
+ return microsec;
}
!
! /* process idle callbacks at most once
! */
! void run_all_idle_callbacks(void)
! {
! run_timed_idle_callbacks(0);
! }
!
! static void run_idle_callbacks(int microsec)
! {
! double remain = run_timed_idle_callbacks(microsec);
! if(remain > 0)
! {
sys_unlock();
sys_microsleep(microsec);
Index: m_simd.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_simd.c,v
retrieving revision 1.1.4.7
retrieving revision 1.1.4.7.2.1
diff -C2 -d -r1.1.4.7 -r1.1.4.7.2.1
*** m_simd.c 8 Apr 2005 12:39:33 -0000 1.1.4.7
--- m_simd.c 17 Aug 2007 13:56:41 -0000 1.1.4.7.2.1
***************
*** 6,15 ****
--- 6,19 ----
#include "m_pd.h"
#include "m_simd.h"
+ #include <string.h> /* for memcpy, memset */
void zerovec_8(t_float *dst,int n)
{
+ memset(dst,0,n*sizeof(t_float));
+ /*
for(n >>= 3; n--; dst += 8) {
dst[0] = dst[1] = dst[2] = dst[3] = dst[4] = dst[5] = dst[6] = dst[7] = 0;
}
+ */
}
***************
*** 23,30 ****
--- 27,37 ----
void copyvec_8(t_float *dst,const t_float *src,int n)
{
+ memcpy(dst,src,n*sizeof(t_float));
+ /*
for(n >>= 3; n--; src += 8,dst += 8) {
dst[0] = src[0],dst[1] = src[1],dst[2] = src[2],dst[3] = src[3];
dst[4] = src[4],dst[5] = src[5],dst[6] = src[6],dst[7] = src[7];
}
+ */
}
***************
*** 39,50 ****
void copyvec(t_float *dst,const t_float *src,int n)
{
! while(n--)
! *dst++ = *src++;
}
void zerovec(t_float *dst, int n)
{
! while(n--)
! *dst++ = 0;
}
--- 46,55 ----
void copyvec(t_float *dst,const t_float *src,int n)
{
! memcpy(dst,src,n*sizeof(t_float));
}
void zerovec(t_float *dst, int n)
{
! memset(dst,0,n*sizeof(t_float));
}
Index: s_stuff.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_stuff.h,v
retrieving revision 1.5.4.10.2.9
retrieving revision 1.5.4.10.2.10
diff -C2 -d -r1.5.4.10.2.9 -r1.5.4.10.2.10
*** s_stuff.h 30 Nov 2006 01:30:03 -0000 1.5.4.10.2.9
--- s_stuff.h 17 Aug 2007 13:56:42 -0000 1.5.4.10.2.10
***************
*** 19,31 ****
} t_namelist;
! t_namelist *namelist_append(t_namelist *listwas, const char *s, int allowdup);
! t_namelist *namelist_append_files(t_namelist *listwas, const char *s);
void namelist_free(t_namelist *listwas);
! char *namelist_get(t_namelist *namelist, int n);
void sys_setextrapath(const char *p);
extern int sys_usestdpath;
extern t_namelist *sys_externlist;
! extern t_namelist *sys_searchpath;
! extern t_namelist *sys_helppath;
--- 19,31 ----
} t_namelist;
! EXTERN t_namelist *namelist_append(t_namelist *listwas, const char *s, int allowdup);
! EXTERN t_namelist *namelist_append_files(t_namelist *listwas, const char *s);
void namelist_free(t_namelist *listwas);
! EXTERN char *namelist_get(t_namelist *namelist, int n);
void sys_setextrapath(const char *p);
extern int sys_usestdpath;
extern t_namelist *sys_externlist;
! EXTERN t_namelist *sys_searchpath;
! EXTERN t_namelist *sys_helppath;
***************
*** 191,194 ****
--- 191,195 ----
#endif
+ #ifdef PD_INTERNAL
#define API_ALSA 1
#define API_OSS 2
***************
*** 256,259 ****
--- 257,262 ----
#endif
+ #endif // PD_INTERNAL
+
int pa_open_audio(int inchans, int outchans, int rate, int advance,
int indeviceno, int outdeviceno, int schedmode);
***************
*** 348,353 ****
typedef void (*t_printhook)(const char *s);
! extern t_printhook sys_printhook; /* set this to override printing */
! extern int sys_printtostderr;
#ifdef MSW
#define vsnprintf _vsnprintf /* jsarlo -- alias this name for msw */
--- 351,356 ----
typedef void (*t_printhook)(const char *s);
! EXTERN t_printhook sys_printhook; /* set this to override printing */
! EXTERN int sys_printtostderr;
#ifdef MSW
#define vsnprintf _vsnprintf /* jsarlo -- alias this name for msw */
Index: s_inter.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_inter.c,v
retrieving revision 1.5.4.10.2.26
retrieving revision 1.5.4.10.2.27
diff -C2 -d -r1.5.4.10.2.26 -r1.5.4.10.2.27
*** s_inter.c 30 Nov 2006 01:43:23 -0000 1.5.4.10.2.26
--- s_inter.c 17 Aug 2007 13:56:42 -0000 1.5.4.10.2.27
***************
*** 176,184 ****
FD_ZERO(&readset);
FD_ZERO(&exceptset);
for (fp = sys_fdpoll, i = sys_nfdpoll; i--; fp++)
FD_SET(fp->fdp_fd, &readset);
select(sys_maxfd+1, &readset, &writeset, &exceptset, &timout);
for (i = 0; i < sys_nfdpoll; i++)
! if (FD_ISSET(sys_fdpoll[i].fdp_fd, &readset))
{
(*sys_fdpoll[i].fdp_fn)(sys_fdpoll[i].fdp_ptr, sys_fdpoll[i].fdp_fd);
--- 176,186 ----
FD_ZERO(&readset);
FD_ZERO(&exceptset);
+
for (fp = sys_fdpoll, i = sys_nfdpoll; i--; fp++)
+ if(fp->fdp_fd >= 0) /* in some situations (race conditions at startup?) file descriptors are -1 */
FD_SET(fp->fdp_fd, &readset);
select(sys_maxfd+1, &readset, &writeset, &exceptset, &timout);
for (i = 0; i < sys_nfdpoll; i++)
! if (sys_fdpoll[i].fdp_fd >= 0 && FD_ISSET(sys_fdpoll[i].fdp_fd, &readset))
{
(*sys_fdpoll[i].fdp_fn)(sys_fdpoll[i].fdp_ptr, sys_fdpoll[i].fdp_fd);
Index: s_audio.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio.c,v
retrieving revision 1.5.4.16.2.20
retrieving revision 1.5.4.16.2.21
diff -C2 -d -r1.5.4.16.2.20 -r1.5.4.16.2.21
*** s_audio.c 23 Nov 2006 06:08:39 -0000 1.5.4.16.2.20
--- s_audio.c 17 Aug 2007 13:56:41 -0000 1.5.4.16.2.21
***************
*** 715,721 ****
}
/* start an audio settings dialog window */
! void glob_audio_properties(t_pd *dummy, t_floatarg flongform)
{
char buf[1024 + 2 * MAXNDEV*(DEVDESCSIZE+4)];
--- 715,734 ----
}
+ static int sys_inaudiothread(void);
+
+ /* vibrez.net - if we are within the audio thread, schedule function fun at idle time */
+ static void _callfunction(t_int (*fun)(t_int *),t_int *argv,t_int argc)
+ {
+ /* if we are in audio thread, do the requested function at idle time */
+ if(sys_inaudiothread())
+ sys_callback(fun,argv,argc);
+ else
+ fun(argv);
+ }
+
+ void glob_audio_properties(t_pd *dummy, t_floatarg f);
/* start an audio settings dialog window */
! static t_int _glob_audio_properties(t_int *args)
{
char buf[1024 + 2 * MAXNDEV*(DEVDESCSIZE+4)];
***************
*** 731,738 ****
--- 744,754 ----
char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
int nindevs = 0, noutdevs = 0, canmulti = 0, i;
+ int longform = *args;
char indevliststring[MAXNDEV*(DEVDESCSIZE+4)+80],
outdevliststring[MAXNDEV*(DEVDESCSIZE+4)+80];
+ if(sys_inaudiothread()) return 2;
+
audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
MAXNDEV, DEVDESCSIZE);
***************
*** 762,766 ****
naudioindev, naudiooutdev, flongform); */
if (naudioindev > 1 || naudiooutdev > 1)
! flongform = 1;
--- 778,782 ----
naudioindev, naudiooutdev, flongform); */
if (naudioindev > 1 || naudiooutdev > 1)
! longform = 1;
***************
*** 792,802 ****
audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4,
! rate, dacblocksize, advance, canmulti, (flongform != 0));
gfxstub_deleteforkey(0);
gfxstub_new(&glob_pdobject, (void *)glob_audio_properties, buf);
}
/* new values from dialog window */
! void glob_audio_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv)
{
int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
--- 808,826 ----
audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4,
! rate, dacblocksize, advance, canmulti, (longform != 0));
gfxstub_deleteforkey(0);
gfxstub_new(&glob_pdobject, (void *)glob_audio_properties, buf);
+ return 0;
+ }
+
+ void glob_audio_properties(t_pd *dummy, t_floatarg f)
+ {
+ t_int args = (t_int)f;
+ _callfunction(_glob_audio_properties,&args,1);
}
+
/* new values from dialog window */
! static t_int _glob_audio_dialog(t_int *args)
{
int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
***************
*** 807,822 ****
newaudiooutdev[4], newaudiooutchan[4];
/* the new values the dialog came back with: */
! int newrate = atom_getintarg(16, argc, argv);
! int newdacblocksize = atom_getintarg(17, argc, argv);
! int newadvance = atom_getintarg(18, argc, argv);
! int newschedmode = atom_getintarg(19, argc, argv);
int statewas;
for (i = 0; i < 4; i++)
{
! newaudioindev[i] = atom_getintarg(i, argc, argv);
! newaudioinchan[i] = atom_getintarg(i+4, argc, argv);
! newaudiooutdev[i] = atom_getintarg(i+8, argc, argv);
! newaudiooutchan[i] = atom_getintarg(i+12, argc, argv);
}
--- 831,848 ----
newaudiooutdev[4], newaudiooutchan[4];
/* the new values the dialog came back with: */
! int newrate = args[16];
! int newdacblocksize = args[17];
! int newadvance = args[18];
! int newschedmode = args[19];
int statewas;
+ if(sys_inaudiothread()) return 2;
+
for (i = 0; i < 4; i++)
{
! newaudioindev[i] = args[i];
! newaudioinchan[i] = args[i+4];
! newaudiooutdev[i] = args[i+8];
! newaudiooutchan[i] = args[i+12];
}
***************
*** 848,853 ****
--- 874,890 ----
noutdev, newaudiooutdev, noutdev, newaudiooutchan,
newrate, newdacblocksize, newadvance, newschedmode, 1);
+ return 0;
}
+ void glob_audio_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv)
+ {
+ t_int args[20];
+ int i;
+ for (i = 0; i < 20; i++)
+ args[i] = atom_getintarg(i, argc, argv);
+ _callfunction(_glob_audio_dialog,args,20);
+ }
+
+
void sys_listdevs(void )
{
***************
*** 905,911 ****
}
! void glob_audio_setapi(void *dummy, t_floatarg f)
{
! int newapi = f;
if (newapi != sys_audioapi)
{
--- 942,951 ----
}
! static t_int _glob_audio_setapi(t_int *args)
{
! int newapi = *args;
!
! if(sys_inaudiothread()) return 2;
!
if (newapi != sys_audioapi)
{
***************
*** 922,925 ****
--- 962,972 ----
/* glob_audio_properties(0, 0); */
}
+ return 0;
+ }
+
+ void glob_audio_setapi(t_pd *dummy, t_floatarg f)
+ {
+ t_int args = (t_int)f;
+ _callfunction(_glob_audio_setapi,&args,1);
}
***************
*** 1014,1018 ****
/* tb: message-based audio configuration
* supported by vibrez.net { */
! void glob_audio_samplerate(t_pd * dummy, t_float f)
{
int naudioindev;
--- 1061,1066 ----
/* tb: message-based audio configuration
* supported by vibrez.net { */
!
! static t_int _glob_audio_samplerate(t_int *args)
{
int naudioindev;
***************
*** 1026,1032 ****
int advance;
int scheduler;
! if (f == sys_getsr())
! return;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
--- 1074,1083 ----
int advance;
int scheduler;
+ int newrate = *args;
! if(sys_inaudiothread()) return 2;
!
! if (newrate == sys_getsr())
! return 0;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
***************
*** 1036,1051 ****
sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! (int)f, dacblocksize, advance, scheduler, 1);
}
! void glob_audio_api(t_pd * dummy, t_float f)
{
! int newapi = (int)f;
sys_close_audio();
sys_audioapi = newapi;
}
! void glob_audio_delay(t_pd * dummy, t_float f)
{
int naudioindev;
--- 1087,1116 ----
sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! newrate, dacblocksize, advance, scheduler, 1);
! return 0;
}
+ void glob_audio_samplerate(t_pd * dummy, t_float f)
+ {
+ t_int args = (t_int)f;
+ _callfunction(_glob_audio_samplerate,&args,1);
+ }
! static t_int _glob_audio_api(t_int *args)
{
! int newapi = *args;
! if(sys_inaudiothread()) return 2;
sys_close_audio();
sys_audioapi = newapi;
+ return 0;
}
! void glob_audio_api(t_pd * dummy, t_float f)
! {
! t_int args = (t_int)f;
! _callfunction(_glob_audio_api,&args,1);
! }
!
! static t_int _glob_audio_delay(t_int *args)
{
int naudioindev;
***************
*** 1059,1065 ****
int advance; /* dummy */
int scheduler;
! if ((int)f == audio_advance)
! return;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
--- 1124,1133 ----
int advance; /* dummy */
int scheduler;
+ int newadv = *args;
! if(sys_inaudiothread()) return 2;
!
! if (newadv == audio_advance)
! return 0;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
***************
*** 1069,1076 ****
sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! rate, dacblocksize, (int) f, scheduler, 1);
}
! void glob_audio_dacblocksize(t_pd * dummy, t_float f)
{
int naudioindev;
--- 1137,1152 ----
sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! rate, dacblocksize, newadv, scheduler, 1);
! return 0;
}
! void glob_audio_delay(t_pd * dummy, t_float f)
! {
! t_int args = (t_int)f;
! _callfunction(_glob_audio_delay,&args,1);
! }
!
!
! static t_int _glob_audio_dacblocksize(t_int *args)
{
int naudioindev;
***************
*** 1084,1090 ****
int advance;
int scheduler;
! if ((int)f == audio_dacblocksize)
! return;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
--- 1160,1169 ----
int advance;
int scheduler;
+ int newblocksize = *args;
! if(sys_inaudiothread()) return 2;
!
! if (newblocksize == audio_dacblocksize)
! return 0;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
***************
*** 1094,1101 ****
sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! rate, (int)f, advance, scheduler, 1);
}
! void glob_audio_scheduler(t_pd * dummy, t_float f)
{
int naudioindev;
--- 1173,1188 ----
sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! rate, newblocksize, advance, scheduler, 1);
! return 0;
}
! void glob_audio_dacblocksize(t_pd * dummy, t_float f)
! {
! t_int args = (t_int)f;
! _callfunction(_glob_audio_dacblocksize,&args,1);
! }
!
!
! static t_int _glob_audio_scheduler(t_int *args)
{
int naudioindev;
***************
*** 1109,1117 ****
int advance;
int scheduler; /* dummy */
! if ((int)f == sys_callbackscheduler)
! return;
! scheduler = (f != 0) ? 1 : 0;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
--- 1196,1205 ----
int advance;
int scheduler; /* dummy */
+ int newscheduler = (*args != 0) ? 1 : 0;
! if(sys_inaudiothread()) return 2;
! if (newscheduler == sys_callbackscheduler)
! return 0;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
***************
*** 1121,1129 ****
sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! rate, dacblocksize, advance, scheduler, 1);
! if (scheduler != sys_callbackscheduler)
{
! if (scheduler == 1)
post("switched to callback-based scheduler");
else
--- 1209,1217 ----
sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! rate, dacblocksize, advance, newscheduler, 1);
! if (scheduler != newscheduler)
{
! if (newscheduler == 1)
post("switched to callback-based scheduler");
else
***************
*** 1132,1171 ****
else
post("couldn't change scheduler");
}
!
! void glob_audio_device(t_pd * dummy, t_symbol *s, int argc, t_atom *argv)
! {
! int naudioindev;
! int audioindev[MAXAUDIOINDEV];
! int audiochindev[MAXAUDIOINDEV];
! int naudiooutdev;
! int audiooutdev[MAXAUDIOOUTDEV];
! int audiochoutdev[MAXAUDIOOUTDEV];
! int rate;
! int dacblocksize;
! int advance;
! int scheduler;
!
! int i;
!
! sys_get_audio_params(&naudioindev, audioindev, audiochindev,
! &naudiooutdev, audiooutdev, audiochoutdev,
! &rate, &dacblocksize, &advance, &scheduler);
!
! naudiooutdev = naudioindev = (int)atom_getfloatarg(0, argc, argv);
! for (i = 0; i != MAXAUDIOINDEV; i++)
{
! audiooutdev[i] = audioindev[i] = atom_getfloatarg(i*2+1, argc, argv);
! audiochoutdev[i] = audiochindev[i] = atom_getfloatarg(i*2+2, argc, argv);
}
- sys_close_audio();
- sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
- naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
- rate, dacblocksize, advance, scheduler, 1);
- }
! void glob_audio_device_in(t_pd * dummy, t_symbol *s, int argc, t_atom *argv)
{
int naudioindev;
--- 1220,1234 ----
else
post("couldn't change scheduler");
+ return 0;
}
! void glob_audio_scheduler(t_pd * dummy, t_float f)
{
! t_int args = (t_int)f;
! _callfunction(_glob_audio_scheduler,&args,1);
}
! static t_int _glob_audio_device(t_int *args)
{
int naudioindev;
***************
*** 1182,1194 ****
int i;
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
&naudiooutdev, audiooutdev, audiochoutdev,
&rate, &dacblocksize, &advance, &scheduler);
! naudioindev = (int)atom_getfloatarg(0, argc, argv);
! for (i = 0; i != MAXAUDIOINDEV; i=i+2)
{
! audioindev[i] = atom_getfloatarg(i+1, argc, argv);
! audiochindev[i] = atom_getfloatarg(i+2, argc, argv);
}
--- 1245,1259 ----
int i;
+ if(sys_inaudiothread()) return 2;
+
sys_get_audio_params(&naudioindev, audioindev, audiochindev,
&naudiooutdev, audiooutdev, audiochoutdev,
&rate, &dacblocksize, &advance, &scheduler);
! naudiooutdev = naudioindev = args[0];
! for (i = 0; i != MAXAUDIOINDEV; i++)
{
! audiooutdev[i] = audioindev[i] = args[i*2+1];
! audiochoutdev[i] = audiochindev[i] = args[i*2+2];
}
***************
*** 1197,1235 ****
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
rate, dacblocksize, advance, scheduler, 1);
}
! void glob_audio_device_out(t_pd * dummy, t_symbol *s, int argc, t_atom *argv)
{
! int naudioindev;
! int audioindev[MAXAUDIOINDEV];
! int audiochindev[MAXAUDIOINDEV];
! int naudiooutdev;
! int audiooutdev[MAXAUDIOOUTDEV];
! int audiochoutdev[MAXAUDIOOUTDEV];
! int rate;
! int dacblocksize;
! int advance;
! int scheduler;
!
int i;
! sys_get_audio_params(&naudioindev, audioindev, audiochindev,
! &naudiooutdev, audiooutdev, audiochoutdev,
! &rate, &dacblocksize, &advance, &scheduler);
!
! naudiooutdev = (int)atom_getfloatarg(0, argc, argv);
! for (i = 0; i != MAXAUDIOOUTDEV; i=i+2)
{
! audiooutdev[i] = atom_getfloatarg(i+1, argc, argv);
! audiochoutdev[i] = atom_getfloatarg(i+2, argc, argv);
}
! sys_close_audio();
! sys_open_audio(naudioindev, audioindev, naudioindev, audiochindev,
! naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
! rate, dacblocksize, advance, scheduler, 1);
}
-
/* some general helper functions */
void sys_update_sleepgrain(void)
--- 1262,1283 ----
naudiooutdev, audiooutdev, naudiooutdev, audiochoutdev,
rate, dacblocksize, advance, scheduler, 1);
+ return 0;
}
! void glob_audio_device(t_pd * dummy, t_symbol *s, int argc, t_atom *argv)
{
! t_int args[MAXAUDIOINDEV*2+1];
int i;
! args[0] = (t_int)atom_getfloatarg(0, argc, argv);
! for (i = 0; i != MAXAUDIOINDEV; i++)
{
! args[i*2+1] = (t_int)atom_getfloatarg(i*2+1, argc, argv);
! args[i*2+2] = (t_int)atom_getfloatarg(i*2+2, argc, argv);
}
! _callfunction(_glob_audio_device,args,MAXAUDIOINDEV*2+1);
}
/* some general helper functions */
void sys_update_sleepgrain(void)
***************
*** 1244,1248 ****
! void glob_audio_getaudioindevices(t_pd * dummy, t_symbol *s, int ac, t_atom *av)
{
float flongform = 0;
--- 1292,1296 ----
! static t_int _glob_audio_getaudioindevices(t_int *args)
{
float flongform = 0;
***************
*** 1266,1274 ****
t_atom argv[MAXNDEV];
! int f = ac ? (int)atom_getfloatarg(0,ac,av) : -1;
t_symbol * selector = gensym("audioindev");
t_symbol * pd = gensym("pd");
audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
MAXNDEV, DEVDESCSIZE);
--- 1314,1324 ----
t_atom argv[MAXNDEV];
! int f = *args;
t_symbol * selector = gensym("audioindev");
t_symbol * pd = gensym("pd");
+ if(sys_inaudiothread()) return 2;
+
audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
MAXNDEV, DEVDESCSIZE);
***************
*** 1299,1305 ****
typedmess(pd->s_thing, selector, 1, argv);
}
}
! void glob_audio_getaudiooutdevices(t_pd * dummy, t_symbol *s, int ac, t_atom *av)
{
float flongform = 0;
--- 1349,1362 ----
typedmess(pd->s_thing, selector, 1, argv);
}
+ return 0;
}
! void glob_audio_getaudioindevices(t_pd * dummy, t_symbol *s, int ac, t_atom *av)
! {
! t_int args = ac ? (int)atom_getfloatarg(0,ac,av) : -1;
! _callfunction(_glob_audio_getaudioindevices,&args,1);
! }
!
! static t_int _glob_audio_getaudiooutdevices(t_int *args)
{
float flongform = 0;
***************
*** 1323,1331 ****
t_atom argv[MAXNDEV];
! int f = ac ? (int)atom_getfloatarg(0,ac,av) : -1;
t_symbol * selector = gensym("audiooutdev");
t_symbol * pd = gensym("pd");
audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
MAXNDEV, DEVDESCSIZE);
--- 1380,1390 ----
t_atom argv[MAXNDEV];
! int f = *args;
t_symbol * selector = gensym("audiooutdev");
t_symbol * pd = gensym("pd");
+ if(sys_inaudiothread()) return 2;
+
audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
MAXNDEV, DEVDESCSIZE);
***************
*** 1356,1361 ****
--- 1415,1428 ----
typedmess(pd->s_thing, selector, 1, argv);
}
+ return 0;
+ }
+
+ void glob_audio_getaudiooutdevices(t_pd * dummy, t_symbol *s, int ac, t_atom *av)
+ {
+ t_int args = ac ? (int)atom_getfloatarg(0,ac,av) : -1;
+ _callfunction(_glob_audio_getaudiooutdevices,&args,1);
}
+
/* some prototypes from s_audio_portaudio.c */
extern void pa_getcurrent_devices(void);
***************
*** 1364,1388 ****
extern void pa_test_setting (int ac, t_atom *av);
extern void pa_get_asio_latencies(t_float f);
! void glob_audio_getaudioininfo(t_pd * dummy, t_float f)
{
#ifdef USEAPI_PORTAUDIO
#ifndef PABLIO
if (sys_audioapi == API_PORTAUDIO)
! pa_getaudioininfo(f);
#endif
#endif
}
! void glob_audio_getaudiooutinfo(t_pd * dummy, t_float f)
{
#ifdef USEAPI_PORTAUDIO
#ifndef PABLIO
if (sys_audioapi == API_PORTAUDIO)
! pa_getaudiooutinfo(f);
#endif
#endif
}
void glob_audio_testaudiosetting(t_pd * dummy, t_symbol *s, int ac, t_atom *av)
{
--- 1431,1486 ----
extern void pa_test_setting (int ac, t_atom *av);
extern void pa_get_asio_latencies(t_float f);
+ extern int pa_inaudiothread(void);
! static int sys_inaudiothread(void)
{
#ifdef USEAPI_PORTAUDIO
#ifndef PABLIO
if (sys_audioapi == API_PORTAUDIO)
! return pa_inaudiothread();
#endif
#endif
+ return 0;
}
! static t_int _glob_audio_getaudioininfo(t_int *args)
{
+ if(sys_inaudiothread()) return 2;
+
#ifdef USEAPI_PORTAUDIO
#ifndef PABLIO
if (sys_audioapi == API_PORTAUDIO)
! pa_getaudioininfo(*args);
#endif
#endif
+ return 0;
+ }
+
+ void glob_audio_getaudioininfo(t_pd * dummy, t_float f)
+ {
+ t_int args = (t_int)f;
+ _callfunction(_glob_audio_getaudioininfo,&args,1);
}
+ static t_int _glob_audio_getaudiooutinfo(t_int *args)
+ {
+ if(sys_inaudiothread()) return 2;
+
+ #ifdef USEAPI_PORTAUDIO
+ #ifndef PABLIO
+ if (sys_audioapi == API_PORTAUDIO)
+ pa_getaudiooutinfo(*args);
+ #endif
+ #endif
+ return 0;
+ }
+
+ void glob_audio_getaudiooutinfo(t_pd * dummy, t_float f)
+ {
+ t_int args = (t_int)f;
+ _callfunction(_glob_audio_getaudiooutinfo,&args,1);
+ }
+
+ /* TODO */
void glob_audio_testaudiosetting(t_pd * dummy, t_symbol *s, int ac, t_atom *av)
{
***************
*** 1395,1400 ****
}
! void glob_audio_getcurrent_devices(void)
{
#ifdef USEAPI_PORTAUDIO
#ifndef PABLIO
--- 1493,1500 ----
}
! static t_int _glob_audio_getcurrent_devices(t_int *args)
{
+ if(sys_inaudiothread()) return 2;
+
#ifdef USEAPI_PORTAUDIO
#ifndef PABLIO
***************
*** 1403,1417 ****
#endif
#endif
}
! void glob_audio_asio_latencies(t_pd * dummy, t_float f)
{
#ifdef USEAPI_PORTAUDIO
#ifndef PABLIO
if (sys_audioapi == API_PORTAUDIO)
! pa_get_asio_latencies(f);
#endif
#endif
}
--- 1503,1532 ----
#endif
#endif
+ return 0;
}
! void glob_audio_getcurrent_devices()
! {
! _callfunction(_glob_audio_getcurrent_devices,NULL,0);
! }
!
!
! static t_int _glob_audio_asio_latencies(t_int *args)
{
+ if(sys_inaudiothread()) return 2;
+
#ifdef USEAPI_PORTAUDIO
#ifndef PABLIO
if (sys_audioapi == API_PORTAUDIO)
! pa_get_asio_latencies(*args);
#endif
#endif
+ return 0;
+ }
+ void glob_audio_asio_latencies(t_pd * dummy, t_float f)
+ {
+ t_int args = (t_int)f;
+ _callfunction(_glob_audio_asio_latencies,&args,1);
}
Index: m_simd_sse_gcc.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_simd_sse_gcc.c,v
retrieving revision 1.1.4.13.2.4
retrieving revision 1.1.4.13.2.5
diff -C2 -d -r1.1.4.13.2.4 -r1.1.4.13.2.5
*** m_simd_sse_gcc.c 10 Jan 2006 20:28:13 -0000 1.1.4.13.2.4
--- m_simd_sse_gcc.c 17 Aug 2007 13:56:41 -0000 1.1.4.13.2.5
***************
*** 7,152 ****
#include "m_simd.h"
! #if defined(__GNUC__) && (defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__)) && !(defined DONTUSESIMD)
/* TB: adapted from thomas' vc routines */
/* dst is assumed to be aligned */
! void zerovec_simd(t_float *dst,int n)
{
! asm(
! ".set T_FLOAT,4 \n" /* sizeof(t_float) */
! "xorps %%xmm0, %%xmm0 \n" /* zero value */
! "shr $4, %0 \n"
!
! /* should we do more loop unrolling? */
! /* *dst = 0 */
! "1: \n"
! "movaps %%xmm0, (%1) \n"
! "movaps %%xmm0, 4*T_FLOAT(%1) \n"
! "movaps %%xmm0, 8*T_FLOAT(%1) \n"
! "movaps %%xmm0, 12*T_FLOAT(%1) \n"
!
! "addl $16*T_FLOAT,%1 \n"
! "loop 1b \n"
! :
! :"c"(n),"r"(dst)
! :"%xmm0");
}
/* dst is assumed to be aligned */
! void setvec_simd(t_float *dst,t_float v,int n)
{
! asm(
! ".set T_FLOAT,4 \n" /* sizeof(t_float) */
! "movss (%2),%%xmm0 \n"
! "shufps $0,%%xmm0,%%xmm0 \n" /* load value */
! "shr $4,%0 \n"
!
! /* should we do more loop unrolling? */
! /* *dst = v */
! "1: \n"
! "movaps %%xmm0, (%1) \n"
! "movaps %%xmm0, 4*T_FLOAT(%1) \n"
! "movaps %%xmm0, 8*T_FLOAT(%1) \n"
! "movaps %%xmm0, 12*T_FLOAT(%1) \n"
!
! "addl $16*T_FLOAT,%1 \n"
! "loop 1b \n"
! :
! :"c"(n),"r"(dst),"r"(&v)
! :"%xmm0");
}
/* dst and src are assumed to be aligned */
! void copyvec_simd(t_float *dst,const t_float *src,int n)
{
! asm(
! ".set T_FLOAT,4 \n" /* sizeof(t_float) */
! "shr $4, %0 \n"
!
! /* loop: *dst = *src */
! "1: \n"
! "movaps (%1), %%xmm0 \n"
! "movaps 4*T_FLOAT(%1), %%xmm1 \n"
! "movaps 8*T_FLOAT(%1), %%xmm2 \n"
! "movaps 12*T_FLOAT(%1), %%xmm3 \n"
! "movaps %%xmm0, (%2) \n"
! "movaps %%xmm1, 4*T_FLOAT(%2) \n"
! "movaps %%xmm2, 8*T_FLOAT(%2) \n"
! "movaps %%xmm3, 12*T_FLOAT(%2) \n"
!
!
! "addl $16*T_FLOAT,%1 \n"
! "addl $16*T_FLOAT,%2 \n"
! "loop 1b \n"
! :
! :"c"(n),"r"(src),"r"(dst)
! :"%xmm0","%xmm1","%xmm2","%xmm3");
}
/* dst is assumed to be aligned */
! void copyvec_simd_unalignedsrc(t_float *dst,const t_float *src,int n)
{
! asm(
! ".set T_FLOAT,4 \n" /* sizeof(t_float) */
! "shr $4, %0 \n"
!
! /* loop: *dst = *src */
! "1: \n"
! "movups (%1), %%xmm0 \n"
! "movups 4*T_FLOAT(%1), %%xmm1 \n"
! "movups 8*T_FLOAT(%1), %%xmm2 \n"
! "movups 12*T_FLOAT(%1), %%xmm3 \n"
! "movaps %%xmm0, (%2) \n"
! "movaps %%xmm1, 4*T_FLOAT(%2) \n"
! "movaps %%xmm2, 8*T_FLOAT(%2) \n"
! "movaps %%xmm3, 12*T_FLOAT(%2) \n"
!
!
! "addl $16*T_FLOAT,%1 \n"
! "addl $16*T_FLOAT,%2 \n"
! "loop 1b \n"
! :
! :"c"(n),"r"(src),"r"(dst)
! :"%xmm0","%xmm1","%xmm2","%xmm3");
}
/* dst and src are assumed to be aligned */
! void addvec_simd(t_float *dst,const t_float *src,int n)
{
! asm(
! ".set T_FLOAT,4 \n" /* sizeof(t_float) */
! "shr $4, %0 \n"
!
! /* loop: *dst += *src */
! "1: \n"
! "movaps (%2,%3),%%xmm0 \n"
! "movaps (%1,%3),%%xmm1 \n"
! "addps %%xmm0,%%xmm1 \n"
! "movaps %%xmm1,(%2,%3) \n"
!
! "movaps 4*T_FLOAT(%2,%3),%%xmm0 \n"
! "movaps 4*T_FLOAT(%1,%3),%%xmm1 \n"
! "addps %%xmm0,%%xmm1 \n"
! "movaps %%xmm1,4*T_FLOAT(%2,%3) \n"
!
! "movaps 8*T_FLOAT(%2,%3),%%xmm0 \n"
! "movaps 8*T_FLOAT(%1,%3),%%xmm1 \n"
! "addps %%xmm0,%%xmm1 \n"
! "movaps %%xmm1,8*T_FLOAT(%2,%3) \n"
!
! "movaps 12*T_FLOAT(%2,%3),%%xmm0 \n"
! "movaps 12*T_FLOAT(%1,%3),%%xmm1 \n"
! "addps %%xmm0,%%xmm1 \n"
! "movaps %%xmm1,12*T_FLOAT(%2,%3) \n"
!
! "addl $16*T_FLOAT,%3 \n"
! "loop 1b \n"
! :
! : "c"(n),"r"(src),"r"(dst),"r"(0)
! : "%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5","%xmm6","%xmm7");
}
--- 7,68 ----
#include "m_simd.h"
! #if defined(__GNUC__) && (defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__)) && !defined(DONTUSESIMD)
!
! #include <xmmintrin.h>
! #include <string.h>
+ #define INNER 1 /* inner loop unrolling: 1, 2 or 4 */
+ #define INLINE __inline__
+ typedef float * __restrict__ __attribute__((aligned(16))) vec_ptr;
/* TB: adapted from thomas' vc routines */
/* dst is assumed to be aligned */
! void INLINE zerovec_simd(vec_ptr dst,int n)
{
! __m128 zero = _mm_xor_ps(zero,zero);
! int i,j;
! for(i = 0; i < n;)
! for(j = 0; j < INNER; ++j,i += 4)
! _mm_store_ps(dst+i,zero);
}
/* dst is assumed to be aligned */
! void INLINE setvec_simd(t_float *dst,t_float v,int n)
{
! const __m128 src = _mm_load_ps1(&v);
! int i,j;
! for(i = 0; i < n;)
! for(j = 0; j < INNER; ++j,i += 4)
! _mm_store_ps(dst+i,src);
}
/* dst and src are assumed to be aligned */
! void INLINE copyvec_simd(t_float *dst,const t_float *src,int n)
{
! int i,j;
! for(i = 0; i < n;)
! for(j = 0; j < INNER; ++j,i += 4)
! _mm_store_ps(dst+i ,_mm_load_ps(src+i ));
}
/* dst is assumed to be aligned */
! void INLINE copyvec_simd_unalignedsrc(t_float *dst,const t_float *src,int n)
{
! int i,j;
! for(i = 0; i < n;)
! for(j = 0; j < INNER; ++j,i += 4)
! _mm_store_ps(dst+i ,_mm_loadu_ps(src+i ));
}
/* dst and src are assumed to be aligned */
! void INLINE addvec_simd(t_float *dst,const t_float *src,int n)
{
! int i,j;
! for(i = 0; i < n;)
! for(j = 0; j < INNER; ++j,i += 4)
! _mm_store_ps(dst+i ,_mm_add_ps(_mm_load_ps(dst+i ),_mm_load_ps(src+i )));
}
***************
*** 154,175 ****
void testcopyvec_simd(t_float *dst,const t_float *src,int n)
{
asm(
- ".section .rodata \n"
- ".align 16 \n"
- "2: \n"
- ".long 1610612736 \n" /* bitmask */
- ".long 1610612736 \n" /* 0x60000000 */
- ".long 1610612736 \n"
- ".long 1610612736 \n"
-
".set T_FLOAT,4 \n"
- ".text \n"
"shr $4, %0 \n"
! "movaps (2b), %%xmm0 \n" /* xmm0 = bitmask */
"xorps %%xmm1, %%xmm1 \n" /* xmm1 = 0x0 */
-
"1: \n"
"movaps (%1), %%xmm2 \n"
--- 70,82 ----
void testcopyvec_simd(t_float *dst,const t_float *src,int n)
{
+ static __attribute__((aligned(16))) const unsigned long bitmask[4] = {0x60000000,0x60000000,0x60000000,0x60000000};
asm(
".set T_FLOAT,4 \n"
"shr $4, %0 \n"
! "movaps (%3), %%xmm0 \n" /* xmm0 = bitmask */
"xorps %%xmm1, %%xmm1 \n" /* xmm1 = 0x0 */
"1: \n"
"movaps (%1), %%xmm2 \n"
***************
*** 219,223 ****
"jne 1b \n"
:
! :"c"(n),"r"(src),"r"(dst)
:"%xmm0","%xmm1","%xmm2","%xmm3", "%xmm4");
}
--- 126,130 ----
"jne 1b \n"
:
! :"c"(n),"r"(src),"r"(dst),"r"(bitmask)
:"%xmm0","%xmm1","%xmm2","%xmm3", "%xmm4");
}
***************
*** 226,246 ****
void testaddvec_simd(t_float *dst,const t_float *src,int n)
{
! asm(
! ".section .rodata \n"
! ".align 16 \n"
! "2: \n"
! ".long 1610612736 \n" /* bitmask */
! ".long 1610612736 \n" /* 0x60000000 */
! ".long 1610612736 \n"
! ".long 1610612736 \n"
".set T_FLOAT,4 \n"
- ".text \n"
"shr $4, %0 \n"
! "movaps (2b), %%xmm0 \n" /* xmm0 = bitmask */
"xorps %%xmm1, %%xmm1 \n" /* xmm1 = 0x0 */
-
"1: \n"
"movaps (%1), %%xmm2 \n"
--- 133,145 ----
void testaddvec_simd(t_float *dst,const t_float *src,int n)
{
! static __attribute__((aligned(16))) const unsigned long bitmask[4] = {0x60000000,0x60000000,0x60000000,0x60000000};
+ asm(
".set T_FLOAT,4 \n"
"shr $4, %0 \n"
! "movaps (%3), %%xmm0 \n" /* xmm0 = bitmask */
"xorps %%xmm1, %%xmm1 \n" /* xmm1 = 0x0 */
"1: \n"
"movaps (%1), %%xmm2 \n"
***************
*** 298,302 ****
"jne 1b \n"
:
! :"c"(n),"r"(src),"r"(dst)
:"%xmm0","%xmm1","%xmm2","%xmm3", "%xmm4", "%xmm5");
}
--- 197,201 ----
"jne 1b \n"
:
! :"c"(n),"r"(src),"r"(dst),"r"(bitmask)
:"%xmm0","%xmm1","%xmm2","%xmm3", "%xmm4", "%xmm5");
}
***************
*** 324,327 ****
--- 223,236 ----
t_int *plus_perf_simd (t_int * w)
{
+ #ifdef NOASM
+ vec_ptr in1 = (vec_ptr)w[1];
+ vec_ptr in2 = (vec_ptr)w[2];
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_add_ps(_mm_load_ps(in1+i),_mm_load_ps(in2+i)));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 358,361 ****
--- 267,271 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5","%xmm6","%xmm7"
);
+ #endif
return w+5;
}
***************
*** 364,367 ****
--- 274,287 ----
t_int *scalarplus_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ const __m128 value = _mm_load_ps1((const t_float *)w[2]);
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_add_ps(_mm_load_ps(in+i),value));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 397,400 ****
--- 317,321 ----
:"%xmm0", "%xmm1","%xmm2","%xmm3","%xmm4"
);
+ #endif
return w+5;
}
***************
*** 402,405 ****
--- 323,336 ----
t_int *minus_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in1 = (vec_ptr)w[1];
+ vec_ptr in2 = (vec_ptr)w[2];
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_sub_ps(_mm_load_ps(in1+i),_mm_load_ps(in2+i)));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 436,439 ****
--- 367,371 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5","%xmm6","%xmm7"
);
+ #endif
return w+5;
}
***************
*** 441,444 ****
--- 373,386 ----
t_int* scalarminus_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ const __m128 value = _mm_load_ps1((const t_float *)w[2]);
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_sub_ps(_mm_load_ps(in+i),value));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 474,477 ****
--- 416,420 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4"
);
+ #endif
return w+5;
}
***************
*** 480,483 ****
--- 423,436 ----
t_int *times_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in1 = (vec_ptr)w[1];
+ vec_ptr in2 = (vec_ptr)w[2];
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_mul_ps(_mm_load_ps(in1+i),_mm_load_ps(in2+i)));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 514,517 ****
--- 467,471 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5","%xmm6","%xmm7"
);
+ #endif
return w+5;
}
***************
*** 519,522 ****
--- 473,486 ----
t_int* scalartimes_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ const __m128 value = _mm_load_ps1((const t_float *)w[2]);
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_mul_ps(_mm_load_ps(in+i),value));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 552,555 ****
--- 516,520 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4"
);
+ #endif
return w+5;
}
***************
*** 557,560 ****
--- 522,536 ----
t_int *sqr_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ vec_ptr out = (vec_ptr)w[2];
+ const int n = (int)w[3];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4) {
+ const __m128 v = _mm_load_ps(in+i);
+ _mm_store_ps(out+i,_mm_mul_ps(v,v));
+ }
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 588,591 ****
--- 564,568 ----
:"%xmm0","%xmm1","%xmm2","%xmm3"
);
+ #endif
return w+4;
}
***************
*** 594,597 ****
--- 571,584 ----
t_int* over_perf_simd(t_int * w)
{
+ #ifdef NOASM
+ vec_ptr in1 = (vec_ptr)w[1];
+ vec_ptr in2 = (vec_ptr)w[2];
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_div_ps(_mm_load_ps(in1+i),_mm_load_ps(in2+i)));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 628,631 ****
--- 615,619 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5","%xmm6","%xmm7"
);
+ #endif
return w+5;
}
***************
*** 633,636 ****
--- 621,635 ----
t_int* scalarover_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ const float one = 1.f;
+ const __m128 value = _mm_div_ps(_mm_load_ps1(&one),_mm_load_ps1((const t_float *)w[2]));
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_mul_ps(_mm_load_ps(in+i),value));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 666,669 ****
--- 665,669 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4"
);
+ #endif
return w+5;
}
***************
*** 672,675 ****
--- 672,685 ----
t_int* min_perf_simd(t_int * w)
{
+ #ifdef NOASM
+ vec_ptr in1 = (vec_ptr)w[1];
+ vec_ptr in2 = (vec_ptr)w[2];
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_min_ps(_mm_load_ps(in1+i),_mm_load_ps(in2+i)));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 706,709 ****
--- 716,720 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5","%xmm6","%xmm7"
);
+ #endif
return w+5;
}
***************
*** 712,715 ****
--- 723,736 ----
t_int* scalarmin_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ const __m128 value = _mm_load_ps1((const t_float *)w[2]);
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_min_ps(_mm_load_ps(in+i),value));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 745,748 ****
--- 766,770 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4"
);
+ #endif
return w+5;
}
***************
*** 751,754 ****
--- 773,786 ----
t_int* max_perf_simd(t_int * w)
{
+ #ifdef NOASM
+ vec_ptr in1 = (vec_ptr)w[1];
+ vec_ptr in2 = (vec_ptr)w[2];
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_max_ps(_mm_load_ps(in1+i),_mm_load_ps(in2+i)));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 785,788 ****
--- 817,821 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5","%xmm6","%xmm7"
);
+ #endif
return w+5;
}
***************
*** 791,794 ****
--- 824,837 ----
t_int* scalarmax_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ const __m128 value = _mm_load_ps1((const t_float *)w[2]);
+ vec_ptr out = (vec_ptr)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_max_ps(_mm_load_ps(in+i),value));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 824,827 ****
--- 867,871 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4"
);
+ #endif
return w+5;
}
***************
*** 829,832 ****
--- 873,887 ----
t_int* clip_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ vec_ptr out = (vec_ptr)w[2];
+ const __m128 lo = _mm_load_ps1((const t_float *)w[3]);
+ const __m128 hi = _mm_load_ps1((const t_float *)w[4]);
+ const int n = w[5];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_max_ps(_mm_min_ps(_mm_load_ps(in+i),hi),lo));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 869,872 ****
--- 924,928 ----
:"%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5"
);
+ #endif
return w+6;
}
***************
*** 875,878 ****
--- 931,943 ----
t_int* sigsqrt_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ vec_ptr out = (vec_ptr)w[2];
+ const int n = w[3];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_sqrt_ps(_mm_load_ps(in+i)));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 906,909 ****
--- 971,975 ----
:"%xmm0","%xmm1","%xmm2","%xmm3"
);
+ #endif
return w+4;
}
***************
*** 912,915 ****
--- 978,990 ----
t_int* sigrsqrt_perf_simd(t_int *w)
{
+ #ifdef NOASM
+ vec_ptr in = (vec_ptr)w[1];
+ vec_ptr out = (vec_ptr)w[2];
+ const int n = w[3];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < INNER; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_rsqrt_ps(_mm_load_ps(in+i)));
+ #else
asm(
".set T_FLOAT,4 \n"
***************
*** 943,946 ****
--- 1018,1022 ----
:"%xmm0","%xmm1","%xmm2","%xmm3"
);
+ #endif
return w+4;
}
***************
*** 1030,1047 ****
float peakvec_simd(t_float* vec, t_int n, t_float cur_max)
{
! asm(
! ".section .rodata \n"
! ".align 16 \n"
! "2: \n"
! ".long 2147483647 \n" /* bitmask for abs */
! ".long 2147483647 \n" /* 0x7fffffff */
! ".long 2147483647 \n"
! ".long 2147483647 \n"
".set T_FLOAT,4 \n"
- ".text \n"
"shrl $4, %2 \n" /* divide by 16 */
! "movaps (2b), %%xmm0 \n"
"movss (%0), %%xmm5 \n" /* cur_max */
--- 1106,1116 ----
float peakvec_simd(t_float* vec, t_int n, t_float cur_max)
{
! static __attribute__((aligned(16))) const unsigned long bitmask[4] = {0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff};
+ asm(
".set T_FLOAT,4 \n"
"shrl $4, %2 \n" /* divide by 16 */
! "movaps (%3), %%xmm0 \n"
"movss (%0), %%xmm5 \n" /* cur_max */
***************
*** 1081,1085 ****
:
! :"r"(&cur_max), "r"(vec),"c"(n)
:"%xmm0","%xmm1","%xmm2","%xmm3", "%xmm4", "%xmm5");
--- 1150,1154 ----
:
! :"r"(&cur_max), "r"(vec),"c"(n),"r"(bitmask)
:"%xmm0","%xmm1","%xmm2","%xmm3", "%xmm4", "%xmm5");
Index: s_audio_portaudio.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/s_audio_portaudio.c,v
retrieving revision 1.1.2.21
retrieving revision 1.1.2.22
diff -C2 -d -r1.1.2.21 -r1.1.2.22
*** s_audio_portaudio.c 23 Nov 2006 05:54:26 -0000 1.1.2.21
--- s_audio_portaudio.c 17 Aug 2007 13:56:41 -0000 1.1.2.22
***************
*** 37,54 ****
! #define MAX_PA_CHANS 32
! static int pa_inchans, pa_outchans;
! static int pa_blocksize;
! static PaStream *pa_stream;
! /* Initialize PortAudio */
! PaError pa_status = -1;
! int pa_initialized = 0;
! void pa_initialize(void)
{
! // if (!pa_initialized)
! // {
pa_status = Pa_Initialize();
if ( pa_status!= paNoError )
--- 37,88 ----
! #define MAX_PA_CHANS 64
! static int pa_inchans = 0, pa_outchans = 0;
! static int pa_blocksize = 0;
! static PaStream *pa_stream = NULL;
! static float* pa_inbuffer[MAX_PA_CHANS];
! static float* pa_outbuffer[MAX_PA_CHANS];
! static int pa_bufferpos = 0;
!
! static int gotaudiothread = 0;
! static pthread_t audiothread;
!
! static t_symbol *sym_pd = NULL;
! static t_symbol *sym_audiodevice;
! static t_symbol *sym_audiocurrentininfo,*sym_audiocurrentoutinfo;
! static t_symbol *sym_audioininfo,*sym_audiooutinfo;
! static t_symbol *sym_testaudiosettingresult;
! static t_symbol *sym_asiolatency;
!
! int pa_inaudiothread(void)
{
! return gotaudiothread && pthread_equal(pthread_self(),audiothread);
! }
!
! static void pa_initialize(void)
! {
! PaError pa_status;
!
! /* Assert that we're not in the audio thread */
! assert(!pa_inaudiothread());
! gotaudiothread = 0;
!
! if(!sym_pd)
! {
! /* initialize symbols */
! sym_pd = gensym("pd");
!
! sym_audiodevice = gensym("audiodevice");
! sym_audiocurrentininfo = gensym("audiocurrentininfo");
! sym_audiocurrentoutinfo = gensym("audiocurrentoutinfo");
! sym_audioininfo = gensym("audioininfo");
! sym_audiooutinfo = gensym("audiooutinfo");
! sym_testaudiosettingresult = gensym("testaudiosettingresult");
! sym_asiolatency = gensym("asiolatency");
! }
!
pa_status = Pa_Initialize();
if ( pa_status!= paNoError )
***************
*** 60,78 ****
return;
}
- pa_initialized = 1;
- // }
}
! static float* pa_inbuffer[MAX_PA_CHANS];
! static float* pa_outbuffer[MAX_PA_CHANS];
! static int pa_bufferpos;
! static int pddev2padev(int pdindev,int isinput);
! static int padev2pddev(int padev,int isinput);
! int process (const void *input, void *output, unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, void *userData);
static int patestCallback(const void* inputBuffer,
void* outputBuffer,
--- 94,141 ----
return;
}
}
! static int pddev2padev(int pddev,int input)
! {
! /* portaudio is already initialized here */
! int j,devno;
! int count = Pa_GetDeviceCount();
! for (j = 0, devno = 0; j < count; j++)
! {
! const PaDeviceInfo *info = Pa_GetDeviceInfo(j);
! int maxchans = input?info->maxInputChannels:info->maxOutputChannels;
! if (maxchans > 0)
! {
! if (devno == pddev) return j;
! devno++;
! }
! }
! return -1; // not found
! }
! static int padev2pddev(int padev,int input)
! {
! /* portaudio is already initialized here */
! int j,devno;
! int count = Pa_GetDeviceCount();
! for (j = 0, devno = 0; j < count; j++)
! {
! const PaDeviceInfo *info = Pa_GetDeviceInfo(j);
! int chans = input?info->maxInputChannels:info->maxOutputChannels;
! if (chans > 0)
! {
! if(j == padev) return devno;
! devno++;
! }
! }
! return -1; // not found
! }
!
! static int process (const void *input, void *output, unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, void *userData);
+ /*
static int patestCallback(const void* inputBuffer,
void* outputBuffer,
***************
*** 81,84 ****
--- 144,148 ----
PaStreamCallbackFlags statusFlags,
void* userData);
+ */
static int pa_indev = -1, pa_outdev = -1;
***************
*** 135,140 ****
#endif
{
! post("input device %d, channels %d", pa_indev, inchans);
! post("output device %d, channels %d", pa_outdev, outchans);
post("latency advance %d", advance);
}
--- 199,204 ----
#endif
{
! post("input device %d (%s), channels %d", pa_indev, pdi?pdi->name:"", inchans);
! post("output device %d (%s), channels %d", pa_outdev, pdo?pdo->name:"", outchans);
post("latency advance %d", advance);
}
***************
*** 197,209 ****
if (err == paNoError)
{
- const PaStreamInfo * streaminfo = Pa_GetStreamInfo (pa_stream);
-
t_atom atoms[4];
! t_symbol * pd = gensym("pd");
! t_symbol * selector1 = gensym("audiocurrentininfo");
! t_symbol * selector2 = gensym("audiocurrentoutinfo");
!
! sys_schedadvance = 1e-6 * streaminfo->outputLatency;
SETFLOAT(atoms, (float)indeviceno);
--- 261,268 ----
if (err == paNoError)
{
t_atom atoms[4];
! const PaStreamInfo * streaminfo = Pa_GetStreamInfo (pa_stream);
! sys_schedadvance = 1e6 * streaminfo->outputLatency;
SETFLOAT(atoms, (float)indeviceno);
***************
*** 211,215 ****
SETFLOAT(atoms+2, (float)rate);
SETFLOAT(atoms+3, (float)streaminfo->inputLatency * 1000.f);
! typedmess(pd->s_thing, selector1, 4, atoms);
SETFLOAT(atoms, (float)outdeviceno);
--- 270,274 ----
SETFLOAT(atoms+2, (float)rate);
SETFLOAT(atoms+3, (float)streaminfo->inputLatency * 1000.f);
! typedmess(sym_pd->s_thing, sym_audiocurrentininfo, 4, atoms);
SETFLOAT(atoms, (float)outdeviceno);
***************
*** 217,221 ****
SETFLOAT(atoms+2, (float)rate);
SETFLOAT(atoms+3, (float)streaminfo->outputLatency * 1000.f);
! typedmess(pd->s_thing, selector2, 4, atoms);
}
}
--- 276,280 ----
SETFLOAT(atoms+2, (float)rate);
SETFLOAT(atoms+3, (float)streaminfo->outputLatency * 1000.f);
! typedmess(sym_pd->s_thing, sym_audiocurrentoutinfo, 4, atoms);
}
}
***************
*** 264,315 ****
extern int sys_meters; /* true if we're metering */
-
- static int patestCallback(const void* inputBuffer,
- void* outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
- void* userData)
- {
- int frameIndex, channelIndex, i;
- float** outputs = (float**)outputBuffer;
- static float phase;
-
- for( frameIndex=0; frameIndex<(int)framesPerBuffer; frameIndex++ )
- {
- int c;
- /* Output sine wave on every channel. */
- outputs[0][frameIndex] = (float) sin(phase);
- outputs[1][frameIndex] = (float) sin(phase);
- phase += 0.05;
- if( phase >= (2.0 * M_PI) ) phase -= (2.0 * M_PI);
-
- }
- for (i = 0; (unsigned)i != framesPerBuffer / sys_dacblocksize; ++i)
- {
- sched_tick(sys_time + sys_time_per_dsp_tick);
- }
-
- return 0;
- }
-
void run_all_idle_callbacks(void);
void sys_xrun_notification(void); /* in m_sched.c */
void sys_lock_timeout_notification(void);
! int process (const void *input, void *output, unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, void *userData)
{
- static int started = 0;
-
-
int i;
int timeout = (float)frameCount / (float) sys_dacsr * 1e6;
if (statusFlags)
sys_xrun_notification();
if (sys_timedlock(timeout) == ETIMEDOUT)
/* we're late */
--- 323,351 ----
extern int sys_meters; /* true if we're metering */
void run_all_idle_callbacks(void);
+ int run_timed_idle_callbacks(int microsecs);
void sys_xrun_notification(void); /* in m_sched.c */
void sys_lock_timeout_notification(void);
! static int process (const void *input, void *output, unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, void *userData)
{
int i;
int timeout = (float)frameCount / (float) sys_dacsr * 1e6;
+ double time,rtime;
+
+ if(!gotaudiothread) {
+ audiothread = pthread_self();
+ gotaudiothread = 1;
+ }
+ else
+ assert(pa_inaudiothread());
if (statusFlags)
sys_xrun_notification();
+ time = sys_getrealtime();
if (sys_timedlock(timeout) == ETIMEDOUT)
/* we're late */
***************
*** 322,325 ****
--- 358,362 ----
{
int j;
+ if(input)
for (j = 0; j < sys_inchannels; j++)
{
***************
*** 331,334 ****
--- 368,372 ----
sched_tick(sys_time + sys_time_per_dsp_tick);
+ if(output)
for (j = 0; j < sys_outchannels; j++)
{
***************
*** 337,340 ****
--- 375,379 ----
sys_dacblocksize);
}
+
/* update peak meters */
if (sys_meters)
***************
*** 345,349 ****
}
! run_all_idle_callbacks();
sys_unlock();
--- 384,395 ----
}
! rtime = (sys_getrealtime()-time)*1e6;
! if(rtime > 0) /* < 0 can happen when changing drivers etc. */
! {
! time = timeout-rtime;
! if(time > 0)
! rtime = run_timed_idle_callbacks(time);
! }
!
sys_unlock();
***************
*** 353,356 ****
--- 399,404 ----
void pa_close_audio( void)
{
+ pa_initialize();
+
#ifndef DEBUG
if(sys_verbose)
***************
*** 362,366 ****
if (pa_stream)
{
! int status = Pa_StopStream(pa_stream);
if (status)
--- 410,414 ----
if (pa_stream)
{
! int status = Pa_AbortStream(pa_stream);
if (status)
***************
*** 479,492 ****
void pa_getaudioininfo(t_float f)
{
! int i = pddev2padev((int)f,1);
const PaDeviceInfo * pdi;
pa_initialize();
- pdi = Pa_GetDeviceInfo (i);
if (pdi)
{
- t_symbol * selector = gensym("audioininfo");
- t_symbol * pd = gensym("pd");
t_atom argv[4];
SETFLOAT(argv, pdi->maxInputChannels);
--- 527,541 ----
void pa_getaudioininfo(t_float f)
{
! int index;
const PaDeviceInfo * pdi;
pa_initialize();
+ index = pddev2padev((int)f,1);
+ if(index < 0) return;
+
+ pdi = Pa_GetDeviceInfo (index);
if (pdi)
{
t_atom argv[4];
SETFLOAT(argv, pdi->maxInputChannels);
***************
*** 494,498 ****
SETFLOAT(argv+2, pdi->defaultLowInputLatency*1000.f);
SETFLOAT(argv+3, pdi->defaultHighInputLatency*1000.f);
! typedmess(pd->s_thing, selector, 4, argv);
}
}
--- 543,547 ----
SETFLOAT(argv+2, pdi->defaultLowInputLatency*1000.f);
SETFLOAT(argv+3, pdi->defaultHighInputLatency*1000.f);
! typedmess(sym_pd->s_thing, sym_audioininfo, 4, argv);
}
}
***************
*** 500,513 ****
void pa_getaudiooutinfo(t_float f)
{
! int i = pddev2padev((int)f,0);
const PaDeviceInfo * pdi;
pa_initialize();
- pdi = Pa_GetDeviceInfo (i);
if (pdi)
{
- t_symbol * selector = gensym("audiooutinfo");
- t_symbol * pd = gensym("pd");
t_atom argv[4];
SETFLOAT(argv, pdi->maxOutputChannels);
--- 549,563 ----
void pa_getaudiooutinfo(t_float f)
{
! int index;
const PaDeviceInfo * pdi;
pa_initialize();
+ index = pddev2padev((int)f,0);
+ if(index < 0) return;
+
+ pdi = Pa_GetDeviceInfo (index);
if (pdi)
{
t_atom argv[4];
SETFLOAT(argv, pdi->maxOutputChannels);
***************
*** 515,519 ****
SETFLOAT(argv+2, pdi->defaultLowOutputLatency*1000.f);
SETFLOAT(argv+3, pdi->defaultHighOutputLatency*1000.f);
! typedmess(pd->s_thing, selector, 4, argv);
}
}
--- 565,569 ----
SETFLOAT(argv+2, pdi->defaultLowOutputLatency*1000.f);
SETFLOAT(argv+3, pdi->defaultHighOutputLatency*1000.f);
! typedmess(sym_pd->s_thing, sym_audiooutinfo, 4, argv);
}
}
***************
*** 521,530 ****
void pa_getcurrent_devices(void)
{
- t_symbol * pd = gensym("pd");
- t_symbol * selector = gensym("audiodevice");
t_atom argv[2];
SETFLOAT(argv, padev2pddev(pa_indev,1));
SETFLOAT(argv+1, padev2pddev(pa_outdev,0));
! typedmess(pd->s_thing, selector, 2, argv);
}
--- 571,581 ----
void pa_getcurrent_devices(void)
{
t_atom argv[2];
+
+ assert(!pa_inaudiothread());
+
SETFLOAT(argv, padev2pddev(pa_indev,1));
SETFLOAT(argv+1, padev2pddev(pa_outdev,0));
! typedmess(sym_pd->s_thing, sym_audiodevice, 2, argv);
}
***************
*** 537,542 ****
int outchans = atom_getfloatarg(4, ac, av);
int advance = atom_getfloatarg(5, ac, av);
- t_symbol * pd = gensym("pd");
- t_symbol * selector = gensym("testaudiosettingresult");
t_atom argv[1];
--- 588,591 ----
***************
*** 546,550 ****
outdev = pddev2padev(outdev,0);
! if ((pa_indev == -1) && (pa_outdev == -1))
{
int ret;
--- 595,599 ----
outdev = pddev2padev(outdev,0);
! if (pa_indev >= 0 && pa_outdev >= 0)
{
int ret;
***************
*** 566,621 ****
SETFLOAT(argv, ret == paNoError?1:0);
! typedmess(pd->s_thing, selector, 1, argv);
}
}
! static int pddev2padev(int pddev,int input)
{
! int j;
! int devno;
! pa_initialize();
! for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++)
! {
! const PaDeviceInfo *info = Pa_GetDeviceInfo(j);
! int maxchans = input?info->maxInputChannels:info->maxOutputChannels;
! if (maxchans > 0)
! {
! if (devno == pddev)
! {
! return j;
! }
! devno++;
! }
! }
! return -1;
}
! static int padev2pddev(int padev,int input)
! {
! int j,devno;
! int count = Pa_GetDeviceCount();
! for (j = 0, devno = 0; j < count; j++)
! {
! const PaDeviceInfo *info = Pa_GetDeviceInfo(j);
! int chans = input?info->maxInputChannels:info->maxOutputChannels;
! if (chans > 0)
! {
! if(j == padev) return devno;
! devno++;
! }
! }
! return -1; // no found
! }
- void pa_get_asio_latencies(t_float f)
- {
- int index = pddev2padev((int)f,0);
- const PaDeviceInfo *pdi = Pa_GetDeviceInfo(index);
- const PaHostApiInfo *phi = Pa_GetHostApiInfo(pdi->hostApi);
if (phi->type != paASIO)
{
! post("device not an asio device");
return;
}
--- 615,642 ----
SETFLOAT(argv, ret == paNoError?1:0);
! typedmess(sym_pd->s_thing, sym_testaudiosettingresult, 1, argv);
}
}
! void pa_get_asio_latencies(t_float f)
{
! int index;
! const PaDeviceInfo *pdi;
! const PaHostApiInfo *phi;
! pa_initialize();
! index = pddev2padev((int)f,0);
! if(index < 0) {
! post("device %i out of range",(int)f);
! return;
}
! pdi = Pa_GetDeviceInfo(index);
! phi = Pa_GetHostApiInfo(pdi->hostApi);
if (phi->type != paASIO)
{
! post("device %i not an asio device",(int)f);
return;
}
***************
*** 626,632 ****
t_atom argv[4];
- t_symbol * selector = gensym("asiolatency");
- t_symbol * pd = gensym("pd");
-
PaAsio_GetAvailableLatencyValues(index, &minlat, &maxlat, &preflat, &gran);
--- 647,650 ----
***************
*** 635,640 ****
SETFLOAT(argv + 2, (float) preflat);
SETFLOAT(argv + 3, (float) gran);
!
! typedmess(pd->s_thing, selector, 4, argv);
}
#endif
--- 653,657 ----
SETFLOAT(argv + 2, (float) preflat);
SETFLOAT(argv + 3, (float) gran);
! typedmess(sym_pd->s_thing, sym_asiolatency, 4, argv);
}
#endif
Index: s_midi_pm.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_midi_pm.c,v
retrieving revision 1.4.4.1.2.9
retrieving revision 1.4.4.1.2.10
diff -C2 -d -r1.4.4.1.2.9 -r1.4.4.1.2.10
*** s_midi_pm.c 30 Nov 2006 01:43:23 -0000 1.4.4.1.2.9
--- s_midi_pm.c 17 Aug 2007 13:56:42 -0000 1.4.4.1.2.10
***************
*** 22,26 ****
#include "portmidi.h"
#include "porttime.h"
! #include "pminternal.h"
static PmStream *mac_midiindevlist[MAXMIDIINDEV];
--- 22,26 ----
#include "portmidi.h"
#include "porttime.h"
! #include "pmutil.h"
static PmStream *mac_midiindevlist[MAXMIDIINDEV];
Index: m_simd_sse_vc.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_simd_sse_vc.c,v
retrieving revision 1.1.4.6.2.1
retrieving revision 1.1.4.6.2.2
diff -C2 -d -r1.1.4.6.2.1 -r1.1.4.6.2.2
*** m_simd_sse_vc.c 11 Sep 2005 11:55:12 -0000 1.1.4.6.2.1
--- m_simd_sse_vc.c 17 Aug 2007 13:56:41 -0000 1.1.4.6.2.2
***************
*** 7,15 ****
#include "m_simd.h"
! #if defined(NT) && defined(_MSC_VER) && !(defined DONTUSESIMD)
/* dst is assumed to be aligned */
void zerovec_simd(t_float *dst,int n)
{
__asm {
mov edx,dword ptr [dst] /* out */
--- 7,28 ----
#include "m_simd.h"
! #if defined(NT) && defined(_MSC_VER) && !defined(DONTUSESIMD)
!
! #include <xmmintrin.h>
/* dst is assumed to be aligned */
void zerovec_simd(t_float *dst,int n)
{
+ #ifdef NOASM
+ int n4 = n/16;
+ const __m128 zero = _mm_setzero_ps();
+ for(int i = 0; i < n4; ++i,dst += 16)
+ {
+ _mm_store_ps(dst+ 0,zero);
+ _mm_store_ps(dst+ 4,zero);
+ _mm_store_ps(dst+ 8,zero);
+ _mm_store_ps(dst+12,zero);
+ }
+ #else
__asm {
mov edx,dword ptr [dst] /* out */
***************
*** 30,33 ****
--- 43,47 ----
loop loopa
}
+ #endif
}
***************
*** 35,38 ****
--- 49,63 ----
void setvec_simd(t_float *dst,t_float v,int n)
{
+ #ifdef NOASM
+ int n4 = n/16;
+ const __m128 value = _mm_load1_ps(&v);
+ for(int i = 0; i < n4; ++i,dst += 16)
+ {
+ _mm_store_ps(dst+ 0,value);
+ _mm_store_ps(dst+ 4,value);
+ _mm_store_ps(dst+ 8,value);
+ _mm_store_ps(dst+12,value);
+ }
+ #else
__asm {
mov edx,dword ptr [dst] /* out */
***************
*** 56,59 ****
--- 81,85 ----
loop loopa
}
+ #endif
}
***************
*** 429,432 ****
--- 455,468 ----
t_int *scalartimes_perf_simd(t_int *w)
{
+ #if 0 //def NOASM
+ const t_float *in = (t_float *)w[1];
+ const __m128 value = _mm_load1_ps((const t_float *)w[2]);
+ t_float *out = (t_float *)w[3];
+ const int n = w[4];
+ int i,j;
+ for(i = 0; i < n; )
+ for(j = 0; j < 4; ++j,i += 4)
+ _mm_store_ps(out+i,_mm_mul_ps(_mm_load_ps(in+i),value));
+ #else
__asm {
mov esi,dword ptr [w]
***************
*** 471,474 ****
--- 507,511 ----
loop loopa
}
+ #endif
return (w+5);
}
Index: s_entry.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_entry.c,v
retrieving revision 1.2.4.2.2.2
retrieving revision 1.2.4.2.2.3
diff -C2 -d -r1.2.4.2.2.2 -r1.2.4.2.2.3
*** s_entry.c 8 Oct 2005 09:38:46 -0000 1.2.4.2.2.2
--- s_entry.c 17 Aug 2007 13:56:41 -0000 1.2.4.2.2.3
***************
*** 13,18 ****
--- 13,21 ----
int nCmdShow)
{
+ #ifdef _MSC_VER
__try {
+ #endif
sys_main(__argc,__argv);
+ #ifdef _MSC_VER
}
__finally
***************
*** 20,23 ****
--- 23,27 ----
printf("caught an exception; stopping\n");
}
+ #endif
}
Index: m_simd_ve_gcc.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_simd_ve_gcc.c,v
retrieving revision 1.1.4.2
retrieving revision 1.1.4.2.2.1
diff -C2 -d -r1.1.4.2 -r1.1.4.2.2.1
*** m_simd_ve_gcc.c 11 Jan 2005 21:41:14 -0000 1.1.4.2
--- m_simd_ve_gcc.c 17 Aug 2007 13:56:41 -0000 1.1.4.2.2.1
***************
*** 7,14 ****
#include "m_simd.h"
! #if defined(__GNUC__) && defined(__POWERPC__) && defined(__ALTIVEC__)
//#define USEVECLIB
#ifdef USEVECLIB
#include <vecLib/vDSP.h>
--- 7,19 ----
#include "m_simd.h"
[...1048 lines suppressed...]
}
--- 449,466 ----
#ifdef USEVECLIB
/* no zero checking here */
! vec_st(vrsqrtf(vec_ld( 0,src+i)), 0,dst+i);
#else
! vector float v = vec_ld( 0,src+i);
! const vector unsigned char mask = vec_nor((vector unsigned char)vec_cmple(v,zero),(vector unsigned char)zero); /* bit mask... all 0 for data <= 0., all 1 else */
! const vector float estimate = (vector float)vec_and((vector unsigned char)vec_rsqrte(v),mask);
! vec_st(
! vec_madd(
! vec_nmsub( v, vec_madd( estimate, estimate, zero ), one ),
! vec_madd( estimate, oneHalf, zero ),
! estimate
! )
! , 0,dst+i
! );
#endif
}
Index: s_print.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_print.c,v
retrieving revision 1.2.4.1.2.2
retrieving revision 1.2.4.1.2.3
diff -C2 -d -r1.2.4.1.2.2 -r1.2.4.1.2.3
*** s_print.c 30 Nov 2005 13:36:58 -0000 1.2.4.1.2.2
--- s_print.c 17 Aug 2007 13:56:42 -0000 1.2.4.1.2.3
***************
*** 11,22 ****
#include "s_stuff.h"
! t_printhook sys_printhook;
! int sys_printtostderr;
!
! static void dopost(const char *s)
{
! if (sys_printhook)
! (*sys_printhook)(s);
! else if (sys_printtostderr)
fprintf(stderr, "%s", s);
else
--- 11,17 ----
#include "s_stuff.h"
! static void dopost_intern(const char *s)
{
! if (sys_printtostderr)
fprintf(stderr, "%s", s);
else
***************
*** 33,37 ****
if (c == '\\' || c == '{' || c == '}' || c == ';')
upbuf[ptout++] = '\\';
! upbuf[ptout] = s[ptin];
}
if (ptout && upbuf[ptout-1] == '\n')
--- 28,32 ----
if (c == '\\' || c == '{' || c == '}' || c == ';')
upbuf[ptout++] = '\\';
! upbuf[ptout] = c;
}
if (ptout && upbuf[ptout-1] == '\n')
***************
*** 42,45 ****
--- 37,48 ----
}
+ static void dopost(const char *s)
+ {
+ (*sys_printhook)(s);
+ }
+
+ t_printhook sys_printhook = dopost_intern;
+ int sys_printtostderr = 0;
+
void post(const char *fmt, ...)
{
Index: x_connective.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/x_connective.c,v
retrieving revision 1.3.4.1.2.11
retrieving revision 1.3.4.1.2.12
diff -C2 -d -r1.3.4.1.2.11 -r1.3.4.1.2.12
*** x_connective.c 30 Nov 2006 01:43:23 -0000 1.3.4.1.2.11
--- x_connective.c 17 Aug 2007 13:56:42 -0000 1.3.4.1.2.12
***************
*** 11,16 ****
extern t_pd *newest;
- #define pd_set_newest(x) (newest=(x))
-
/* -------------------------- int ------------------------------ */
static t_class *pdint_class;
--- 11,14 ----
***************
*** 69,73 ****
outlet_new(&x->x_obj, &s_float);
floatinlet_new(&x->x_obj, &x->x_f);
! pd_set_newest((t_pd *)x);
return (x);
}
--- 67,71 ----
outlet_new(&x->x_obj, &s_float);
floatinlet_new(&x->x_obj, &x->x_f);
! newest = &x->x_obj.ob_pd;
return (x);
}
***************
*** 112,116 ****
outlet_new(&x->x_obj, &s_symbol);
symbolinlet_new(&x->x_obj, &x->x_s);
! pd_set_newest((t_pd *)x);
return (x);
}
--- 110,114 ----
outlet_new(&x->x_obj, &s_symbol);
symbolinlet_new(&x->x_obj, &x->x_s);
! newest = &x->x_obj.ob_pd;
return (x);
}
***************
*** 168,172 ****
t_bang *x = (t_bang *)pd_new(bang_class);
outlet_new(&x->x_obj, &s_bang);
! pd_set_newest((t_pd *)x);
return (x);
}
--- 166,170 ----
t_bang *x = (t_bang *)pd_new(bang_class);
outlet_new(&x->x_obj, &s_bang);
! newest = &x->x_obj.ob_pd;
return (x);
}
Index: SConscript
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/SConscript,v
retrieving revision 1.1.4.61
retrieving revision 1.1.4.62
diff -C2 -d -r1.1.4.61 -r1.1.4.62
*** SConscript 30 Nov 2006 01:43:23 -0000 1.1.4.61
--- SConscript 17 Aug 2007 13:56:41 -0000 1.1.4.62
***************
*** 301,304 ****
--- 301,305 ----
pa_stream.c
pa_trace.c
+ pa_debugprint.c
""")
)
***************
*** 312,315 ****
--- 313,317 ----
pmpath = pdenv['portmidipath']
+ pdenv.Append(CPPDEFINES="NEWBUFFER")
pm_common_sources = map(lambda x: pmpath+x,
***************
*** 414,417 ****
--- 416,420 ----
/src/hostapi/oss/pa_unix_oss.c
/src/hostapi/alsa/pa_linux_alsa.c
+ /src/common/pa_ringbuffer.c
""")
)
***************
*** 473,479 ****
/src/os/mac_osx/pa_mac_hostapis.c
/src/os/unix/pa_unix_util.c
""")
)
! osx_sources = pa_sources + pa_common_sources + pa_osx_sources + pm_sources + pm_common_sources + pm_osx_sources + simd_ve_gcc_sources
osx_defs = Split("UNISTD PA_USE_COREAUDIO MACOSX")
--- 476,487 ----
/src/os/mac_osx/pa_mac_hostapis.c
/src/os/unix/pa_unix_util.c
+ /src/common/pa_ringbuffer.c
""")
)
! osx_sources = pa_sources + pa_common_sources + pa_osx_sources + pm_sources + pm_common_sources + pm_osx_sources
!
! if pdenv['simd']:
! osx_sources += simd_sse_gcc_sources
! osx_sources += simd_ve_gcc_sources
osx_defs = Split("UNISTD PA_USE_COREAUDIO MACOSX")
***************
*** 573,577 ****
cflags += " -mfpmath=sse -mmmx -msse -fprefetch-loop-arrays"
else:
! cflags += " -faltivec -maltivec"
if pdenv['PLATFORM'] == 'win32':
--- 581,586 ----
cflags += " -mfpmath=sse -mmmx -msse -fprefetch-loop-arrays"
else:
! pass
! # cflags += " -faltivec -maltivec"
if pdenv['PLATFORM'] == 'win32':
Index: m_atomic.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_atomic.h,v
retrieving revision 1.1.2.1.2.1
retrieving revision 1.1.2.1.2.2
diff -C2 -d -r1.1.2.1.2.1 -r1.1.2.1.2.2
*** m_atomic.h 12 Jul 2005 15:11:10 -0000 1.1.2.1.2.1
--- m_atomic.h 17 Aug 2007 13:56:41 -0000 1.1.2.1.2.2
***************
*** 6,17 ****
#if defined(__GNUC__) && (defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__))
/* gcc, x86 */
#define ATOMIC_INC(X) \
! asm __volatile__("lock incl (%0) \n" \
: :"r"(X) :"memory")
#define ATOMIC_DEC(X) \
! asm __volatile__("lock decl (%0) \n" \
: :"r"(X) :"memory")
--- 6,19 ----
#if defined(__GNUC__) && (defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__))
+ /* grrrr: for OSX >= 10.4 we could use the functions provided by the OS */
+
/* gcc, x86 */
#define ATOMIC_INC(X) \
! asm __volatile__("lock\n incl (%0) \n" \
: :"r"(X) :"memory")
#define ATOMIC_DEC(X) \
! asm __volatile__("lock\n decl (%0) \n" \
: :"r"(X) :"memory")
More information about the Pd-cvs
mailing list