# HG changeset patch # User Chris Cannam # Date 1169830797 0 # Node ID bf753a9abf0c6132ef3dbcdfb8f9343fbdef7ecd # Parent c7122e70f8ec256eeffac4e22ed56e97a486d6fd * Add slice layers (so you can display a slice of a colour 3d plot as if it were a spectrum) * Make spectrum layer a subclass of slice layer diff -r c7122e70f8ec -r bf753a9abf0c data/fft/FFTDataServer.cpp --- a/data/fft/FFTDataServer.cpp Thu Jan 25 17:41:00 2007 +0000 +++ b/data/fft/FFTDataServer.cpp Fri Jan 26 16:59:57 2007 +0000 @@ -30,7 +30,7 @@ #include -//#define DEBUG_FFT_SERVER 1 +#define DEBUG_FFT_SERVER 1 //#define DEBUG_FFT_SERVER_FILL 1 #ifdef DEBUG_FFT_SERVER_FILL diff -r c7122e70f8ec -r bf753a9abf0c data/model/DenseThreeDimensionalModel.h --- a/data/model/DenseThreeDimensionalModel.h Thu Jan 25 17:41:00 2007 +0000 +++ b/data/model/DenseThreeDimensionalModel.h Fri Jan 26 16:59:57 2007 +0000 @@ -54,11 +54,10 @@ /** * Return true if there are data available for the given column. - * This should return true only if getBinValues(windowStartFrame) - * would not have to do any substantial work to calculate its - * return values. If this function returns false, it may still be - * possible to get the bin values for that column, but they may - * have to be calculated. + * This should return true only if getColumn(column) would not + * have to do any substantial work to calculate its return values. + * If this function returns false, it may still be possible to + * retrieve the column, but its values may have to be calculated. */ virtual bool isColumnAvailable(size_t column) const = 0; diff -r c7122e70f8ec -r bf753a9abf0c plugin/DSSIPluginFactory.cpp --- a/plugin/DSSIPluginFactory.cpp Thu Jan 25 17:41:00 2007 +0000 +++ b/plugin/DSSIPluginFactory.cpp Fri Jan 26 16:59:57 2007 +0000 @@ -231,7 +231,7 @@ std::string::size_type index = 0, newindex = 0; - while ((newindex = path.find(':', index)) < path.size()) { + while ((newindex = path.find(PATH_SEPARATOR, index)) < path.size()) { pathList.push_back(path.substr(index, newindex - index).c_str()); index = newindex + 1; } diff -r c7122e70f8ec -r bf753a9abf0c plugin/LADSPAPluginFactory.cpp --- a/plugin/LADSPAPluginFactory.cpp Thu Jan 25 17:41:00 2007 +0000 +++ b/plugin/LADSPAPluginFactory.cpp Fri Jan 26 16:59:57 2007 +0000 @@ -554,7 +554,7 @@ std::string::size_type index = 0, newindex = 0; - while ((newindex = path.find(':', index)) < path.size()) { + while ((newindex = path.find(PATH_SEPARATOR, index)) < path.size()) { pathList.push_back(path.substr(index, newindex - index).c_str()); index = newindex + 1; } diff -r c7122e70f8ec -r bf753a9abf0c system/System.cpp --- a/system/System.cpp Thu Jan 25 17:41:00 2007 +0000 +++ b/system/System.cpp Fri Jan 26 16:59:57 2007 +0000 @@ -1,261 +1,260 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Sonic Visualiser - An audio file viewer and annotation editor. - Centre for Digital Music, Queen Mary, University of London. - This file copyright 2006 Chris Cannam and QMUL. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. See the file - COPYING included with this distribution for more information. -*/ - -#include "System.h" - -#include -#include - -#include - -#ifndef _WIN32 -#include -#include -#include -#endif - -#ifdef __APPLE__ -#include -#include -#endif - -#include - -#ifdef _WIN32 - -extern "C" { - -void usleep(unsigned long usec) -{ - ::Sleep(usec / 1000); -} - -void gettimeofday(struct timeval *tv, void *tz) -{ - union { - long long ns100; - FILETIME ft; - } now; - - ::GetSystemTimeAsFileTime(&now.ft); - tv->tv_usec = (long)((now.ns100 / 10LL) % 1000000LL); - tv->tv_sec = (long)((now.ns100 - 116444736000000000LL) / 10000000LL); -} - -} - -#endif - -ProcessStatus -GetProcessStatus(int pid) -{ -#ifdef _WIN32 - HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); - if (!handle) { - return ProcessNotRunning; - } else { - CloseHandle(handle); - return ProcessRunning; - } -#else - if (kill(getpid(), 0) == 0) { - if (kill(pid, 0) == 0) { - return ProcessRunning; - } else { - return ProcessNotRunning; - } - } else { - return UnknownProcessStatus; - } -#endif -} - -#ifdef _WIN32 -/* MEMORYSTATUSEX is missing from older Windows headers, so define a - local replacement. This trick from MinGW source code. Ugh */ -typedef struct -{ - DWORD dwLength; - DWORD dwMemoryLoad; - DWORDLONG ullTotalPhys; - DWORDLONG ullAvailPhys; - DWORDLONG ullTotalPageFile; - DWORDLONG ullAvailPageFile; - DWORDLONG ullTotalVirtual; - DWORDLONG ullAvailVirtual; - DWORDLONG ullAvailExtendedVirtual; -} lMEMORYSTATUSEX; -typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*); -#endif - -void -GetRealMemoryMBAvailable(int &available, int &total) -{ - available = -1; - total = -1; - -#ifdef _WIN32 - - static bool checked = false; - static bool exFound = false; - static PFN_MS_EX ex; - - if (!checked) { - - HMODULE h = GetModuleHandleA("kernel32.dll"); - - if (h) { - if ((ex = (PFN_MS_EX)GetProcAddress(h, "GlobalMemoryStatusEx"))) { - exFound = true; - } - } - - checked = true; - } - - DWORDLONG wavail = 0; - DWORDLONG wtotal = 0; - - if (exFound) { - - lMEMORYSTATUSEX lms; - lms.dwLength = sizeof(lms); - if (!ex(&lms)) { - std::cerr << "WARNING: GlobalMemoryStatusEx failed: error code " - << GetLastError() << std::endl; - return; - } - wavail = lms.ullAvailPhys; - wtotal = lms.ullTotalPhys; - - } else { - - /* Fall back to GlobalMemoryStatus which is always available. - but returns wrong results for physical memory > 4GB */ - - MEMORYSTATUS ms; - GlobalMemoryStatus(&ms); - wavail = ms.dwAvailPhys; - wtotal = ms.dwTotalPhys; - } - - DWORDLONG size = wavail / 1048576; - if (size > INT_MAX) size = INT_MAX; - available = int(size); - - size = wtotal / 1048576; - if (size > INT_MAX) size = INT_MAX; - total = int(size); - - return; - -#else -#ifdef __APPLE__ - - unsigned int val; - int mib[2]; - size_t size_sys; - - mib[0] = CTL_HW; - - mib[1] = HW_PHYSMEM; - size_sys = sizeof(val); - sysctl(mib, 2, &val, &size_sys, NULL, 0); - if (val) total = val / 1048576; - - mib[1] = HW_USERMEM; - size_sys = sizeof(val); - sysctl(mib, 2, &val, &size_sys, NULL, 0); - if (val) available = val / 1048576; - - return; - -#else - - FILE *meminfo = fopen("/proc/meminfo", "r"); - if (!meminfo) return; - - char buf[256]; - while (!feof(meminfo)) { - fgets(buf, 256, meminfo); - bool isMemFree = (strncmp(buf, "MemFree:", 8) == 0); - bool isMemTotal = (!isMemFree && (strncmp(buf, "MemTotal:", 9) == 0)); - if (isMemFree || isMemTotal) { - QString line = QString(buf).trimmed(); - QStringList elements = line.split(' ', QString::SkipEmptyParts); - QString unit = "kB"; - if (elements.size() > 2) unit = elements[2]; - int size = elements[1].toInt(); -// std::cerr << "have size \"" << size << "\", unit \"" -// << unit.toStdString() << "\"" << std::endl; - if (unit.toLower() == "gb") size = size * 1024; - else if (unit.toLower() == "mb") size = size; - else if (unit.toLower() == "kb") size = size / 1024; - else size = size / 1048576; - - if (isMemFree) available = size; - else total = size; - } - if (available != -1 && total != -1) { - fclose(meminfo); - return; - } - } - fclose(meminfo); - - return; - -#endif -#endif -} - -int -GetDiscSpaceMBAvailable(const char *path) -{ -#ifdef _WIN32 - ULARGE_INTEGER available, total, totalFree; - if (GetDiskFreeSpaceExA(path, &available, &total, &totalFree)) { - __int64 a = available.QuadPart; - a /= 1048576; - if (a > INT_MAX) a = INT_MAX; - return int(a); - } else { - std::cerr << "WARNING: GetDiskFreeSpaceEx failed: error code " - << GetLastError() << std::endl; - return -1; - } -#else - struct statvfs buf; - if (!statvfs(path, &buf)) { - // do the multiplies and divides in this order to reduce the - // likelihood of arithmetic overflow - std::cerr << "statvfs(" << path << ") says available: " << buf.f_bavail << ", block size: " << buf.f_bsize << std::endl; - uint64_t available = ((buf.f_bavail / 1024) * buf.f_bsize) / 1024; - if (available > INT_MAX) available = INT_MAX; - return int(available); - } else { - perror("statvfs failed"); - return -1; - } -#endif -} - - -double mod(double x, double y) { return x - (y * floor(x / y)); } -float modf(float x, float y) { return x - (y * floorf(x / y)); } - -double princarg(double a) { return mod(a + M_PI, -2 * M_PI) + M_PI; } -float princargf(float a) { return modf(a + M_PI, -2 * M_PI) + M_PI; } - +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006 Chris Cannam and QMUL. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "System.h" + +#include +#include + +#include + +#ifndef _WIN32 +#include +#include +#endif + +#ifdef __APPLE__ +#include +#include +#endif + +#include + +#ifdef _WIN32 + +extern "C" { + +void usleep(unsigned long usec) +{ + ::Sleep(usec / 1000); +} + +void gettimeofday(struct timeval *tv, void *tz) +{ + union { + long long ns100; + FILETIME ft; + } now; + + ::GetSystemTimeAsFileTime(&now.ft); + tv->tv_usec = (long)((now.ns100 / 10LL) % 1000000LL); + tv->tv_sec = (long)((now.ns100 - 116444736000000000LL) / 10000000LL); +} + +} + +#endif + +ProcessStatus +GetProcessStatus(int pid) +{ +#ifdef _WIN32 + HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if (!handle) { + return ProcessNotRunning; + } else { + CloseHandle(handle); + return ProcessRunning; + } +#else + if (kill(getpid(), 0) == 0) { + if (kill(pid, 0) == 0) { + return ProcessRunning; + } else { + return ProcessNotRunning; + } + } else { + return UnknownProcessStatus; + } +#endif +} + +#ifdef _WIN32 +/* MEMORYSTATUSEX is missing from older Windows headers, so define a + local replacement. This trick from MinGW source code. Ugh */ +typedef struct +{ + DWORD dwLength; + DWORD dwMemoryLoad; + DWORDLONG ullTotalPhys; + DWORDLONG ullAvailPhys; + DWORDLONG ullTotalPageFile; + DWORDLONG ullAvailPageFile; + DWORDLONG ullTotalVirtual; + DWORDLONG ullAvailVirtual; + DWORDLONG ullAvailExtendedVirtual; +} lMEMORYSTATUSEX; +typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*); +#endif + +void +GetRealMemoryMBAvailable(int &available, int &total) +{ + available = -1; + total = -1; + +#ifdef _WIN32 + + static bool checked = false; + static bool exFound = false; + static PFN_MS_EX ex; + + if (!checked) { + + HMODULE h = GetModuleHandleA("kernel32.dll"); + + if (h) { + if ((ex = (PFN_MS_EX)GetProcAddress(h, "GlobalMemoryStatusEx"))) { + exFound = true; + } + } + + checked = true; + } + + DWORDLONG wavail = 0; + DWORDLONG wtotal = 0; + + if (exFound) { + + lMEMORYSTATUSEX lms; + lms.dwLength = sizeof(lms); + if (!ex(&lms)) { + std::cerr << "WARNING: GlobalMemoryStatusEx failed: error code " + << GetLastError() << std::endl; + return; + } + wavail = lms.ullAvailPhys; + wtotal = lms.ullTotalPhys; + + } else { + + /* Fall back to GlobalMemoryStatus which is always available. + but returns wrong results for physical memory > 4GB */ + + MEMORYSTATUS ms; + GlobalMemoryStatus(&ms); + wavail = ms.dwAvailPhys; + wtotal = ms.dwTotalPhys; + } + + DWORDLONG size = wavail / 1048576; + if (size > INT_MAX) size = INT_MAX; + available = int(size); + + size = wtotal / 1048576; + if (size > INT_MAX) size = INT_MAX; + total = int(size); + + return; + +#else +#ifdef __APPLE__ + + unsigned int val; + int mib[2]; + size_t size_sys; + + mib[0] = CTL_HW; + + mib[1] = HW_PHYSMEM; + size_sys = sizeof(val); + sysctl(mib, 2, &val, &size_sys, NULL, 0); + if (val) total = val / 1048576; + + mib[1] = HW_USERMEM; + size_sys = sizeof(val); + sysctl(mib, 2, &val, &size_sys, NULL, 0); + if (val) available = val / 1048576; + + return; + +#else + + FILE *meminfo = fopen("/proc/meminfo", "r"); + if (!meminfo) return; + + char buf[256]; + while (!feof(meminfo)) { + fgets(buf, 256, meminfo); + bool isMemFree = (strncmp(buf, "MemFree:", 8) == 0); + bool isMemTotal = (!isMemFree && (strncmp(buf, "MemTotal:", 9) == 0)); + if (isMemFree || isMemTotal) { + QString line = QString(buf).trimmed(); + QStringList elements = line.split(' ', QString::SkipEmptyParts); + QString unit = "kB"; + if (elements.size() > 2) unit = elements[2]; + int size = elements[1].toInt(); +// std::cerr << "have size \"" << size << "\", unit \"" +// << unit.toStdString() << "\"" << std::endl; + if (unit.toLower() == "gb") size = size * 1024; + else if (unit.toLower() == "mb") size = size; + else if (unit.toLower() == "kb") size = size / 1024; + else size = size / 1048576; + + if (isMemFree) available = size; + else total = size; + } + if (available != -1 && total != -1) { + fclose(meminfo); + return; + } + } + fclose(meminfo); + + return; + +#endif +#endif +} + +int +GetDiscSpaceMBAvailable(const char *path) +{ +#ifdef _WIN32 + ULARGE_INTEGER available, total, totalFree; + if (GetDiskFreeSpaceExA(path, &available, &total, &totalFree)) { + __int64 a = available.QuadPart; + a /= 1048576; + if (a > INT_MAX) a = INT_MAX; + return int(a); + } else { + std::cerr << "WARNING: GetDiskFreeSpaceEx failed: error code " + << GetLastError() << std::endl; + return -1; + } +#else + struct statvfs buf; + if (!statvfs(path, &buf)) { + // do the multiplies and divides in this order to reduce the + // likelihood of arithmetic overflow + std::cerr << "statvfs(" << path << ") says available: " << buf.f_bavail << ", block size: " << buf.f_bsize << std::endl; + uint64_t available = ((buf.f_bavail / 1024) * buf.f_bsize) / 1024; + if (available > INT_MAX) available = INT_MAX; + return int(available); + } else { + perror("statvfs failed"); + return -1; + } +#endif +} + + +double mod(double x, double y) { return x - (y * floor(x / y)); } +float modf(float x, float y) { return x - (y * floorf(x / y)); } + +double princarg(double a) { return mod(a + M_PI, -2 * M_PI) + M_PI; } +float princargf(float a) { return modf(a + M_PI, -2 * M_PI) + M_PI; } + diff -r c7122e70f8ec -r bf753a9abf0c system/System.h --- a/system/System.h Thu Jan 25 17:41:00 2007 +0000 +++ b/system/System.h Fri Jan 26 16:59:57 2007 +0000 @@ -28,10 +28,11 @@ #define DLOPEN(a,b) LoadLibrary((a).toStdWString().c_str()) #define DLSYM(a,b) GetProcAddress((HINSTANCE)(a),(b)) -#define DLCLOSE(a) FreeLibrary((HINSTANCE)(a)) +#define DLCLOSE(a) (!FreeLibrary((HINSTANCE)(a))) #define DLERROR() "" #define PLUGIN_GLOB "*.dll" +#define PATH_SEPARATOR ';' // The default Vamp plugin path is obtained from a function in the // Vamp SDK (Vamp::PluginHostAdapter::getPluginPath). @@ -46,7 +47,7 @@ // default if we include the Audacity plugin location as well as an // (imho) more sensible place. -#define DEFAULT_LADSPA_PATH "%ProgramFiles%\\LADSPA Plugins:%ProgramFiles%\\Audacity\\Plug-Ins" +#define DEFAULT_LADSPA_PATH "%ProgramFiles%\\LADSPA Plugins;%ProgramFiles%\\Audacity\\Plug-Ins" #define DEFAULT_DSSI_PATH "%ProgramFiles%\\DSSI Plugins" #define getpid _getpid @@ -73,6 +74,7 @@ #ifdef __APPLE__ #define PLUGIN_GLOB "*.dylib" +#define PATH_SEPARATOR ':' #define DEFAULT_LADSPA_PATH "$HOME/Library/Audio/Plug-Ins/LADSPA:/Library/Audio/Plug-Ins/LADSPA" #define DEFAULT_DSSI_PATH "$HOME/Library/Audio/Plug-Ins/DSSI:/Library/Audio/Plug-Ins/DSSI" @@ -80,6 +82,7 @@ #else #define PLUGIN_GLOB "*.so" +#define PATH_SEPARATOR ':' #define DEFAULT_LADSPA_PATH "$HOME/ladspa:$HOME/.ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa" #define DEFAULT_DSSI_PATH "$HOME/dssi:$HOME/.dssi:/usr/local/lib/dssi:/usr/lib/dssi"