[PD-cvs] pd/src CHANGELOG.txt, 1.5, 1.6 configure.in, 1.24, 1.25 m_pd.h, 1.19, 1.20 m_sched.c, 1.9, 1.10 makefile.nt, 1.10, 1.11 s_audio.c, 1.12, 1.13 s_audio_mmio.c, 1.5, 1.6 s_audio_pa.c, 1.6, 1.7 s_audio_pablio.c, 1.8, 1.9 s_file.c, 1.10, 1.11 s_inter.c, 1.19, 1.20 s_main.c, 1.30, 1.31 s_midi_pm.c, 1.7, 1.8 s_stuff.h, 1.10, 1.11 t_tkcmd.c, 1.7, 1.8 u_main.tk, 1.27, 1.28 x_arithmetic.c, 1.4, 1.5 makefile.dependencies, 1.10, NONE

Miller Puckette millerpuckette at users.sourceforge.net
Sun Aug 19 01:32:46 CEST 2007


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12807/src

Modified Files:
	CHANGELOG.txt configure.in m_pd.h m_sched.c makefile.nt 
	s_audio.c s_audio_mmio.c s_audio_pa.c s_audio_pablio.c 
	s_file.c s_inter.c s_main.c s_midi_pm.c s_stuff.h t_tkcmd.c 
	u_main.tk x_arithmetic.c 
Removed Files:
	makefile.dependencies 
Log Message:
Download and adjust sources for new portaudio, portmidi.
Add experimental callback scheduling.



Index: x_arithmetic.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/x_arithmetic.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** x_arithmetic.c	15 Aug 2006 04:54:15 -0000	1.4
--- x_arithmetic.c	18 Aug 2007 23:32:44 -0000	1.5
***************
*** 582,588 ****
  {
      t_atan2 *x = (t_atan2 *)pd_new(atan2_class);
-     static int warned;
-     if (!warned)
-         post("warning: atan2 inlets switched from Pd 0.37 to 0.38"), warned=1;
      floatinlet_new(&x->x_ob, &x->x_f);
      x->x_f = 0;
--- 582,585 ----

Index: configure.in
===================================================================
RCS file: /cvsroot/pure-data/pd/src/configure.in,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** configure.in	2 Aug 2007 00:33:50 -0000	1.24
--- configure.in	18 Aug 2007 23:32:43 -0000	1.25
***************
*** 41,45 ****
  AC_ARG_ENABLE(setuid,   [  --enable-setuid         install as setuid (linux)],
      setuid=$enableval)
! AC_ARG_ENABLE(fftw,   [  --enable-fftw           use FFTW package],
      fftw=$enableval)
  
--- 41,45 ----
  AC_ARG_ENABLE(setuid,   [  --enable-setuid         install as setuid (linux)],
      setuid=$enableval)
! AC_ARG_ENABLE(fftw,     [  --enable-fftw           use FFTW package],
      fftw=$enableval)
  
***************
*** 186,192 ****
      CPPFLAGS="-DDL_OPEN -DPA_USE_OSS -DUNIX -DUNISTD\
      	-DUSEAPI_OSS \
-         -I../portaudio/pa_common -I../portaudio/pablio \
-         -I../portmidi/pm_common \
-         -I../portmidi/pm_linux \
  	-fno-strict-aliasing"
      SYSSRC="s_midi_oss.c s_audio_oss.c"
--- 186,189 ----
***************
*** 198,227 ****
      fi
  
- 
      if test x$portaudio == "xyes";
- 
- 
      then
!     	CPPFLAGS=$CPPFLAGS" -DUSEAPI_PORTAUDIO -DPA19"
  	SYSSRC="s_audio_pa.c \
      	s_audio_pablio.c     \
  	s_audio_paring.c     \
! 	../portaudio/pa_common/pa_allocation.c  \
! 	../portaudio/pa_common/pa_converters.c  \
! 	../portaudio/pa_common/pa_cpuload.c     \
! 	../portaudio/pa_common/pa_dither.c      \
! 	../portaudio/pa_common/pa_front.c       \
! 	../portaudio/pa_common/pa_process.c     \
! 	../portaudio/pa_common/pa_skeleton.c    \
! 	../portaudio/pa_common/pa_stream.c      \
! 	../portaudio/pa_common/pa_trace.c       \
! 	../portaudio/pa_unix/pa_unix_hostapis.c \
! 	../portaudio/pa_unix/pa_unix_util.c     \
! 	../portaudio/pa_unix_oss/pa_unix_oss.c "$SYSSRC
  	if test x$alsa == "xyes";
  	then
! 	    SYSSRC=$SYSSRC" ../portaudio/pa_linux_alsa/pa_linux_alsa.c"
! 	    CPPFLAGS=$CPPFLAGS" -Wno-error"
!     	fi
      fi
      if test x$setuid == "xyes";
--- 195,233 ----
      fi
  
      if test x$portaudio == "xyes";
      then
!     	CPPFLAGS=$CPPFLAGS" -DUSEAPI_PORTAUDIO -DHAVE_SYS_SOUNDCARD_H \
! 	-Wno-error \
!         -I../portaudio/include -I../portaudio/src/common \
! 	-I../portaudio/src/os/unix/ \
!         -I../portmidi/pm_common \
!         -I../portmidi/pm_linux"
  	SYSSRC="s_audio_pa.c \
      	s_audio_pablio.c     \
  	s_audio_paring.c     \
! 	../portaudio/src/common/pa_allocation.c  \
! 	../portaudio/src/common/pa_converters.c  \
! 	../portaudio/src/common/pa_cpuload.c     \
! 	../portaudio/src/common/pa_dither.c      \
! 	../portaudio/src/common/pa_front.c       \
! 	../portaudio/src/common/pa_process.c     \
! 	../portaudio/src/common/pa_skeleton.c    \
! 	../portaudio/src/common/pa_stream.c      \
! 	../portaudio/src/common/pa_trace.c       \
! 	../portaudio/src/common/pa_debugprint.c  \
! 	../portaudio/src/common/pa_ringbuffer.c  \
! 	../portaudio/src/os/unix/pa_unix_hostapis.c \
! 	../portaudio/src/os/unix/pa_unix_util.c     \
! 	../portaudio/src/hostapi/oss/pa_unix_oss.c "$SYSSRC
  	if test x$alsa == "xyes";
  	then
!     	    SYSSRC="../portaudio/src/hostapi/alsa/pa_linux_alsa.c "$SYSSRC
! 	    CPPFLAGS=$CPPFLAGS" -DPA_USE_ALSA"
! 	fi
! 	if test x$jack == "xyes";
! 	then
!     	    SYSSRC="../portaudio/src/hostapi/jack/pa_jack.c "$SYSSRC
! 	    CPPFLAGS=$CPPFLAGS" -DPA_USE_JACK"
! 	fi
      fi
      if test x$setuid == "xyes";
***************
*** 258,265 ****
      EXT=pd_darwin
      CPPFLAGS="-DDL_OPEN -DMACOSX -DUNISTD -I/usr/X11R6/include \
! 	-I../portaudio/pa_common -I../portaudio/pablio \
  	-I../portmidi/pm_common -I../portmidi/pm_mac \
  	-I../portmidi/porttime \
! 	-DUSEAPI_PORTAUDIO -DPA19 -DPA_USE_COREAUDIO"
      if test `uname -r` = 7.9.0;
      then
--- 264,272 ----
      EXT=pd_darwin
      CPPFLAGS="-DDL_OPEN -DMACOSX -DUNISTD -I/usr/X11R6/include \
! 	-I../portaudio/include -I../portaudio/src/common \
! 	-I../portaudio/src/os/mac_osx/ \
  	-I../portmidi/pm_common -I../portmidi/pm_mac \
  	-I../portmidi/porttime \
! 	-DUSEAPI_PORTAUDIO -DPA19 -DPA_USE_COREAUDIO -DNEWBUFFER"
      if test `uname -r` = 7.9.0;
      then
***************
*** 275,290 ****
      	s_audio_pablio.c     \
  	s_audio_paring.c     \
! 	../portaudio/pa_common/pa_allocation.c  \
! 	../portaudio/pa_common/pa_converters.c  \
! 	../portaudio/pa_common/pa_cpuload.c     \
! 	../portaudio/pa_common/pa_dither.c      \
! 	../portaudio/pa_common/pa_front.c       \
! 	../portaudio/pa_common/pa_process.c     \
! 	../portaudio/pa_common/pa_skeleton.c    \
! 	../portaudio/pa_common/pa_stream.c      \
! 	../portaudio/pa_common/pa_trace.c       \
! 	../portaudio/pa_unix/pa_unix_util.c     \
! 	../portaudio/pa_mac_core/pa_mac_core.c  \
! 	../portaudio/pa_mac/pa_mac_hostapis.c   \
          ../portmidi/pm_mac/pmmac.c \
          ../portmidi/pm_mac/pmmacosxcm.c \
--- 282,301 ----
      	s_audio_pablio.c     \
  	s_audio_paring.c     \
! 	../portaudio/src/common/pa_allocation.c  \
! 	../portaudio/src/common/pa_converters.c  \
! 	../portaudio/src/common/pa_cpuload.c     \
! 	../portaudio/src/common/pa_dither.c      \
! 	../portaudio/src/common/pa_front.c       \
! 	../portaudio/src/common/pa_process.c     \
! 	../portaudio/src/common/pa_skeleton.c    \
! 	../portaudio/src/common/pa_stream.c      \
! 	../portaudio/src/common/pa_trace.c       \
! 	../portaudio/src/common/pa_debugprint.c       \
! 	../portaudio/src/common/pa_ringbuffer.c  \
! 	../portaudio/src/os/unix/pa_unix_util.c     \
! 	../portaudio/src/os/mac_osx/pa_mac_hostapis.c   \
! 	../portaudio/src/hostapi/coreaudio/pa_mac_core.c  \
! 	../portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.c  \
! 	../portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.c  \
          ../portmidi/pm_mac/pmmac.c \
          ../portmidi/pm_mac/pmmacosxcm.c \
***************
*** 336,340 ****
      EXT=dll
      MORECFLAGS="-DUSEAPI_PORTAUDIO -DPA19 -DMSW -DPA_NO_DS -DPD_INTERNAL \
!         -I../portaudio/pa_common -I../portaudio/pablio \
          -mwindows -mms-bitfields "$MORECFLAGS
      PDLIB=$PDLIB" -lwsock32 -lwinmm -lole32 -lstdc++"
--- 347,352 ----
      EXT=dll
      MORECFLAGS="-DUSEAPI_PORTAUDIO -DPA19 -DMSW -DPA_NO_DS -DPD_INTERNAL \
!         -I../portaudio/include -I../portaudio/src/common \
! 	-I../portaudio/src/os/win/ \
          -mwindows -mms-bitfields "$MORECFLAGS
      PDLIB=$PDLIB" -lwsock32 -lwinmm -lole32 -lstdc++"
***************
*** 342,359 ****
      SYSSRC="s_audio_pa.c s_audio_pablio.c s_audio_paring.c \
          s_audio_mmio.c s_midi_mmio.c \
!         ../portaudio/pa_common/pa_allocation.c  \
!         ../portaudio/pa_common/pa_converters.c  \
!         ../portaudio/pa_common/pa_cpuload.c     \
!         ../portaudio/pa_common/pa_dither.c      \
!         ../portaudio/pa_common/pa_front.c       \
!         ../portaudio/pa_common/pa_process.c     \
!         ../portaudio/pa_common/pa_skeleton.c    \
!         ../portaudio/pa_common/pa_stream.c      \
!         ../portaudio/pa_common/pa_trace.c       \
!         ../portaudio/pa_win/pa_win_util.c       \
!         ../portaudio/pa_win/pa_win_hostapis.c   \
!         ../portaudio/pa_win_wmme/pa_win_wmme.c"
! 	 ASIOSRC="../portaudio/pa_asio/iasiothiscallresolver.cpp \
! 	 ../portaudio/pa_asio/pa_asio.cpp ../asio/asio.cpp \
  	 ../asio/asiodrivers.cpp ../asio/asiolist.cpp"
      STRIPFLAG="--strip-unneeded"
--- 354,374 ----
      SYSSRC="s_audio_pa.c s_audio_pablio.c s_audio_paring.c \
          s_audio_mmio.c s_midi_mmio.c \
! 	../portaudio/src/common/pa_allocation.c  \
! 	../portaudio/src/common/pa_converters.c  \
! 	../portaudio/src/common/pa_cpuload.c     \
! 	../portaudio/src/common/pa_dither.c      \
! 	../portaudio/src/common/pa_front.c       \
! 	../portaudio/src/common/pa_process.c     \
! 	../portaudio/src/common/pa_skeleton.c    \
! 	../portaudio/src/common/pa_stream.c      \
! 	../portaudio/src/common/pa_trace.c       \
! 	../portaudio/src/common/pa_debugprint.c       \
! 	../portaudio/src/common/pa_ringbuffer.c  \
!         ../portaudio/src/os/win/pa_win_util.c       \
!         ../portaudio/src/os/win/pa_win_hostapis.c   \
!         ../portaudio/src/os/win/pa_x86_plain_converters.c   \
!         ../portaudio/src/hostapi/wmme/pa_win_wmme.c"
! 	 ASIOSRC="../portaudio/src/hostapi/asio/iasiothiscallresolver.cpp \
! 	 ../portaudio/src/hostapi/pa_asio/asio.cpp ../asio/asio.cpp \
  	 ../asio/asiodrivers.cpp ../asio/asiolist.cpp"
      STRIPFLAG="--strip-unneeded"
***************
*** 383,398 ****
  fi
  
- # extra flags for alpha machines
- if test `uname -m | awk '{print $1}'` = alpha;
- then
-     MORECFLAGS=$MORECFLAGS" -mieee -mcpu=ev56"
- fi
- 
- # test for compaq compiler---not sure what this does or how to test it.
- if test x$CC == xccc;
- then
-     MORECFLAGS=$MORECFLAGS"  -g3 -D__COMPAQC__ -arch host"
- fi
- 
  ## JMZ{
  ##  this does not do very much, but i guess it is a good idea to use it...
--- 398,401 ----

Index: s_main.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_main.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -C2 -d -r1.30 -r1.31
*** s_main.c	20 Jul 2007 03:25:20 -0000	1.30
--- s_main.c	18 Aug 2007 23:32:44 -0000	1.31
***************
*** 32,36 ****
  int sys_startgui(const char *guipath);
  int sys_rcfile(void);
! int m_scheduler(void);
  void sys_addhelppath(char *p);
  #ifdef USEAPI_ALSA
--- 32,36 ----
  int sys_startgui(const char *guipath);
  int sys_rcfile(void);
! int m_mainloop(void);
  void sys_addhelppath(char *p);
  #ifdef USEAPI_ALSA
***************
*** 44,47 ****
--- 44,48 ----
  int sys_hipriority = -1;    /* -1 = don't care; 0 = no; 1 = yes */
  int sys_guisetportnumber;   /* if started from the GUI, this is the port # */
+ int sys_nosleep = 0;  /* skip all "sleep" calls and spin instead */
  
  char *sys_guicmd;
***************
*** 61,64 ****
--- 62,66 ----
  static int sys_main_srate;
  static int sys_main_advance;
+ static int sys_main_callback;
  static int sys_listplease;
  
***************
*** 70,74 ****
  
      /* here the "-1" counts signify that the corresponding vector hasn't been
!     specified in command line arguments; sys_open_audio will detect this
      and fill things in. */
  static int sys_nsoundin = -1;
--- 72,76 ----
  
      /* here the "-1" counts signify that the corresponding vector hasn't been
!     specified in command line arguments; sys_set_audio_settings will detect it
      and fill things in. */
  static int sys_nsoundin = -1;
***************
*** 82,86 ****
  static int sys_choutlist[MAXAUDIOOUTDEV];
  
- int sys_nosleep = 0;  /* skip all "sleep" calls and spin instead */
  t_sample* get_sys_soundout() { return sys_soundout; }
  t_sample* get_sys_soundin() { return sys_soundin; }
--- 84,87 ----
***************
*** 314,318 ****
          sys_reopen_audio();
              /* run scheduler until it quits */
!         return (m_scheduler());
      }
  }
