[PD-cvs] pd/src makefile.vstwin,NONE,1.1.2.1 s_audio_vst.c,NONE,1.1.2.1 m_pd.h,1.1.1.4.2.10.2.3,1.1.1.4.2.10.2.4 m_sched.c,1.1.1.2.2.7.2.3,1.1.1.2.2.7.2.4 s_audio.c,1.1.1.1.2.7,1.1.1.1.2.7.2.1 s_entry.c,1.1.1.2.4.1,1.1.1.2.4.2 s_main.c,1.1.1.4.2.8.4.9,1.1.1.4.2.8.4.10

carmen rocco ix9 at users.sourceforge.net
Sat Apr 17 23:17:37 CEST 2004


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

Modified Files:
      Tag: impd_0_37
	m_pd.h m_sched.c s_audio.c s_entry.c s_main.c 
Added Files:
      Tag: impd_0_37
	makefile.vstwin s_audio_vst.c 
Log Message:
impdvst available on windows (-DVST) use makefile.vstwin


Index: m_pd.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_pd.h,v
retrieving revision 1.1.1.4.2.10.2.3
retrieving revision 1.1.1.4.2.10.2.4
diff -C2 -d -r1.1.1.4.2.10.2.3 -r1.1.1.4.2.10.2.4
*** m_pd.h	12 Apr 2004 04:46:45 -0000	1.1.1.4.2.10.2.3
--- m_pd.h	17 Apr 2004 21:17:30 -0000	1.1.1.4.2.10.2.4
***************
*** 597,600 ****
--- 597,640 ----
  EXTERN void c_addmess(t_method fn, t_symbol *sel, t_atomtype arg1, ...);
  
+ #ifdef VST
+ /* jsarlo { */
+ EXTERN double sys_time;
+ EXTERN double sys_time_per_dsp_tick;
+ EXTERN int sys_externalschedlib;
+ 
+ EXTERN t_sample* get_sys_soundout();
+ EXTERN t_sample* get_sys_soundin();
+ EXTERN int* get_sys_main_advance();
+ EXTERN double* get_sys_time_per_dsp_tick();
+ EXTERN int* get_sys_schedblocksize();
+ EXTERN double* get_sys_time();
+ EXTERN float* get_sys_dacsr();
+ EXTERN int* get_sys_sleepgrain();
+ EXTERN int* get_sys_schedadvance();
+ 
+ EXTERN void sys_clearhist();
+ EXTERN void sys_initmidiqueue();
+ EXTERN int sys_addhist(int phase);
+ EXTERN void sys_setmiditimediff(double inbuftime, double outbuftime);
+ EXTERN void sched_tick(double next_sys_time);
+ EXTERN void sys_pollmidiqueue();
+ EXTERN int sys_pollgui();
+ EXTERN void sys_setchsr(int chin, int chout, int sr);
+ 
+ EXTERN void inmidi_noteon(int portno, int channel, int pitch, int velo);
+ EXTERN void inmidi_controlchange(int portno,
+                                  int channel,
+                                  int ctlnumber,
+                                  int value);
+ EXTERN void inmidi_programchange(int portno, int channel, int value);
+ EXTERN void inmidi_pitchbend(int portno, int channel, int value);
+ EXTERN void inmidi_aftertouch(int portno, int channel, int value);
+ EXTERN void inmidi_polyaftertouch(int portno,
+                                   int channel,
+                                   int pitch,
+                                   int value);
+ /* } jsarlo */
+ #endif
+ 
  #define t_getbytes getbytes
  #define t_freebytes freebytes

--- NEW FILE: s_audio_vst.c ---
/* PdVst v0.0.2 - VST - Pd bridging plugin
** Copyright (C) 2004 Joseph A. Sarlo
**
** This program is free software; you can redistribute it and/orsig
** modify it under the terms of the GNU General Public License
** as published by the Free Software Foundation; either version 2
** of the License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
**
** jsarlo at ucsd.edu
*/

#define _WIN32_WINDOWS 0x410
#include <windows.h>
#include <io.h>
#include <stdio.h>
#include "m_pd.h"
#include "../../source/pdvst/pdvstTransfer.h"
#define MAXARGS 1024
#define MAXSTRLEN 1024
#define TIMEUNITPERSEC (32.*441000.)

