[PD-cvs] pd/src s_audio_portaudio.c, NONE, 1.1.2.1 s_audio.c, 1.5.4.16.2.14, 1.5.4.16.2.15 SConscript, 1.1.4.44, 1.1.4.45 m_glob.c, 1.4.4.2.2.4, 1.4.4.2.2.5

Tim Blechmann timblech at users.sourceforge.net
Thu Apr 20 15:32:35 CEST 2006


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

Modified Files:
      Tag: devel_0_39
	s_audio.c SConscript m_glob.c 
Added Files:
      Tag: devel_0_39
	s_audio_portaudio.c 
Log Message:
importing new portaudio implementation
more message-based access to the audio api

Index: SConscript
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/SConscript,v
retrieving revision 1.1.4.44
retrieving revision 1.1.4.45
diff -C2 -d -r1.1.4.44 -r1.1.4.45
*** SConscript	17 Dec 2005 00:04:37 -0000	1.1.4.44
--- SConscript	20 Apr 2006 13:32:33 -0000	1.1.4.45
***************
*** 13,51 ****
  
  opt.AddOptions(
! 	BoolOption('debug', 'Build with debugging symbols', False),
! 	BoolOption('simd', 'Build with simd instructions', True),
! 	BoolOption('daz', 'Build using DAZ flag on x86-SSE2 cpus (must be set to False for AMD cpus)', False),
! 	BoolOption('portaudio', 'Build with portaudio', True),
! 	('portaudiopath', 'Path to portaudio','../portaudio'),
! 	BoolOption('threadedsf', 'Build with threaded soundfiler', False),
! 	BoolOption('atomic', 'Build with atomic operations', False),
! 	BoolOption('newhash', 'Build with 16 bit symbol hash table', True),
[...1025 lines suppressed...]
  
  Export("pdenv")
--- 624,640 ----
  
  if pdenv['pdlib']:
!     if pdenv['PLATFORM'] == 'win32':
!         envint.Append(LINKFLAGS=["/EXPORT:sys_main","/PDB:./bin/pd-dll.pdb"])
  
!     pdlib = envint.SharedLibrary('../bin/pd', sources)
!     pd = pdenv.Program('../bin/pd', 's_entry.c', LIBS=['./bin/pd'])
!     Default(pdsend, pdreceive, pdgui, pdlib, pd, pdtk)
  else:
!     pdlib = None
!     pd = envint.Program('../bin/pd', ['s_entry.c'] + sources)
!     Default(pdsend, pdreceive, pdgui, pd, pdtk)
  
  if pdenv['PLATFORM'] != 'win32':
!     Default(pdwatchdog)
  
  Export("pdenv")

Index: s_audio.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio.c,v
retrieving revision 1.5.4.16.2.14
retrieving revision 1.5.4.16.2.15
diff -C2 -d -r1.5.4.16.2.14 -r1.5.4.16.2.15
*** s_audio.c	14 Apr 2006 18:37:52 -0000	1.5.4.16.2.14
--- s_audio.c	20 Apr 2006 13:32:28 -0000	1.5.4.16.2.15
***************
*** 1345,1348 ****
--- 1345,1387 ----
  }
  
+ void glob_audio_getaudioindevinfo(t_pd * dummy, t_float f)
+ {
+ #ifdef USEAPI_PORTAUDIO
+ #ifndef PABLIO
+     if (sys_audioapi == API_PORTAUDIO)
+         pa_getaudioindevinfo(f);
+ #endif
+ #endif
+ }
+ 
+ void glob_audio_getaudiooutdevinfo(t_pd * dummy, t_float f)
+ {
+ #ifdef USEAPI_PORTAUDIO
+ #ifndef PABLIO
+     if (sys_audioapi == API_PORTAUDIO)
+         pa_getaudiooutdevinfo(f);
+ #endif
+ #endif
+ }
+ 
+ void glob_audio_testaudiosetting(t_pd * dummy, t_symbol *s, int ac, t_atom *av)
+ {
+ #ifdef USEAPI_PORTAUDIO
+ #ifndef PABLIO
+     if (sys_audioapi == API_PORTAUDIO)
+         pa_test_setting (ac, av);
+ #endif
+ #endif
+ }
+ 
+ void glob_audio_getcurrent_devices(void)
+ {
+ #ifdef USEAPI_PORTAUDIO
+ #ifndef PABLIO
+     if (sys_audioapi == API_PORTAUDIO)
+         pa_getcurrent_devices();
+ #endif
+ #endif
+ }
  
  /* tb } */