--- 315,319 ----
          sys_reopen_audio();
              /* run scheduler until it quits */
!         return (m_mainloop());
      }
  }
***************
*** 581,584 ****
--- 582,590 ----
              argc -= 2; argv += 2;
          }
+         else if (!strcmp(*argv, "-callback"))
+         {
+             sys_main_callback = 1;
+             argc--; argv++;
+         }
          else if (!strcmp(*argv, "-blocksize"))
          {
***************
*** 900,904 ****
      int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
      int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
!     int nchindev, nchoutdev, rate, advance;
      int nmidiindev = 0, midiindev[MAXMIDIINDEV];
      int nmidioutdev = 0, midioutdev[MAXMIDIOUTDEV];
--- 906,910 ----
      int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
      int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
!     int nchindev, nchoutdev, rate, advance, callback;
      int nmidiindev = 0, midiindev[MAXMIDIINDEV];
      int nmidioutdev = 0, midioutdev[MAXMIDIOUTDEV];
***************
*** 936,940 ****
              of argument parsing, and store them again. */
      sys_get_audio_params(&naudioindev, audioindev, chindev,
!         &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
      if (sys_nchin >= 0)
      {
--- 942,946 ----
              of argument parsing, and store them again. */
      sys_get_audio_params(&naudioindev, audioindev, chindev,
!         &naudiooutdev, audiooutdev, choutdev, &rate, &advance, &callback);
      if (sys_nchin >= 0)
      {
***************
*** 982,987 ****
      if (sys_main_srate)
          rate = sys_main_srate;
!     sys_open_audio(naudioindev, audioindev, nchindev, chindev,
!         naudiooutdev, audiooutdev, nchoutdev, choutdev, rate, advance, 0);
      sys_open_midi(nmidiindev, midiindev, nmidioutdev, midioutdev, 0);
  }
--- 988,996 ----
      if (sys_main_srate)
          rate = sys_main_srate;
!     if (sys_main_callback)
!         callback = sys_main_callback;
!     sys_set_audio_settings(naudioindev, audioindev, nchindev, chindev,
!         naudiooutdev, audiooutdev, nchoutdev, choutdev, rate, advance, 
!         callback);
      sys_open_midi(nmidiindev, midiindev, nmidioutdev, midioutdev, 0);
  }

Index: u_main.tk
===================================================================
RCS file: /cvsroot/pure-data/pd/src/u_main.tk,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** u_main.tk	2 Aug 2007 00:33:50 -0000	1.27
--- u_main.tk	18 Aug 2007 23:32:44 -0000	1.28
***************
*** 3480,3484 ****
      global audio_outchan1 audio_outchan2 audio_outchan3 audio_outchan4
      global audio_outenable1 audio_outenable2 audio_outenable3 audio_outenable4
!     global audio_sr audio_advance
  
      pd [concat pd audio-dialog \
--- 3480,3484 ----
      global audio_outchan1 audio_outchan2 audio_outchan3 audio_outchan4
      global audio_outenable1 audio_outenable2 audio_outenable3 audio_outenable4
!     global audio_sr audio_advance audio_callback
  
      pd [concat pd audio-dialog \
***************
*** 3501,3504 ****
--- 3501,3505 ----
          $audio_sr \
          $audio_advance \
+         $audio_callback \
          \;]
  }
***************
*** 3544,3548 ****
          inchan1 inchan2 inchan3 inchan4 \
          outdev1 outdev2 outdev3 outdev4 \
!         outchan1 outchan2 outchan3 outchan4 sr advance multi longform} {
      global audio_indev1 audio_indev2 audio_indev3 audio_indev4 
      global audio_inchan1 audio_inchan2 audio_inchan3 audio_inchan4
--- 3545,3550 ----
          inchan1 inchan2 inchan3 inchan4 \
          outdev1 outdev2 outdev3 outdev4 \
!         outchan1 outchan2 outchan3 outchan4 sr advance multi callback \
!         longform} {
      global audio_indev1 audio_indev2 audio_indev3 audio_indev4 
      global audio_inchan1 audio_inchan2 audio_inchan3 audio_inchan4
***************
*** 3551,3555 ****
      global audio_outchan1 audio_outchan2 audio_outchan3 audio_outchan4
      global audio_outenable1 audio_outenable2 audio_outenable3 audio_outenable4
!     global audio_sr audio_advance
      global audio_indevlist audio_outdevlist
      global pd_indev pd_outdev
--- 3553,3557 ----
      global audio_outchan1 audio_outchan2 audio_outchan3 audio_outchan4
      global audio_outenable1 audio_outenable2 audio_outenable3 audio_outenable4
!     global audio_sr audio_advance audio_callback
      global audio_indevlist audio_outdevlist
      global pd_indev pd_outdev
***************
*** 3585,3589 ****
      set audio_sr $sr
      set audio_advance $advance
! 
      toplevel $id
      wm title $id {audio}
--- 3587,3591 ----
      set audio_sr $sr
      set audio_advance $advance
!     set audio_callback $callback
      toplevel $id
      wm title $id {audio}
***************
*** 3598,3604 ****
      button $id.buttonframe.ok -text {OK}\
          -command "audio_ok $id"
!     pack $id.buttonframe.cancel -side left -expand 1
!     pack $id.buttonframe.apply -side left -expand 1
!     pack $id.buttonframe.ok -side left -expand 1
      
          # sample rate and advance
--- 3600,3607 ----
      button $id.buttonframe.ok -text {OK}\
          -command "audio_ok $id"
!     button $id.buttonframe.save -text {Save all settings}\
!         -command "audio_apply $id \; pd pd save-preferences \\;"
!     pack $id.buttonframe.cancel $id.buttonframe.apply $id.buttonframe.ok \
!         $id.buttonframe.save -side left -expand 1
      
          # sample rate and advance
***************
*** 3611,3615 ****
      entry $id.srf.x2 -textvariable audio_advance -width 4
      pack $id.srf.l1 $id.srf.x1 $id.srf.l2 $id.srf.x2 -side left
!     
          # input device 1
      frame $id.in1f
--- 3614,3622 ----
      entry $id.srf.x2 -textvariable audio_advance -width 4
      pack $id.srf.l1 $id.srf.x1 $id.srf.l2 $id.srf.x2 -side left
!     if {$audio_callback >= 0} {
!         checkbutton $id.srf.x3 -variable audio_callback \
!             -text {use callbacks} -anchor e
!         pack $id.srf.x3 -side left
!     }
          # input device 1
      frame $id.in1f

Index: s_stuff.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_stuff.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** s_stuff.h	15 Aug 2006 04:54:15 -0000	1.10
--- s_stuff.h	18 Aug 2007 23:32:44 -0000	1.11
***************
*** 72,79 ****
  extern int sys_schedadvance;
  extern int sys_sleepgrain;
! void sys_open_audio(int naudioindev, int *audioindev,
      int nchindev, int *chindev,
      int naudiooutdev, int *audiooutdev, int nchoutdev, int *choutdev,
!     int srate, int advance, int enable);
  void sys_reopen_audio( void);
  void sys_close_audio(void);
--- 72,79 ----
  extern int sys_schedadvance;
  extern int sys_sleepgrain;
! void sys_set_audio_settings(int naudioindev, int *audioindev,
      int nchindev, int *chindev,
      int naudiooutdev, int *audiooutdev, int nchoutdev, int *choutdev,
!     int srate, int advance, int callback);
  void sys_reopen_audio( void);
  void sys_close_audio(void);
***************
*** 140,144 ****
  #define ERR_RESYNC 3
  #define ERR_DATALATE 4
! void sched_set_using_dacs(int flag);
  
  /* s_inter.c */
--- 140,148 ----
  #define ERR_RESYNC 3
  #define ERR_DATALATE 4
! 
! #define SCHED_AUDIO_NONE 0
! #define SCHED_AUDIO_POLL 1 
! #define SCHED_AUDIO_CALLBACK 2
! void sched_set_using_audio(int flag);
  
  /* s_inter.c */
***************
*** 206,212 ****
  #endif
  
  int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin,
      t_sample *soundout, int framesperbuf, int nbuffers,
!     int indeviceno, int outdeviceno);
  void pa_close_audio(void);
  int pa_send_dacs(void);
--- 210,218 ----
  #endif
  
+ typedef void (*t_audiocallback)(void);
+ 
  int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin,
      t_sample *soundout, int framesperbuf, int nbuffers,
!     int indeviceno, int outdeviceno, t_audiocallback callback);
  void pa_close_audio(void);
  int pa_send_dacs(void);