typedef struct _vstParameterReceiver
{
    t_object x_obj;
    t_symbol *x_sym;
}t_vstParameterReceiver;

t_vstParameterReceiver *vstParameterReceivers[MAXPARAMETERS];

t_class *vstParameterReceiver_class;

char *pdvstTransferMutexName,
     *pdvstTransferFileMapName,
     *vstProcEventName,
     *pdProcEventName;
pdvstTransferData *pdvstData;
HANDLE vstHostProcess,
       pdvstTransferMutex,
       pdvstTransferFileMap,
       vstProcEvent,
       pdProcEvent;

int tokenizeCommandLineString(char *clString, char **tokens)
{
    int i, charCount = 0;
    int tokCount= 0;
    int quoteOpen = 0;

    for (i = 0; i < (signed int)strlen(clString); i++)
    {
        if (clString[i] == '"')
        {
            quoteOpen = !quoteOpen;
        }
        else if (clString[i] == ' ' && !quoteOpen)
        {
            tokens[tokCount][charCount] = 0;
            tokCount++;
            charCount = 0;
        }
        else
        {
            tokens[tokCount][charCount] = clString[i];
            charCount++;
        }
    }
    tokens[tokCount][charCount] = 0;
    tokCount++;
    return tokCount;
}

void parseArgs(int argc, char **argv)
{
    int vstHostProcessId;

    while ((argc > 0) && (**argv == '-'))
    {
        if (strcmp(*argv, "-vsthostid") == 0)
        {
            vstHostProcessId = atoi(argv[1]);
            vstHostProcess = OpenProcess(PROCESS_ALL_ACCESS, 
                                         FALSE,
                                         vstHostProcessId);
            if (vstHostProcess == NULL)
            {
                exit(1);
            }
            argc -= 2;
            argv += 2;
        }
        if (strcmp(*argv, "-mutexname") == 0)
        {
            pdvstTransferMutexName = argv[1];
            argc -= 2;
            argv += 2;
        }
        if (strcmp(*argv, "-filemapname") == 0)
        {
            pdvstTransferFileMapName = argv[1];
            argc -= 2;
            argv += 2;
        }
        if (strcmp(*argv, "-vstproceventname") == 0)
        {
            vstProcEventName = argv[1];
            argc -= 2;
            argv += 2;
        }
        if (strcmp(*argv, "-pdproceventname") == 0)
        {
            pdProcEventName = argv[1];
            argc -= 2;
            argv += 2;
        }
        else
        {
            argc--;
            argv++;
        }
    }
}

void setPdvstGuiState(int state)
{
    t_symbol *tempSym;

    tempSym = gensym("rvstopengui");
    if (tempSym->s_thing)
    {
        pd_float(tempSym->s_thing, (float)state);
    }
}

int setPdvstFloatParameter(int index, float value)
{
    t_symbol *tempSym;
    char string[1024];

    sprintf(string, "rvstparameter%d", index);
    tempSym = gensym(string);
    if (tempSym->s_thing)
    {
        pd_float(tempSym->s_thing, value);
        return 1;
    }
    else
    {
        return 0;
    }
}

void sendPdVstFloatParameter(t_vstParameterReceiver *x, t_float floatValue)
{
    int index;

    index = atoi(x->x_sym->s_name + strlen("svstParameter"));
    WaitForSingleObject(pdvstTransferMutex, INFINITE);
    pdvstData->vstParameters[index].type = FLOAT_TYPE;
    pdvstData->vstParameters[index].direction = PD_SEND;
    pdvstData->vstParameters[index].updated = 1;
    pdvstData->vstParameters[index].value.floatData = floatValue;
    ReleaseMutex(pdvstTransferMutex);
}

void makePdvstParameterReceivers()
{
    int i;
    char string[1024];

    for (i = 0; i < MAXPARAMETERS; i++)
    {
        vstParameterReceivers[i] = (t_vstParameterReceiver *)pd_new(vstParameterReceiver_class);
        sprintf(string, "svstparameter%d", i);
        vstParameterReceivers[i]->x_sym = gensym(string);
        pd_bind(&vstParameterReceivers[i]->x_obj.ob_pd, gensym(string));
    }
}