--- NEW FILE: s_audio_portaudio.c ---
/* Copyright (c) 2001 Miller Puckette and others.
 * Copyright (c) 2005-2006 Tim Blechmann
 * supported by vibrez.net
 * For information on usage and redistribution, and for a DISCLAIMER OF ALL
 * WARRANTIES, see the file, "LICENSE.txt," in this distribution.  */

/* this file calls Ross Bencina's and Phil Burk's Portaudio package.  It's
   the main way in for Mac OS and, with Michael Casey's help, also into
   ASIO in Windows. */

/* tb: requires portaudio >= V19 */

#include "m_pd.h"
#include "s_stuff.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <portaudio.h>
#include <errno.h>

#include "assert.h"

#ifdef MSW
# include <malloc.h>
#else
# include <alloca.h>
#endif

#include "pthread.h"

/* for M_PI */
#if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES)
#define _USE_MATH_DEFINES
#endif
#include <math.h>


#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()
{
    if (!pa_initialized)
    {
        pa_status = Pa_Initialize();
        if ( pa_status!= paNoError )
        {
            fprintf( stderr,
                "Error number %d occured initializing portaudio\n",
                pa_status);
            fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( pa_status ) );
            return;
        }
        pa_initialized = 1;
    }
}

static float* pa_inbuffer[MAX_PA_CHANS];
static float* pa_outbuffer[MAX_PA_CHANS];
static int pa_bufferpos;

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,
                          unsigned long                   framesPerBuffer,
                          const PaStreamCallbackTimeInfo* timeInfo,
                          PaStreamCallbackFlags           statusFlags,
                          void*                           userData);

static int pa_indev = -1, pa_outdev = -1;