***************
*** 246,250 ****
  void jack_listdevs(void);
  
! void mmio_open_audio(int naudioindev, int *audioindev,
      int nchindev, int *chindev, int naudiooutdev, int *audiooutdev,
      int nchoutdev, int *choutdev, int rate);
--- 252,256 ----
  void jack_listdevs(void);
  
! int mmio_open_audio(int naudioindev, int *audioindev,
      int nchindev, int *chindev, int naudiooutdev, int *audiooutdev,
      int nchoutdev, int *choutdev, int rate);
***************
*** 270,278 ****
      int *pnaudioindev, int *paudioindev, int *chindev,
      int *pnaudiooutdev, int *paudiooutdev, int *choutdev,
!     int *prate, int *padvance);
  void sys_save_audio_params(
      int naudioindev, int *audioindev, int *chindev,
      int naudiooutdev, int *audiooutdev, int *choutdev,
!     int rate, int advance);
  
  /* s_file.c */
--- 276,284 ----
      int *pnaudioindev, int *paudioindev, int *chindev,
      int *pnaudiooutdev, int *paudiooutdev, int *choutdev,
!     int *prate, int *padvance, int *callback);
  void sys_save_audio_params(
      int naudioindev, int *audioindev, int *chindev,
      int naudiooutdev, int *audiooutdev, int *choutdev,
!     int rate, int advance, int callback);
  
  /* s_file.c */

Index: s_inter.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_inter.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** s_inter.c	20 Jul 2007 03:25:20 -0000	1.19
--- s_inter.c	18 Aug 2007 23:32:44 -0000	1.20
***************
*** 1081,1084 ****
--- 1081,1088 ----
                      /* Perform the same search among system applications. */
                  strcpy(filename, 
+                     "/usr/bin/wish");
+                 if (stat(filename, &statbuf) >= 0)
+                     goto foundit;
+                 strcpy(filename, 
                      "/Applications/Utilities/Wish Shell.app/Contents/MacOS/Wish Shell");
                  if (stat(filename, &statbuf) >= 0)

Index: CHANGELOG.txt
===================================================================
RCS file: /cvsroot/pure-data/pd/src/CHANGELOG.txt,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** CHANGELOG.txt	8 Sep 2006 23:45:30 -0000	1.5
--- CHANGELOG.txt	18 Aug 2007 23:32:43 -0000	1.6
***************
*** 3,6 ****
--- 3,10 ----
  for original notes on source stype and organization.
  
+ 0.41.0
+ 
+ add support for callback-based audio I/O; changes in 
+ 
  0.40.0
  

Index: makefile.nt
===================================================================
RCS file: /cvsroot/pure-data/pd/src/makefile.nt,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** makefile.nt	20 Jul 2007 03:25:20 -0000	1.10
--- makefile.nt	18 Aug 2007 23:32:44 -0000	1.11
***************
*** 39,55 ****
  
  PADIR = ..\portaudio
! INCPA = -I$(PADIR) -I$(PADIR)\pa_common -I$(PADIR)\pablio -I..\lib\asio
! SRCPA = $(PADIR)/pa_common/pa_stream.c \
!         $(PADIR)/pa_common/pa_trace.c \
!         $(PADIR)/pa_common/pa_skeleton.c \
!         $(PADIR)/pa_common/pa_process.c \
!         $(PADIR)/pa_common/pa_front.c \
!         $(PADIR)/pa_common/pa_dither.c \
!         $(PADIR)/pa_common/pa_cpuload.c \
!         $(PADIR)/pa_common/pa_converters.c \
!         $(PADIR)/pa_common/pa_allocation.c \
!         $(PADIR)/pa_win/pa_win_util.c \
!         $(PADIR)/pa_win/pa_win_hostapis.c \
!         $(PADIR)/pa_win_wmme/pa_win_wmme.c 
  #        $(PADIR)/pa_win_wdmks/pa_win_wdmks.c
  
--- 39,56 ----
  
  PADIR = ..\portaudio
! INCPA = -I$(PADIR)\include -I$(PADIR)\src\common -I..\lib\asio
! PASRC = $(PADIR)\src
! SRCPA = $(PASRC)/common/pa_stream.c \
!         $(PASRC)/common/pa_trace.c \
!         $(PASRC)/common/pa_skeleton.c \
!         $(PASRC)/common/pa_process.c \
!         $(PASRC)/common/pa_front.c \
!         $(PASRC)/common/pa_dither.c \
!         $(PASRC)/common/pa_cpuload.c \
!         $(PASRC)/common/pa_converters.c \
!         $(PASRC)/common/pa_allocation.c \
!         $(PASRC)/os/win/pa_win_hostapis.c \
!         $(PASRC)/os/win/pa_win_util.c \
!         $(PASRC)/hostapi/wmme/pa_win_wmme.c 
  #        $(PADIR)/pa_win_wdmks/pa_win_wdmks.c
  
