Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
// 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);
}
Beispiel #4
0
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;
}
Beispiel #5
0
// 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);
		}
	}
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}
Beispiel #8
0
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;
}