int pa_open_audio(int inchans, int outchans, int rate, int advance, 
    int indeviceno, int outdeviceno, int schedmode)
{
    PaError err;
    int j, devno;

    schedmode = 1; /* we don't support blocking io */
    
    pa_initialize();    

    sys_setscheduler(schedmode);

    if (indeviceno != outdeviceno)
    {
        post("portaudio supports only one device for i/o");
        return 1;
    }

    /* post("in %d out %d rate %d device %d", inchans, outchans, rate, deviceno); */
    if (inchans > MAX_PA_CHANS)
    {
        post("input channels reduced to maximum %d", MAX_PA_CHANS);
        inchans = MAX_PA_CHANS;
    }
    if (outchans > MAX_PA_CHANS)
    {
        post("output channels reduced to maximum %d", MAX_PA_CHANS);
        outchans = MAX_PA_CHANS;
    }
    
    if (inchans > 0)
    {
        for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++)
        {
            const PaDeviceInfo *info = Pa_GetDeviceInfo(j);
            int maxchans = info->maxInputChannels;
            if (maxchans > 0)
            {
                if (devno == indeviceno)
                {
                    if (maxchans < inchans)
                        inchans = maxchans;
                    pa_indev = j;
                    break;
                }
                devno++;
            }
        }
    }
    
    if (outchans > 0)
    {
        for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++)
        {
            const PaDeviceInfo *info = Pa_GetDeviceInfo(j);
            int maxchans = info->maxOutputChannels;
            if (maxchans > 0)
            {
                if (devno == outdeviceno)
                {
                    if (maxchans < outchans)
                        outchans = maxchans;
                    pa_outdev = j;
                    break;
                }
                devno++;
            }
        }
    }

    if (1/* sys_verbose */)
    {
        post("input device %d, channels %d", pa_indev, inchans);
        post("output device %d, channels %d", pa_outdev, outchans);
        post("latency advance %d", advance);
    }
    if (inchans || outchans)
    {
        int blocksize;
        PaStreamParameters inputParameters, outputParameters;
        
        const PaDeviceInfo* pdi = Pa_GetDeviceInfo(pa_indev);
        const PaDeviceInfo* pdo = Pa_GetDeviceInfo(pa_outdev);
        
        assert(pdi);

        /* initialize input */
        inputParameters.device = pa_indev;
        inputParameters.channelCount = inchans;
        inputParameters.sampleFormat = paFloat32 | paNonInterleaved;
        inputParameters.suggestedLatency = advance * 0.001;
        inputParameters.hostApiSpecificStreamInfo = NULL;

        /* initialize output */
        outputParameters.device = pa_outdev;
        outputParameters.channelCount = outchans;
        outputParameters.sampleFormat = paFloat32 | paNonInterleaved;
        outputParameters.suggestedLatency = advance * 0.001;
        outputParameters.hostApiSpecificStreamInfo = NULL;

        /* set block size */
        blocksize =  sys_advance_samples;
        
        if (blocksize > 8192)
            blocksize = 8192;
        else if (blocksize < sys_dacblocksize)
            blocksize = sys_dacblocksize;
        
        if (blocksize != (1 << ilog2(blocksize)))
        {
            blocksize = (1 << ilog2(blocksize));
        }
        
        post("using blocksize %d", blocksize);
        
        pa_blocksize = blocksize;
    
        /* initialize io buffer */
        for (j=0; j != MAX_PA_CHANS;++j)
        {
            if (pa_inbuffer[j])
                freealignedbytes(pa_inbuffer[j], 0);
            
            if (pa_outbuffer[j])
                freealignedbytes(pa_outbuffer[j], 0);

            pa_inbuffer[j] = getalignedbytes((blocksize + sys_dacblocksize) * sizeof (float));
            pa_outbuffer[j] = getalignedbytes((blocksize + sys_dacblocksize) * sizeof (float));
        }
        pa_bufferpos = 0;

        /* report to portaudio */
        err = Pa_OpenStream(&pa_stream,
            ( (pa_indev  != -1) ? &inputParameters  : 0),
            ( (pa_outdev != -1) ? &outputParameters : 0), 
            rate,
            pa_blocksize,
            paClipOff, /* tb: we should be faster ;-) */
            process
            /* patestCallback */, NULL);

        if (err == paNoError)
        {
            const PaStreamInfo * streaminfo = Pa_GetStreamInfo (pa_stream);
            t_atom atoms[2];

            t_symbol * pd = gensym("pd");
            t_symbol * latency = gensym("latency");
            t_symbol * selector1 = gensym("audioindev");
            t_symbol * selector2 = gensym("audiooutdev");

            sys_schedadvance = 1e-6 * streaminfo->outputLatency;
            SETSYMBOL(atoms, latency);

            SETFLOAT(atoms+1, streaminfo->inputLatency);
            typedmess(pd->s_thing, selector1, 2, atoms);
            
            SETFLOAT(atoms+1, streaminfo->outputLatency);
            typedmess(pd->s_thing, selector2, 2, atoms);
        }
    }
    else
        err = 0;
    
    if ( err != paNoError )
    {
        post("Error number %d occured opening portaudio stream\n",
            err);
        post("Error message: %s\n", Pa_GetErrorText( err ) );
        sys_inchannels = sys_outchannels = 0;
        return (1);
    }
    else if (sys_verbose)
        post("... opened OK.");
    pa_inchans = inchans;
    pa_outchans = outchans;
    
    err = Pa_StartStream(pa_stream);
    
    if ( err != paNoError )
    {
        post("Error number %d occured starting portaudio stream\n",
            err);
        post("Error message: %s\n", Pa_GetErrorText(err));
        sys_inchannels = sys_outchannels = 0;
        return (1);
    }
    
    post("successfully started");
    
    return (0);
}


void sys_peakmeters(void);
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; i != framesPerBuffer / sys_dacblocksize; ++i)
    {
        sched_tick(sys_time + sys_time_per_dsp_tick);
    }
    
    return 0;
}

void run_all_idle_callbacks(void);

int process (const void *input, void *output, unsigned long frameCount, 
    const PaStreamCallbackTimeInfo* timeInfo, 
    PaStreamCallbackFlags statusFlags, void *userData)
{
    static started = 0;


    int i;
    int timeout = (float)frameCount / (float) sys_dacsr * 1e6;

    if (statusFlags)
        post("statusFlags %p", statusFlags);

    if (sys_timedlock(timeout) == ETIMEDOUT)
        /* we're late */
    {
        post("timeout %d", timeout);
        sys_log_error(ERR_SYSLOCK);
        return 0;
    }

    for (i = 0; i != frameCount / sys_dacblocksize; ++i)
    {
        int j;
        for (j = 0; j < sys_inchannels; j++)
        {
            t_sample * in = ((t_sample**)input)[j] + i * sys_dacblocksize;
            copyvec(sys_soundin + j * sys_dacblocksize,
                in, sys_dacblocksize);
        }
            
        sched_tick(sys_time + sys_time_per_dsp_tick);
            
        for (j = 0; j < sys_outchannels;  j++) 
        {
            t_sample * out = ((t_sample**)output)[j] + i * sys_dacblocksize;
            copyvec(out, sys_soundout + j * sys_dacblocksize,
                sys_dacblocksize);
        }
        /* update peak meters */
        if (sys_meters)
            sys_peakmeters();
            
        /* clear the output buffer */
        zerovec(sys_soundout, pa_outchans * sys_dacblocksize);
    }
    
    run_all_idle_callbacks();
    sys_unlock();
    
    return 0;
}