***************
*** 64,73 ****
  PAOBJ = pa_stream.obj pa_trace.obj pa_skeleton.obj pa_process.obj \
  	pa_front.obj pa_dither.obj pa_cpuload.obj pa_converters.obj \
! 	pa_allocation.obj pa_win_util.obj pa_win_hostapis.obj pa_asio.obj \
  	pa_win_wmme.obj 
  #       pa_win_wdmks.obj
  
  PMDIR = ..\portmidi
! INCPM = -I$(PMDIR)\pm_common -I$(PMDIR)\pm_win -I$(PMDIR)\porttime
  SRCPM = $(PADIR)/pm_common/portmidi.c \
          $(PMDIR)/pm_common/pmutil.c \
--- 65,74 ----
  PAOBJ = pa_stream.obj pa_trace.obj pa_skeleton.obj pa_process.obj \
  	pa_front.obj pa_dither.obj pa_cpuload.obj pa_converters.obj \
! 	pa_allocation.obj pa_win_hostapis.obj pa_win_util.obj pa_asio.obj \
  	pa_win_wmme.obj 
  #       pa_win_wdmks.obj
  
  PMDIR = ..\portmidi
! INCPM = -I$(PMDIR)\pm_common -I$(PMDIR)\pm_win -I$(PMDIR)\porttime -DNEWBUFFER
  SRCPM = $(PADIR)/pm_common/portmidi.c \
          $(PMDIR)/pm_common/pmutil.c \
***************
*** 128,162 ****
  
  # explicit rules to compile portaudio sources:
! pa_stream.obj: $(PADIR)\pa_common\pa_stream.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_stream.c
! pa_trace.obj: $(PADIR)\pa_common\pa_trace.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_trace.c
! pa_skeleton.obj: $(PADIR)\pa_common\pa_skeleton.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_skeleton.c
! pa_process.obj: $(PADIR)\pa_common\pa_process.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_process.c
! pa_front.obj: $(PADIR)\pa_common\pa_front.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_front.c
! pa_dither.obj: $(PADIR)\pa_common\pa_dither.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_dither.c
! pa_cpuload.obj: $(PADIR)\pa_common\pa_cpuload.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_cpuload.c
! pa_converters.obj: $(PADIR)\pa_common\pa_converters.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_converters.c
! pa_allocation.obj: $(PADIR)\pa_common\pa_allocation.c
! 	cl /c $(ALLCF) $(PADIR)\pa_common\pa_allocation.c
  
! pa_win_util.obj: $(PADIR)\pa_win\pa_win_util.c
! 	cl /c $(ALLCF) $(PADIR)\pa_win\pa_win_util.c
! pa_win_hostapis.obj: $(PADIR)\pa_win\pa_win_hostapis.c
! 	cl /c $(ALLCF) $(PADIR)\pa_win\pa_win_hostapis.c
! pa_win_wmme.obj: $(PADIR)\pa_win_wmme\pa_win_wmme.c
! 	cl /c $(ALLCF) $(PADIR)\pa_win_wmme\pa_win_wmme.c
  pa_win_wdmks.obj: $(PADIR)\pa_win_wdmks\pa_win_wdmks.c
  	cl /c $(ALLCF) \
  	-DWINVER=0x400 -DKSAUDIO_SPEAKER_DIRECTOUT \
  	$(PADIR)\pa_win_wdmks\pa_win_wdmks.c
! pa_asio.obj: $(PADIR)\pa_asio\pa_asio.cpp
! 	cl /c $(ALLCF) $(PADIR)\pa_asio\pa_asio.cpp
  
  portmidi.obj: $(PMDIR)\pm_common\portmidi.c
--- 129,163 ----
  
  # explicit rules to compile portaudio sources:
! pa_stream.obj: $(PASRC)\common\pa_stream.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_stream.c
! pa_trace.obj: $(PASRC)\common\pa_trace.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_trace.c
! pa_skeleton.obj: $(PASRC)\common\pa_skeleton.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_skeleton.c
! pa_process.obj: $(PASRC)\common\pa_process.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_process.c
! pa_front.obj: $(PASRC)\common\pa_front.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_front.c
! pa_dither.obj: $(PASRC)\common\pa_dither.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_dither.c
! pa_cpuload.obj: $(PASRC)\common\pa_cpuload.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_cpuload.c
! pa_converters.obj: $(PASRC)\common\pa_converters.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_converters.c
! pa_allocation.obj: $(PASRC)\common\pa_allocation.c
! 	cl /c $(ALLCF) $(PASRC)\common\pa_allocation.c
  
! pa_win_hostapis.obj: $(PASRC)\os\win\pa_win_hostapis.c
! 	cl /c $(ALLCF) $(PASRC)\os\win\pa_win_hostapis.c
! pa_win_util.obj: $(PASRC)\os\win\pa_win_util.c
! 	cl /c $(ALLCF) $(PASRC)\os\win\pa_win_util.c
! pa_win_wmme.obj: $(PASRC)\hostapi\wmme\pa_win_wmme.c
! 	cl /c $(ALLCF) $(PASRC)\hostapi\wmme\pa_win_wmme.c
  pa_win_wdmks.obj: $(PADIR)\pa_win_wdmks\pa_win_wdmks.c
  	cl /c $(ALLCF) \
  	-DWINVER=0x400 -DKSAUDIO_SPEAKER_DIRECTOUT \
  	$(PADIR)\pa_win_wdmks\pa_win_wdmks.c
! pa_asio.obj: $(PASRC)\hostapi\asio\pa_asio.cpp
! 	cl /c $(ALLCF) $(PASRC)\hostapi\asio\pa_asio.cpp
  
  portmidi.obj: $(PMDIR)\pm_common\portmidi.c

--- makefile.dependencies DELETED ---

Index: s_audio_pablio.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio_pablio.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** s_audio_pablio.c	4 Oct 2006 19:35:06 -0000	1.8
--- s_audio_pablio.c	18 Aug 2007 23:32:44 -0000	1.9
***************
*** 59,63 ****
  /************************************************************************/
  
- #ifdef PA19
  static int blockingIOCallback( const void *inputBuffer, void *outputBuffer, /*MSP */
                                 unsigned long framesPerBuffer,
--- 59,62 ----
***************
*** 65,73 ****
                                 PaStreamCallbackFlags myflags, 
                                 void *userData );
- #else
- static int blockingIOCallback( void *inputBuffer, void *outputBuffer,
-                                unsigned long framesPerBuffer,
-                                PaTimestamp outTime, void *userData );
- #endif
  static PaError PABLIO_InitFIFO( sys_ringbuf *rbuf, long numFrames, long bytesPerFrame );
  static PaError PABLIO_TermFIFO( sys_ringbuf *rbuf );
--- 64,67 ----
***************
*** 80,84 ****
   * Read and write data only if there is room in FIFOs.
   */
- #ifdef PA19
  static int blockingIOCallback( const void *inputBuffer, void *outputBuffer, /* MSP */
                                 unsigned long framesPerBuffer,
--- 74,77 ----
***************
*** 86,94 ****
                                 PaStreamCallbackFlags myflags, 
                                 void *userData )
