SCErr meth_n_after(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/) { sc_msg_iter msg(inSize, inData); Node *prevNode = 0; Node *prevTarget = 0; while (msg.remain()) { Node *node = Msg_GetNode(inWorld, msg); Node *target = Msg_GetNode(inWorld, msg); if (!node || !target) continue; // tolerate failure if (prevNode && prevNode != node) { // move the last pair that succeeded Node_Remove(prevNode); Node_AddAfter(prevNode, prevTarget); Node_StateMsg(prevNode, kNode_Move); } prevNode = node; prevTarget = target; } if (prevNode) { // move the last pair that succeeded Node_Remove(prevNode); Node_AddAfter(prevNode, prevTarget); Node_StateMsg(prevNode, kNode_Move); } return kSCErr_None; }
SCErr meth_s_newargs(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/) { SCErr err; sc_msg_iter msg(inSize, inData); int32 *defname = msg.gets4(); if (!defname) return kSCErr_WrongArgType; int32 nodeID = msg.geti(); int32 addAction = msg.geti(); GraphDef *def = World_GetGraphDef(inWorld, defname); if (!def) { scprintf("*** ERROR: SynthDef %s not found\n", (char*)defname); return kSCErr_SynthDefNotFound; } Graph *graph = 0; switch (addAction) { case 0 : { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; err = Graph_New(inWorld, def, nodeID, &msg, &graph,false);//false for setn type args if (err) return err; if (!graph) return kSCErr_Failed; Group_AddHead(group, &graph->mNode); } break; case 1 : { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; err = Graph_New(inWorld, def, nodeID, &msg, &graph,false); if (err) return err; Group_AddTail(group, &graph->mNode); } break; case 2 : { Node *beforeThisNode = Msg_GetNode(inWorld, msg); if (!beforeThisNode) return kSCErr_NodeNotFound; err = Graph_New(inWorld, def, nodeID, &msg, &graph,false); if (err) return err; Node_AddBefore(&graph->mNode, beforeThisNode); } break; case 3 : { Node *afterThisNode = Msg_GetNode(inWorld, msg); if (!afterThisNode) return kSCErr_NodeNotFound; err = Graph_New(inWorld, def, nodeID, &msg, &graph,false); if (err) return err; Node_AddAfter(&graph->mNode, afterThisNode); } break; case 4 : { Node *replaceThisNode = Msg_GetNode(inWorld, msg); if (!replaceThisNode) return kSCErr_NodeNotFound; err = Graph_New(inWorld, def, nodeID, &msg, &graph,false); if (err) return err; Node_Replace(&graph->mNode, replaceThisNode); } break; default: return kSCErr_Failed; } Node_StateMsg(&graph->mNode, kNode_Go); return kSCErr_None; }
// node destructor void Node_Dtor(Node *inNode) { Node_StateMsg(inNode, kNode_End); Node_Remove(inNode); World *world = inNode->mWorld; world->hw->mNodeLib->Remove(inNode); World_Free(world, inNode); }
SCErr meth_n_query(World *inWorld, int inSize, char *inData, ReplyAddress *inReply) { sc_msg_iter msg(inSize, inData); while (msg.remain()) { Node *node = Msg_GetNode(inWorld, msg); if (!node) return kSCErr_NodeNotFound; Node_StateMsg(node, kNode_Info); } return kSCErr_None; }
// if inRun is zero then the node's calc function is set to Node_NullCalc, // otherwise its normal calc function is installed. void Node_SetRun(Node* inNode, int inRun) { if (inRun) { if (inNode->mCalcFunc == &Node_NullCalc) { if (inNode->mIsGroup) { inNode->mCalcFunc = (NodeCalcFunc)&Group_Calc; } else { inNode->mCalcFunc = (NodeCalcFunc)&Graph_Calc; } Node_StateMsg(inNode, kNode_On); } } else { if (inNode->mCalcFunc != &Node_NullCalc) { if (!inNode->mIsGroup && inNode->mCalcFunc == (NodeCalcFunc)&Graph_FirstCalc) { inNode->mCalcFunc = (NodeCalcFunc)&Graph_NullFirstCalc; } else { inNode->mCalcFunc = (NodeCalcFunc)&Node_NullCalc; } Node_StateMsg(inNode, kNode_Off); } } }
SCErr meth_g_tail(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/) { sc_msg_iter msg(inSize, inData); while (msg.remain()) { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; Node *node = Msg_GetNode(inWorld, msg); if (!node) return kSCErr_NodeNotFound; //Group *prevGroup = node->mParent; Node_Remove(node); Group_AddTail(group, node); //if (group != prevGroup) { Node_StateMsg(node, kNode_Move); //} } return kSCErr_None; }
SCErr meth_g_new(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/) { SCErr err; sc_msg_iter msg(inSize, inData); while (msg.remain()) { int32 newGroupID = msg.geti(); int32 addAction = msg.geti(); Group *newGroup = 0; switch (addAction) { case 0 : { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; err = Group_New(inWorld, newGroupID, &newGroup); if (err) { if (err == kSCErr_DuplicateNodeID) { newGroup = World_GetGroup(inWorld, newGroupID); if (!newGroup || !newGroup->mNode.mParent || newGroup->mNode.mParent != group) return err; } else return err; } else { Group_AddHead(group, &newGroup->mNode); } } break; case 1 : { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; err = Group_New(inWorld, newGroupID, &newGroup); if (err) { if (err == kSCErr_DuplicateNodeID) { newGroup = World_GetGroup(inWorld, newGroupID); if (!newGroup || !newGroup->mNode.mParent || newGroup->mNode.mParent != group) return err; } else return err; } else { Group_AddTail(group, &newGroup->mNode); } } break; case 2 : { Node *beforeThisNode = Msg_GetNode(inWorld, msg); if (!beforeThisNode) return kSCErr_TargetNodeNotFound; err = Group_New(inWorld, newGroupID, &newGroup); if (err) { if (err == kSCErr_DuplicateNodeID) { newGroup = World_GetGroup(inWorld, newGroupID); if (!newGroup || !newGroup->mNode.mParent || newGroup->mNode.mParent->mNode.mID != beforeThisNode->mParent->mNode.mID) return err; } else return err; } else { Node_AddBefore(&newGroup->mNode, beforeThisNode); } } break; case 3 : { Node *afterThisNode = Msg_GetNode(inWorld, msg); if (!afterThisNode) return kSCErr_TargetNodeNotFound; err = Group_New(inWorld, newGroupID, &newGroup); if (err) { if (err == kSCErr_DuplicateNodeID) { newGroup = World_GetGroup(inWorld, newGroupID); if (!newGroup || !newGroup->mNode.mParent || newGroup->mNode.mParent->mNode.mID != afterThisNode->mParent->mNode.mID) return err; } else return err; } else { Node_AddAfter(&newGroup->mNode, afterThisNode); } } break; case 4 : { Node *replaceThisNode = Msg_GetNode(inWorld, msg); if (!replaceThisNode) return kSCErr_TargetNodeNotFound; err = Group_New(inWorld, newGroupID, &newGroup); if (err) return err; Node_Replace(&newGroup->mNode, replaceThisNode); } break; default: return kSCErr_Failed; } Node_StateMsg(&newGroup->mNode, kNode_Go); } return kSCErr_None; }
SCErr meth_n_order(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/) { SCErr err; Node *prevNode = 0; Node *node = 0; sc_msg_iter msg(inSize, inData); int32 addAction = msg.geti(); // place the first node in the list based on target and addAction switch (addAction) { case 0 : { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; while(!node && msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) scprintf("Warning Node not found\n"); } if (!node) return kSCErr_NodeNotFound; Group *prevGroup = node->mParent; Node_Remove(node); Group_AddHead(group, node); if (group != prevGroup) { Node_StateMsg(node, kNode_Move); } prevNode = node; } break; case 1 : { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; while(!node && msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) scprintf("Warning Node not found\n"); } if (!node) return kSCErr_NodeNotFound; Group *prevGroup = node->mParent; Node_Remove(node); Group_AddTail(group, node); if (group != prevGroup) { Node_StateMsg(node, kNode_Move); } prevNode = node; } break; case 2 : { Node *beforeNode = Msg_GetNode(inWorld, msg); if (!beforeNode) return kSCErr_TargetNodeNotFound; while(!node && msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) scprintf("Warning Node not found\n"); } if (!node) return kSCErr_NodeNotFound; Node_Remove(node); Node_AddBefore(node, beforeNode); Node_StateMsg(node, kNode_Move); prevNode = node; } break; case 3 : { Node *afterNode = Msg_GetNode(inWorld, msg); if (!afterNode) return kSCErr_TargetNodeNotFound; while(!node && msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) scprintf("Warning Node not found\n"); } if (!node) return kSCErr_NodeNotFound; Node_Remove(node); Node_AddAfter(node, afterNode); Node_StateMsg(node, kNode_Move); prevNode = node; } break; default: return kSCErr_Failed; } // now iterate through in order while (msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) { scprintf("Warning Node not found\n"); continue; } Node_Remove(node); Node_AddAfter(node, prevNode); Node_StateMsg(node, kNode_Move); prevNode = node; } return kSCErr_None; }