void pa_close_audio( void)
{
    post("closing portaudio");
    if (pa_inchans || pa_outchans)
    {
        if (pa_stream)
        {
            int status = Pa_StopStream(pa_stream);

            if (status)
                post("error closing audio: %d", status);

            Pa_CloseStream(pa_stream);
            pa_stream = NULL;
        }
    }
    sys_setscheduler(0);

    post("portaudio closed");
    pa_inchans = pa_outchans = 0;
    pa_indev = pa_outdev = -1;
}



/* for blocked IO */
int pa_send_dacs(void)
{
    /* we don't support blocking i/o */
    return SENDDACS_NO;
}



void pa_listdevs(void)     /* lifted from pa_devs.c in portaudio */
{
    int      i,j;
    int      numDevices;
    const    PaDeviceInfo *pdi;
    PaError  err;
    pa_initialize();    

    numDevices = Pa_GetDeviceCount();
    if( numDevices < 0 )
    {
        fprintf(stderr, "ERROR: Pa_GetDeviceCount returned %d\n", numDevices );
        err = numDevices;
        goto error;
    }
    fprintf(stderr, "Audio Devices:\n");
    for( i=0; i<numDevices; i++ )
    {
        const PaDeviceInfo *pdi = Pa_GetDeviceInfo( i );
        post ("device %s", pdi->name);
        fprintf(stderr, "device %d:", i+1 );
        fprintf(stderr, " %s;", pdi->name );
        fprintf(stderr, "%d inputs, ", pdi->maxInputChannels  );
        fprintf(stderr, "%d outputs", pdi->maxOutputChannels  );
        if ( i == Pa_GetDefaultInputDevice() )
            fprintf(stderr, " (Default Input)");
        if ( i == Pa_GetDefaultOutputDevice() )
            fprintf(stderr, " (Default Output)");
        fprintf(stderr, "\n");
    }

    fprintf(stderr, "\n");
    return;

 error:
    fprintf( stderr, "An error occured while using the portaudio stream\n" );
    fprintf( stderr, "Error number: %d\n", err );
    fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );

}


/* scanning for devices */
void pa_getdevs(char *indevlist, int *nindevs,
    char *outdevlist, int *noutdevs, int *canmulti,
    int maxndev, int devdescsize)
{
    int i, nin = 0, nout = 0, ndev;
    *canmulti = 1;  /* one dev each for input and output */

    pa_initialize();    

    ndev = Pa_GetDeviceCount();
    for (i = 0; i < ndev; i++)
    {
        const PaDeviceInfo *pdi = Pa_GetDeviceInfo(i);
        if (pdi->maxInputChannels > 0 && nin < maxndev)
        {
            PaHostApiIndex api = pdi->hostApi;
            const PaHostApiInfo * info = Pa_GetHostApiInfo (api);
            const char * apiName = info->name;
            unsigned int apiNameLen = strlen(apiName);
            strcpy(indevlist + nin * devdescsize, apiName);
            indevlist[nin * devdescsize + apiNameLen] = '/';
            strcpy(indevlist + nin * devdescsize + apiNameLen + 1, pdi->name);
            nin++;
        }
        if (pdi->maxOutputChannels > 0 && nout < maxndev)
        {
            PaHostApiIndex api = pdi->hostApi;
            const PaHostApiInfo * info = Pa_GetHostApiInfo (api);
            const char * apiName = info->name;
            unsigned int apiNameLen = strlen(apiName);
            strcpy(outdevlist + nout * devdescsize, apiName);
            
            outdevlist[nout * devdescsize + apiNameLen] = '/';
            strcpy(outdevlist + nout * devdescsize + apiNameLen + 1, pdi->name);
            nout++;
        }
    }
    *nindevs = nin;
    *noutdevs = nout;
}