- #else
- static int blockingIOCallback( void *inputBuffer, void *outputBuffer,
-                                unsigned long framesPerBuffer,
-                                PaTimestamp outTime, void *userData )
- #endif
  {
      PABLIO_Stream *data = (PABLIO_Stream*)userData;
--- 79,82 ----
***************
*** 224,232 ****
      PABLIO_Stream *aStream;
      long   numFrames;
- #ifdef PA19
      PaStreamParameters instreamparams, outstreamparams;  /* MSP */
- #else
-     long   minNumBuffers;
- #endif
  
      /* fprintf(stderr,
--- 212,216 ----
***************
*** 237,254 ****
      if (indeviceno < 0)  /* MSP... */
      {
- #ifdef PA19
          indeviceno = Pa_GetDefaultInputDevice();
- #else
-         indeviceno = Pa_GetDefaultInputDeviceID();
- #endif
          fprintf(stderr, "using default input device number: %d\n", indeviceno);
      }
      if (outdeviceno < 0)
      {
- #ifdef PA19
          outdeviceno = Pa_GetDefaultOutputDevice();
- #else
-         outdeviceno = Pa_GetDefaultOutputDeviceID();
- #endif
          fprintf(stderr, "using default output device number: %d\n", outdeviceno);
      }
--- 221,230 ----
***************
*** 278,282 ****
      if( err != paNoError ) goto error;
  
- #ifdef PA19
      numFrames = nbuffers * framesperbuf; /* ...MSP */
  
--- 254,257 ----
***************
*** 293,307 ****
      outstreamparams.hostApiSpecificStreamInfo = 0;  /* ... MSP */
  
- #else
- /* Warning: numFrames must be larger than amount of data processed per
-   interrupt inside PA to prevent glitches. */  /* MSP */
-     minNumBuffers = Pa_GetMinNumBuffers(framesperbuf, sampleRate);
-     if (minNumBuffers > nbuffers)
-         fprintf(stderr,
-         "warning: number of buffers %d less than recommended minimum %d\n",
-             (int)nbuffers, (int)minNumBuffers);
- #endif
- 
- 
      numFrames = nbuffers * framesperbuf;
      /* fprintf(stderr, "numFrames %d\n", numFrames); */
--- 268,271 ----
***************
*** 328,332 ****
      /* Open a PortAudio stream that we will use to communicate with the underlying
       * audio drivers. */
- #ifdef PA19
      err = Pa_OpenStream(
                &aStream->stream,
--- 292,295 ----
***************
*** 338,359 ****
                blockingIOCallback,
                aStream );
- #else
-     err = Pa_OpenStream(
-               &aStream->stream,
-               (doRead ? indeviceno : paNoDevice),  /* MSP */
-               (doRead ? aStream->insamplesPerFrame : 0 ),
-               format,
-               NULL,
-               (doWrite ? outdeviceno : paNoDevice),  /* MSP */
-               (doWrite ? aStream->outsamplesPerFrame : 0 ),
-               format,
-               NULL,
-               sampleRate,
-               framesperbuf,  /* MSP */
-               nbuffers,      /* MSP */
-               paNoFlag,      /* MSP -- portaudio will clip for us */
-               blockingIOCallback,
-               aStream );
- #endif
      if( err != paNoError ) goto error;
  
--- 301,304 ----

Index: s_midi_pm.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_midi_pm.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** s_midi_pm.c	2 Aug 2007 00:33:50 -0000	1.7
--- s_midi_pm.c	18 Aug 2007 23:32:44 -0000	1.8
***************
*** 22,26 ****
  #include "portmidi.h"
  #include "porttime.h"
- #include "pminternal.h"
  
  static PmStream *mac_midiindevlist[MAXMIDIINDEV];
--- 22,25 ----

Index: m_pd.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_pd.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** m_pd.h	6 Aug 2007 16:39:54 -0000	1.19
--- m_pd.h	18 Aug 2007 23:32:43 -0000	1.20
***************
*** 12,16 ****
  #define PD_MINOR_VERSION 41
  #define PD_BUGFIX_VERSION 0
! #define PD_TEST_VERSION "test05"
  
  /* old name for "MSW" flag -- we have to take it for the sake of many old
--- 12,16 ----
  #define PD_MINOR_VERSION 41
  #define PD_BUGFIX_VERSION 0
! #define PD_TEST_VERSION "test06"
  
  /* old name for "MSW" flag -- we have to take it for the sake of many old

Index: m_sched.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_sched.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** m_sched.c	20 Jul 2007 03:25:20 -0000	1.9
--- m_sched.c	18 Aug 2007 23:32:44 -0000	1.10
***************
*** 8,11 ****
--- 8,14 ----
  #include "m_imp.h"
  #include "s_stuff.h"
+ #ifdef MSW
+ #include <windows.h>
+ #endif
  
      /* LATER consider making this variable.  It's now the LCM of all sample
***************
*** 16,20 ****
  #include "pthread.h"
  
! 
  static int sys_quit;
  double sys_time;
--- 19,24 ----
  #include "pthread.h"
  
! #define SYS_QUIT_QUIT 1
! #define SYS_QUIT_RESTART 2
  static int sys_quit;
  double sys_time;
***************
*** 327,342 ****
  void dsp_tick(void);
  
! static int sched_usedacs = 1;
  static double sched_referencerealtime, sched_referencelogicaltime;
  double sys_time_per_dsp_tick;
  
! void sched_set_using_dacs(int flag)
  {
!     sched_usedacs = flag;
!     if (!flag)
      {
          sched_referencerealtime = sys_getrealtime();
          sched_referencelogicaltime = clock_getlogicaltime();
      }
      sys_time_per_dsp_tick = (TIMEUNITPERSEC) *
          ((double)sys_schedblocksize) / sys_dacsr;
--- 331,351 ----
  void dsp_tick(void);
  
! static int sched_useaudio = SCHED_AUDIO_POLL;
  static double sched_referencerealtime, sched_referencelogicaltime;
  double sys_time_per_dsp_tick;
  
! void sched_set_using_audio(int flag)
  {
!     sched_useaudio = flag;
!     if (flag == SCHED_AUDIO_NONE)
      {
          sched_referencerealtime = sys_getrealtime();
          sched_referencelogicaltime = clock_getlogicaltime();
      }
+         if (flag == SCHED_AUDIO_CALLBACK && sched_useaudio != SCHED_AUDIO_CALLBACK)
+                 sys_quit = SYS_QUIT_RESTART;
+         if (flag != SCHED_AUDIO_CALLBACK && sched_useaudio == SCHED_AUDIO_CALLBACK)
+                 post("sorry, can't turn off callbacks yet; restart Pd");  /* not right yet! */
+         
      sys_time_per_dsp_tick = (TIMEUNITPERSEC) *
          ((double)sys_schedblocksize) / sys_dacsr;
***************
*** 386,390 ****
  int (*sys_idlehook)(void);
  
! int m_scheduler( void)
  {
      int idlecount = 0;
--- 395,399 ----
  int (*sys_idlehook)(void);
  
! static void m_pollingscheduler( void)
  {
      int idlecount = 0;
***************
*** 411,415 ****
          sys_addhist(0);
      waitfortick:
!         if (sched_usedacs)
          {
  #ifdef THREAD_LOCKING
--- 420,424 ----
          sys_addhist(0);
      waitfortick:
!         if (sched_useaudio != SCHED_AUDIO_NONE)
          {
  #ifdef THREAD_LOCKING
***************
*** 434,437 ****
--- 443,451 ----
                  {
                      static double idletime;
+                                         if (sched_useaudio != SCHED_AUDIO_POLL)
+                                         {
+                                                 bug("m_pollingscheduler\n");
+                                                 return;
+                                         }
                          /* on 32nd idle, start a clock watch;  every
                          32 ensuing idles, check it */
***************
*** 442,446 ****
                          post("audio I/O stuck... closing audio\n");
                          sys_close_audio();
!                         sched_set_using_dacs(0);
                          goto waitfortick;
                      }
--- 456,460 ----
                          post("audio I/O stuck... closing audio\n");
                          sys_close_audio();
!                         sched_set_using_audio(SCHED_AUDIO_NONE);
                          goto waitfortick;
                      }
***************
*** 476,480 ****
              sched_pollformeters();
              sys_reportidle();
- 
  #ifdef THREAD_LOCKING
              sys_unlock();   /* unlock while we idle */
--- 490,493 ----
***************
*** 490,497 ****
              sys_lock();
  #endif
- 
              sys_addhist(5);
              sched_didnothing++;
- 
          }
      }
--- 503,508 ----
***************
*** 500,507 ****
      sys_unlock();
  #endif
  
!     return (0);
  }
  
  
  /* ------------ thread locking ------------------- */
--- 511,561 ----
      sys_unlock();
  #endif
+ }
  
! void sched_audio_callbackfn(void)
! {
!     sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
!     sys_addhist(1);
!     sched_tick(sys_time + sys_time_per_dsp_tick);
!     sys_addhist(2);
!     sys_pollmidiqueue();
!     sys_addhist(3);
!     sys_pollgui();
!     sys_addhist(5);
!     sched_pollformeters();
!     sys_addhist(0);
! }
! 
! static void m_callbackscheduler(void)
! {
!     sys_initmidiqueue();
!     while (1)
!     {
! #ifdef MSW
!     Sleep(1000);
! #else
! 	sleep(1);
! #endif
!         if (sys_idlehook)
!             sys_idlehook();
!     }
  }
  
+ int m_mainloop(void)
+ {
+     while (sys_quit != SYS_QUIT_QUIT)
+     {
+         if (sched_useaudio == SCHED_AUDIO_CALLBACK)
+             m_callbackscheduler();
+         else m_pollingscheduler();
+         if (sys_quit == SYS_QUIT_RESTART)
+         {
+             sys_quit = 0;
+             sys_close_audio();
+             sys_reopen_audio();
+         }
+     }
+     return (0);
+ }
  
  /* ------------ thread locking ------------------- */
***************
*** 535,538 ****
  void sys_exit(void)
  {
!         sys_quit = 1;
  }
--- 589,592 ----
  void sys_exit(void)
  {
!     sys_quit = SYS_QUIT_QUIT;
  }

Index: t_tkcmd.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/t_tkcmd.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** t_tkcmd.c	31 Dec 2005 20:55:25 -0000	1.7
--- t_tkcmd.c	18 Aug 2007 23:32:44 -0000	1.8
***************
*** 620,636 ****
      const char *argv = Tcl_GetVar(interp, "argv", 0);
      int portno, argno = 0;
-         /* argument passing seems to be different in MSW as opposed to
-         unix-likes.  Here we check if we got sent a "port number" as an
-         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. */
- #ifdef MSW
      if (argv && (portno = atoi(argv)) > 1)
- #else
-     char *firstspace;
-     if (argv && (firstspace = strchr(argv, ' ')) && (portno = atoi(firstspace)) > 1)
- #endif
          pdgui_setsock(portno);
  #ifdef DEBUGCONNECT
!     debugfd = fopen("/Users/msp/bratwurst", "w");
      fprintf(debugfd, "turning stderr back on\n");
      fflush(debugfd);
--- 620,628 ----
      const char *argv = Tcl_GetVar(interp, "argv", 0);
      int portno, argno = 0;
      if (argv && (portno = atoi(argv)) > 1)
          pdgui_setsock(portno);
  #ifdef DEBUGCONNECT
!         pd_portno = portno;
!     debugfd = fopen("/tmp/bratwurst", "w");
      fprintf(debugfd, "turning stderr back on\n");
      fflush(debugfd);

Index: s_audio_mmio.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio_mmio.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** s_audio_mmio.c	28 Nov 2004 21:20:42 -0000	1.5
--- s_audio_mmio.c	18 Aug 2007 23:32:44 -0000	1.6
***************
*** 695,699 ****
  /* ------------------- public routines -------------------------- */
  
! void mmio_open_audio(int naudioindev, int *audioindev,
      int nchindev, int *chindev, int naudiooutdev, int *audiooutdev,
      int nchoutdev, int *choutdev, int rate)
--- 695,699 ----
  /* ------------------- public routines -------------------------- */
  
! int mmio_open_audio(int naudioindev, int *audioindev,
      int nchindev, int *chindev, int naudiooutdev, int *audiooutdev,
      int nchoutdev, int *choutdev, int rate)
***************
*** 725,729 ****
      if (naudiooutdev > 1 || naudioindev > 1)
   post("separate audio device choice not supported; using sequential devices.");
!     mmio_do_open_audio();
  }
  
--- 725,729 ----
      if (naudiooutdev > 1 || naudioindev > 1)
   post("separate audio device choice not supported; using sequential devices.");
!     return (mmio_do_open_audio());
  }
  