void send_dacs(void)
{
    int i, j, sampleCount, nChannels, blockSize;
    t_sample *soundin, *soundout;

    soundin = get_sys_soundin();
    soundout = get_sys_soundout();
    nChannels = pdvstData->nChannels;
    blockSize = pdvstData->blockSize;
    if (blockSize == *(get_sys_schedblocksize()))
    {
        sampleCount = 0;
        for (i = 0; i < nChannels; i++)
        {
            for (j = 0; j < blockSize; j++)
            {
                soundin[sampleCount] = pdvstData->samples[i][j];
                pdvstData->samples[i][j] = soundout[sampleCount];
                soundout[sampleCount] = 0;
                sampleCount++;
            }
        }
    }
}

void scheduler_tick( void)
{
    sys_addhist(0);
    send_dacs();
    sys_setmiditimediff(0, 1e-6 * *(get_sys_schedadvance()));
    sys_addhist(1);
    sched_tick(*(get_sys_time()) + *(get_sys_time_per_dsp_tick()));
    sys_addhist(2);
    sys_pollmidiqueue();
    sys_pollgui();
    sys_addhist(3);
}

int HFClock()
{
    LARGE_INTEGER freq, now;

    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&now);
    return (int)((now.QuadPart * 1000) / freq.QuadPart);
}


int scheduler()
{
    int i,
        blockTime, 
        vstHostProcessStatus = 0, 
        active = 1;

    vstParameterReceiver_class = class_new(gensym("vstParameterReceiver"),
                                           0,
                                           0,
                                           sizeof(t_vstParameterReceiver),
                                           0,
                                           0);
    class_addfloat(vstParameterReceiver_class, (t_method)sendPdVstFloatParameter);
    makePdvstParameterReceivers();
    *(get_sys_time_per_dsp_tick()) = (TIMEUNITPERSEC) * \
                                     ((double)*(get_sys_schedblocksize())) / \
                                     *(get_sys_dacsr());
    sys_clearhist();
    if (*(get_sys_sleepgrain()) < 1000)
    {
        *(get_sys_sleepgrain()) = *(get_sys_schedadvance()) / 4;
    }
    if (*(get_sys_sleepgrain()) < 100)
    {
        *(get_sys_sleepgrain()) = 100;
    }
    else if (*(get_sys_sleepgrain()) > 5000)
    {
        *(get_sys_sleepgrain()) = 5000;
    }
    sys_initmidiqueue();
    while (active)
    {
        WaitForSingleObject(pdvstTransferMutex, INFINITE);
        active = pdvstData->active;
        // check sample rate
        if (pdvstData->sampleRate != (int)sys_getsr())
        {
            sys_setchsr(pdvstData->nChannels, 
                        pdvstData->nChannels,
                        pdvstData->sampleRate);
        }
        // check for vstParameter changed
        if (pdvstData->guiState.direction == PD_RECEIVE && \
            pdvstData->guiState.updated)
        {
            setPdvstGuiState((int)pdvstData->guiState.value.floatData);
            pdvstData->guiState.updated = 0;
        }
        for (i = 0; i < pdvstData->nParameters; i++)
        {
            if (pdvstData->vstParameters[i].direction == PD_RECEIVE && \
                pdvstData->vstParameters[i].updated)
            {
                if (pdvstData->vstParameters[i].type == FLOAT_TYPE)
                {
                    if (setPdvstFloatParameter(i, 
                                  pdvstData->vstParameters[i].value.floatData))
                    {
                        pdvstData->vstParameters[i].updated = 0;
                    }
                }
            }
        }
        // check for new midi message (VSTi)
        if (pdvstData->midiQueueUpdated)
        {
            for (i = 0; i < pdvstData->midiQueueSize; i++)
            {
                if (pdvstData->midiQueue[i].messageType == NOTE_ON) 
                {
                    inmidi_noteon(0, 
                                  pdvstData->midiQueue[i].channelNumber,
                                  pdvstData->midiQueue[i].dataByte1,
                                  pdvstData->midiQueue[i].dataByte2);
                }
                else if (pdvstData->midiQueue[i].messageType == NOTE_OFF)
                {
                    inmidi_noteon(0, 
                                  pdvstData->midiQueue[i].channelNumber,
                                  pdvstData->midiQueue[i].dataByte1,
                                  0);
                }
                else if (pdvstData->midiQueue[i].messageType == CONTROLLER_CHANGE)
                {
                    inmidi_controlchange(0, 
                                         pdvstData->midiQueue[i].channelNumber,
                                         pdvstData->midiQueue[i].dataByte1,
                                         pdvstData->midiQueue[i].dataByte2);
                }
                else if (pdvstData->midiQueue[i].messageType == PROGRAM_CHANGE)
                {
                    inmidi_programchange(0, 
                                         pdvstData->midiQueue[i].channelNumber,
                                         pdvstData->midiQueue[i].dataByte1);
                }
                else if (pdvstData->midiQueue[i].messageType == PITCH_BEND)
                {
                    int value = (((int)pdvstData->midiQueue[i].dataByte2) * 16) + \
                                (int)pdvstData->midiQueue[i].dataByte1;

                    inmidi_pitchbend(0, 
                                     pdvstData->midiQueue[i].channelNumber,
                                     value);
                }
                else if (pdvstData->midiQueue[i].messageType == CHANNEL_PRESSURE)
                {
                    inmidi_aftertouch(0, 
                                      pdvstData->midiQueue[i].channelNumber,
                                      pdvstData->midiQueue[i].dataByte1);
                }
                else if (pdvstData->midiQueue[i].messageType == KEY_PRESSURE)
                {
                    inmidi_polyaftertouch(0, 
                                          pdvstData->midiQueue[i].channelNumber,
                                          pdvstData->midiQueue[i].dataByte1,
                                          pdvstData->midiQueue[i].dataByte2);
                }
                else if (pdvstData->midiQueue[i].messageType == OTHER)
                {
                    // FIXME: what to do?
                }
                else
                {
                    // FIXME: error?
                }
            }
            pdvstData->midiQueueSize = 0;
            pdvstData->midiQueueUpdated = 0;
        }
        // run at approx. real-time
        blockTime = (int)((float)(pdvstData->blockSize) / \
                          (float)pdvstData->sampleRate * 1000.0);
        if (blockTime < 1)
        {
            blockTime = 1;
        }
        if (pdvstData->syncToVst)
        {
            ReleaseMutex(pdvstTransferMutex);
            if (WaitForSingleObject(vstProcEvent, 1000) == WAIT_TIMEOUT)
            {
                // we have probably lost sync by now (1 sec)
                WaitForSingleObject(pdvstTransferMutex, 100);
                pdvstData->syncToVst = 0;
                ReleaseMutex(pdvstTransferMutex);
            }
            ResetEvent(vstProcEvent);
            scheduler_tick();
            SetEvent(pdProcEvent);
        }
        else
        {
            ReleaseMutex(pdvstTransferMutex);
            scheduler_tick();
            Sleep(blockTime);
        }
        GetExitCodeProcess(vstHostProcess, &vstHostProcessStatus);
        if (vstHostProcessStatus != STILL_ACTIVE)
        {
            active = 0;
        }
    }
    return 1;
}

