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); }
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; }
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); } }
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 }
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 }