Index: s_audio_pa.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio_pa.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** s_audio_pa.c	3 Jun 2006 19:13:07 -0000	1.6
--- s_audio_pa.c	18 Aug 2007 23:32:44 -0000	1.7
***************
*** 24,43 ****
  static int pa_inchans, pa_outchans;
  static float *pa_soundin, *pa_soundout;
  
  #define MAX_PA_CHANS 32
  #define MAX_SAMPLES_PER_FRAME MAX_PA_CHANS * DEFDACBLKSIZE
  
! #ifndef PA19
! #define Pa_GetDeviceCount Pa_CountDevices
! #endif
  
  int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin,
      t_sample *soundout, int framesperbuf, int nbuffers,
!     int indeviceno, int outdeviceno)
  {
      PaError err;
      static int initialized;
      int j, devno, pa_indev = 0, pa_outdev = 0;
! 
      if (!initialized)
      {
--- 24,159 ----
  static int pa_inchans, pa_outchans;
  static float *pa_soundin, *pa_soundout;
+ static t_audiocallback pa_callback;
  
  #define MAX_PA_CHANS 32
  #define MAX_SAMPLES_PER_FRAME MAX_PA_CHANS * DEFDACBLKSIZE
  
! static int pa_lowlevel_callback(const void *inputBuffer,
!     void *outputBuffer, unsigned long framesPerBuffer,
!     const PaStreamCallbackTimeInfo *outTime, PaStreamCallbackFlags myflags, 
!     void *userData)
! {
!     int i; 
!     unsigned int j;
!     float *fbuf, *fp2, *fp3, *soundiop;
!         if (framesPerBuffer != DEFDACBLKSIZE)
!         {
!                 fprintf(stderr, "ignoring buffer size %d\n", framesPerBuffer);
!                 return;
!     }
!         if (inputBuffer != NULL)
!     {
!         fbuf = (float *)inputBuffer;
!         soundiop = pa_soundin;
!         for (i = 0, fp2 = fbuf; i < pa_inchans; i++, fp2++)
!             for (j = 0, fp3 = fp2; j < framesPerBuffer; j++, fp3 += pa_inchans)
!                 *soundiop++ = *fp3;
!     }
!     else memset((void *)pa_soundin, 0,
!         framesPerBuffer * pa_inchans * sizeof(float));
!     (*pa_callback)();
!     if (outputBuffer != NULL)
!     {
!         fbuf = (float *)outputBuffer;
!         soundiop = pa_soundout;
!         for (i = 0, fp2 = fbuf; i < pa_outchans; i++, fp2++)
!             for (j = 0, fp3 = fp2; j < framesPerBuffer; j++, fp3 += pa_outchans)
!                 *fp3 = *soundiop++;
!     }
! 
!     return 0;
! }
! 
! PaError pa_open_callback(double sampleRate, int inchannels, int outchannels,
!     int framesperbuf, int nbuffers, int indeviceno, int outdeviceno)
! {
!     long   bytesPerSample;
!     PaError err;
!     PABLIO_Stream *pastream;
!     long   numFrames;
!     PaStreamParameters instreamparams, outstreamparams;
! 
!     if (indeviceno < 0) 
!     {
!         indeviceno = Pa_GetDefaultInputDevice();
!         fprintf(stderr, "using default input device number: %d\n", indeviceno);
!     }
!     if (outdeviceno < 0)
!     {
!         outdeviceno = Pa_GetDefaultOutputDevice();
!         fprintf(stderr, "using default output device number: %d\n", outdeviceno);
!     }
!     /* fprintf(stderr, "nchan %d, flags %d, bufs %d, framesperbuf %d\n",
!             nchannels, flags, nbuffers, framesperbuf); */
! 
!     /* Allocate PABLIO_Stream structure for caller. */
!     pastream = (PABLIO_Stream *)malloc( sizeof(PABLIO_Stream));
!     if (pastream == NULL)
!         return (1);
!     memset(pastream, 0, sizeof(PABLIO_Stream));
! 
!     /* Determine size of a sample. */
!     bytesPerSample = Pa_GetSampleSize(paFloat32);
!     if (bytesPerSample < 0)
!     {
!         err = (PaError) bytesPerSample;
!         goto error;
!     }
!     pastream->insamplesPerFrame = inchannels;
!     pastream->inbytesPerFrame = bytesPerSample * pastream->insamplesPerFrame;
!     pastream->outsamplesPerFrame = outchannels;
!     pastream->outbytesPerFrame = bytesPerSample * pastream->outsamplesPerFrame;
! 
!     numFrames = nbuffers * framesperbuf;
! 
!     instreamparams.device = indeviceno;
!     instreamparams.channelCount = inchannels;
!     instreamparams.sampleFormat = paFloat32;
!     instreamparams.suggestedLatency = nbuffers*framesperbuf/sampleRate;
!     instreamparams.hostApiSpecificStreamInfo = 0;
!     
!     outstreamparams.device = outdeviceno;
!     outstreamparams.channelCount = outchannels;
!     outstreamparams.sampleFormat = paFloat32;
!     outstreamparams.suggestedLatency = nbuffers*framesperbuf/sampleRate;
!     outstreamparams.hostApiSpecificStreamInfo = 0;
! 
!     err = Pa_OpenStream(
!               &pastream->stream,
!               (inchannels ? &instreamparams : 0),
!               (outchannels ? &outstreamparams : 0),
!               sampleRate,
!               DEFDACBLKSIZE,
!               paNoFlag,      /* portaudio will clip for us */
!               pa_lowlevel_callback,
!               pastream);
!     if (err != paNoError)
!         goto error;
! 
!     err = Pa_StartStream(pastream->stream);
!     if (err != paNoError)
!     {
!         fprintf(stderr, "Pa_StartStream failed; closing audio stream...\n");
!         CloseAudioStream( pastream );
!         goto error;
!     }
!     pa_stream = pastream;
!     return paNoError;
! error:
!     pa_stream = NULL;
!     return err;
! }
  
  int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin,
      t_sample *soundout, int framesperbuf, int nbuffers,
!     int indeviceno, int outdeviceno, t_audiocallback callbackfn)
  {
      PaError err;
      static int initialized;
      int j, devno, pa_indev = 0, pa_outdev = 0;
!     
!     pa_callback = callbackfn;
!     if (callbackfn)
!         fprintf(stderr, "callback enabled\n");
      if (!initialized)
      {
***************
*** 106,129 ****
          post("framesperbuf %d, nbufs %d", framesperbuf, nbuffers);
      }
!     if (inchans || outchans)
          err = OpenAudioStream( &pa_stream, rate, paFloat32,
              inchans, outchans, framesperbuf, nbuffers,
                  pa_indev, pa_outdev);
!     else err = 0;
      if ( err != paNoError ) 
      {
!         fprintf( stderr, "Error number %d occured opening portaudio stream\n",
              err); 
          fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
          Pa_Terminate();
-         sys_inchannels = sys_outchannels = 0;
          return (1);
      }
      else if (sys_verbose)
          post("... opened OK.");
-     pa_inchans = inchans;
-     pa_outchans = outchans;
-     pa_soundin = soundin;
-     pa_soundout = soundout;
      return (0);
  }
--- 222,253 ----
          post("framesperbuf %d, nbufs %d", framesperbuf, nbuffers);
      }
!     pa_inchans = inchans;
!     pa_outchans = outchans;
!     pa_soundin = soundin;
!     pa_soundout = soundout;
!     if (! inchans && !outchans)
!         return(0);
!     if (callbackfn)
!     {
!         pa_callback = callbackfn;
!         err = pa_open_callback(rate, inchans, outchans,
!             framesperbuf, nbuffers, pa_indev, pa_outdev);
!     }
!     else
!     {
          err = OpenAudioStream( &pa_stream, rate, paFloat32,
              inchans, outchans, framesperbuf, nbuffers,
                  pa_indev, pa_outdev);
!     }
      if ( err != paNoError ) 
      {
!         fprintf(stderr, "Error number %d opening portaudio stream\n",
              err); 
          fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
          Pa_Terminate();
          return (1);
      }
      else if (sys_verbose)
          post("... opened OK.");
      return (0);
  }
***************
*** 236,250 ****
          fprintf(stderr, "%d inputs, ", pdi->maxInputChannels  );
          fprintf(stderr, "%d outputs", pdi->maxOutputChannels  );
- #ifdef PA19
          if ( i == Pa_GetDefaultInputDevice() )
              fprintf(stderr, " (Default Input)");
          if ( i == Pa_GetDefaultOutputDevice() )
              fprintf(stderr, " (Default Output)");
- #else
-         if ( i == Pa_GetDefaultInputDeviceID() )
-             fprintf(stderr, " (Default Input)");
-         if ( i == Pa_GetDefaultOutputDeviceID() )
-             fprintf(stderr, " (Default Output)");
- #endif
          fprintf(stderr, "\n");
      }
--- 360,367 ----

Index: s_audio.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** s_audio.c	4 Oct 2006 19:35:06 -0000	1.12
--- s_audio.c	18 Aug 2007 23:32:44 -0000	1.13
***************
*** 30,34 ****
  
  static void audio_getdevs(char *indevlist, int *nindevs,
!     char *outdevlist, int *noutdevs, int *canmulti, 
          int maxndev, int devdescsize);
  
--- 30,34 ----
  
  static void audio_getdevs(char *indevlist, int *nindevs,
!     char *outdevlist, int *noutdevs, int *canmulti, int *cancallback, 
          int maxndev, int devdescsize);
  
***************
*** 66,69 ****
--- 66,72 ----
  static int audio_rate;
  static int audio_advance;
+ static int audio_callback;
+ 
+ void sched_audio_callbackfn(void);
  
  static int audio_isopen(void)
***************
*** 77,81 ****
      int *pnaudioindev, int *paudioindev, int *chindev,
      int *pnaudiooutdev, int *paudiooutdev, int *choutdev,