void pa_getaudioindevinfo(t_float f)
{
    int i = (int)f;
    const PaDeviceInfo * pdi;
   
    pa_initialize();    
    pdi = Pa_GetDeviceInfo (i);

    if (pdi)
    {
        t_symbol * selector = gensym("audioindevinfo");
        t_symbol * pd = gensym("pd");
        t_atom argv[4];
        SETFLOAT(argv, pdi->maxInputChannels);
        SETFLOAT(argv+1, pdi->defaultSampleRate);
        SETFLOAT(argv+2, pdi->defaultLowInputLatency);
        SETFLOAT(argv+3, pdi->defaultHighInputLatency);
        typedmess(pd->s_thing, selector, 4, argv);
    }
}

void pa_getaudiooutdevinfo(t_float f)
{
    int i = (int)f;
    const PaDeviceInfo * pdi;
   
    pa_initialize();    
    pdi = Pa_GetDeviceInfo (i);

    if (pdi)
    {
        t_symbol * selector = gensym("audiooutdevinfo");
        t_symbol * pd = gensym("pd");
        t_atom argv[4];
        SETFLOAT(argv, pdi->maxOutputChannels);
        SETFLOAT(argv+1, pdi->defaultSampleRate);
        SETFLOAT(argv+2, pdi->defaultLowOutputLatency);
        SETFLOAT(argv+3, pdi->defaultHighOutputLatency);
        typedmess(pd->s_thing, selector, 4, argv);
    }
}

void pa_getcurrent_devices(void)
{
    t_symbol * pd = gensym("pd");
    t_symbol * selector = gensym("audiodevice");
    t_atom argv[2];
    SETFLOAT(argv, pa_indev);
    SETFLOAT(argv+1, pa_outdev);
    typedmess(pd->s_thing, selector, 2, argv);
}

void pa_test_setting (int ac, t_atom *av)
{
    int indev = atom_getfloatarg(0, ac, av);
    int outdev = atom_getfloatarg(1, ac, av);
    int samplerate = atom_getfloatarg(2, ac, av);
    int inchans = atom_getfloatarg(3, ac, av);
    int outchans = atom_getfloatarg(4, ac, av);
    int advance = atom_getfloatarg(5, ac, av);
    int blocksize =  (advance * samplerate) / (1000000.);
    t_symbol * pd = gensym("pd");
    t_symbol * selector = gensym("testaudiosettingresult");
    t_atom argv[1];
    int ret;
    PaStreamParameters inputParameters, outputParameters;
    
    if ((pa_indev == -1) && (pa_outdev == -1))
    {
        pa_initialize();
            
        inputParameters.device = indev;
        inputParameters.channelCount = inchans;
        inputParameters.sampleFormat = paFloat32 | paNonInterleaved;
        inputParameters.suggestedLatency = advance * 0.001;
        inputParameters.hostApiSpecificStreamInfo = NULL;
        
        outputParameters.device = outdev;
        outputParameters.channelCount = outchans;
        outputParameters.sampleFormat = paFloat32 | paNonInterleaved;
        outputParameters.suggestedLatency = advance * 0.001;
        outputParameters.hostApiSpecificStreamInfo = NULL;
        
        ret = Pa_IsFormatSupported(&inputParameters, &outputParameters, samplerate);
    
        SETFLOAT(argv, ret);
        typedmess(pd->s_thing, selector, 1, argv);
    }
}

Index: m_glob.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_glob.c,v
retrieving revision 1.4.4.2.2.4
retrieving revision 1.4.4.2.2.5
diff -C2 -d -r1.4.4.2.2.4 -r1.4.4.2.2.5
*** m_glob.c	27 Mar 2006 12:08:57 -0000	1.4.4.2.2.4
--- m_glob.c	20 Apr 2006 13:32:33 -0000	1.4.4.2.2.5
***************
*** 34,39 ****
  void glob_tooltips(t_pd *dummy, t_float f);
  /* tb: message-based audio configuration { */
! void glob_audio_getaudioindevices(t_pd * dummy, t_float f);
! void glob_audio_getaudiooutdevices(t_pd * dummy, t_float f);
  void glob_audio_samplerate(t_pd * dummy, t_float f);
  void glob_audio_delay(t_pd * dummy, t_float f);
--- 34,42 ----
  void glob_tooltips(t_pd *dummy, t_float f);
  /* tb: message-based audio configuration { */
