From ed932acb5860bf8b9296169676499562a55d139e Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Mon, 6 Sep 2004 20:20:36 +0000 Subject: 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 --- pd/src/s_main.c | 1010 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 571 insertions(+), 439 deletions(-) (limited to 'pd/src/s_main.c') 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 #include -#ifdef UNIX +#ifdef UNISTD #include #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 -- add an ALSA device name to list\n", -"-alsadev ----- 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 -- add to file search path\n", +"-nostdpath -- don't search standard (\"extra\") directory\n", +"-stdpath -- search standard directory (true by default)\n", "-helppath -- add to help file search path\n", "-open -- open file(s) on startup\n", "-lib -- 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 -- 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 -- connect to pre-existing GUI over port \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) -- cgit v1.2.1