void wrappedClass_receiveNotificationForOutlet(WrappedInstancePtr self, TTValue& arg)
{
    TTString	string = arg[0];
    t_symbol*   s = gensym((char*)string.c_str());
    
    outlet_anything((t_outlet*)self->controlOutlet, s, 0, NULL);
}
void ramp_setFunction(t_ramp *x, void *attr, long argc, t_atom *argv)
{
	long		n;
	TTValue		names;
	TTSymbol*	aName;
	TTString	nameString;
	
	// set the function
	x->attr_function = atom_getsym(argv);
	x->rampUnit->setAttributeValue(TT("function"), TT(x->attr_function->s_name));
	
	// cache the function's attribute names
	x->parameterNames->clear();
	x->rampUnit->getFunctionParameterNames(names);
	n = names.getSize();
	for (int i=0; i<n; i++) {
		names.get(i, &aName);
		nameString = aName->getString();
		
		if (aName == TT("bypass") || aName == TT("mute") || aName == TT("maxNumChannels") || aName == TT("sampleRate"))
			continue;										// don't publish these parameters
		
		if (nameString[0] > 64 && nameString[0] < 91) {		// ignore all params not starting with upper-case
			nameString[0] += 32;							// convert first letter to lower-case for Max
			
			TTValuePtr v = new TTValue(aName);
			x->parameterNames->append(TT(nameString.c_str()), *v);
		}
	}	
}
void plug_alias_register(const char* plugtastic_name, const char* original_name, const char* category, const char* description)
{
	t_atom		a[4];
	TTString	str = "Plugtastic ";
	
	// create alias
	object_method(sMaxObject, ps_objectfile, GENSYM(plugtastic_name), GENSYM(original_name), GENSYM(original_name));

	// add to autocompletion
	atom_setsym(a, GENSYM(plugtastic_name));
	object_method_typed(sMaxObject, ps_db_object_addinternal, 1, a, NULL);
	
	// add to object list
	str += category;
	object_method(sMaxObject, ps_oblist, GENSYM(str.c_str()), GENSYM(plugtastic_name));	
	
	atom_setsym(a+0, GENSYM(plugtastic_name));
	atom_setsym(a+1, _sym_object);
	atom_setsym(a+2, _sym_tag);
	atom_setsym(a+3, GENSYM("Plugtastic"));
	object_method_typed(sMaxObject, ps_db_addmetadata, 4, a, NULL);
	
	atom_setsym(a+0, GENSYM(plugtastic_name));
	atom_setsym(a+1, _sym_object);
	atom_setsym(a+2, _sym_tag);
	atom_setsym(a+3, GENSYM(category));
	object_method_typed(sMaxObject, ps_db_addmetadata, 4, a, NULL);
	
	atom_setsym(a+0, GENSYM(plugtastic_name));
	atom_setsym(a+1, _sym_object);
	atom_setsym(a+2, _sym_description);
	atom_setsym(a+3, GENSYM(description));
	object_method_typed(sMaxObject, ps_db_addmetadata, 4, a, NULL);
}
Exemple #4
0
TTErr TTValue::transformCSVStringToSymbolArray()
{
    TTString	str;
    char*		cStr;
    char*		current;

    if (*type != kTypeString)
        return kTTErrInvalidType;

    str = *data->stringPtr;
    clear();

    cStr = new char[str.size()+1];
    strncpy(cStr, str.c_str(), str.size()+1);

    current = strrchr(cStr, ',');
    while (current) {
        *current = 0;
        current++;

        // Do some basic whitespace stripping from the ends
        while (*current == ' ')
            current++;
        while (current[strlen(current)-1] == ' ')
            current[strlen(current)-1] = 0;

        append(TT(current));
        current = strrchr(cStr, ',');
    }
    append(TT(cStr));
    delete[] cStr;
    return kTTErrNone;
}
Exemple #5
0
void cue_edit(TTPtr self, t_symbol *msg, long argc, const t_atom *argv)
{
	WrappedModularInstancePtr	x = (WrappedModularInstancePtr)self;
	TTString			*buffer;
	char				title[MAX_FILENAME_CHARS];
	TTObject            aTextHandler;
	TTHashPtr			allCues;
	TTValue				v, o;
	TTSymbol			name = kTTSymEmpty;
    t_atom				a;
	TTErr				tterr;
	
	// choose object to edit : default the cuelist
	*EXTRA->toEdit = x->wrappedObject;
	EXTRA->cueName = kTTSymEmpty;
	
	if (argc && argv)
    {
		if (atom_gettype(argv) == A_LONG)
        {
            TTUInt32 index = atom_getlong(argv);
			
			// get cues names
			x->wrappedObject.get("names", v);
			
			if (index > 0 && index <= v.size())
				name = v[index-1];
			else
            {
				object_error((t_object*)x, "%d doesn't exist", atom_getlong(argv));
				return;
			}
		}
		else if (atom_gettype(argv) == A_SYM)
			name = TTSymbol(atom_getsym(argv)->s_name);
		
		if (name != kTTSymEmpty)
        {
			// get cue object table
			x->wrappedObject.get("cues", v);
			allCues = TTHashPtr((TTPtr)v[0]);
			
			if (allCues)
            {
				// get cue to edit
				if (!allCues->lookup(name, v))
                {
					// edit a cue
					*EXTRA->toEdit = v[0];
					EXTRA->cueName = name;
				}
				else
                {
					object_error((t_object*)x, "%s doesn't exist", atom_getsym(argv)->s_name);
					return;
				}
			}
		}
	}
	
	// only one editor can be open in the same time
	if (!EXTRA->textEditor) {
		
		EXTRA->textEditor = (t_object*)object_new(_sym_nobox, _sym_jed, x, 0);
		
		buffer = new TTString();
		
		// get the buffer handler
		tterr = x->internals->lookup(kTTSym_TextHandler, o);
		
		if (!tterr) {
			
			aTextHandler = o[0];
			
			critical_enter(0);
			aTextHandler.set(kTTSym_object, *EXTRA->toEdit);
			tterr = aTextHandler.send(kTTSym_Write, (TTPtr)buffer);
			critical_exit(0);
		}
		
		// pass the buffer to the editor
		object_method(EXTRA->textEditor, _sym_settext, buffer->c_str(), _sym_utf_8);
		object_attr_setchar(EXTRA->textEditor, gensym("scratch"), 1);
		
		snprintf(title, MAX_FILENAME_CHARS, "cuelist editor");
		object_attr_setsym(EXTRA->textEditor, _sym_title, gensym(title));
        
        // output a flag
        atom_setsym(&a, gensym("opened"));
        object_obex_dumpout(self, gensym("editor"), 1, &a);
		
		buffer->clear();
		delete buffer;
		buffer = NULL;
	}
    else
    {
        object_attr_setchar(EXTRA->textEditor, gensym("visible"), 1);
    }
}
Exemple #6
0
void TTFoundationLoadExternalClasses()
{
#ifdef TT_PLATFORM_MAC
	OSErr		err = noErr;
	FSRef		ref;
	UInt8		path[4096];
	TTString	fullpath;
	
	// Look in ~/Library/Application Support/TTBlue/Extensions
	err = FSFindFolder(kLocalDomain, kApplicationSupportFolderType, kCreateFolder, &ref);
	if (!err) {
		FSRefMakePath(&ref, path, 4096);
		fullpath = (char*)path;
		fullpath += "/Jamoma/Extensions";
		TTFoundationLoadExternalClassesFromFolder(fullpath);
	}
	
	// Look in /Library/Application Support/TTBlue/Extensions
	err = FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &ref);
	if (!err) {
		FSRefMakePath(&ref, path, 4096);
		fullpath = (char*)path;
		fullpath += "/Jamoma/Extensions";
		TTFoundationLoadExternalClassesFromFolder(fullpath);
	}
	
	// Look in the folder of the host application	
	CFBundleRef mainBundle = CFBundleGetMainBundle();
	CFURLRef	mainBundleURL = CFBundleCopyBundleURL(mainBundle);
	CFStringRef mainBundlePath = CFURLCopyFileSystemPath(mainBundleURL, kCFURLPOSIXPathStyle);
	char		mainBundleStr[4096];

	CFStringGetCString(mainBundlePath, mainBundleStr, 4096, kCFStringEncodingUTF8);
	strncat(mainBundleStr, "/Contents/Jamoma/Extensions", 4096);
	mainBundleStr[4095] = 0;
	TTFoundationLoadExternalClassesFromFolder(mainBundleStr);
	