!     int *prate, int *padvance)
  {
      int i;
--- 80,84 ----
      int *pnaudioindev, int *paudioindev, int *chindev,
      int *pnaudiooutdev, int *paudiooutdev, int *choutdev,
!     int *prate, int *padvance, int *pcallback)
  {
      int i;
***************
*** 90,93 ****
--- 93,97 ----
      *prate = audio_rate;
      *padvance = audio_advance;
+     *pcallback = audio_callback;
  }
  
***************
*** 95,99 ****
      int naudioindev, int *audioindev, int *chindev,
      int naudiooutdev, int *audiooutdev, int *choutdev,
!     int rate, int advance)
  {
      int i;
--- 99,103 ----
      int naudioindev, int *audioindev, int *chindev,
      int naudiooutdev, int *audiooutdev, int *choutdev,
!     int rate, int advance, int callback)
  {
      int i;
***************
*** 108,111 ****
--- 112,116 ----
      audio_rate = rate;
      audio_advance = advance;
+     audio_callback = callback;
  }
  
***************
*** 166,177 ****
  /* ----------------------- public routines ----------------------- */
  
!     /* open audio devices (after cleaning up the specified device and channel
!     vectors).  The audio devices are "zero based" (i.e. "0" means the first
!     one.)  We also save the cleaned-up device specification so that we
!     can later re-open audio and/or show the settings on a dialog window. */
  
! void sys_open_audio(int naudioindev, int *audioindev, int nchindev,
      int *chindev, int naudiooutdev, int *audiooutdev, int nchoutdev,
!     int *choutdev, int rate, int advance, int enable)
  {
      int i, *ip;
--- 171,182 ----
  /* ----------------------- public routines ----------------------- */
  
!     /* set audio device settings (after cleaning up the specified device and
!     channel vectors).  The audio devices are "zero based" (i.e. "0" means the
!     first one.)  We can later re-open audio and/or show the settings on a\
!     dialog window. */
  
! void sys_set_audio_settings(int naudioindev, int *audioindev, int nchindev,
      int *chindev, int naudiooutdev, int *audiooutdev, int nchoutdev,
!     int *choutdev, int rate, int advance, int callback)
  {
      int i, *ip;
***************
*** 182,189 ****
  
      char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
!     int indevs = 0, outdevs = 0, canmulti = 0;
      audio_getdevs(indevlist, &indevs, outdevlist, &outdevs, &canmulti,
!         MAXNDEV, DEVDESCSIZE);
! 
      if (sys_externalschedlib)
      {
--- 187,193 ----
  
      char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
!     int indevs = 0, outdevs = 0, canmulti = 0, cancallback = 0;
      audio_getdevs(indevlist, &indevs, outdevlist, &outdevs, &canmulti,
!         &cancallback, MAXNDEV, DEVDESCSIZE);
      if (sys_externalschedlib)
      {
***************
*** 320,390 ****
          nrealoutdev++;
      }
-         /* if no input or output devices seem to have been specified,
-         this really means just disable audio, which we now do. */
-     if (!inchans && !outchans)
-         enable = 0;
      sys_schedadvance = advance * 1000;
      sys_setchsr(inchans, outchans, rate);
      sys_log_error(ERR_NOTHING);
!     if (enable)
!     {
! #ifdef USEAPI_PORTAUDIO
!         if (sys_audioapi == API_PORTAUDIO)
!         {
!             int blksize = (sys_blocksize ? sys_blocksize : 64);
!             pa_open_audio(inchans, outchans, rate, sys_soundin, sys_soundout,
!                 blksize, sys_advance_samples/blksize,
!                     (naudiooutdev > 0 ? audioindev[0] : 0),
!                         (naudiooutdev > 0 ? audiooutdev[0] : 0));
!         }
! else
! #endif
! #ifdef USEAPI_JACK
!         if (sys_audioapi == API_JACK) 
!             jack_open_audio((nrealindev > 0 ? realinchans[0] : 0),
!                 (nrealoutdev > 0 ? realoutchans[0] : 0), rate);
! 
!         else
! #endif    
! #ifdef USEAPI_OSS
!         if (sys_audioapi == API_OSS)
!             oss_open_audio(nrealindev, realindev, nrealindev, realinchans,
!                 nrealoutdev, realoutdev, nrealoutdev, realoutchans, rate);
!         else
! #endif
! #ifdef USEAPI_ALSA
!             /* for alsa, only one device is supported; it may
!             be open for both input and output. */
!         if (sys_audioapi == API_ALSA)
!             alsa_open_audio(nrealindev, audioindev, nrealindev, realinchans,
!                 nrealoutdev, audiooutdev, nrealoutdev, realoutchans, rate);
!         else 
! #endif
! #ifdef USEAPI_SGI
!         if (sys_audioapi == API_SGI)
!         {
!             xtern int sgi_open_audio(int nindev,  int *indev,  int nchin,
!                 int *chin,  int noutdev, int *outdev, int nchout, int *chout,
!                 int rate);
!             sgi_open_audio(naudioindev, audioindev, nchindev, chindev,
!                     naudiooutdev, audiooutdev, nchoutdev, choutdev, rate);
!         }
!         else
! #endif
! #ifdef USEAPI_MMIO
!         if (sys_audioapi == API_MMIO)
!             mmio_open_audio(nrealindev, audioindev, nrealindev, realinchans,
!                 nrealoutdev, audiooutdev, nrealoutdev, realoutchans, rate);
!         else
! #endif
!             post("unknown audio API specified");
!     }
!     sys_save_audio_params(naudioindev, audioindev, chindev,
!         naudiooutdev, audiooutdev, choutdev, sys_dacsr, advance);
!     if (sys_inchannels == 0 && sys_outchannels == 0)
!         enable = 0;
!     audio_state = enable;
!     sys_vgui("set pd_whichapi %d\n",  (audio_isopen() ? sys_audioapi : 0));
!     sched_set_using_dacs(enable);
  }
  
--- 324,332 ----
          nrealoutdev++;
      }
      sys_schedadvance = advance * 1000;
      sys_setchsr(inchans, outchans, rate);
      sys_log_error(ERR_NOTHING);
!     sys_save_audio_params(nrealindev, realindev, realinchans,
!         nrealoutdev, realoutdev, realoutchans, sys_dacsr, advance, callback);
  }
  
***************
*** 417,428 ****
      else
  #endif
- #ifdef USEAPI_SGI
-     if (sys_audioapi == API_SGI)
-     {
-         extern void sgi_close_audio(void);
-         sgi_close_audio();
-     }
-     else
- #endif
  #ifdef USEAPI_MMIO
      if (sys_audioapi == API_MMIO)
--- 359,362 ----
***************
*** 432,435 ****
--- 366,370 ----
          post("sys_close_audio: unknown API %d", sys_audioapi);
      sys_inchannels = sys_outchannels = 0;
+     sched_set_using_audio(SCHED_AUDIO_NONE);
  }
  
***************
*** 439,447 ****
      int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
      int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
!     int rate, advance;
      sys_get_audio_params(&naudioindev, audioindev, chindev,
!         &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
!     sys_open_audio(naudioindev, audioindev, naudioindev, chindev,
!         naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate, advance, 1);
  }
  
--- 374,438 ----
      int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
      int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
!     int rate, advance, callback, outcome = 0;
      sys_get_audio_params(&naudioindev, audioindev, chindev,
!         &naudiooutdev, audiooutdev, choutdev, &rate, &advance, &callback);
!     if (!naudioindev && !naudiooutdev)
!     {
!         sched_set_using_audio(SCHED_AUDIO_NONE);
!         return;
!     }
! #ifdef USEAPI_PORTAUDIO
!     if (sys_audioapi == API_PORTAUDIO)
!     {
!         int blksize = (sys_blocksize ? sys_blocksize : 64);
!         outcome = pa_open_audio((naudioindev > 0 ? chindev[0] : 0),
!         (naudiooutdev > 0 ? choutdev[0] : 0), rate, sys_soundin,
!             sys_soundout, blksize, sys_advance_samples/blksize, 
!              (naudioindev > 0 ? audioindev[0] : 0),
!               (naudiooutdev > 0 ? audiooutdev[0] : 0),
!                (callback ? sched_audio_callbackfn : 0));
!     }
!     else
! #endif
! #ifdef USEAPI_JACK
!     if (sys_audioapi == API_JACK) 
!         outcome = jack_open_audio((naudioindev > 0 ? chindev[0] : 0),
!             (naudioindev > 0 ? choutdev[0] : 0), rate);
! 
!     else
! #endif    
! #ifdef USEAPI_OSS
!     if (sys_audioapi == API_OSS)
!         outcome = oss_open_audio(naudioindev, audioindev, naudioindev,
!             chindev, naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate);
!     else
! #endif
! #ifdef USEAPI_ALSA
!         /* for alsa, only one device is supported; it may
!         be open for both input and output. */
!     if (sys_audioapi == API_ALSA)
!         outcome = alsa_open_audio(naudioindev, audioindev, naudioindev,
!             chindev, naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate);
!     else 
! #endif
! #ifdef USEAPI_MMIO
!     if (sys_audioapi == API_MMIO)
!         outcome = mmio_open_audio(naudioindev, audioindev, naudioindev,
!             chindev, naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate);
!     else
! #endif
!         post("unknown audio API specified");
!     if (outcome)    /* failed */
!     {
!         audio_state = 0;
!         sched_set_using_audio(SCHED_AUDIO_NONE);
!     }
!     else
!     {
!         audio_state = 1;
!         sched_set_using_audio(
!             (callback ? SCHED_AUDIO_CALLBACK : SCHED_AUDIO_POLL));
!     }
!     sys_vgui("set pd_whichapi %d\n",  (outcome == 0 ? sys_audioapi : 0));
  }
  
***************
*** 490,501 ****
      else
  #endif
