diff options
author | Orcan Ogetbil <oget.fedora@gmail.com> | 2010-12-19 08:57:19 +0000 |
---|---|---|
committer | Orcan Ogetbil <oget.fedora@gmail.com> | 2010-12-19 08:57:19 +0000 |
commit | 520e889a3e58fdaa99a0c13a40d1c3e4affe60b1 (patch) | |
tree | 3e671e957f24f22f6d2d540cde8634848069445e /muse2/muse/app.cpp | |
parent | 54dd5ec68d550408be99118c59df2a91c33183f7 (diff) |
Split individual parts into their own shared libraries. Moved main() into its own file.
Diffstat (limited to 'muse2/muse/app.cpp')
-rw-r--r-- | muse2/muse/app.cpp | 585 |
1 files changed, 24 insertions, 561 deletions
diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp index f339fabf..ecee0f71 100644 --- a/muse2/muse/app.cpp +++ b/muse2/muse/app.cpp @@ -6,90 +6,48 @@ // (C) Copyright 1999-2004 Werner Schweer (ws@seh.de) //========================================================= -#include "config.h" - -#include <string> -#include <map> -#include <assert.h> -#include <getopt.h> -#include <errno.h> -#include <sys/mman.h> -#include <sys/wait.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <time.h> -#include <signal.h> -#include <stdarg.h> - -#include <QAction> -#include <QActionGroup> -#include <QApplication> -#include <QByteArray> #include <QClipboard> -#include <QCloseEvent> -#include <QFile> -#include <QFocusEvent> -#include <QKeyEvent> -#include <QMenu> #include <QMessageBox> -#include <QPixmap> #include <QShortcut> #include <QSignalMapper> -#include <QSplashScreen> -#include <QTextCodec> #include <QTimer> -#include <QTimerEvent> -#include <QTranslator> #include <QWhatsThis> #include "app.h" #include "master/lmaster.h" -#include "master/masteredit.h" -#include "marker/markerview.h" -#include "popupmenu.h" -#include "transport.h" -#include "bigtime.h" +#include "al/dsp.h" +#include "amixer.h" +#include "appearance.h" #include "arranger.h" -#include "pianoroll.h" -#include "xml.h" -#include "midi.h" +#include "audio.h" +#include "audiodev.h" +#include "audioprefetch.h" +#include "bigtime.h" +#include "cliplist/cliplist.h" #include "conf.h" -#include "listedit.h" +#include "debug.h" +#include "didyouknow.h" #include "drumedit.h" -#include "ttoolbar.h" -#include "amixer.h" -#include "cliplist/cliplist.h" -#include "midiport.h" -#include "audiodev.h" -#include "mididev.h" -#include "waveedit.h" -#include "icons.h" -#include "minstrument.h" -#include "mixdowndialog.h" -#include "midictrl.h" #include "filedialog.h" -#include "plugin.h" -#include "transpose.h" -#include "appearance.h" #include "gatetime.h" +#include "gconfig.h" +#include "gui.h" +#include "icons.h" +#include "instruments/editinstrument.h" +#include "listedit.h" +#include "marker/markerview.h" +#include "master/masteredit.h" #include "metronome.h" -#include "debug.h" -#include "event.h" -#include "audio.h" #include "midiseq.h" -#include "audioprefetch.h" -#include "wave.h" +#include "mixdowndialog.h" +#include "pianoroll.h" +#include "popupmenu.h" #include "shortcutconfig.h" -#include "gconfig.h" -#include "driver/jackaudio.h" -#include "track.h" +#include "songinfo.h" #include "ticksynth.h" -#include "instruments/editinstrument.h" -#include "synth.h" -#include "remote/pyapi.h" -#include "al/dsp.h" -#include "gui.h" +#include "transport.h" +#include "transpose.h" +#include "waveedit.h" #ifdef DSSI_SUPPORT #include "dssihost.h" @@ -99,10 +57,6 @@ #include "vst.h" #endif -#include <alsa/asoundlib.h> -#include "songinfo.h" -#include "didyouknow.h" - //extern void cacheJackRouteNames(); static pthread_t watchdogThread; @@ -129,19 +83,11 @@ static const char* infoPanicButton = QT_TRANSLATE_NOOP("@default", "send note #define PROJECT_LIST_LEN 6 static QString* projectList[PROJECT_LIST_LEN]; -static QString locale_override; -extern void initIcons(); extern void initMidiSynth(); -extern bool initJackAudio(); extern void exitJackAudio(); -extern bool initDummyAudio(); extern void exitDummyAudio(); -extern void initVST_fst_init(); -extern void initVST(); -extern void initDSSI(); // p3.3.39 -extern void initOSC(); extern void exitOSC(); #ifdef HAVE_LASH @@ -162,33 +108,6 @@ pthread_t splashThread; // } //--------------------------------------------------------- -// getCapabilities -//--------------------------------------------------------- - -static void getCapabilities() - { -#ifdef RTCAP -#ifdef __linux__ - const char* napp = getenv("GIVERTCAP"); - if (napp == 0) - napp = "givertcap"; - int pid = fork(); - if (pid == 0) { - if (execlp(napp, napp, 0) == -1) - perror("exec givertcap failed"); - } - else if (pid == -1) { - perror("fork givertcap failed"); - } - else { - waitpid(pid, 0, 0); - } -#endif // __linux__ -#endif - } - - -//--------------------------------------------------------- // sleep function //--------------------------------------------------------- void microSleep(long msleep) @@ -3140,15 +3059,6 @@ bool MusE::saveAs() } //--------------------------------------------------------- -// printVersion -//--------------------------------------------------------- - -static void printVersion(const char* prog) - { - fprintf(stderr, "%s: Linux Music Editor; Version %s, (svn revision %s)\n", prog, VERSION, SVNVERSION); - } - -//--------------------------------------------------------- // startEditor //--------------------------------------------------------- @@ -3531,141 +3441,6 @@ void MusE::kbAccel(int key) } //--------------------------------------------------------- -// MuseApplication -//--------------------------------------------------------- - -class MuseApplication : public QApplication { - MusE* muse; - - public: - MuseApplication(int& argc, char** argv) - : QApplication(argc, argv) - { - muse = 0; - } - - - void setMuse(MusE* m) { - muse = m; -#ifdef HAVE_LASH - if(useLASH) - startTimer (300); -#endif - } - - bool notify(QObject* receiver, QEvent* event) { - //if (event->type() == QEvent::KeyPress) - // printf("notify key press before app::notify accepted:%d\n", event->isAccepted()); - bool flag = QApplication::notify(receiver, event); - if (event->type() == QEvent::KeyPress) { - //printf("notify key press after app::notify accepted:%d\n", event->isAccepted()); - QKeyEvent* ke = (QKeyEvent*)event; - ///globalKeyState = ke->stateAfter(); - globalKeyState = ke->modifiers(); - bool accepted = ke->isAccepted(); - if (!accepted) { - int key = ke->key(); - ///if (ke->state() & Qt::ShiftModifier) - //if (globalKeyState & Qt::ShiftModifier) - if (((QInputEvent*)ke)->modifiers() & Qt::ShiftModifier) - key += Qt::SHIFT; - ///if (ke->state() & Qt::AltModifier) - //if (globalKeyState & Qt::AltModifier) - if (((QInputEvent*)ke)->modifiers() & Qt::AltModifier) - key += Qt::ALT; - ///if (ke->state() & Qt::ControlModifier) - //if (globalKeyState & Qt::ControlModifier) - if (((QInputEvent*)ke)->modifiers() & Qt::ControlModifier) - key+= Qt::CTRL; - muse->kbAccel(key); - return true; - } - } - if (event->type() == QEvent::KeyRelease) { - QKeyEvent* ke = (QKeyEvent*)event; - ///globalKeyState = ke->stateAfter(); - globalKeyState = ke->modifiers(); - } - - return flag; - } - -#ifdef HAVE_LASH - virtual void timerEvent (QTimerEvent * /* e */) { - if(useLASH) - muse->lash_idle_cb (); - } -#endif /* HAVE_LASH */ - - }; - -//--------------------------------------------------------- -// localeList -//--------------------------------------------------------- - -static QString localeList() - { - // Find out what translations are available: - QStringList deliveredLocaleListFiltered; - QString distLocale = QString(INSTPREFIX) + "/" + SHAREINSTPREFIX + "/" - + INSTALL_NAME + "/locale"; - QFileInfo distLocaleFi(distLocale); - if (distLocaleFi.isDir()) { - QDir dir = QDir(distLocale); - QStringList deliveredLocaleList = dir.entryList(); - for(QStringList::iterator it = deliveredLocaleList.begin(); it != deliveredLocaleList.end(); ++it) { - QString item = *it; - if (item.endsWith(".qm")) { - int inipos = item.indexOf("muse_") + 5; - int finpos = item.lastIndexOf(".qm"); - deliveredLocaleListFiltered << item.mid(inipos, finpos - inipos); - } - } - return deliveredLocaleListFiltered.join(","); - } - return QString("No translations found!"); - } - -//--------------------------------------------------------- -// usage -//--------------------------------------------------------- - -static void usage(const char* prog, const char* txt) - { - fprintf(stderr, "%s: %s\nusage: %s flags midifile\n Flags:\n", - prog, txt, prog); - fprintf(stderr, " -h this help\n"); - fprintf(stderr, " -v print version\n"); - fprintf(stderr, " -d debug mode: no threads, no RT\n"); - fprintf(stderr, " -D debug mode: enable some debug messages\n"); - fprintf(stderr, " -m debug mode: trace midi Input\n"); - fprintf(stderr, " -M debug mode: trace midi Output\n"); - fprintf(stderr, " -s debug mode: trace sync\n"); - fprintf(stderr, " -a no audio\n"); - //fprintf(stderr, " -P n set real time priority to n (default: 50)\n"); - fprintf(stderr, " -P n set audio driver real time priority to n (Dummy only, default 40. Else fixed by Jack.)\n"); - fprintf(stderr, " -Y n force midi real time priority to n (default: audio driver prio +2)\n"); - fprintf(stderr, " -p don't load LADSPA plugins\n"); -#ifdef ENABLE_PYTHON - fprintf(stderr, " -y enable Python control support\n"); -#endif -#ifdef VST_SUPPORT - fprintf(stderr, " -V don't load VST plugins\n"); -#endif -#ifdef DSSI_SUPPORT - fprintf(stderr, " -I don't load DSSI plugins\n"); -#endif -#ifdef HAVE_LASH - fprintf(stderr, " -L don't use LASH\n"); -#endif - fprintf(stderr, " -l xx force locale to the given language/country code (xx = %s)\n", localeList().toLatin1().constData()); - fprintf(stderr, "useful environment variables:\n"); - fprintf(stderr, " MUSE override library and shared directories location\n"); - fprintf(stderr, " MUSEHOME override user home directory (HOME/)\n"); - fprintf(stderr, " MUSEINSTRUMENTS override user instrument directory (MUSEHOME/muse_instruments)\n"); - } - -//--------------------------------------------------------- // catchSignal // only for debugging //--------------------------------------------------------- @@ -3690,318 +3465,6 @@ static void catchSignal(int sig) } #endif -//--------------------------------------------------------- -// main -//--------------------------------------------------------- - -int main(int argc, char* argv[]) - { - -// error = ErrorHandler::create(argv[0]); - ruid = getuid(); - euid = geteuid(); - undoSetuid(); - getCapabilities(); - int noAudio = false; - - const char* mu = getenv("MUSEHOME"); - if(mu) - museUser = QString(mu); - if(museUser.isEmpty()) - museUser = QString(getenv("HOME")); - - QString museGlobal; - const char* p = getenv("MUSE"); - if (p) - museGlobal = p; - - if (museGlobal.isEmpty()) { - //QString museGlobal(INSTPREFIX); - //QString museGlobalLibDir(INSTLIBDIR); - //QString museGlobalLibDir(LIBINSTPREFIX); // This has no prefix. - //museGlobalLib = museGlobalLibDir + "/muse"; - //museGlobalShare = museGlobal + "/share/muse"; - - // p4.0.7 - museGlobalLib = QString(INSTPREFIX) + QString("/") + - QString(LIBINSTPREFIX) + QString("/") + - QString(INSTALL_NAME); - //museGlobalShare = museGlobal + QString("/share/") + QString(INSTALL_NAME); - museGlobalShare = QString(INSTPREFIX) + QString("/") + - QString(SHAREINSTPREFIX) + QString("/") + // This has no prefix. Default is "share", set in top cmake script. - QString(INSTALL_NAME); - } - else { - //museGlobalLib = museGlobal + "/lib"; - //museGlobalShare = museGlobal + "/share"; - museGlobalLib = museGlobal + QString("/") + QString(LIBINSTPREFIX); // p4.0.7 - museGlobalShare = museGlobal + QString("/") + QString(SHAREINSTPREFIX); - } - museProject = museProjectInitPath; //getcwd(0, 0); - configName = QString(getenv("HOME")) + QString("/.MusE"); - - museInstruments = museGlobalShare + QString("/instruments"); - - const char* ins = getenv("MUSEINSTRUMENTS"); - if(ins) - museUserInstruments = QString(ins); - if(museUserInstruments.isEmpty()) - museUserInstruments = museUser + QString("/muse_instruments"); - -#ifdef HAVE_LASH - lash_args_t * lash_args = 0; - if(useLASH) - lash_args = lash_extract_args (&argc, &argv); -#endif - - srand(time(0)); // initialize random number generator -// signal(SIGCHLD, catchSignal); // interferes with initVST() - initMidiController(); - QApplication::setColorSpec(QApplication::ManyColor); - MuseApplication app(argc, argv); - - initShortCuts(); - readConfiguration(); - - if (config.useDenormalBias) - printf("Denormal protection enabled.\n"); - // SHOW MUSE SPLASH SCREEN - if (config.showSplashScreen) { - QPixmap splsh(museGlobalShare + "/splash.png"); - - if (!splsh.isNull()) { - QSplashScreen* muse_splash = new QSplashScreen(splsh, - Qt::WindowStaysOnTopHint); - muse_splash->setAttribute(Qt::WA_DeleteOnClose); // Possibly also Qt::X11BypassWindowManagerHint - muse_splash->show(); - QTimer* stimer = new QTimer(0); - muse_splash->connect(stimer, SIGNAL(timeout()), muse_splash, SLOT(close())); - stimer->setSingleShot(true); - stimer->start(6000); - } - } - - int i; - - QString optstr("ahvdDmMsP:Y:l:py"); -#ifdef VST_SUPPORT - optstr += QString("V"); -#endif -#ifdef DSSI_SUPPORT - optstr += QString("I"); -#endif -#ifdef HAVE_LASH - optstr += QString("L"); -#endif - -//#ifdef VST_SUPPORT -// while ((i = getopt(argc, argv, "ahvdDmMsVP:py")) != EOF) { -//#else -// while ((i = getopt(argc, argv, "ahvdDmMsP:py")) != EOF) { -//#endif - - while ((i = getopt(argc, argv, optstr.toLatin1().constData())) != EOF) { - char c = (char)i; - switch (c) { - case 'v': printVersion(argv[0]); return 0; - case 'd': - debugMode = true; - realTimeScheduling = false; - break; - case 'a': - noAudio = true; - break; - case 'D': debugMsg = true; break; - case 'm': midiInputTrace = true; break; - case 'M': midiOutputTrace = true; break; - case 's': debugSync = true; break; - case 'P': realTimePriority = atoi(optarg); break; - case 'Y': midiRTPrioOverride = atoi(optarg); break; - case 'p': loadPlugins = false; break; - case 'V': loadVST = false; break; - case 'I': loadDSSI = false; break; - case 'L': useLASH = false; break; - case 'y': usePythonBridge = true; break; - case 'l': locale_override = QString(optarg); break; - case 'h': usage(argv[0], argv[1]); return -1; - default: usage(argv[0], "bad argument"); return -1; - } - } - - /* - if(!config.styleSheetFile.isEmpty()) - { - if(debugMsg) - printf("loading style sheet <%s> \n", qPrintable(config.styleSheetFile)); - QFile cf(config.styleSheetFile); - if (cf.open(QIODevice::ReadOnly)) { - QByteArray ss = cf.readAll(); - QString sheet(QString::fromUtf8(ss.data())); - app.setStyleSheet(sheet); - cf.close(); - } - else - printf("loading style sheet <%s> failed\n", qPrintable(config.styleSheetFile)); - } - */ - - AL::initDsp(); - - if (debugMsg) - printf("Start euid: %d ruid: %d, Now euid %d\n", - euid, ruid, geteuid()); - if (debugMode) { - initDummyAudio(); - realTimeScheduling = false; - } - else if (noAudio) { - initDummyAudio(); - realTimeScheduling = true; - //if (debugMode) { // ?? - // realTimeScheduling = false; - // } - } - else if (initJackAudio()) { - if (!debugMode) - { - QMessageBox::critical(NULL, "MusE fatal error", "MusE <b>failed</b> to find a <b>Jack audio server</b>.<br><br>" - "<i>MusE will continue without audio support (-a switch)!</i><br><br>" - "If this was not intended check that Jack was started. " - "If Jack <i>was</i> started check that it was\n" - "started as the same user as MusE.\n"); - - initDummyAudio(); - noAudio = true; - realTimeScheduling = true; - if (debugMode) { - realTimeScheduling = false; - } - } - else - { - fprintf(stderr, "fatal error: no JACK audio server found\n"); - fprintf(stderr, "no audio functions available\n"); - fprintf(stderr, "*** experimental mode -- no play possible ***\n"); - initDummyAudio(); - //realTimeScheduling = audioDevice->isRealtime(); - } - realTimeScheduling = true; - } - else - realTimeScheduling = audioDevice->isRealtime(); - - useJackTransport.setValue(true); - // setup the prefetch fifo length now that the segmentSize is known - // Changed by Tim. p3.3.17 - // Changed to 4 *, JUST FOR TEST!!! - fifoLength = 131072/segmentSize; - //fifoLength = (131072/segmentSize) * 4; - - - argc -= optind; - ++argc; - - if (debugMsg) { - printf("global lib: <%s>\n", museGlobalLib.toLatin1().constData()); - printf("global share: <%s>\n", museGlobalShare.toLatin1().constData()); - printf("muse home: <%s>\n", museUser.toLatin1().constData()); - printf("project dir: <%s>\n", museProject.toLatin1().constData()); - printf("user instruments: <%s>\n", museUserInstruments.toLatin1().constData()); - } - - static QTranslator translator(0); - QString locale(QApplication::keyboardInputLocale().name()); - if (locale_override.length()) - locale = locale_override; - if (locale != "C") { - QString loc("muse_"); - loc += locale; - if (translator.load(loc, QString(".")) == false) { - QString lp(museGlobalShare); - lp += QString("/locale"); - if (translator.load(loc, lp) == false) { - printf("no locale <%s>/<%s>\n", loc.toLatin1().constData(), lp.toLatin1().constData()); - } - } - app.installTranslator(&translator); - } - - if (locale == "de") { - printf("locale de\n"); - hIsB = false; - } - - if (loadPlugins) - initPlugins(); - - if (loadVST) - initVST(); - - if(loadDSSI) - initDSSI(); - - // p3.3.39 - initOSC(); - - initIcons(); - - initMetronome(); - - //QApplication::clipboard()->setSelectionMode(false); ddskrjo obsolete even in Qt3 - - QApplication::addLibraryPath(museGlobalLib + "/qtplugins"); - if (debugMsg) { - QStringList list = app.libraryPaths(); - QStringList::Iterator it = list.begin(); - printf("QtLibraryPath:\n"); - while(it != list.end()) { - printf(" <%s>\n", (*it).toLatin1().constData()); - ++it; - } - } - - muse = new MusE(argc, &argv[optind]); - app.setMuse(muse); - muse->setWindowIcon(*museIcon); - - // Added by Tim. p3.3.22 - if (!debugMode) { - if (mlockall(MCL_CURRENT | MCL_FUTURE)) - perror("WARNING: Cannot lock memory:"); - } - - muse->show(); - muse->seqStart(); - -#ifdef HAVE_LASH - { - if(useLASH) - { - int lash_flags = LASH_Config_File; - const char *muse_name = PACKAGE_NAME; - lash_client = lash_init (lash_args, muse_name, lash_flags, LASH_PROTOCOL(2,0)); - lash_alsa_client_id (lash_client, snd_seq_client_id (alsaSeq)); - if (!noAudio) { - // p3.3.38 - //char *jack_name = ((JackAudioDevice*)audioDevice)->getJackName(); - const char *jack_name = audioDevice->clientName(); - lash_jack_client_name (lash_client, jack_name); - } - } - } -#endif /* HAVE_LASH */ - QTimer::singleShot(100, muse, SLOT(showDidYouKnowDialog())); - - int rv = app.exec(); - if(debugMsg) - printf("app.exec() returned:%d\nDeleting main MusE object\n", rv); - delete muse; - if(debugMsg) - printf("Finished! Exiting main, return value:%d\n", rv); - return rv; - - } - #if 0 //--------------------------------------------------------- // configPart |