int main(char *flags)
{
    int i, argc;
    char *argv[MAXARGS];
    
    for (i = 0; i < MAXARGS; i++)
    {
        argv[i] = (char *)malloc(MAXSTRLEN * sizeof(char));
    }
    argc = tokenizeCommandLineString(flags, argv);
    parseArgs(argc, argv);
    pdvstTransferMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, pdvstTransferMutexName);
    vstProcEvent = OpenEvent(EVENT_ALL_ACCESS, 0, vstProcEventName);
    pdProcEvent = OpenEvent(EVENT_ALL_ACCESS, 0, pdProcEventName);
    pdvstTransferFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS,
                                           0,
                                           pdvstTransferFileMapName);
    pdvstData = (pdvstTransferData *)MapViewOfFile(pdvstTransferFileMap,
                                                   FILE_MAP_ALL_ACCESS,
                                                   0,
                                                   0,
                                                   sizeof(pdvstTransferData));
    WaitForSingleObject(pdvstTransferMutex, INFINITE);
    *(get_sys_schedadvance()) = *(get_sys_main_advance()) * 1000;
    sys_setchsr(pdvstData->nChannels, 
                pdvstData->nChannels,
                pdvstData->sampleRate);
    ReleaseMutex(pdvstTransferMutex);
    timeBeginPeriod(1);
    scheduler();
    UnmapViewOfFile(pdvstData);
    CloseHandle(pdvstTransferFileMap);
    CloseHandle(pdvstTransferMutex);
    for (i = 0; i < MAXARGS; i++)
    {
        free(argv[i]);
    }
    return (0);
}








