Пример #1
0
/*--------------------------------------------------------------------------*/
long _fftwfA (char* w, long ni) /* export wisdom to string */
{
  char *ws;
  ws = fftwf_export_wisdom_to_string();
  long n = strlen(ws);
  if (n>ni) return -n;
  strcpy(w,ws);
  return n;
}
Пример #2
0
int
main(int argc, char **argv)
{
    svSystemSpecificInitialisation();

#ifdef Q_WS_X11
#if QT_VERSION >= 0x040500
//    QApplication::setGraphicsSystem("raster");
#endif
#endif

#ifdef Q_OS_MAC
    if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) {
        // Fix for OS/X 10.9 font problem
        QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande");
    }
#endif

    SVApplication application(argc, argv);

    QStringList args = application.arguments();

    signal(SIGINT,  signalHandler);
    signal(SIGTERM, signalHandler);

#ifndef Q_OS_WIN32
    signal(SIGHUP,  signalHandler);
    signal(SIGQUIT, signalHandler);
#endif

    bool audioOutput = true;
    bool oscSupport = true;

    if (args.contains("--help") || args.contains("-h") || args.contains("-?")) {
        cerr << QApplication::tr(
            "\nSonic Visualiser is a program for viewing and exploring audio data\nfor semantic music analysis and annotation.\n\nUsage:\n\n  %1 [--no-audio] [--no-osc] [<file> ...]\n\n  --no-audio: Do not attempt to open an audio output device\n  --no-osc: Do not provide an Open Sound Control port for remote control\n  <file>: One or more Sonic Visualiser (.sv) and audio files may be provided.\n").arg(argv[0]) << endl;
        exit(2);
    }

    if (args.contains("--no-audio")) audioOutput = false;
    if (args.contains("--no-osc")) oscSupport = false;

    QApplication::setOrganizationName("sonic-visualiser");
    QApplication::setOrganizationDomain("sonicvisualiser.org");
    QApplication::setApplicationName(QApplication::tr("Sonic Visualiser"));

    QSplashScreen *splash = 0;

    QSettings settings;

    settings.beginGroup("Preferences");
    if (settings.value("show-splash", true).toBool()) {
        QPixmap pixmap(":/icons/sv-splash.png");
        QPainter painter;
        painter.begin(&pixmap);
        QString text = QString("v%1").arg(SV_VERSION);
        painter.drawText
            (pixmap.width() - painter.fontMetrics().width(text) - 10,
             10 + painter.fontMetrics().ascent(),
             text);
        painter.end();
        splash = new QSplashScreen(pixmap);
        splash->show();
        QTimer::singleShot(5000, splash, SLOT(hide()));
        application.processEvents();
    }
    settings.endGroup();

    settings.beginGroup("RDF");
    if (!settings.contains("rdf-indices")) {
        QStringList list;
        list << "http://www.vamp-plugins.org/rdf/plugins/index.txt";
        settings.setValue("rdf-indices", list);
    }
    settings.endGroup();

    QIcon icon;
    int sizes[] = { 16, 22, 24, 32, 48, 64, 128 };
    for (int i = 0; i < int(sizeof(sizes)/sizeof(sizes[0])); ++i) {
        icon.addFile(QString(":icons/sv-%1x%2.png").arg(sizes[i]).arg(sizes[i]));
    }
    QApplication::setWindowIcon(icon);

    QString language = QLocale::system().name();

    settings.beginGroup("Preferences");
    language = settings.value("locale", language).toString();
    settings.endGroup();

    QTranslator qtTranslator;
    QString qtTrName = QString("qt_%1").arg(language);
    SVDEBUG << "Loading " << qtTrName << "... ";
    bool success = false;
    if (!(success = qtTranslator.load(qtTrName))) {
        QString qtDir = getenv("QTDIR");
        if (qtDir != "") {
            success = qtTranslator.load
                (qtTrName, QDir(qtDir).filePath("translations"));
        }
    }
    if (!success) {
        SVDEBUG << "Failed\nFailed to load Qt translation for locale" << endl;
    } else {
        cerr << "Done" << endl;
    }
    application.installTranslator(&qtTranslator);

    QTranslator svTranslator;
    QString svTrName = QString("sonic-visualiser_%1").arg(language);
    SVDEBUG << "Loading " << svTrName << "... ";
    svTranslator.load(svTrName, ":i18n");
    SVDEBUG << "Done" << endl;
    application.installTranslator(&svTranslator);

    StoreStartupLocale();

    // Permit size_t and PropertyName to be used as args in queued signal calls
    qRegisterMetaType<PropertyContainer::PropertyName>("PropertyContainer::PropertyName");

    MainWindow *gui = new MainWindow(audioOutput, oscSupport);
    application.setMainWindow(gui);
    InteractiveFileFinder::setParentWidget(gui);
    TransformUserConfigurator::setParentWidget(gui);
    if (splash) {
        QObject::connect(gui, SIGNAL(hideSplash()), splash, SLOT(hide()));
    }

    QDesktopWidget *desktop = QApplication::desktop();
    QRect available = desktop->availableGeometry();

    int width = (available.width() * 2) / 3;
    int height = available.height() / 2;
    if (height < 450) height = (available.height() * 2) / 3;
    if (width > height * 2) width = height * 2;

    settings.beginGroup("MainWindow");

    QSize size = settings.value("size", QSize(width, height)).toSize();
    gui->resizeConstrained(size);

    if (settings.contains("position")) {
        QRect prevrect(settings.value("position").toPoint(), size);
        if (!(available & prevrect).isEmpty()) {
            gui->move(prevrect.topLeft());
        }
    }

    if (settings.value("maximised", false).toBool()) {
        gui->setWindowState(Qt::WindowMaximized);
    }

    settings.endGroup();
    
    gui->show();

    // The MainWindow class seems to have trouble dealing with this if
    // it tries to adapt to this preference before the constructor is
    // complete.  As a lazy hack, apply it explicitly from here
    gui->preferenceChanged("Property Box Layout");

    application.m_readyForFiles = true; // Ready to receive files from e.g. Apple Events

    for (QStringList::iterator i = args.begin(); i != args.end(); ++i) {

        if (i == args.begin()) continue;
        if (i->startsWith('-')) continue;

        QString path = *i;

        application.handleFilepathArgument(path, splash);
    }
    
    for (QStringList::iterator i = application.m_filepathQueue.begin(); i != application.m_filepathQueue.end(); ++i) {
        QString path = *i;
        application.handleFilepathArgument(path, splash);
    }
    