- #ifdef USEAPI_SGI
-     if (sys_audioapi == API_SGI)
-     {
-         extern int sgi_send_dacs(void);
-         return (sgi_send_dacs());
-     }
-     else
- #endif
  #ifdef USEAPI_MMIO
      if (sys_audioapi == API_MMIO)
--- 481,484 ----
***************
*** 540,547 ****
  
  static void audio_getdevs(char *indevlist, int *nindevs,
!     char *outdevlist, int *noutdevs, int *canmulti, 
          int maxndev, int devdescsize)
  {
      audio_init();
  #ifdef USEAPI_PORTAUDIO
      if (sys_audioapi == API_PORTAUDIO)
--- 523,531 ----
  
  static void audio_getdevs(char *indevlist, int *nindevs,
!     char *outdevlist, int *noutdevs, int *canmulti, int *cancallback,
          int maxndev, int devdescsize)
  {
      audio_init();
+     *cancallback = 0;   /* may be overridden by specific API implementation */
  #ifdef USEAPI_PORTAUDIO
      if (sys_audioapi == API_PORTAUDIO)
***************
*** 549,552 ****
--- 533,537 ----
          pa_getdevs(indevlist, nindevs, outdevlist, noutdevs, canmulti,
              maxndev, devdescsize);
+         *cancallback = 1;
      }
      else
***************
*** 576,590 ****
      else
  #endif
- #ifdef USEAPI_SGI
-     if (sys_audioapi == API_SGI)
-     {
-         extern void sgi_getdevs(char *indevlist, int *nindevs,
-             char *outdevlist, int *noutdevs, int *canmulti, 
-             int maxndev, int devdescsize);
-         sgi_getdevs(indevlist, nindevs, outdevlist, noutdevs, canmulti,
-             maxndev, devdescsize);
-     }
-     else
- #endif
  #ifdef USEAPI_MMIO
      if (sys_audioapi == API_MMIO)
--- 561,564 ----
***************
*** 612,619 ****
  {
      char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
!     int nindevs = 0, noutdevs = 0, i, canmulti = 0;
  
      audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
!         MAXNDEV, DEVDESCSIZE);
  
      if (!nindevs)
--- 586,593 ----
  {
      char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
!     int nindevs = 0, noutdevs = 0, i, canmulti = 0, cancallback = 0;
  
      audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
!         &cancallback, MAXNDEV, DEVDESCSIZE);
  
      if (!nindevs)
***************
*** 654,664 ****
          audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
          audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4;
!     int rate, advance;
          /* these are all the devices on your system: */
      char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
!     int nindevs = 0, noutdevs = 0, canmulti = 0, i;
  
      audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
!         MAXNDEV, DEVDESCSIZE);
  
      sys_gui("global audio_indevlist; set audio_indevlist {}\n");
--- 628,638 ----
          audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
          audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4;
!     int rate, advance, callback;
          /* these are all the devices on your system: */
      char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
!     int nindevs = 0, noutdevs = 0, canmulti = 0, cancallback = 0, i;
  
      audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
!          &cancallback, MAXNDEV, DEVDESCSIZE);
  
      sys_gui("global audio_indevlist; set audio_indevlist {}\n");
***************
*** 673,677 ****
  
      sys_get_audio_params(&naudioindev, audioindev, chindev,
!         &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
  
      /* post("naudioindev %d naudiooutdev %d longform %f",
--- 647,651 ----
  
      sys_get_audio_params(&naudioindev, audioindev, chindev,
!         &naudiooutdev, audiooutdev, choutdev, &rate, &advance, &callback);
  
      /* post("naudioindev %d naudiooutdev %d longform %f",
***************
*** 700,709 ****
  %d %d %d %d %d %d %d %d \
  %d %d %d %d %d %d %d %d \
! %d %d %d %d\n",
          audioindev1, audioindev2, audioindev3, audioindev4, 
          audioinchan1, audioinchan2, audioinchan3, audioinchan4, 
          audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
          audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4, 
!         rate, advance, canmulti, (flongform != 0));
      gfxstub_deleteforkey(0);
      gfxstub_new(&glob_pdobject, (void *)glob_audio_properties, buf);
--- 674,684 ----
  %d %d %d %d %d %d %d %d \
  %d %d %d %d %d %d %d %d \
! %d %d %d %d %d\n",
          audioindev1, audioindev2, audioindev3, audioindev4, 
          audioinchan1, audioinchan2, audioinchan3, audioinchan4, 
          audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
          audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4, 
!         rate, advance, canmulti, (cancallback ? callback : -1),
!         (flongform != 0));
      gfxstub_deleteforkey(0);
      gfxstub_new(&glob_pdobject, (void *)glob_audio_properties, buf);
***************
*** 722,725 ****
--- 697,701 ----
      int newrate = atom_getintarg(16, argc, argv);
      int newadvance = atom_getintarg(17, argc, argv);
+     int newcallback = atom_getintarg(18, argc, argv);
      int statewas;
  
***************
*** 754,762 ****
          }
      }
! 
!     sys_close_audio();
!     sys_open_audio(nindev, newaudioindev, nindev, newaudioinchan,
          noutdev, newaudiooutdev, noutdev, newaudiooutchan,
!         newrate, newadvance, 1);
  }
  
--- 730,745 ----
          }
      }
!     
!     if (newcallback < 0)
!     	newcallback = 0;
!     post("callback %d new %d",audio_callback, newcallback) ;
!     if (audio_callback == newcallback)
!         sys_close_audio();
!     sys_set_audio_settings(nindev, newaudioindev, nindev, newaudioinchan,
          noutdev, newaudiooutdev, noutdev, newaudiooutchan,
!         newrate, newadvance, (newcallback >= 0 ? newcallback : 0));
!     post("callback %d new %d",audio_callback, newcallback) ;
!     if (audio_callback == newcallback)
!         sys_reopen_audio();
  }
  
***************
*** 783,792 ****
      else
  #endif
- #ifdef USEAPI_SGI
-         extern void sgi_listaudiodevs(void);
-     if (sys_audioapi == API_SGI)
-         sgi_listaudiodevs();
-     else
- #endif
  #ifdef USEAPI_MMIO
      if (sys_audioapi == API_MMIO)
--- 766,769 ----
***************
*** 842,846 ****
          sys_close_audio();
          audio_state = 0;
-         sched_set_using_dacs(0);
      }
  }
--- 819,822 ----
***************
*** 857,864 ****
      {
          if (audio_isopen())
-         {
              sys_close_audio();
-             sched_set_using_dacs(0);
-         }
      }
      audio_state = onoff;
--- 833,837 ----
***************
*** 889,895 ****
      sprintf(buf + strlen(buf), "{portaudio %d} ", API_PORTAUDIO);
  #endif
- #ifdef USEAPI_SGI
-     sprintf(buf + strlen(buf), "{SGI %d} ", API_SGI); n++;
- #endif
  #endif
       n++;
--- 862,865 ----
***************
*** 902,906 ****
      if (n < 2)
          strcpy(buf, "{}");
-     
  }
  
--- 872,875 ----

Index: s_file.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_file.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** s_file.c	2 Aug 2007 00:33:50 -0000	1.10
--- s_file.c	18 Aug 2007 23:32:44 -0000	1.11
***************
*** 289,293 ****
      int nmidiindev, midiindev[MAXMIDIINDEV];
      int nmidioutdev, midioutdev[MAXMIDIOUTDEV];
!     int i, rate = 0, advance = 0, api, nolib, maxi;
      char prefbuf[MAXPDSTRING], keybuf[80];
  
--- 289,293 ----
      int nmidiindev, midiindev[MAXMIDIINDEV];
      int nmidioutdev, midioutdev[MAXMIDIOUTDEV];
!     int i, rate = 0, advance = 0, callback = 0, api, nolib, maxi;
      char prefbuf[MAXPDSTRING], keybuf[80];
  
***************
*** 338,343 ****
      if (sys_getpreference("audiobuf", prefbuf, MAXPDSTRING))
          sscanf(prefbuf, "%d", &advance);
!     sys_open_audio(naudioindev, audioindev, naudioindev, chindev,
!         naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate, advance, 0);
          
          /* load MIDI preferences */
--- 338,346 ----
      if (sys_getpreference("audiobuf", prefbuf, MAXPDSTRING))
          sscanf(prefbuf, "%d", &advance);
!     if (sys_getpreference("callback", prefbuf, MAXPDSTRING))
!         sscanf(prefbuf, "%d", &callback);
!     sys_set_audio_settings(naudioindev, audioindev, naudioindev, chindev,
!         naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate, advance,
!         callback);
          
          /* load MIDI preferences */
***************
*** 424,428 ****
      int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
      int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
!     int i, rate, advance;
      char buf1[MAXPDSTRING], buf2[MAXPDSTRING];
      int nmidiindev, midiindev[MAXMIDIINDEV];
--- 427,431 ----
      int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
      int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
!     int i, rate, advance, callback;
      char buf1[MAXPDSTRING], buf2[MAXPDSTRING];
      int nmidiindev, midiindev[MAXMIDIINDEV];
***************
*** 437,441 ****
  
      sys_get_audio_params(&naudioindev, audioindev, chindev,
!         &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
  
      sys_putpreference("noaudioin", (naudioindev <= 0 ? "True" : "False"));
--- 440,444 ----
  
      sys_get_audio_params(&naudioindev, audioindev, chindev,
!         &naudiooutdev, audiooutdev, choutdev, &rate, &advance, &callback);
  
      sys_putpreference("noaudioin", (naudioindev <= 0 ? "True" : "False"));
***************
*** 460,463 ****
--- 463,469 ----
      sys_putpreference("rate", buf1);
  
+     sprintf(buf1, "%d", callback);
+     sys_putpreference("callback", buf1);
+ 
          /* MIDI settings */
      sys_get_midi_params(&nmidiindev, midiindev, &nmidioutdev, midioutdev);





More information about the Pd-cvs mailing list