! void glob_audio_testaudiosetting(t_pd * dummy, t_symbol *s, int ac, t_atom *av);
! void glob_audio_getaudioindevices(t_pd * dummy, t_symbol *s, int ac, t_atom *av);
! void glob_audio_getaudiooutdevices(t_pd * dummy, t_symbol *s, int ac, t_atom *av);
! void glob_audio_getaudioindevinfo(t_pd * dummy, t_float f);
! void glob_audio_getaudiooutdevinfo(t_pd * dummy, t_float f);
  void glob_audio_samplerate(t_pd * dummy, t_float f);
  void glob_audio_delay(t_pd * dummy, t_float f);
***************
*** 43,46 ****
--- 46,50 ----
  void glob_audio_device_in(t_pd * dummy, t_symbol *s, int argc, t_atom *argv);
  void glob_audio_device_out(t_pd * dummy, t_symbol *s, int argc, t_atom *argv);
+ void glob_audio_getcurrent_devices(void);
  /* tb } */
  
***************
*** 70,73 ****
--- 74,85 ----
      if (s == gensym("audiooutdev"))
          return;
+     if (s == gensym("audioindevinfo"))
+         return;
+     if (s == gensym("audiooutdevinfo"))
+         return;
+     if (s == gensym("testaudiosettingresult"))
+         return;
+     if (s == gensym("audiodevice"))
+         return;
      
      startpost("%s: unknown message %s ", class_getname(pd_class(x)),
***************
*** 132,155 ****
          gensym("save-preferences"), 0);
      class_addmethod(glob_pdobject, (t_method)glob_tooltips,
!     	gensym("tooltips"), A_DEFFLOAT, 0);
  	/* tb: message-based audio configuration { */
      class_addmethod(glob_pdobject, (t_method)glob_audio_samplerate,
          gensym("audio-samplerate"), A_DEFFLOAT, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_delay,
!     	gensym("audio-delay"), A_DEFFLOAT, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_dacblocksize,
          gensym("audio-dacblocksize"), A_DEFFLOAT, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_scheduler,
!     	gensym("audio-scheduler"), A_DEFFLOAT, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_device,
!     	gensym("audio-device"), A_GIMME, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_device_in,
!     	gensym("audio-device-in"), A_GIMME, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_device_out,
!     	gensym("audio-device-out"), A_GIMME, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_getaudioindevices,
!     	gensym("getaudioindev"), A_GIMME, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_getaudiooutdevices,
!     	gensym("getaudiooutdev"), A_GIMME, 0);
  	/* tb } */
  #ifdef UNIX
--- 144,175 ----
          gensym("save-preferences"), 0);
      class_addmethod(glob_pdobject, (t_method)glob_tooltips,
!         gensym("tooltips"), A_DEFFLOAT, 0);
  	/* tb: message-based audio configuration { */
      class_addmethod(glob_pdobject, (t_method)glob_audio_samplerate,
          gensym("audio-samplerate"), A_DEFFLOAT, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_delay,
!         	gensym("audio-delay"), A_DEFFLOAT, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_dacblocksize,
          gensym("audio-dacblocksize"), A_DEFFLOAT, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_scheduler,
!         gensym("audio-scheduler"), A_DEFFLOAT, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_device,
!         gensym("audio-device"), A_GIMME, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_device_in,
!         gensym("audio-device-in"), A_GIMME, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_device_out,
! 	    gensym("audio-device-out"), A_GIMME, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_getaudioindevices,
!     	    gensym("getaudioindev"), A_GIMME, 0);
      class_addmethod(glob_pdobject, (t_method)glob_audio_getaudiooutdevices,
!         gensym("getaudiooutdev"), A_GIMME, 0);
!     class_addmethod(glob_pdobject, (t_method)glob_audio_getaudioindevinfo,
!    	    gensym("getaudioindevinfo"), A_FLOAT, 0);
!     class_addmethod(glob_pdobject, (t_method)glob_audio_getaudiooutdevinfo,
!         gensym("getaudiooutdevinfo"), A_FLOAT, 0);	
!     class_addmethod(glob_pdobject, (t_method)glob_audio_testaudiosetting,
!         gensym("testaudiosetting"), A_GIMME, 0);  
!     class_addmethod(glob_pdobject, (t_method)glob_audio_getcurrent_devices,
!         gensym("getaudiodevice"), 0);  
  	/* tb } */
  #ifdef UNIX





More information about the Pd-cvs mailing list