Index: s_main.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_main.c,v
retrieving revision 1.1.1.4.2.8.4.9
retrieving revision 1.1.1.4.2.8.4.10
diff -C2 -d -r1.1.1.4.2.8.4.9 -r1.1.1.4.2.8.4.10
*** s_main.c	4 Apr 2004 19:17:57 -0000	1.1.1.4.2.8.4.9
--- s_main.c	17 Apr 2004 21:17:31 -0000	1.1.1.4.2.8.4.10
***************
*** 5,9 ****
  /* IOhannes :
   * hacked the code to add advanced multidevice-support
!  * 1311:forum::für::umläute:2001
   */
  
--- 5,9 ----
  /* IOhannes :
   * hacked the code to add advanced multidevice-support
!  * 1311:forum::für::umläute:2001
   */
  
***************
*** 66,69 ****
--- 66,76 ----
  static int sys_main_advance = DEFAULTADVANCE;
  
+ #ifdef VST
+ int sys_externalschedlib;
+ char sys_externalschedlibname[MAXPDSTRING];
+ int sys_extraflags;
+ char sys_extraflagsstring[MAXPDSTRING];
+ #endif
+ 
  /* IOhannes { */
  
***************
*** 82,85 ****
--- 89,106 ----
  /* } IOhannes */
  
+ #ifdef VST
+ /* jsarlo { */
+ t_sample* get_sys_soundout() { return sys_soundout; }
+ t_sample* get_sys_soundin() { return sys_soundin; }
+ int* get_sys_main_advance() { return &sys_main_advance; }
+ double* get_sys_time_per_dsp_tick() { return &sys_time_per_dsp_tick; }
+ int* get_sys_schedblocksize() { return &sys_schedblocksize; }
+ double* get_sys_time() { return &sys_time; }
+ float* get_sys_dacsr() { return &sys_dacsr; }
+ int* get_sys_sleepgrain() { return &sys_sleepgrain; }
+ int* get_sys_schedadvance() { return &sys_schedadvance; }
+ /* } jsarlo */
+ #endif
+ 
  /* Matju { */
  int console_scrollback = 0;
***************
*** 229,232 ****
--- 250,258 ----
  {
  	int ret;
+ 
+ #ifdef VST
+     sys_externalschedlib = 0;
+     sys_extraflags = 0;
+ #endif
  #ifdef PD_DEBUG
      fprintf(stderr, "Pd: COMPILED FOR DEBUGGING\n");
***************
*** 262,266 ****
  	    "make_console\n",
  	    console_scrollback,option_look,option_statusbar,rcfilename?rcfilename:"");
!     
  	    /* open audio and MIDI */
      sys_open_midi(sys_nmidiin, sys_midiindevlist,
--- 288,307 ----
  	    "make_console\n",
  	    console_scrollback,option_look,option_statusbar,rcfilename?rcfilename:"");
! #ifdef VST
!         typedef int (*t_externalschedlibmain)(char *);
!         t_externalschedlibmain externalmainfunc;
!         HINSTANCE ntdll;
!         char filename[MAXPDSTRING];
!         sprintf(filename, "%s.dll", sys_externalschedlibname);
!         sys_bashfilename(filename, filename);
!         ntdll = LoadLibrary(filename);
!         if (!ntdll)
!         {
!               post("%s: couldn't load external scheduler lib ", filename);
!               return (0);
!         }
!         externalmainfunc = (t_externalschedlibmain)GetProcAddress(ntdll,"main");
!         ret = (*externalmainfunc)(sys_extraflagsstring);
! #else    
  	    /* open audio and MIDI */
      sys_open_midi(sys_nmidiin, sys_midiindevlist,
***************
*** 276,280 ****
     	sys_close_audio();
   	sys_close_midi();
!  
   	return ret;
  }
--- 317,321 ----
     	sys_close_audio();
   	sys_close_midi();
! #endif 
   	return ret;
  }
***************
*** 748,751 ****
--- 789,808 ----
      	    argc--; argv++;
      	}
