MAX/MSP SDK学习05:A_GIMME方法

今天终于将A_GIMME方法部分的描述看懂了,上周因为太赶时间加上这文档很抽象一直没看懂。也就那么一回事,记录一下。


A_GIMME方法用于接收多个参数:

#include "ext.h"			// standard Max include, always required
#include "ext_obex.h"		// required for new style Max object

typedef struct _gimme {
	t_object	ob;			// the object itself (must be first)
	/* 自定义属性 */
} t_gimme;

void* gimme_new(t_symbol* s, long argc, t_atom* argv);
void gimme_free(t_gimme* x);
void gimme_assist(t_gimme* x, void* b, long m, long a, char* s);
// 自定义函数
void gimme_printArgs(t_gimme* x, t_symbol* s, long argc, t_atom* argv);

void* gimme_class;

void ext_main(void* r) {
	t_class* c;

	// "gimme" 建议和项目名一样,否则在max/msp中创建自定义组件会出问题
	c = class_new("gimme", (method)gimme_new, (method)gimme_free, (long)sizeof(t_gimme),
		0L /* leave NULL!! */, A_GIMME, 0);

	/* you CAN'T call this from the patcher */
	class_addmethod(c, (method)gimme_assist, "assist", A_CANT, 0);
	// 注意:这里的"gimme"为自定义的消息选择器,会被加入消息选择器表中;而"anything"为消息选择器表内置
    // 自定义消息选择器
	class_addmethod(c, (method)gimme_printArgs, "gimme", A_GIMME, 0); 

	class_register(CLASS_BOX, c); /* CLASS_NOBOX */
	gimme_class = c;

	post("I am the gimme object");
}

void gimme_assist(t_gimme* x, void* b, long m, long a, char* s) {
	if (m == ASSIST_INLET) { // inlet
		sprintf(s, "I am inlet %ld", a);
	} else {	// outlet
		sprintf(s, "I am outlet %ld", a);
	}
}

void gimme_free(t_gimme* x) {
	;
}

/* argc指在创建组件时,直接跟在组件后面的参数个数;argv存储参数具体值*/
void* gimme_new(t_symbol* s, long argc, t_atom* argv) {
	t_gimme* x = NULL;
	long i;
	x = (t_gimme*)object_alloc(gimme_class);
	return (x);
}

// 接收多个参数,并打印所有参数
void gimme_printArgs(t_gimme* x, t_symbol* s, long argc, t_atom* argv) {
	long i;
	t_atom* ap = argv;
	for (int i = 0; i < argc; i++) {
		switch (atom_gettype(ap)) {
		case A_LONG:
			post("arg %ld: %ld", i, atom_getlong(ap));
			break;
		case A_FLOAT:
			post("arg %ld: %lf", i, atom_getfloat(ap));
			break;
		case A_SYM:
			post("arg %ld: %s", i, atom_getsym(ap)->s_name);
			break;
		default:
			post("%ld, unknown atom type: %ld", i, atom_gettype(ap));
			break;
		}
		ap++;
	}
}

运行结果:

MAX/MSP SDK学习05:A_GIMME方法_第1张图片

你可能感兴趣的:(MAX/MSP,SDK学习,MAX/MSP)