#elif TT_PLATFORM_WIN
	TTString	fullpath;
	char		temppath[4096];
//	WCHAR		wc[4096];
	HKEY		hKey = 0;
	LONG		lRes;
	DWORD		dwSize = sizeof(temppath);
	HRESULT		hr;
	HINSTANCE	hInstance = GetModuleHandle(NULL);

	// Look in C:\Program Files\Common Files\TTBlue\Extensions
	hr = SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, SHGFP_TYPE_CURRENT, (LPSTR)temppath);
	if (!FAILED(hr)) {
		fullpath = temppath;
		fullpath += "\\Jamoma\\Extensions\\";
		lRes = SHCreateDirectory(NULL, (LPCWSTR)fullpath.c_str());
		TTFoundationLoadExternalClassesFromFolder(fullpath);
	}

	// TODO: Look in some user-level directory like we do on the Mac?

	// Look in the support folder of the host application
	if (hInstance) {
		GetModuleFileName(hInstance, (LPSTR)temppath, 4096);
		if (temppath[0]) {
			char *s = strrchr(temppath, '\\');
			if (s)
				*s = 0;
			fullpath = temppath;
			fullpath += "\\Jamoma\\Extensions\\";
			lRes = SHCreateDirectory(NULL, (LPCWSTR)fullpath.c_str());
			TTFoundationLoadExternalClassesFromFolder(fullpath);
		}
	}