+ #ifdef VST
+         else if (!strcmp(*argv, "-schedlib"))
+         {
+             sys_externalschedlib = 1;
+             strcpy(sys_externalschedlibname, argv[1]);
+             argv += 2;
+             argc -= 2;
+         }
+         else if (!strcmp(*argv, "-extraflags"))
+         {
+             sys_extraflags = 1;
+             strcpy(sys_extraflagsstring, argv[1]);
+             argv += 2;
+             argc -= 2;
+         }
+ #endif
  #ifdef UNIX
      	else if (!strcmp(*argv, "-rt") || !strcmp(*argv, "-realtime"))

Index: m_sched.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_sched.c,v
retrieving revision 1.1.1.2.2.7.2.3
retrieving revision 1.1.1.2.2.7.2.4
diff -C2 -d -r1.1.1.2.2.7.2.3 -r1.1.1.2.2.7.2.4
*** m_sched.c	12 Apr 2004 00:45:38 -0000	1.1.1.2.2.7.2.3
--- m_sched.c	17 Apr 2004 21:17:31 -0000	1.1.1.2.2.7.2.4
***************
*** 24,28 ****
  
  static int sys_quit;
! static double sys_time;
  static double sys_time_per_msec = TIMEUNITPERSEC / 1000.;
  
--- 24,28 ----
  
  static int sys_quit;
! double sys_time;
  static double sys_time_per_msec = TIMEUNITPERSEC / 1000.;
  
***************
*** 140,144 ****
  static int sched_diddsp, sched_didpoll, sched_didnothing;
  
