aboutsummaryrefslogtreecommitdiff
path: root/pd/src/s_main.c
diff options
context:
space:
mode:
authorMiller Puckette <millerpuckette@users.sourceforge.net>2004-09-06 20:20:36 +0000
committerMiller Puckette <millerpuckette@users.sourceforge.net>2004-09-06 20:20:36 +0000
commited932acb5860bf8b9296169676499562a55d139e (patch)
treedc6a40dba908deb07c175cd40ee19c197318f72d /pd/src/s_main.c
parentdad636821f6e7d3ead02c157f308c0ceeba9af3d (diff)
checking in version 0.38test5.
Oops, I realize I forgot some more nice files, will add them and re-commit. svn path=/trunk/; revision=2010
Diffstat (limited to 'pd/src/s_main.c')
-rw-r--r--pd/src/s_main.c1010
1 files changed, 571 insertions, 439 deletions
diff --git a/pd/src/s_main.c b/pd/src/s_main.c
index cc8bcc20..2af36f0d 100644
--- a/pd/src/s_main.c
+++ b/pd/src/s_main.c
@@ -7,7 +7,7 @@
* 1311:forum::für::umläute:2001
*/
-char pd_version[] = "Pd version 0.37.1 TEST6\n";
+char pd_version[] = "Pd version 0.38 TEST 4\n";
char pd_compiletime[] = __TIME__;
char pd_compiledate[] = __DATE__;
@@ -22,7 +22,7 @@ char pd_compiledate[] = __DATE__;
#include <fcntl.h>
#include <stdlib.h>
-#ifdef UNIX
+#ifdef UNISTD
#include <unistd.h>
#endif
#ifdef MSW
@@ -44,14 +44,17 @@ int sys_debuglevel;
int sys_verbose;
int sys_noloadbang;
int sys_nogui;
+int sys_hipriority = -1; /* -1 = don't care; 0 = no; 1 = yes */
+int sys_guisetportnumber; /* if started from the GUI, this is the port # */
+
char *sys_guicmd;
t_symbol *sys_libdir;
static t_symbol *sys_guidir;
-static t_namelist *sys_externlist;
+t_namelist *sys_externlist;
static t_namelist *sys_openlist;
static t_namelist *sys_messagelist;
static int sys_version;
-int sys_oldtclversion; /* hack to warn g_rtext.c about old text sel */
+int sys_oldtclversion; /* hack to warn g_rtext.c about old text sel */
int sys_nmidiout = 1;
#ifdef MSW
@@ -62,25 +65,46 @@ int sys_nmidiin = 1;
int sys_midiindevlist[MAXMIDIINDEV] = {1};
int sys_midioutdevlist[MAXMIDIOUTDEV] = {1};
-static int sys_main_srate = DEFAULTSRATE;
-static int sys_main_advance = DEFAULTADVANCE;
+static int sys_main_srate;
+static int sys_main_advance;
+
+/* jsarlo { */
+int sys_externalschedlib;
+char sys_externalschedlibname[MAXPDSTRING];
+int sys_extraflags;
+char sys_extraflagsstring[MAXPDSTRING];
+/* } jsarlo */
+
/* IOhannes { */
/* 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. */
-int sys_nsoundin = -1;
-int sys_nsoundout = -1;
-int sys_soundindevlist[MAXAUDIOINDEV];
-int sys_soundoutdevlist[MAXAUDIOOUTDEV];
-
-int sys_nchin = -1;
-int sys_nchout = -1;
-int sys_chinlist[MAXAUDIOINDEV];
-int sys_choutlist[MAXAUDIOOUTDEV];
+static int sys_nsoundin = -1;
+static int sys_nsoundout = -1;
+static int sys_soundindevlist[MAXAUDIOINDEV];
+static int sys_soundoutdevlist[MAXAUDIOOUTDEV];
+
+static int sys_nchin = -1;
+static int sys_nchout = -1;
+static int sys_chinlist[MAXAUDIOINDEV];
+static int sys_choutlist[MAXAUDIOOUTDEV];
/* } IOhannes */
+/* 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 */
+
+
typedef struct _fontinfo
{
@@ -123,7 +147,7 @@ static t_fontinfo *sys_findfont(int fontsize)
unsigned int i;
t_fontinfo *fi;
for (i = 0, fi = sys_fontlist; i < (NFONT-1); i++, fi++)
- if (fontsize < fi[1].fi_fontsize) return (fi);
+ if (fontsize < fi[1].fi_fontsize) return (fi);
return (sys_fontlist + (NFONT-1));
}
@@ -158,14 +182,14 @@ static void openit(const char *dirname, const char *filename)
{
char dirbuf[MAXPDSTRING], *nameptr;
int fd = open_via_path(dirname, filename, "", dirbuf, &nameptr,
- MAXPDSTRING, 0);
+ MAXPDSTRING, 0);
if (fd)
{
- close (fd);
- glob_evalfile(0, gensym(nameptr), gensym(dirbuf));
+ close (fd);
+ glob_evalfile(0, gensym(nameptr), gensym(dirbuf));
}
else
- error("%s: can't open", filename);
+ error("%s: can't open", filename);
}
#define NHOSTFONT 7
@@ -186,44 +210,42 @@ void glob_initfromgui(void *dummy, t_symbol *s, int argc, t_atom *argv)
if (argc != 2 + 3 * NHOSTFONT) bug("glob_initfromgui");
for (i = 0; i < NFONT; i++)
{
- int wantheight = sys_fontlist[i].fi_maxheight;
- for (j = 0; j < NHOSTFONT-1; j++)
- {
- if (atom_getintarg(3 * (j + 1) + 3, argc, argv) > wantheight)
- break;
- }
- /* j is now the "real" font index for the desired font index i. */
- sys_fontlist[i].fi_hostfontsize = atom_getintarg(3 * j + 1, argc, argv);
- sys_fontlist[i].fi_width = atom_getintarg(3 * j + 2, argc, argv);
- sys_fontlist[i].fi_height = atom_getintarg(3 * j + 3, argc, argv);
+ int wantheight = sys_fontlist[i].fi_maxheight;
+ for (j = 0; j < NHOSTFONT-1; j++)
+ {
+ if (atom_getintarg(3 * (j + 1) + 3, argc, argv) > wantheight)
+ break;
+ }
+ /* j is now the "real" font index for the desired font index i. */
+ sys_fontlist[i].fi_hostfontsize = atom_getintarg(3 * j + 1, argc, argv);
+ sys_fontlist[i].fi_width = atom_getintarg(3 * j + 2, argc, argv);
+ sys_fontlist[i].fi_height = atom_getintarg(3 * j + 3, argc, argv);
}
#if 0
for (i = 0; i < 6; i++)
- fprintf(stderr, "font %d %d %d %d %d\n",
- sys_fontlist[i].fi_fontsize,
- sys_fontlist[i].fi_maxheight,
- sys_fontlist[i].fi_hostfontsize,
- sys_fontlist[i].fi_width,
- sys_fontlist[i].fi_height);
+ fprintf(stderr, "font %d %d %d %d %d\n",
+ sys_fontlist[i].fi_fontsize,
+ sys_fontlist[i].fi_maxheight,
+ sys_fontlist[i].fi_hostfontsize,
+ sys_fontlist[i].fi_width,
+ sys_fontlist[i].fi_height);
#endif
- /* load dynamic libraries specified with "-lib" args */
+ /* load dynamic libraries specified with "-lib" args */
for (nl = sys_externlist; nl; nl = nl->nl_next)
- if (!sys_load_lib(cwd, nl->nl_string))
- post("%s: can't load library", nl->nl_string);
- namelist_free(sys_externlist);
- sys_externlist = 0;
- /* open patches specifies with "-open" args */
+ if (!sys_load_lib(cwd, nl->nl_string))
+ post("%s: can't load library", nl->nl_string);
+ /* open patches specifies with "-open" args */
for (nl = sys_openlist; nl; nl = nl->nl_next)
- openit(cwd, nl->nl_string);
+ openit(cwd, nl->nl_string);
namelist_free(sys_openlist);
sys_openlist = 0;
- /* send messages specified with "-send" args */
+ /* send messages specified with "-send" args */
for (nl = sys_messagelist; nl; nl = nl->nl_next)
{
- t_binbuf *b = binbuf_new();
- binbuf_text(b, nl->nl_string, strlen(nl->nl_string));
- binbuf_eval(b, 0, 0, 0);
- binbuf_free(b);
+ t_binbuf *b = binbuf_new();
+ binbuf_text(b, nl->nl_string, strlen(nl->nl_string));
+ binbuf_eval(b, 0, 0, 0);
+ binbuf_free(b);
}
namelist_free(sys_messagelist);
sys_messagelist = 0;
@@ -235,32 +257,61 @@ static void sys_afterargparse(void);
/* this is called from main() in s_entry.c */
int sys_main(int argc, char **argv)
{
+ /* jsarlo { */
+ sys_externalschedlib = 0;
+ sys_extraflags = 0;
+ /* } jsarlo */
#ifdef PD_DEBUG
fprintf(stderr, "Pd: COMPILED FOR DEBUGGING\n");
#endif
- pd_init(); /* start the message system */
- sys_findprogdir(argv[0]); /* set sys_progname, guipath */
-#ifdef UNIX
+ pd_init(); /* start the message system */
+ sys_findprogdir(argv[0]); /* set sys_progname, guipath */
+ sys_loadpreferences(); /* load default settings */
+#ifndef MSW
sys_rcfile(); /* parse the startup file */
#endif
- if (sys_argparse(argc, argv)) /* parse cmd line */
- return (1);
- sys_afterargparse(); /* post-argparse settings */
+ if (sys_argparse(argc, argv)) /* parse cmd line */
+ return (1);
+ sys_afterargparse(); /* post-argparse settings */
if (sys_verbose || sys_version) fprintf(stderr, "%scompiled %s %s\n",
- pd_version, pd_compiletime, pd_compiledate);
- if (sys_version) /* if we were just asked our version, exit here. */
- return (0);
- if (sys_startgui(sys_guidir->s_name)) /* start the gui */
- return(1);
- /* open audio and MIDI */
- sys_open_midi(sys_nmidiin, sys_midiindevlist,
- sys_nmidiout, sys_midioutdevlist);
- sys_open_audio(sys_nsoundin, sys_soundindevlist, sys_nchin, sys_chinlist,
- sys_nsoundout, sys_soundoutdevlist, sys_nchout, sys_choutlist,
- sys_main_srate, sys_main_advance, 1);
-
- /* run scheduler until it quits */
- return (m_scheduler());
+ pd_version, pd_compiletime, pd_compiledate);
+ if (sys_version) /* if we were just asked our version, exit here. */
+ return (0);
+ if (sys_startgui(sys_guidir->s_name)) /* start the gui */
+ return(1);
+ /* jsarlo { */
+ if (sys_externalschedlib)
+ {
+#ifdef MSW
+ 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");
+ return((*externalmainfunc)(sys_extraflagsstring));
+#else
+ return (0);
+#endif
+ }
+ else
+ {
+ /* open audio and MIDI */
+ sys_reopen_midi();
+ sys_reopen_audio();
+ /* run scheduler until it quits */
+ return (m_scheduler());
+ }
+ /* } jsarlo */
}
static char *(usagemessage[]) = {
@@ -282,14 +333,13 @@ static char *(usagemessage[]) = {
"-listdev -- list audio and MIDI devices\n",
#ifdef USEAPI_OSS
-"-oss -- use OSS audio API\n",
-"-32bit ----- allow 32 bit OSS audio (for RME Hammerfall)\n",
+"-oss -- use OSS audio API\n",
+"-32bit ----- allow 32 bit OSS audio (for RME Hammerfall)\n",
#endif
#ifdef USEAPI_ALSA
"-alsa -- use ALSA audio API\n",
"-alsaadd <name> -- add an ALSA device name to list\n",
-"-alsadev <n> ----- obsolete: use -audiodev\n",
#endif
#ifdef USEAPI_JACK
@@ -306,7 +356,7 @@ static char *(usagemessage[]) = {
#endif
#ifdef USEAPI_MMIO
-"-mmio -- use MMIO audio API (default for Windows)\n",
+"-mmio -- use MMIO audio API (default for Windows)\n",
#endif
" (default audio API for this platform: ", API_DEFSTRING, ")\n\n",
@@ -320,6 +370,8 @@ static char *(usagemessage[]) = {
"\nother flags:\n",
"-path <path> -- add to file search path\n",
+"-nostdpath -- don't search standard (\"extra\") directory\n",
+"-stdpath -- search standard directory (true by default)\n",
"-helppath <path> -- add to help file search path\n",
"-open <file> -- open file(s) on startup\n",
"-lib <file> -- load object library(s)\n",
@@ -328,10 +380,12 @@ static char *(usagemessage[]) = {
"-version -- don't run Pd; just print out which version it is \n",
"-d <n> -- specify debug level\n",
"-noloadbang -- suppress all loadbangs\n",
+"-stderr -- send printout to standard error instead of GUI\n",
"-nogui -- suppress starting the GUI\n",
-"-guicmd \"cmd...\" -- substitute another GUI program (e.g., rsh)\n",
-"-send \"msg...\" -- send a message at startup (after patches are loaded)\n",
-#ifdef UNIX
+"-guiport <n> -- connect to pre-existing GUI over port <n>\n",
+"-guicmd \"cmd...\" -- start alternatve GUI program (e.g., remote via ssh)\n",
+"-send \"msg...\" -- send a message at startup, after patches are loaded\n",
+#ifdef UNISTD
"-rt or -realtime -- use real-time priority\n",
"-nrt -- don't use real-time priority\n",
#endif
@@ -342,18 +396,18 @@ static void sys_parsedevlist(int *np, int *vecp, int max, char *str)
int n = 0;
while (n < max)
{
- if (!*str) break;
- else
- {
- char *endp;
- vecp[n] = strtol(str, &endp, 10);
- if (endp == str)
- break;
- n++;
- if (!endp)
- break;
- str = endp + 1;
- }
+ if (!*str) break;
+ else
+ {
+ char *endp;
+ vecp[n] = strtol(str, &endp, 10);
+ if (endp == str)
+ break;
+ n++;
+ if (!endp)
+ break;
+ str = endp + 1;
+ }
}
*np = n;
}
@@ -376,7 +430,7 @@ void sys_findprogdir(char *progname)
{
char sbuf[MAXPDSTRING], sbuf2[MAXPDSTRING], *sp;
char *lastslash;
-#ifdef UNIX
+#ifdef UNISTD
struct stat statbuf;
#endif
@@ -386,80 +440,79 @@ void sys_findprogdir(char *progname)
sbuf2[MAXPDSTRING-1] = 0;
sys_unbashfilename(sbuf2, sbuf);
#endif /* MSW */
-#ifdef UNIX
+#ifdef UNISTD
strncpy(sbuf, progname, MAXPDSTRING);
sbuf[MAXPDSTRING-1] = 0;
#endif
lastslash = strrchr(sbuf, '/');
if (lastslash)
{
- /* bash last slash to zero so that sbuf is directory pd was in,
- e.g., ~/pd/bin */
- *lastslash = 0;
- /* go back to the parent from there, e.g., ~/pd */
- lastslash = strrchr(sbuf, '/');
- if (lastslash)
- {
- strncpy(sbuf2, sbuf, lastslash-sbuf);
- sbuf2[lastslash-sbuf] = 0;
- }
- else strcpy(sbuf2, "..");
+ /* bash last slash to zero so that sbuf is directory pd was in,
+ e.g., ~/pd/bin */
+ *lastslash = 0;
+ /* go back to the parent from there, e.g., ~/pd */
+ lastslash = strrchr(sbuf, '/');
+ if (lastslash)
+ {
+ strncpy(sbuf2, sbuf, lastslash-sbuf);
+ sbuf2[lastslash-sbuf] = 0;
+ }
+ else strcpy(sbuf2, "..");
}
else
{
- /* no slashes found. Try INSTALL_PREFIX. */
+ /* no slashes found. Try INSTALL_PREFIX. */
#ifdef INSTALL_PREFIX
- strcpy(sbuf2, INSTALL_PREFIX);
+ strcpy(sbuf2, INSTALL_PREFIX);
#else
- strcpy(sbuf2, ".");
+ strcpy(sbuf2, ".");
#endif
}
- /* now we believe sbuf2 holds the parent directory of the directory
- pd was found in. We now want to infer the "lib" directory and the
- "gui" directory. In "simple" UNIX installations, the layout is
- .../bin/pd
- .../bin/pd-gui
- .../doc
- and in "complicated" UNIX installations, it's:
- .../bin/pd
- .../lib/pd/bin/pd-gui
- .../lib/pd/doc
- To decide which, we stat .../lib/pd; if that exists, we assume it's
- the complicated layout. In MSW, it's the "simple" layout, but
- the gui program is straight wish80:
- .../bin/pd
- .../bin/wish80.exe
- .../doc
- */
-#ifdef UNIX
+ /* now we believe sbuf2 holds the parent directory of the directory
+ pd was found in. We now want to infer the "lib" directory and the
+ "gui" directory. In "simple" unix installations, the layout is
+ .../bin/pd
+ .../bin/pd-gui
+ .../doc
+ and in "complicated" unix installations, it's:
+ .../bin/pd
+ .../lib/pd/bin/pd-gui
+ .../lib/pd/doc
+ To decide which, we stat .../lib/pd; if that exists, we assume it's
+ the complicated layout. In MSW, it's the "simple" layout, but
+ the gui program is straight wish80:
+ .../bin/pd
+ .../bin/wish80.exe
+ .../doc
+ */
+#ifdef MSW
+ sys_libdir = gensym(sbuf2);
+ sys_guidir = &s_; /* in MSW the guipath just depends on the libdir */
+#else
strncpy(sbuf, sbuf2, MAXPDSTRING-30);
sbuf[MAXPDSTRING-30] = 0;
strcat(sbuf, "/lib/pd");
if (stat(sbuf, &statbuf) >= 0)
{
- /* complicated layout: lib dir is the one we just stat-ed above */
- sys_libdir = gensym(sbuf);
- /* gui lives in .../lib/pd/bin */
- strncpy(sbuf, sbuf2, MAXPDSTRING-30);
- sbuf[MAXPDSTRING-30] = 0;
- strcat(sbuf, "/lib/pd/bin");
- sys_guidir = gensym(sbuf);
+ /* complicated layout: lib dir is the one we just stat-ed above */
+ sys_libdir = gensym(sbuf);
+ /* gui lives in .../lib/pd/bin */
+ strncpy(sbuf, sbuf2, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/lib/pd/bin");
+ sys_guidir = gensym(sbuf);
}
else
{
- /* simple layout: lib dir is the parent */
- sys_libdir = gensym(sbuf2);
- /* gui lives in .../bin */
- strncpy(sbuf, sbuf2, MAXPDSTRING-30);
- sbuf[MAXPDSTRING-30] = 0;
- strcat(sbuf, "/bin");
- sys_guidir = gensym(sbuf);
+ /* simple layout: lib dir is the parent */
+ sys_libdir = gensym(sbuf2);
+ /* gui lives in .../bin */
+ strncpy(sbuf, sbuf2, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/bin");
+ sys_guidir = gensym(sbuf);
}
#endif
-#ifdef MSW
- sys_libdir = gensym(sbuf2);
- sys_guidir = &s_; /* in MSW the guipath just depends on the libdir */
-#endif
}
#ifdef MSW
@@ -475,309 +528,329 @@ int sys_argparse(int argc, char **argv)
argc--; argv++;
while ((argc > 0) && **argv == '-')
{
- if (!strcmp(*argv, "-r") && argc > 1 &&
- sscanf(argv[1], "%d", &sys_main_srate) >= 1)
- {
- argc -= 2;
- argv += 2;
- }
- else if (!strcmp(*argv, "-inchannels"))
- { /* IOhannes */
- sys_parsedevlist(&sys_nchin,
- sys_chinlist, MAXAUDIOINDEV, argv[1]);
-
- if (!sys_nchin)
- goto usage;
-
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-outchannels"))
- { /* IOhannes */
- sys_parsedevlist(&sys_nchout, sys_choutlist,
- MAXAUDIOOUTDEV, argv[1]);
-
- if (!sys_nchout)
- goto usage;
-
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-channels"))
- {
- sys_parsedevlist(&sys_nchin, sys_chinlist,MAXAUDIOINDEV,
- argv[1]);
- sys_parsedevlist(&sys_nchout, sys_choutlist,MAXAUDIOOUTDEV,
- argv[1]);
-
- if (!sys_nchout)
- goto usage;
-
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-soundbuf") || !strcmp(*argv, "-audiobuf"))
- {
- sys_main_advance = atoi(argv[1]);
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-blocksize"))
- {
- sys_setblocksize(atoi(argv[1]));
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-sleepgrain"))
- {
- sys_sleepgrain = 1000 * atoi(argv[1]);
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-nodac"))
- { /* IOhannes */
- sys_nsoundout=0;
- sys_nchout = 0;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-noadc"))
- { /* IOhannes */
- sys_nsoundin=0;
- sys_nchin = 0;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-nosound") || !strcmp(*argv, "-noaudio"))
- { /* IOhannes */
- sys_nsoundin=sys_nsoundout = 0;
- sys_nchin = sys_nchout = 0;
- argc--; argv++;
- }
+ if (!strcmp(*argv, "-r") && argc > 1 &&
+ sscanf(argv[1], "%d", &sys_main_srate) >= 1)
+ {
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-inchannels"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nchin,
+ sys_chinlist, MAXAUDIOINDEV, argv[1]);
+
+ if (!sys_nchin)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-outchannels"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nchout, sys_choutlist,
+ MAXAUDIOOUTDEV, argv[1]);
+
+ if (!sys_nchout)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-channels"))
+ {
+ sys_parsedevlist(&sys_nchin, sys_chinlist,MAXAUDIOINDEV,
+ argv[1]);
+ sys_parsedevlist(&sys_nchout, sys_choutlist,MAXAUDIOOUTDEV,
+ argv[1]);
+
+ if (!sys_nchout)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-soundbuf") || !strcmp(*argv, "-audiobuf"))
+ {
+ sys_main_advance = atoi(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-blocksize"))
+ {
+ sys_setblocksize(atoi(argv[1]));
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-sleepgrain"))
+ {
+ sys_sleepgrain = 1000 * atoi(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-nodac"))
+ { /* IOhannes */
+ sys_nsoundout=0;
+ sys_nchout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-noadc"))
+ { /* IOhannes */
+ sys_nsoundin=0;
+ sys_nchin = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nosound") || !strcmp(*argv, "-noaudio"))
+ { /* IOhannes */
+ sys_nsoundin=sys_nsoundout = 0;
+ sys_nchin = sys_nchout = 0;
+ argc--; argv++;
+ }
#ifdef USEAPI_OSS
- else if (!strcmp(*argv, "-oss"))
- {
- sys_set_audio_api(API_OSS);
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-32bit"))
- {
- sys_set_audio_api(API_OSS);
- oss_set32bit();
- argc--; argv++;
- }
+ else if (!strcmp(*argv, "-oss"))
+ {
+ sys_set_audio_api(API_OSS);
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-32bit"))
+ {
+ sys_set_audio_api(API_OSS);
+ oss_set32bit();
+ argc--; argv++;
+ }
#endif
#ifdef USEAPI_ALSA
- else if (!strcmp(*argv, "-alsa"))
- {
- sys_set_audio_api(API_ALSA);
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-alsaadd"))
- {
- if (argc > 1)
- alsa_adddev(argv[1]);
- else goto usage;
- argc -= 2; argv +=2;
- }
- /* obsolete flag for setting ALSA device number or name */
- else if (!strcmp(*argv, "-alsadev"))
- {
- int devno = 0;
- if (argv[1][0] >= '1' && argv[1][0] <= '9')
- devno = 1 + 2 * (atoi(argv[1]) - 1);
- else if (!strncmp(argv[1], "hw:", 3))
- devno = 1 + 2 * atoi(argv[1]+3);
- else if (!strncmp(argv[1], "plughw:", 7))
- devno = 2 + 2 * atoi(argv[1]+7);
- else goto usage;
- post("devno %d", devno);
- sys_nsoundin = sys_nsoundout = 1;
- sys_soundindevlist[0] = sys_soundoutdevlist[0] = devno;
- sys_set_audio_api(API_ALSA);
- argc -= 2; argv +=2;
- }
+ else if (!strcmp(*argv, "-alsa"))
+ {
+ sys_set_audio_api(API_ALSA);
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-alsaadd"))
+ {
+ if (argc > 1)
+ alsa_adddev(argv[1]);
+ else goto usage;
+ argc -= 2; argv +=2;
+ }
#endif
#ifdef USEAPI_JACK
- else if (!strcmp(*argv, "-jack"))
- {
- sys_set_audio_api(API_JACK);
- argc--; argv++;
- }
+ else if (!strcmp(*argv, "-jack"))
+ {
+ sys_set_audio_api(API_JACK);
+ argc--; argv++;
+ }
#endif
#ifdef USEAPI_PORTAUDIO
- else if (!strcmp(*argv, "-pa") || !strcmp(*argv, "-portaudio")
+ else if (!strcmp(*argv, "-pa") || !strcmp(*argv, "-portaudio")
#ifdef MSW
- || !strcmp(*argv, "-asio")
+ || !strcmp(*argv, "-asio")
#endif
- )
- {
- sys_set_audio_api(API_PORTAUDIO);
- sys_mmio = 0;
- argc--; argv++;
- }
+ )
+ {
+ sys_set_audio_api(API_PORTAUDIO);
+ sys_mmio = 0;
+ argc--; argv++;
+ }
#endif
#ifdef USEAPI_MMIO
- else if (!strcmp(*argv, "-mmio"))
- {
- sys_set_audio_api(API_MMIO);
- sys_mmio = 1;
- argc--; argv++;
- }
+ else if (!strcmp(*argv, "-mmio"))
+ {
+ sys_set_audio_api(API_MMIO);
+ sys_mmio = 1;
+ argc--; argv++;
+ }
#endif
- else if (!strcmp(*argv, "-nomidiin"))
- {
- sys_nmidiin = 0;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-nomidiout"))
- {
- sys_nmidiout = 0;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-nomidi"))
- {
- sys_nmidiin = sys_nmidiout = 0;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-midiindev"))
- {
- sys_parsedevlist(&sys_nmidiin, sys_midiindevlist, MAXMIDIINDEV,
- argv[1]);
- if (!sys_nmidiin)
- goto usage;
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-midioutdev"))
- {
- sys_parsedevlist(&sys_nmidiout, sys_midioutdevlist, MAXMIDIOUTDEV,
- argv[1]);
- if (!sys_nmidiout)
- goto usage;
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-mididev"))
- {
- sys_parsedevlist(&sys_nmidiin, sys_midiindevlist, MAXMIDIINDEV,
- argv[1]);
- sys_parsedevlist(&sys_nmidiout, sys_midioutdevlist, MAXMIDIOUTDEV,
- argv[1]);
- if (!sys_nmidiout)
- goto usage;
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-path"))
- {
- sys_addpath(argv[1]);
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-helppath"))
- {
- sys_addhelppath(argv[1]);
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-open") && argc > 1)
- {
- sys_openlist = namelist_append(sys_openlist, argv[1]);
- argc -= 2; argv += 2;
- }
+ else if (!strcmp(*argv, "-nomidiin"))
+ {
+ sys_nmidiin = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nomidiout"))
+ {
+ sys_nmidiout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nomidi"))
+ {
+ sys_nmidiin = sys_nmidiout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-midiindev"))
+ {
+ sys_parsedevlist(&sys_nmidiin, sys_midiindevlist, MAXMIDIINDEV,
+ argv[1]);
+ if (!sys_nmidiin)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-midioutdev"))
+ {
+ sys_parsedevlist(&sys_nmidiout, sys_midioutdevlist, MAXMIDIOUTDEV,
+ argv[1]);
+ if (!sys_nmidiout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-mididev"))
+ {
+ sys_parsedevlist(&sys_nmidiin, sys_midiindevlist, MAXMIDIINDEV,
+ argv[1]);
+ sys_parsedevlist(&sys_nmidiout, sys_midioutdevlist, MAXMIDIOUTDEV,
+ argv[1]);
+ if (!sys_nmidiout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-path"))
+ {
+ sys_searchpath = namelist_append_files(sys_searchpath, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-nostdpath"))
+ {
+ sys_usestdpath = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-stdpath"))
+ {
+ sys_usestdpath = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-helppath"))
+ {
+ sys_helppath = namelist_append_files(sys_helppath, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-open") && argc > 1)
+ {
+ sys_openlist = namelist_append_files(sys_openlist, argv[1]);
+ argc -= 2; argv += 2;
+ }
else if (!strcmp(*argv, "-lib") && argc > 1)
{
- sys_externlist = namelist_append(sys_externlist, argv[1]);
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-font") && argc > 1)
- {
- sys_defaultfont = sys_nearestfontsize(atoi(argv[1]));
- argc -= 2;
- argv += 2;
- }
- else if (!strcmp(*argv, "-verbose"))
- {
- sys_verbose = 1;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-version"))
- {
- sys_version = 1;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-d") && argc > 1 &&
- sscanf(argv[1], "%d", &sys_debuglevel) >= 1)
- {
- argc -= 2;
- argv += 2;
- }
- else if (!strcmp(*argv, "-noloadbang"))
- {
- sys_noloadbang = 1;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-nogui"))
- {
- sys_nogui = 1;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-guicmd") && argc > 1)
- {
- sys_guicmd = argv[1];
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-send") && argc > 1)
- {
- sys_messagelist = namelist_append(sys_messagelist, argv[1]);
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-listdev"))
- {
- sys_listdevs();
- argc--; argv++;
- }
-#ifdef UNIX
- else if (!strcmp(*argv, "-rt") || !strcmp(*argv, "-realtime"))
- {
- sys_hipriority = 1;
- argc--; argv++;
- }
- else if (!strcmp(*argv, "-nrt"))
- {
- sys_hipriority = 0;
- argc--; argv++;
- }
+ sys_externlist = namelist_append_files(sys_externlist, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-font") && argc > 1)
+ {
+ sys_defaultfont = sys_nearestfontsize(atoi(argv[1]));
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-verbose"))
+ {
+ sys_verbose = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-version"))
+ {
+ sys_version = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-d") && argc > 1 &&
+ sscanf(argv[1], "%d", &sys_debuglevel) >= 1)
+ {
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-noloadbang"))
+ {
+ sys_noloadbang = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nogui"))
+ {
+ sys_printtostderr = sys_nogui = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-guiport") && argc > 1 &&
+ sscanf(argv[1], "%d", &sys_guisetportnumber) >= 1)
+ {
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-stderr"))
+ {
+ sys_printtostderr = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-guicmd") && argc > 1)
+ {
+ sys_guicmd = argv[1];
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-send") && argc > 1)
+ {
+ sys_messagelist = namelist_append(sys_messagelist, argv[1], 1);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-listdev"))
+ {
+ sys_listdevs();
+ argc--; argv++;
+ }
+ /* jsarlo { */
+ 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;
+ }
+ /* } jsarlo */
+#ifdef UNISTD
+ else if (!strcmp(*argv, "-rt") || !strcmp(*argv, "-realtime"))
+ {
+ sys_hipriority = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nrt"))
+ {
+ sys_hipriority = 0;
+ argc--; argv++;
+ }
#endif
- else if (!strcmp(*argv, "-soundindev") ||
- !strcmp(*argv, "-audioindev"))
- { /* IOhannes */
- sys_parsedevlist(&sys_nsoundin, sys_soundindevlist,
- MAXAUDIOINDEV, argv[1]);
- if (!sys_nsoundin)
- goto usage;
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-soundoutdev") ||
- !strcmp(*argv, "-audiooutdev"))
- { /* IOhannes */
- sys_parsedevlist(&sys_nsoundout, sys_soundoutdevlist,
- MAXAUDIOOUTDEV, argv[1]);
- if (!sys_nsoundout)
- goto usage;
- argc -= 2; argv += 2;
- }
- else if (!strcmp(*argv, "-sounddev") || !strcmp(*argv, "-audiodev"))
- {
- sys_parsedevlist(&sys_nsoundin, sys_soundindevlist,
- MAXAUDIOINDEV, argv[1]);
- sys_parsedevlist(&sys_nsoundout, sys_soundoutdevlist,
- MAXAUDIOOUTDEV, argv[1]);
- if (!sys_nsoundout)
- goto usage;
- argc -= 2; argv += 2;
- }
- else
- {
- unsigned int i;
- usage:
- for (i = 0; i < sizeof(usagemessage)/sizeof(*usagemessage); i++)
- fprintf(stderr, "%s", usagemessage[i]);
- return (1);
- }
+ else if (!strcmp(*argv, "-soundindev") ||
+ !strcmp(*argv, "-audioindev"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nsoundin, sys_soundindevlist,
+ MAXAUDIOINDEV, argv[1]);
+ if (!sys_nsoundin)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-soundoutdev") ||
+ !strcmp(*argv, "-audiooutdev"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nsoundout, sys_soundoutdevlist,
+ MAXAUDIOOUTDEV, argv[1]);
+ if (!sys_nsoundout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-sounddev") || !strcmp(*argv, "-audiodev"))
+ {
+ sys_parsedevlist(&sys_nsoundin, sys_soundindevlist,
+ MAXAUDIOINDEV, argv[1]);
+ sys_parsedevlist(&sys_nsoundout, sys_soundoutdevlist,
+ MAXAUDIOOUTDEV, argv[1]);
+ if (!sys_nsoundout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else
+ {
+ unsigned int i;
+ usage:
+ for (i = 0; i < sizeof(usagemessage)/sizeof(*usagemessage); i++)
+ fprintf(stderr, "%s", usagemessage[i]);
+ return (1);
+ }
}
if (!sys_defaultfont)
- sys_defaultfont = DEFAULTFONT;
+ sys_defaultfont = DEFAULTFONT;
for (; argc > 0; argc--, argv++)
- sys_openlist = namelist_append(sys_openlist, *argv);
+ sys_openlist = namelist_append_files(sys_openlist, *argv);
return (0);
@@ -789,36 +862,95 @@ int sys_getblksize(void)
}
/* stuff to do, once, after calling sys_argparse() -- which may itself
- be called twice because of the .pdrc hack. */
+ be called more than once (first from "settings, second from .pdrc, then
+ from command-line arguments */
static void sys_afterargparse(void)
{
char sbuf[MAXPDSTRING];
int i;
- /* add "extra" library to path */
+ 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];
+ /* add "extra" library to path */
strncpy(sbuf, sys_libdir->s_name, MAXPDSTRING-30);
sbuf[MAXPDSTRING-30] = 0;
strcat(sbuf, "/extra");
- sys_addpath(sbuf);
- /* add "doc/5.reference" library to helppath */
+ sys_setextrapath(sbuf);
+ /* add "doc/5.reference" library to helppath */
strncpy(sbuf, sys_libdir->s_name, MAXPDSTRING-30);
sbuf[MAXPDSTRING-30] = 0;
strcat(sbuf, "/doc/5.reference");
- sys_addhelppath(sbuf);
- /* correct to make audio and MIDI device lists zero based. On
- MMIO, however, "1" really means the second device (the first one
- is "mapper" which is was not included when the command args were
- set up, so we leave it that way for compatibility. */
+ sys_helppath = namelist_append_files(sys_helppath, sbuf);
+ /* correct to make audio and MIDI device lists zero based. On
+ MMIO, however, "1" really means the second device (the first one
+ is "mapper" which is was not included when the command args were
+ set up, so we leave it that way for compatibility. */
if (!sys_mmio)
{
- for (i = 0; i < sys_nsoundin; i++)
- sys_soundindevlist[i]--;
- for (i = 0; i < sys_nsoundout; i++)
- sys_soundoutdevlist[i]--;
+ for (i = 0; i < sys_nsoundin; i++)
+ sys_soundindevlist[i]--;
+ for (i = 0; i < sys_nsoundout; i++)
+ sys_soundoutdevlist[i]--;
}
for (i = 0; i < sys_nmidiin; i++)
- sys_midiindevlist[i]--;
+ sys_midiindevlist[i]--;
for (i = 0; i < sys_nmidiout; i++)
- sys_midioutdevlist[i]--;
+ sys_midioutdevlist[i]--;
+
+ /* get the current audio parameters. These are set
+ by the preferences mechanism (sys_loadpreferences()) or
+ else are the default. Overwrite them with any results
+ of argument parsing, and store them again. */
+ sys_get_audio_params(&naudioindev, audioindev, chindev,
+ &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
+ if (sys_nchin >= 0)
+ {
+ nchindev = sys_nchin;
+ for (i = 0; i < nchindev; i++)
+ chindev[i] = sys_chinlist[i];
+ }
+ else nchindev = naudioindev;
+ if (sys_nsoundin >= 0)
+ {
+ naudioindev = sys_nsoundin;
+ for (i = 0; i < naudioindev; i++)
+ audioindev[i] = sys_soundindevlist[i];
+ }
+
+ if (sys_nchout >= 0)
+ {
+ nchoutdev = sys_nchout;
+ for (i = 0; i < nchoutdev; i++)
+ choutdev[i] = sys_choutlist[i];
+ }
+ else nchoutdev = naudiooutdev;
+ if (sys_nsoundout >= 0)
+ {
+ naudiooutdev = sys_nsoundout;
+ for (i = 0; i < naudiooutdev; i++)
+ audiooutdev[i] = sys_soundoutdevlist[i];
+ }
+ if (sys_nmidiin >= 0)
+ {
+ nmidiindev = sys_nmidiin;
+ for (i = 0; i < nmidiindev; i++)
+ midiindev[i] = sys_midiindevlist[i];
+ }
+ if (sys_nmidiout >= 0)
+ {
+ nmidioutdev = sys_nmidiout;
+ for (i = 0; i < nmidioutdev; i++)
+ midioutdev[i] = sys_midioutdevlist[i];
+ }
+ if (sys_main_advance)
+ advance = sys_main_advance;
+ if (sys_main_srate)
+ rate = sys_main_srate;
+ sys_open_audio(naudioindev, audioindev, naudioindev, chindev,
+ naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate, advance, 0);
+ sys_open_midi(nmidiindev, midiindev, nmidioutdev, midioutdev, 0);
}
static void sys_addreferencepath(void)