#ifdef HAVE_FFTW3F
    settings.beginGroup("FFTWisdom");
    QString wisdom = settings.value("wisdom").toString();
    if (wisdom != "") {
        fftwf_import_wisdom_from_string(wisdom.toLocal8Bit().data());
    }
#ifdef HAVE_FFTW3
    wisdom = settings.value("wisdom_d").toString();
    if (wisdom != "") {
        fftw_import_wisdom_from_string(wisdom.toLocal8Bit().data());
    }
#endif
    settings.endGroup();
#endif

    if (splash) splash->finish(gui);
    delete splash;

/*
    TipDialog tipDialog;
    if (tipDialog.isOK()) {
        tipDialog.exec();
    }
*/
    int rv = application.exec();

    gui->hide();

    cleanupMutex.lock();

    if (!cleanedUp) {
        TransformFactory::deleteInstance();
        TempDirectory::getInstance()->cleanup();
        cleanedUp = true;
    }

    application.releaseMainWindow();

#ifdef HAVE_FFTW3F
    settings.beginGroup("FFTWisdom");
    char *cwisdom = fftwf_export_wisdom_to_string();
    if (cwisdom) {
        settings.setValue("wisdom", cwisdom);
        free(cwisdom);
    }
#ifdef HAVE_FFTW3
    cwisdom = fftw_export_wisdom_to_string();
    if (cwisdom) {
        settings.setValue("wisdom_d", cwisdom);
        free(cwisdom);
    }