! static void sys_clearhist( void)
  {
      unsigned int i, j;
--- 140,144 ----
  static int sched_diddsp, sched_didpoll, sched_didnothing;
  
! void sys_clearhist( void)
  {
      unsigned int i, j;
***************
*** 334,338 ****
  static int sched_usedacs = 1;
  static double sched_referencerealtime, sched_referencelogicaltime;
! static double sys_time_per_dsp_tick;
  
  void sched_set_using_dacs(int flag)
--- 334,338 ----
  static int sched_usedacs = 1;
  static double sched_referencerealtime, sched_referencelogicaltime;
! double sys_time_per_dsp_tick;
  
  void sched_set_using_dacs(int flag)
***************
*** 349,353 ****
  
      /* take the scheduler forward one DSP tick, also handling clock timeouts */
! static void sched_tick(double next_sys_time)
  {
      int countdown = 5000;
--- 349,353 ----
  
      /* take the scheduler forward one DSP tick, also handling clock timeouts */
! void sched_tick(double next_sys_time)
  {
      int countdown = 5000;

Index: s_entry.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_entry.c,v
retrieving revision 1.1.1.2.4.1
retrieving revision 1.1.1.2.4.2
diff -C2 -d -r1.1.1.2.4.1 -r1.1.1.2.4.2
*** s_entry.c	28 Mar 2004 15:07:12 -0000	1.1.1.2.4.1
--- s_entry.c	17 Apr 2004 21:17:31 -0000	1.1.1.2.4.2
***************
*** 6,9 ****
--- 6,68 ----
  int sys_main(int argc, char **argv);
  
+ #ifdef VST
+ #include <windows.h>
+ #include <stdio.h>
+ #include <malloc.h>
+ #define MAXARGS 1024
+ #define MAXARGLEN 1024
+ 
+ /* jsarlo { */
+ int tokenizeCommandLineString(char *clString, char **tokens)
+ {
+     int i, charCount = 0;
+     int tokCount= 0;
+     int quoteOpen = 0;
+ 
+     for (i = 0; i < strlen(clString); i++)
+     {
+         if (clString[i] == '"')
+         {
+             quoteOpen = !quoteOpen;
+         }
+         else if (clString[i] == ' ' && !quoteOpen)
+         {
+             tokens[tokCount][charCount] = 0;
+             tokCount++;
+             charCount = 0;
+         }
+         else
+         {
+             tokens[tokCount][charCount] = clString[i];
+             charCount++;
+         }
+     }
+     tokens[tokCount][charCount] = 0;
+     tokCount++;
+     return tokCount;
+ }
+ 
+ int WINAPI WinMain(HINSTANCE hInstance, 
+ 		  	       HINSTANCE hPrevInstance,
+ 			       LPSTR lpCmdLine,
+ 			       int nCmdShow)
+ {
+     int i, argc;
+     char *argv[MAXARGS];   
+     
+     for (i = 0; i < MAXARGS; i++)
+       {
+ 	argv[i] = (char *)malloc(MAXARGLEN * sizeof(char));
+       }
+     GetModuleFileName(NULL, argv[0], MAXARGLEN);
+     argc = tokenizeCommandLineString(lpCmdLine, argv + 1) + 1;
+     sys_main(argc, argv);
+     for (i = 0; i < MAXARGS; i++)
+       {
+ 	free(argv[i]);
+         }   
+ }
+ #else
+ 
  int main(int argc, char **argv)
  {
***************
*** 11,12 ****
--- 70,72 ----
  }
  
+ #endif

--- NEW FILE: makefile.vstwin ---
VPATH = ../obj:./
INSTDIR = ..
OBJ_DIR = $(INSTDIR)/obj
BIN_DIR = $(INSTDIR)/bin

PDEXEC = pd.exe
GUINAME= pdtcl.dll
DLLWRAP= dllwrap

GFLAGS = -DINSTALL_PREFIX=\"$(INSTDIR)\"

MORECFLAGS =

INCLUDE =  
GINCLUDE = $(INCLUDE) -I../tcl/include

LDFLAGS = -lpthreadGC -lwsock32 -lwinmm /lib/tcl85.lib /lib/tk85.lib
LIB =   -lm

OPT_CFLAGS = 
WARN_CFLAGS = -Wall -W -Wstrict-prototypes  \
    -Wno-unused-parameter -Wno-parentheses -Wno-switch
ARCH_CFLAGS = -DPD -DVST -DMSW -DDONTUSESIMD \

CFLAGS += $(ARCH_CFLAGS) $(WARN_CFLAGS) $(OPT_CFLAGS) $(MORECFLAGS)

# the sources

SYSSRC += s_audio_mmio.c s_midi_mmio.c
SRSRC = u_pdsend.c u_pdreceive.c
GSRC =  t_main.c t_tkcmd.c
VSRC =  s_audio_vst.c
SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \
    g_scalar.c g_traversal.c g_guiconnect.c g_readwrite.c g_editor.c \
    g_all_guis.c g_bang.c g_hdial.c g_hslider.c g_mycanvas.c g_numbox.c \
    g_toggle.c g_vumeter.c m_pd.c m_class.c m_obj.c m_atom.c m_memory.c \
    m_binbuf.c m_conf.c m_glob.c m_sched.c s_main.c s_inter.c s_file.c \
    s_print.c s_loader.c s_path.c s_entry.c s_audio.c s_midi.c \
    d_ugen.c d_ctl.c d_arithmetic.c d_osc.c d_filter.c d_dac.c d_misc.c \
    d_math.c d_fft.c d_mayer_fft.c d_fftroutine.c d_array.c d_global.c \
    d_delay.c d_resample.c x_arithmetic.c x_connective.c x_interface.c \
    x_midi.c x_misc.c x_time.c x_acoustics.c x_net.c x_qlist.c x_gui.c \
    d_soundfile.c m_simd_sse_vc.c m_simd_sse_gcc.c m_simd_ve_gcc.c \
    $(SYSSRC)

OBJ = $(SRC:.c=.o) 
GOBJ = $(GSRC:.c=.o)
VOBJ = $(VSRC:.c=.o)
SROBJ = $(SRSRC:.c=.o) 
OBJC = $(OBJ)

#
#  ------------------ targets ------------------------------------
#

.PHONY: all

all: $(OBJ_DIR)/$(GUINAME) $(OBJ_DIR)/$(PDDLL) $(OBJ_DIR)/$(PDEXEC) \
    $(OBJ_DIR)/pdsend.exe $(OBJ_DIR)/pdreceive.exe \
    $(OBJ_DIR)/vstschedlib.dll $(OBJ_DIR)/pd.tk

$(OBJ) : %.o : %.c
	$(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c 

$(GOBJ) : %.o : %.c
	$(CC) $(CFLAGS) $(GFLAGS) $(GINCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c 

$(SROBJ) : %.o : %.c
	$(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c 

$(VOBJ) : %.o : %.c
	$(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c 

$(OBJ_DIR)/pdsend.exe: u_pdsend.o
	cd $(OBJ_DIR); $(CC) $(CFLAGS)  $(STRIPFLAG) -o pdsend.exe u_pdsend.o $(LDFLAGS)

$(OBJ_DIR)/pdreceive.exe: u_pdreceive.o
	cd $(OBJ_DIR); $(CC) $(CFLAGS)  $(STRIPFLAG) -o pdreceive.exe u_pdreceive.o $(LDFLAGS)

$(OBJ_DIR)/$(PDEXEC): s_entry.o
	cd $(OBJ_DIR); $(CC) -o $(PDEXEC) s_entry.o $(LIB) pd.a $(LDFLAGS) -mwindows

$(OBJ_DIR)/$(PDDLL): $(OBJC)
	cd $(OBJ_DIR); $(DLLWRAP) --export-all-symbols --output-def pd.def \
	--output-lib=pd.a --dllname=pd.dll $(OBJC) pdtcl.a $(LDFLAGS)

$(OBJ_DIR)/$(GUINAME): t_tkcmd.o
	cd $(OBJ_DIR); $(DLLWRAP) --export-all-symbols --output-def pdtcl.def \
	--output-lib=pdtcl.a --dllname=$(GUINAME) t_tkcmd.o $(LDFLAGS)

$(OBJ_DIR)/vstschedlib.dll: s_audio_vst.o
	cd $(OBJ_DIR); $(DLLWRAP) --export-all-symbols --output-def vst.def \
	--output-lib=vst.a --dllname=vstschedlib.dll s_audio_vst.o pd.a $(LDFLAGS)

$(OBJ_DIR)/pd.tk: u_main.tk
	echo set pd_nt 1 > $(OBJ_DIR)/pd.tk
	grep -v "set pd_nt" < u_main.tk >> $(OBJ_DIR)/pd.tk

install:  all
	install -d $(INSTDIR)/bin
	install $(OBJ_DIR)/*.exe $(BIN_DIR)
	install $(OBJ_DIR)/*.dll $(BIN_DIR)
	install -m644 $(OBJ_DIR)/pd.tk $(BIN_DIR)/pd.tk
	install -m644 u_object.tk $(BIN_DIR)/u_object.tk

clean:
	-rm -f $(OBJ_DIR)/*.o $(OBJ_DIR)/*.a $(OBJ_DIR)/*.def
	-rm -f $(OBJ_DIR)/*.exe $(OBJ_DIR)/*.dll $(OBJ_DIR)/*.tk
	-rm -f $(PADIR)/pablio/*.o $(PADIR)/pa_common/*.o
	-rm -f makefile.dependencies
	touch makefile.dependencies
	chmod 666 makefile.dependencies

distclean: clean
	rm -rf config.cache config.log config.status makefile tags \
	     autom4te-*.cache
	echo all: > makefile
	echo -e  "\t./configure" >> makefile
	echo -e "\tmake" >> makefile

tags: $(SRC) $(GSRC); ctags *.[ch]

depend: 
	$(CC) $(INCLUDE) $(CFLAGS) -M $(SRC) > makefile.dependencies

uninstall:
	-rm $(INSTDIR)/bin/pd*.exe
	-rm $(INSTDIR)/bin/pd*.dll
	-rm $(INSTDIR)/bin/*.tk

include makefile.dependencies

Index: s_audio.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio.c,v
retrieving revision 1.1.1.1.2.7
retrieving revision 1.1.1.1.2.7.2.1
diff -C2 -d -r1.1.1.1.2.7 -r1.1.1.1.2.7.2.1
*** s_audio.c	14 Jan 2004 15:50:28 -0000	1.1.1.1.2.7
--- s_audio.c	17 Apr 2004 21:17:31 -0000	1.1.1.1.2.7.2.1
***************
*** 124,128 ****
      /* set channels and sample rate.  */
  
! static void sys_setchsr(int chin, int chout, int sr)
  {
      int nblk;
--- 124,128 ----
      /* set channels and sample rate.  */
  
! void sys_setchsr(int chin, int chout, int sr)
  {
      int nblk;
***************
*** 167,170 ****
--- 167,176 ----
      int defaultchannels = SYS_DEFAULTCH;
      int inchans, outchans;
+ #ifdef VST
+     if (sys_externalschedlib)
+     {
+         return;
+     }
+ #endif
      if (rate < 1)
      	rate = SYS_DEFAULTSRATE;
***************
*** 338,341 ****
--- 344,353 ----
  void sys_close_audio(void)
  {
+ #ifdef VST
+     if (sys_externalschedlib)
+     {
+         return;
+     }
+ #endif
      if (!audio_isopen())
      	return;





More information about the Pd-cvs mailing list