TTErr DemoAppDataReturnValueCallback(const TTValue& baton, const TTValue& value) { DemoApp* demoApp = (DemoApp*)TTPtr(baton[0]); TTObject anObject = baton[1]; // Reteive which data has been updated if (anObject.instance() == demoApp->mDataDemoParameter.instance()) { // print the returned value TTLogMessage("/myParameter has been updated to %s \n", value.toString().data()); return kTTErrNone; } if (anObject.instance() == demoApp->mDataDemoMessage.instance()) { // print the returned value TTLogMessage("/myMessage has been updated to %s \n", value.toString().data()); return kTTErrNone; } if (anObject.instance() == demoApp->mDataDemoReturn.instance()) { // print the returned value TTLogMessage("/myReturn has been updated to %s \n", value.toString().data()); return kTTErrNone; } return kTTErrGeneric; }
void TTInputAudio::process(TTSampleValue* anInputSampleVector, TTSampleValue* anOutputSampleVector, TTUInt16 aVectorSize) { // Store the input from the inlets TTAudioSignalPtr(mSignalIn.instance())->setVector64Copy(0, aVectorSize, anInputSampleVector); // Sum signal from j.send~ objects for (mSignalCache.begin(); mSignalCache.end(); mSignalCache.next()) { TTObject o = mSignalCache.current()[0]; TTAudioSignalPtr sentSignal = TTAudioSignalPtr(o.instance()); if (sentSignal) *TTAudioSignalPtr(mSignalIn.instance()) += *sentSignal; } // if signal is bypassed or muted, send a zero signal to the algorithm if (mBypass || mMute) TTAudioSignal::copy(*TTAudioSignalPtr(mSignalZero.instance()), *TTAudioSignalPtr(mSignalOut.instance())); // else copy in to out else TTAudioSignal::copy(*TTAudioSignalPtr(mSignalIn.instance()), *TTAudioSignalPtr(mSignalOut.instance())); // clear the signal cache mSignalCache.clear(); // Send the input on to the outlets for the algorithm, if desired if (anOutputSampleVector) TTAudioSignalPtr(mSignalOut.instance())->getVectorCopy(0, aVectorSize, anOutputSampleVector); }
TTErr TTProtocolAttributeCallback(const TTValue& baton, const TTValue& data) { TTObject aProtocol; TTSymbol anApplicationName; TTAddress anAddress; // unpack baton aProtocol = baton[0]; anApplicationName = baton[1]; anAddress = baton[2]; if (TTProtocolPtr(aProtocol.instance())->mRunning) return TTProtocolPtr(aProtocol.instance())->SendListenAnswer(anApplicationName, anAddress, data); else return kTTErrGeneric; }
TTErr TTProtocolListenAttributeCallback(const TTValue& baton, const TTValue& data) { TTObject aProtocol; TTSymbol anApplicationName; TTAddress anAddress; TTSymbol attribute; TTBoolean enable; // unpack baton aProtocol = baton[0]; anApplicationName = baton[1]; anAddress = baton[2]; // unpack data attribute = data[0]; enable = data[1]; // send a listen request if (TTProtocolPtr(aProtocol.instance())->mRunning) return TTProtocolPtr(aProtocol.instance())->SendListenRequest(anApplicationName, anAddress.appendAttribute(attribute), enable); else return kTTErrGeneric; }
TTErr TTProtocolSendMessageCallback(const TTValue& baton, const TTValue& data) { TTValuePtr value; TTObject aProtocol; TTSymbol anApplicationName; TTAddress anAddress; TTSymbol message; // unpack baton aProtocol = baton[0]; anApplicationName = baton[1]; anAddress = baton[2]; // unpack data message = data[0]; value = TTValuePtr((TTPtr)data[1]); // send a set request if (TTProtocolPtr(aProtocol.instance())->mRunning) return TTProtocolPtr(aProtocol.instance())->SendSetRequest(anApplicationName, anAddress.appendAttribute(message), *value); else return kTTErrGeneric; }
TTErr TTProtocolDirectoryCallback(const TTValue& baton, const TTValue& data) { TTObject aProtocol; TTSymbol anApplicationName; TTAddress anAddress; TTNodePtr aNode; TTUInt8 flag; TTObject anObserver; TTValue v; // unpack baton aProtocol = baton[0]; anApplicationName = baton[1]; // unpack data (anAddress, aNode, flag, anObserver) anAddress = data[0]; aNode = TTNodePtr((TTPtr)data[1]); flag = data[2]; anObserver = data[3]; if (flag == kAddressCreated) { if (aNode->getObject().valid()) v.append(aNode->getObject().name()); else v.append(kTTSym_none); } else if (flag == kAddressDestroyed) { v.append(TTSymbol("delete")); } if (TTProtocolPtr(aProtocol.instance())->mRunning) return TTProtocolPtr(aProtocol.instance())->SendListenAnswer(anApplicationName, anAddress.appendAttribute(TTSymbol("life")), v); else return kTTErrGeneric; }
TTObjectBasePtr getSelectedObject(WrappedModularInstancePtr x) { if (x->useInternals) { TTValue v; TTObject o; TTErr err; err = x->internals->lookup(x->cursor, v); if (!err) o = v[0]; return o.instance(); } #ifndef ARRAY_EXTERNAL else return x->wrappedObject.instance(); #else else return NULL;
TTErr TTData::WriteAsText(const TTValue& inputValue, TTValue& outputValue) { TTObject o = inputValue[0]; TTTextHandlerPtr aTextHandler = (TTTextHandlerPtr)o.instance(); if (!aTextHandler) return kTTErrGeneric; TTString *buffer; TTValue toString; TTString line; buffer = aTextHandler->mWriter; // Type *buffer += "\t\t\t<td class =\"instructionType\">"; *buffer += this->mType.c_str(); *buffer += "</td>"; // range/bounds toString = this->mRangeBounds; toString.toString(); line = TTString(toString[0]); if ( (this->mType == kTTSym_integer) || (this->mType == kTTSym_boolean) || (this->mType == kTTSym_decimal) || (this->mType == kTTSym_generic) ) { *buffer +="\t\t\t<td class =\"instructionRangeBounds\">"; *buffer +=line.data(); *buffer += "</td>"; } else *buffer += "\t\t\t<td class = \"instructionRangeBounds\"> N/A </td>"; // clipmode *buffer += "\t\t\t<td class =\"instructionRangeClipmode\">"; *buffer += this->mRangeClipmode.c_str(); *buffer += "</td>"; // ramp/drive *buffer += "\t\t\t<td class =\"instructionRampDrive\">"; *buffer += this->mRampDrive.c_str(); *buffer += "</td>"; #ifndef TT_NO_DSP // ramp/function *buffer += "\t\t\t<td class =\"instructionRampFunction\">"; *buffer += this->mRampFunction.c_str(); *buffer += "</td>"; #endif // dataspace *buffer += "\t\t\t<td class =\"instructionDataspace\">"; *buffer += this->mDataspace.c_str(); *buffer += "</td>"; // dataspace/unit *buffer += "\t\t\t<td class =\"instructionDataspaceUnit\">"; *buffer += this->mDataspaceUnit.c_str(); *buffer += "</td>"; // repetitions/filter toString = this->mRepetitionsFilter; toString.toString(); line = TTString(toString[0]); *buffer += "\t\t\t<td class =\"instructionRepetitionsFilter\">"; *buffer += line.data(); *buffer += "</td>"; // description *buffer += "\t\t\t<td class =\"instructionDescription\">"; *buffer += this->mDescription.c_str(); *buffer += "</td>"; return kTTErrNone; }
TTErr wrapTTModularClassAsMaxClass(TTSymbol& ttblueClassName, const char* maxClassName, WrappedClassPtr* c, ModularSpec* specificities) { TTObject o; TTValue v, args; WrappedClass* wrappedMaxClass = NULL; TTSymbol TTName; t_symbol *MaxName = NULL; TTUInt16 i; jamoma_init(); common_symbols_init(); if (!wrappedMaxClasses) wrappedMaxClasses = hashtab_new(0); wrappedMaxClass = new WrappedClass; wrappedMaxClass->maxClassName = gensym(maxClassName); wrappedMaxClass->maxClass = class_new( maxClassName, (method)wrappedModularClass_new, (method)wrappedModularClass_free, sizeof(WrappedModularInstance), (method)0L, A_GIMME, 0); wrappedMaxClass->ttblueClassName = ttblueClassName; wrappedMaxClass->validityCheck = NULL; wrappedMaxClass->validityCheckArgument = NULL; wrappedMaxClass->options = NULL; wrappedMaxClass->maxNamesToTTNames = hashtab_new(0); wrappedMaxClass->specificities = specificities; #ifdef AUDIO_EXTERNAL // Setup our class to work with MSP class_dspinit(wrappedMaxClass->maxClass); #endif // Create a temporary instance of the class so that we can query it. o = TTObject(ttblueClassName); // Register Messages as Max method o.messages(v); for (i = 0; i < v.size(); i++) { TTName = v[i]; if (TTName == TTSymbol("test") || TTName == TTSymbol("getProcessingBenchmark") || TTName == TTSymbol("resetBenchmarking")) continue; else if ((MaxName = jamoma_TTName_To_MaxName(TTName))) { hashtab_store(wrappedMaxClass->maxNamesToTTNames, MaxName, (t_object*)(TTName.rawpointer())); class_addmethod(wrappedMaxClass->maxClass, (method)wrappedModularClass_anything, MaxName->s_name, A_GIMME, 0); } } // Register Attributes as Max attr o.attributes(v); for (i = 0; i < v.size(); i++) { TTAttributePtr attr = NULL; t_symbol *maxType = _sym_atom; TTName = v[i]; #ifdef AUDIO_EXTERNAL // the enable word is already used by a message declared in the dsp_init method if (TTName == TTSymbol("enable")) continue; #endif // we want to hide service attribute for Max external if (TTName == TTSymbol("service")) continue; if ((MaxName = jamoma_TTName_To_MaxName(TTName))) { if (TTName == kTTSym_bypass && wrappedMaxClass->maxClassName != gensym("j.in") && wrappedMaxClass->maxClassName != gensym("j.in~")) continue; o.instance()->findAttribute(TTName, &attr); if (attr->type == kTypeFloat32) maxType = _sym_float32; else if (attr->type == kTypeFloat64) maxType = _sym_float64; else if (attr->type == kTypeSymbol || attr->type == kTypeString) maxType = _sym_symbol; else if (attr->type == kTypeLocalValue) maxType = _sym_atom; hashtab_store(wrappedMaxClass->maxNamesToTTNames, MaxName, (t_object*)(TTName.rawpointer())); class_addattr(wrappedMaxClass->maxClass, attr_offset_new(MaxName->s_name, maxType, 0, (method)wrappedModularClass_attrGet, (method)wrappedModularClass_attrSet, 0)); // Add display styles for the Max 5 inspector if (attr->type == kTypeBoolean) CLASS_ATTR_STYLE(wrappedMaxClass->maxClass, (char*)TTName.c_str(), 0, "onoff"); if (TTName == TTSymbol("fontFace")) CLASS_ATTR_STYLE(wrappedMaxClass->maxClass, "fontFace", 0, "font"); } } // standalone support: class_addmethod(wrappedMaxClass->maxClass, (method)jamoma_fileusage, "fileusage", A_CANT, 0); class_addmethod(wrappedMaxClass->maxClass, (method)stdinletinfo, "inletinfo", A_CANT, 0); class_addmethod(wrappedMaxClass->maxClass, (method)wrappedModularClass_notify, "notify", A_CANT, 0); class_addmethod(wrappedMaxClass->maxClass, (method)wrappedModularClass_shareContextNode, "share_context_node", A_CANT, 0); class_addmethod(wrappedMaxClass->maxClass, (method)wrappedModularClass_anything, "anything", A_GIMME, 0); // Register specific methods and do specific things if (specificities) { if (specificities->_wrap) specificities->_wrap(wrappedMaxClass); } class_addmethod(wrappedMaxClass->maxClass, (method)wrappedModularClass_dump, "dump", A_GIMME, 0); #ifdef ARRAY_EXTERNAL class_addmethod(wrappedMaxClass->maxClass, (method)wrappedModularClass_ArraySelect, "array/select", A_GIMME,0); class_addmethod(wrappedMaxClass->maxClass, (method)wrappedModularClass_ArrayResize, "array/resize", A_LONG,0); CLASS_ATTR_SYM(wrappedMaxClass->maxClass, "format", 0, WrappedModularInstance, arrayAttrFormat); CLASS_ATTR_ACCESSORS(wrappedMaxClass->maxClass, "format", wrappedModularClass_FormatGet, wrappedModularClass_FormatSet); CLASS_ATTR_ENUM(wrappedMaxClass->maxClass, "format", 0, "single array"); #endif class_register(_sym_box, wrappedMaxClass->maxClass); if (c) *c = wrappedMaxClass; hashtab_store(wrappedMaxClasses, wrappedMaxClass->maxClassName, (t_object*)(wrappedMaxClass)); return kTTErrNone; }
TTErr TTSoundfileLoader::test(TTValue& returnedTestInfo) { int errorCount = 0; int testAssertionCount = 0; // assemble the full path of the target sound file TTString testSoundPath = TTFoundationBinaryPath; int pos = testSoundPath.find_last_of('/'); testSoundPath = testSoundPath.substr(0,pos+1); testSoundPath += TESTFILE; std::cout << "We will be using the following path for testing: " << testSoundPath << "\n"; try { TTTestLog("\n"); TTTestLog("Testing TTSoundfileLoader Basics..."); // TEST 0: establish our objects & pointers TTObject* testTargetMatrix = new TTObject("samplematrix"); TTObject* testNonSampleMatrix = new TTObject("delay"); TTObjectBase* objectBasePtrToSampleMatrix; TTObjectBase* ptrToNonSampleMatrix; // TEST 1: set the filepath TTBoolean result1 = { this->setFilePath(TT(testSoundPath)) == kTTErrNone }; TTTestAssertion("setFilePath operates successfully", result1, testAssertionCount, errorCount); // TEST 2: set up the samplematrix first int channelsSend = 1; // compiler complained about TTInt32 being ambiguous here int lengthSend = 22050; // compiler complained about TTInt32 being ambiguous here testTargetMatrix->set("numChannels", channelsSend); testTargetMatrix->set("lengthInSamples", lengthSend); TTInt32 channelsReturn, lengthReturn; testTargetMatrix->get("numChannels", channelsReturn); testTargetMatrix->get("lengthInSamples", lengthReturn); // now for the actual test TTBoolean result2a = { channelsSend == channelsReturn }; TTTestAssertion("numChannels attribute set successfully", result2a, testAssertionCount, errorCount); TTBoolean result2b = { lengthSend == lengthReturn }; TTTestAssertion("lengthInSamples attribute set successfully", result2b, testAssertionCount, errorCount); // // TEST 3: set the target via an objectBasePtr objectBasePtrToSampleMatrix = testTargetMatrix->instance(); // is there a better syntax for this? TTBoolean result3 = { this->setTargetMatrix(objectBasePtrToSampleMatrix) == kTTErrNone }; TTTestAssertion("setTargetMatrix via ObjectBasePtr operates successfully", result3, testAssertionCount, errorCount); // TEST 4: set the target to a non-SampleMatrix, should FAIL ptrToNonSampleMatrix = testNonSampleMatrix->instance(); TTBoolean result4 = { this->setTargetMatrix(ptrToNonSampleMatrix) == kTTErrInvalidValue }; TTTestAssertion("setTargetMatrix returns error when not a SampleMatrix", result4, testAssertionCount, errorCount); // TEST 5: copy samplevalues until samplematrix is filled TTBoolean result5 = { this->copyUntilFilled() == kTTErrNone }; TTTestAssertion("copyUntilFilled operates successfully", result5, testAssertionCount, errorCount); // releasing objects objectBasePtrToSampleMatrix = NULL; ptrToNonSampleMatrix = NULL; delete testTargetMatrix; delete testNonSampleMatrix; // TEST 6: use TTSampleMatrix's load message, then compare 5 random sample values for equivalence // create a new TTSampleMatrix TTObject newTargetMatrix("samplematrix"); // set the length and channel count newTargetMatrix.set("numChannels", TESTNUMCHANNELS); newTargetMatrix.set("lengthInSamples", TESTDURATIONINSAMPLES); // prepare necessary TTValues TTValue loadInput6 = TT(testSoundPath); // we cannot pass the naked TTString, it needs to be part of a TTValue TTValue aReturnWeDontCareAbout6; // send message TTBoolean result6a = { newTargetMatrix.send("load", loadInput6, aReturnWeDontCareAbout6) == kTTErrNone }; TTTestAssertion("TTSampleMatrix load operates successfully", result6a, testAssertionCount, errorCount); // now let's test some values! int randomIndex6, randomChannel6; TTSampleValue testValueSoundFile6; TTBoolean result6b = true; for (int i = 0; i<10; i++) { randomIndex6 = lengthReturn * TTRandom64(); randomChannel6 = i % TESTNUMCHANNELS; //std::cout << "let's look at index " << randomIndex6 << " & channel " << randomChannel6 << "\n"; TTValue peekInput6(randomIndex6); peekInput6.append(randomChannel6); TTValue peekOutput6; this->peek(randomIndex6,randomChannel6,testValueSoundFile6); newTargetMatrix.send("peek",peekInput6,peekOutput6); //std::cout << "Does " << testValueSoundFile6 << " = " << double(peekOutput6) << " ?\n"; if (result6b) // allows test to keep variable false once it is false result6b = TTTestFloatEquivalence(testValueSoundFile6, double(peekOutput6), true, 0.0000001); } TTTestAssertion("comparing values @ 10 random indexes for equivalence", result6b, testAssertionCount, errorCount); // TEST 7: now use TTBuffer's load message, and again compare 5 random sample values for equivalence // create a new TTBuffer with convenience syntax TTAudioBuffer aBufferByAnyOtherName(TESTNUMCHANNELS, TESTDURATIONINSAMPLES); // prepare necessary TTValues TTValue loadInput7 = TT(testSoundPath); // we cannot pass the naked TTString, it needs to be part of a TTValue // send message TTBoolean result7a = { aBufferByAnyOtherName.load(loadInput7) == kTTErrNone }; TTTestAssertion("TTBuffer load operates successfully", result7a, testAssertionCount, errorCount); // setup pointer to samplematrix TTSampleMatrixPtr myMatrix7; // check out samplematrix TTBoolean result7b = { aBufferByAnyOtherName.checkOutMatrix(myMatrix7) == kTTErrNone }; TTTestAssertion("TTBuffer checks out SampleMatrix successfully", result7b, testAssertionCount, errorCount); TTValue testChannel, testSample; myMatrix7->getNumChannels(testChannel); myMatrix7->getLengthInSamples(testSample); //std::cout << "Samplematrix has " << int(testChannel) << " channels & " << int(testSample) << " samples\n"; // now let's test some values! int randomIndex7, randomChannel7; double testValueSoundFile7, testValueSampleMatrix7; TTBoolean result7c = true; for (int i = 0; i<10; i++) { randomIndex7 = lengthReturn * TTRandom64(); randomChannel7 = i % TESTNUMCHANNELS; //std::cout << "let's look at index " << randomIndex7 << " & channel " << randomChannel7 << "\n"; this->peek(randomIndex7,randomChannel7,testValueSoundFile7); myMatrix7->peek(randomIndex7,randomChannel7,testValueSampleMatrix7); //std::cout << "Does " << testValueSoundFile7 << " = " << testValueSampleMatrix7 << " ?\n"; if (result7c) // allows test to keep variable false once it is false result7c = TTTestFloatEquivalence(testValueSoundFile7, testValueSampleMatrix7, true, 0.0000001); } TTTestAssertion("comparing values @ 10 random indexes for equivalence", result7c, testAssertionCount, errorCount); // check in samplematrix TTBoolean result7d = { aBufferByAnyOtherName.checkInMatrix(myMatrix7) == kTTErrNone }; TTTestAssertion("TTBuffer checks in SampleMatrix successfully", result7d, testAssertionCount, errorCount); // TEST 8: use optional load parameters to copy samples 5 to 15 from channel 0 // resize aBufferByAnyOtherName.set("numChannels", 1); aBufferByAnyOtherName.set("lengthInSamples", 10); // prepare necessary TTValues int copyChannel8 = 0; // first channel int startIndex8 = 5; // start @ sample 5 int endIndex8 = 15; // end @ sample 15 TTValue loadInput8 = TT(testSoundPath); // we cannot pass the naked TTString, it needs to be part of a TTValue loadInput8.append(copyChannel8); loadInput8.append(startIndex8); loadInput8.append(endIndex8); // send message TTBoolean result8a = { aBufferByAnyOtherName.load(loadInput8) == kTTErrNone }; TTTestAssertion("TTBuffer load operates successfully w optional parameters", result8a, testAssertionCount, errorCount); // setup pointer to samplematrix TTSampleMatrixPtr myMatrix8; // check out samplematrix TTBoolean result8b = { aBufferByAnyOtherName.checkOutMatrix(myMatrix8) == kTTErrNone }; TTTestAssertion("TTBuffer checks out SampleMatrix successfully", result8b, testAssertionCount, errorCount); // now let's test some values! double testValueSoundFile8, testValueSampleMatrix8; TTBoolean result8c = true; for (int i = 0; i<10; i++) { //std::cout << "let's look at index " << i << "\n"; this->peek(i+startIndex8,copyChannel8,testValueSoundFile8); myMatrix8->peek(i,copyChannel8,testValueSampleMatrix8); //std::cout << "Does " << testValueSoundFile8 << " = " << testValueSampleMatrix8 << " ?\n"; if (result8c) // allows test to keep variable false once it is false result8c = TTTestFloatEquivalence(testValueSoundFile8, testValueSampleMatrix8, true, 0.0000001); } TTTestAssertion("comparing all 10 copied values for equivalence", result8c, testAssertionCount, errorCount); // check in samplematrix TTBoolean result8d = { aBufferByAnyOtherName.checkInMatrix(myMatrix8) == kTTErrNone }; TTTestAssertion("TTBuffer checks in SampleMatrix successfully", result8d, testAssertionCount, errorCount); // TEST 9: load soundfile into buffer/samplematrix with different sample rate TTValue testChannel9in = 2; TTValue testSampleRate9in = 88200; TTValue testLengthSec9in = 0.25; aBufferByAnyOtherName.set("numChannels", testChannel9in); aBufferByAnyOtherName.set("sampleRate", testSampleRate9in); aBufferByAnyOtherName.set("lengthInSeconds", testLengthSec9in); TTValue loadInput9 = TT(testSoundPath); // we cannot pass the naked TTString, it needs to be part of a TTValue // send message TTBoolean result9a = { aBufferByAnyOtherName.load(loadInput9) == kTTErrNone }; TTTestAssertion("TTBuffer load operates successfully when sample rates differ", result9a, testAssertionCount, errorCount); // setup pointer to samplematrix TTSampleMatrixPtr myMatrix9; // check out samplematrix TTBoolean result9b = { aBufferByAnyOtherName.checkOutMatrix(myMatrix9) == kTTErrNone }; TTTestAssertion("TTBuffer checks out SampleMatrix successfully", result9b, testAssertionCount, errorCount); TTValue testChannel9, testSampleCount9, testSampleRate9; myMatrix9->getAttributeValue("numChannels", testChannel9); myMatrix9->getAttributeValue("lengthInSamples", testSampleCount9); myMatrix9->getAttributeValue("sampleRate", testSampleRate9); /*std::cout << "Samplematrix has " << TTInt32(testChannel9) << " channels & " << TTInt32(testSampleCount9) << " samples @ " << TTInt32(testSampleRate9) << " Hz\n";*/ // check out samplematrix TTBoolean result9c = { TTInt32(testChannel9) == TTInt32(testChannel9in) && TTInt32(testSampleRate9) == TTInt32(testSampleRate9in) && TTInt32(testSampleCount9) == (TTInt32(testSampleRate9in) * TTFloat64(testLengthSec9in)) }; TTTestAssertion("SampleMatrix has same attributes set via TTBuffer", result9c, testAssertionCount, errorCount); // let's test some values int randomIndex9, randomChannel9; TTSampleValue testSoundFileValue9, testSampleMatrixValue9; TTBoolean result9d = true; for (int i = 0; i<10; i++) { randomIndex9 = int(testSampleCount9) * TTRandom64(); randomChannel9 = i % TESTNUMCHANNELS; //std::cout << "let's look at index " << randomIndex9 << " & channel " << randomChannel9 << "\n"; this->peeki(float(randomIndex9)/2.0, randomChannel9, testSoundFileValue9); myMatrix9->peek(randomIndex9, randomChannel9, testSampleMatrixValue9); //std::cout << "Does " << testSoundFileValue9 << " = " << testSampleMatrixValue9 << " ?\n"; if (result9d) // allows test to keep variable false once it is false result9d = TTTestFloatEquivalence(testSoundFileValue9, testSampleMatrixValue9, true, 0.0000001); } TTTestAssertion("comparing values @ 10 random indexes for equivalence", result9d, testAssertionCount, errorCount); // check in samplematrix TTBoolean result9e = { aBufferByAnyOtherName.checkInMatrix(myMatrix9) == kTTErrNone }; TTTestAssertion("TTBuffer checks in SampleMatrix successfully", result9e, testAssertionCount, errorCount); // TEST 10: use resizeThenLoad message and test that TTSampleMatrix conforms to sound file loaded TTAudioBuffer bufferForTest10(1,1); // start by making the buffer really tiny TTValue loadInput10 = TT(testSoundPath); // send message TTBoolean result10a = { bufferForTest10.resizeThenLoad(loadInput10) == kTTErrNone }; TTTestAssertion("TTBuffer resizeThenLoad operates successfully", result10a, testAssertionCount, errorCount); // setup pointer to samplematrix TTSampleMatrixPtr myMatrix10; // check out samplematrix TTBoolean result10b = { bufferForTest10.checkOutMatrix(myMatrix10) == kTTErrNone }; TTTestAssertion("TTBuffer checks out SampleMatrix successfully", result10b, testAssertionCount, errorCount); // do some more tests here TTValue testChannel10, testLengthSec10, testLengthSample10; myMatrix10->getAttributeValue("numChannels", testChannel10); myMatrix10->getAttributeValue("lengthInSeconds", testLengthSec10); myMatrix10->getAttributeValue("lengthInSamples", testLengthSample10); /*std::cout << "Samplematrix has " << TTInt32(testChannel10) << " channels & " << TTInt32(testLengthSample10) << " samples and is " << TTFloat64(testLengthSec10) << " secs long\n";*/ TTBoolean result10c = { TTInt32(testChannel10) == TESTNUMCHANNELS && TTInt32(testLengthSample10) == TESTDURATIONINSAMPLES }; TTTestAssertion("TTBuffer.resizeThenLoad results in properly sized TTSampleMatrix", result10c, testAssertionCount, errorCount); // check in samplematrix TTBoolean result10e = { bufferForTest10.checkInMatrix(myMatrix10) == kTTErrNone }; TTTestAssertion("TTBuffer checks in SampleMartix successfully", result10e, testAssertionCount, errorCount); } catch (...) { TTTestAssertion("FAILED to run tests -- likely that necessary objects did not instantiate", 0, testAssertionCount, errorCount); } return TTTestFinish(testAssertionCount, errorCount, returnedTestInfo); }
bool operator != (const TTObject& anObject, const TTObject& anotherObject) { return (anObject.instance() != anotherObject.instance()); }