#endif
    settings.endGroup();
#endif

    FileSource::debugReport();
    
    delete gui;

    cleanupMutex.unlock();

    return rv;
}
Пример #3
0
int main(int argc, char **argv) {
	fftwf_plan ptmp;
	FILE *wisdom_file;
	char *wisdom_string;
	fftwf_complex *in, *out;
	double *inf,*outf;
	in  = (fftwf_complex *)fftwf_malloc(65536*sizeof(fftwf_complex));
	out = (fftwf_complex *)fftwf_malloc(65536*sizeof(fftwf_complex));
	inf  = (double *)in;
	outf = (double *)out;
	if ((wisdom_file = fopen("wisdom","w")) != NULL) {
		fprintf(stderr,"Wisdom file successfully opened\n");
		fprintf(stderr,"Checking forward fft's up to 8192\n");
		fprintf(stderr,"64 Forward\n");
		ptmp = fftwf_plan_dft_1d(64,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		{
			int i;
			for(i=0;i<64;i++) {
				inf[2*i]   = cos(i*M_PI/129.0);
				inf[2*i+1] = sin(i*M_PI/129.0);
			}
			fftwf_execute(ptmp);
			/*for(i=0;i<64;i++) {
				fprintf(stderr,"bin[%3d] =  (%15.10f %15.10f)\n",i,outf[2*i],outf[2*i+1]);
			}*/
		}
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"128 Forward\n");
		ptmp = fftwf_plan_dft_1d(128,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"256 Forward\n");
		ptmp = fftwf_plan_dft_1d(256,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"512 Forward\n");
		ptmp = fftwf_plan_dft_1d(512,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"1024 Forward\n");
		ptmp = fftwf_plan_dft_1d(1024,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"2048 Forward\n");
		ptmp = fftwf_plan_dft_1d(2048,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"4096 Forward\n");
		ptmp = fftwf_plan_dft_1d(4096,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"8192 Forward\n");
		ptmp = fftwf_plan_dft_1d(8192,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
/*		fprintf(stderr,"16384 Forward\n");
		ptmp = fftwf_plan_dft_1d(16384,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"32768 Forward\n");
		ptmp = fftwf_plan_dft_1d(32768,in,out,FFTW_FORWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp); */


		fprintf(stderr,"Checking inverse fft's up to 8192\n");

		fprintf(stderr,"64 Backward\n");
		ptmp = fftwf_plan_dft_1d(64,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"128 Backward\n");
		ptmp = fftwf_plan_dft_1d(128,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"256 Backward\n");
		ptmp = fftwf_plan_dft_1d(256,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"512 Backward\n");
		ptmp = fftwf_plan_dft_1d(512,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"1024 Backward\n");
		ptmp = fftwf_plan_dft_1d(1024,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"2048 Backward\n");
		ptmp = fftwf_plan_dft_1d(2048,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"4096 Backward\n");
		ptmp = fftwf_plan_dft_1d(4096,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"8192 Backward\n");
		ptmp = fftwf_plan_dft_1d(8192,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
/*		fprintf(stderr,"16384 Backward\n");
		ptmp = fftwf_plan_dft_1d(16384,in,out,FFTW_BACKWARD,
				    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
		fprintf(stderr,"32768 Backward\n");
		ptmp = fftwf_plan_dft_1d(32768,in,out,FFTW_BACKWARD,
			    FFTW_PATIENT);
		fftwf_destroy_plan(ptmp);
*/

		fftwf_free(in);
		fftwf_free(out);
		fprintf(stderr,"Finished computing, exporting wisdom\n");
		fflush(stderr);
		wisdom_string = fftwf_export_wisdom_to_string();
		fprintf(wisdom_file,"%s",wisdom_string);
		fclose(wisdom_file);
		fprintf(stderr,"%s\n",wisdom_string);
		fprintf(stderr,"Done!\n");

	} else 
		fprintf(stderr,"Could not create the wisdom file.\n");
	//fprintf(stderr,"Press the Enter key to close."),gets(dummy);
}