#else // Some other platform, like Linux
	
#endif
}
Exemple #7
0
void TTFoundationLoadExternalClassesFromFolder(const TTString& fullpath)
{
#ifdef TT_PLATFORM_MAC
	FSRef							ref;
	Boolean							isDirectory;
	OSStatus						status = noErr;
	ItemCount						count = 0;	
    FSIterator						iterator;
	HFSUniStr255*					names = NULL;
	CFStringRef						name;
	char							cname[4096];
	TTString						path;
	TTCString						cpath = (char*)fullpath.c_str();
	void*							handle;
	TTExtensionInitializationMethod	initializer;
	TTErr							err;
	
	status = FSPathMakeRef((UInt8*)cpath, &ref, &isDirectory);
	if (status != noErr) {
#ifdef TT_DEBUG
		TTLogMessage("TTFoundation - no extensions location found @ %s\n", cpath);
#endif
		return;
	}
	
	status = FSOpenIterator(&ref, kFSIterateFlat, &iterator);
	if (!status) {
        names = (HFSUniStr255 *)malloc(sizeof(HFSUniStr255) * 4096);
        if (names) {
            // Request information about files in the given directory,
            // until we get a status code back from the File Manager
            do{
				status = FSGetCatalogInfoBulk(iterator, 4096, &count, NULL, kFSCatInfoNone, NULL, NULL, NULL, names);
				
                // Process all items received
                if (status == OSStatus(noErr) || status == OSStatus(errFSNoMoreItems)) {
                    for (UInt32 i=0; i < count; i += 1) {
  						name = CFStringCreateWithCharacters(kCFAllocatorDefault, names[i].unicode, names[i].length);
// TODO: filter on name.  We only want to try and load .ttdylib files						
						CFStringGetCString(name, cname, 4096, kCFStringEncodingUTF8);
						path = fullpath;
						path += "/";
						path += cname;
						
						handle = dlopen(path.c_str(), RTLD_LAZY);
// TODO: assert -- or at least do a log post -- if handle is NULL
						initializer = (TTExtensionInitializationMethod)dlsym(handle, "loadTTExtension");
						if (initializer)
							err = initializer();
						CFRelease(name);
                    }
                }
            }
            while (status == OSStatus(noErr));
			
            // errFSNoMoreItems tells us we have successfully processed all
            // items in the directory -- not really an error
            if (status == OSStatus(errFSNoMoreItems))
                status = noErr;
			
            // Free the array memory
            free( (void *) names );
        }
		FSCloseIterator(iterator);
    }
#elif TT_PLATFORM_WIN
	HANDLE							fdHandle;
	WIN32_FIND_DATA					findFileData;
	TTString						path;
	HANDLE							hLib = NULL;
	TTExtensionInitializationMethod	initializer;
	TTErr							err;

	path = fullpath;
	path += "*.ttdll";
	fdHandle = FindFirstFile(path.c_str(), &findFileData);
	if (fdHandle && (fdHandle != INVALID_HANDLE_VALUE)) {
		while (fdHandle) {
			path = fullpath;
			path += findFileData.cFileName;

			hLib = LoadLibrary(path.c_str());
			if (hLib) {
				initializer = (TTExtensionInitializationMethod)GetProcAddress((HMODULE)hLib, "loadTTExtension");
				if (initializer)
					err = initializer();
			}
			if (!FindNextFile(fdHandle, &findFileData))
				break;
		}
	}
#else
	;
#endif
}