openal

Description

Openal é uma biblioteca de audio multi-plataforma feita para ser usada junto com aplicativos 3D. EndSectionDoc void FloatsFromScheme(Scheme_Object *src, float *dst, unsigned int size) { MZ_GC_DECL_REG(1); MZ_GC_VAR_IN_REG(0, src); MZ_GC_REG(); assert(size<=(unsigned int)SCHEME_VEC_SIZE(src)); for (unsigned int n=0; n

Example

 (oa-start)
 (define mysample (oa-load-sample (fullpath "sample.wav")))
 (oa-play mysample (vector 0 0 0) 1 0.2)
 EndFunctionDoc
Scheme_Object *start(int argc, Scheme_Object **argv)
{
	if (Audio==NULL) Audio = new FluxAudio;
	return scheme_void;
}

 StartFunctionDoc-en
 oa-load-sample 
 Returns: sampleid-number
 Description:
 Loads a sample and returns the id number, so it can be played.
 Example: (oa-start)
 (define mysample (oa-load-sample "sample.wav"))
 (oa-play mysample (vector 0 0 0) 1 0.2)
 EndFunctionDoc
 StartFunctionDoc-pt
 oa-load-sample
 Retorna: número-sampleid
 Descrição:
 Carrega uma amostra e retorna o número id, de forma que possa ser
 tocada.
 Exemplo: (oa-start)
 (define mysample (oa-load-sample "sample.wav"))
 (oa-play mysample (vector 0 0 0) 1 0.2)
 EndFunctionDoc
Scheme_Object *load_sample(int argc, Scheme_Object **argv)
{
	char *filename=NULL;
	MZ_GC_DECL_REG(2);
	MZ_GC_VAR_IN_REG(0,argv); 
	MZ_GC_VAR_IN_REG(1,filename); 
	MZ_GC_REG();

	if (!SCHEME_CHAR_STRINGP(argv[0]))scheme_wrong_type("oa-load-sample", "string", 0, argc, argv);
	int id=0;

	if (Audio!=NULL)
	{
		filename=scheme_utf8_encode_to_buffer(SCHEME_CHAR_STR_VAL(argv[0]),SCHEME_CHAR_STRLEN_VAL(argv[0]),NULL,0);		id=Audio->Load(filename);
	}
	
	MZ_GC_UNREG();
	return scheme_make_integer_value(id);
}

 StartFunctionDoc-en
 oa-update
 Returns: void
 Description:
 Keeps the openal code running, is called by the every-frame code.
 Example: (oa-update)
 EndFunctionDoc
 StartFunctionDoc-pt
 oa-update
 Retorna: void
 Descrição:
 Mantém o código openal rodando, é chamado pelo código every-frame.
 Exemplo: (oa-update)
 EndFunctionDoc
Scheme_Object *update(int argc, Scheme_Object **argv)
{
	if (Audio!=NULL)
	{
		Audio->Update();
	}
	return scheme_void;
}

 StartFunctionDoc-en
 oa-play sample-id position pitch gain
 Returns: void
 Description:
 Plays a sample. 
 Example: (oa-start)
 (define mysample (oa-load-sample (fullpath "sample.wav")))
 (oa-play mysample (vector 0 0 0) 1 0.2)
 EndFunctionDoc
 StartFunctionDoc-pt
 oa-play sampleid posição pitch gain
 Retorna: void
 Descrição:
 Toca uma amostra.
 Exemplo: (oa-start)
 (define mysample (oa-load-sample (fullpath "sample.wav")))
 (oa-play mysample (vector 0 0 0) 1 0.2)
 EndFunctionDoc
Scheme_Object *play(int argc, Scheme_Object **argv)
{
	MZ_GC_DECL_REG(4);
	MZ_GC_VAR_IN_REG(0,argv); 
	MZ_GC_REG();
	if (!SCHEME_NUMBERP(argv[0]))scheme_wrong_type("oa-play", "number", 0, argc, argv);
	if (!SCHEME_VECTORP(argv[1]))scheme_wrong_type("oa-play", "vector", 1, argc, argv);
	if (!SCHEME_NUMBERP(argv[2]))scheme_wrong_type("oa-play", "number", 2, argc, argv);
	if (!SCHEME_NUMBERP(argv[3]))scheme_wrong_type("oa-play", "number", 3, argc, argv);

	if (Audio!=NULL)
	{
		unsigned int id=(unsigned int)scheme_real_to_double(argv[0]);
		dVector pos;
		FloatsFromScheme(argv[1],pos.arr(),3);
		Audio->Play(id,pos,scheme_real_to_double(argv[2]),scheme_real_to_double(argv[3]));
	}
	
	MZ_GC_UNREG();
	return scheme_void;
}

 StartFunctionDoc-en
 oa-set-head-pos pos dir
 Returns: void
 Description:
 Sets the head position, or listener position - which changes the panning and
 perhaps filtering of the sounds to relate to world space position.
 Example: (oa-start)
 (define mysample (oa-load-sample (fullpath "sample.wav")))
 (oa-set-head-pos (vector -1 0 0) (vector 0 0 1))
 (oa-play mysample (vector 0 0 0) 1 0.2)
 EndFunctionDoc
 StartFunctionDoc-pt
 oa-set-head-pos pos dir
 Retorna: void
 Descrição:
 Ajusta a posição da cabeça, ou posição do ouvinte - que muda o
 panning e talvez a filtragem dos soms em relação a posição espacial
 no mundo.
 Exemplo: (oa-start)
 (define mysample (oa-load-sample (fullpath "sample.wav")))
 (oa-set-head-pos (vector -1 0 0) (vector 0 0 1))
 (oa-play mysample (vector 0 0 0) 1 0.2)
 EndFunctionDoc
Scheme_Object *set_head_pos(int argc, Scheme_Object **argv)
{
	MZ_GC_DECL_REG(2);
	MZ_GC_VAR_IN_REG(0,argv); 
	MZ_GC_REG();
	if (!SCHEME_VECTORP(argv[0]))scheme_wrong_type("oa-set-head-pos", "vector", 0, argc, argv);
	if (!SCHEME_VECTORP(argv[1]))scheme_wrong_type("oa-set-head-pos", "vector", 1, argc, argv);

	if (Audio!=NULL)
	{
		dVector pos;
		FloatsFromScheme(argv[0],pos.arr(),3);
		dVector dir;
		FloatsFromScheme(argv[1],dir.arr(),3);
	
		Audio->SetHeadPos(pos,dir);
	}
	
	MZ_GC_UNREG();
	return scheme_void;
}

 StartFunctionDoc-en
 oa-set-poly polyphony-count
 Returns: void
 Description:
 Sets the number of samples that can be played at once. Defaults to 256.
 Example: (oa-set-poly 256)
 EndFunctionDoc
 StartFunctionDoc-pt
 oa-set-poly contagem-polifônica
 Retorna: void
 Descrição:
 Ajusta o número de amostras que podem ser tocadas de uma
 vez. Padrão é 256.
 Exemplo: (oa-set-poly 256)
 EndFunctionDoc
Scheme_Object *set_poly(int argc, Scheme_Object **argv)
{
	MZ_GC_DECL_REG(1);
	MZ_GC_VAR_IN_REG(0,argv); 
	MZ_GC_REG();
	if (!SCHEME_NUMBERP(argv[0]))scheme_wrong_type("al-poly", "number", 0, argc, argv);

	if (Audio!=NULL)
	{
		Audio->SetPoly((unsigned int)scheme_real_to_double(argv[0]));
	}
	
	MZ_GC_UNREG();
	return scheme_void;
}

 StartFunctionDoc-en
 oa-set-cull-dist distance
 Returns: void
 Description:
 Sets distance at which sounds will be stopped playing
 Example: (oa-set-cull-dist 1000)
 EndFunctionDoc
 StartFunctionDoc-pt
 oa-set-cull-dist distancia
 Retorna: void
 Descrição:
 Ajusta a distancia à qual o som vai deixar de tocar.
 Exemplo: (oa-set-cull-dist 1000)
 EndFunctionDoc
Scheme_Object *set_cull_dist(int argc, Scheme_Object **argv)
{
	MZ_GC_DECL_REG(1);
	MZ_GC_VAR_IN_REG(0,argv); 
	MZ_GC_REG();
	if (!SCHEME_NUMBERP(argv[0]))scheme_wrong_type("oa-set-cull-dist", "number", 0, argc, argv);

	if (Audio!=NULL)
	{
		Audio->SetCullDist(scheme_real_to_double(argv[0]));
	}
	
	MZ_GC_UNREG();
	return scheme_void;
}

 StartFunctionDoc-en
 oa-set-acoustics attenuation-scale max-distance ref-distance rolloff
 Returns: void
 Description:
 Sets some global acoustic parameters
 Example: (oa-set-acoustics 1 1 1 1)
 EndFunctionDoc
 StartFunctionDoc-pt
 oa-set-acoustics escala-atenuação distancia-max distancia-ref rolloff
 Retorna: void
 Descrição:
 Ajusta alguns parametros globais de acústica.
 Exemplo: (oa-set-acoustics 1 1 1 1)
 EndFunctionDoc
Scheme_Object *set_acoustics(int argc, Scheme_Object **argv)
{
	MZ_GC_DECL_REG(4);
	MZ_GC_VAR_IN_REG(0,argv); 
	MZ_GC_REG();
	if (!SCHEME_NUMBERP(argv[0]))scheme_wrong_type("oa-set-acoustics", "number", 0, argc, argv);
	if (!SCHEME_NUMBERP(argv[1]))scheme_wrong_type("oa-set-acoustics", "number", 1, argc, argv);
	if (!SCHEME_NUMBERP(argv[2]))scheme_wrong_type("oa-set-acoustics", "number", 2, argc, argv);
	if (!SCHEME_NUMBERP(argv[3]))scheme_wrong_type("oa-set-acoustics", "number", 3, argc, argv);

	if (Audio!=NULL)
	{
		FluxAudio::AcousticDesc desc;
		desc.AttenScale=scheme_real_to_double(argv[0]);
		desc.MaxDistance=scheme_real_to_double(argv[1]);
		desc.RefDistance=scheme_real_to_double(argv[2]);
		desc.Rolloff=scheme_real_to_double(argv[3]);

		Audio->SetAcoustics(desc);
	}
	
	MZ_GC_UNREG();
	return scheme_void;
}

/

Scheme_Object *scheme_reload(Scheme_Env*env)
{
	 add all the modules from this extension
	Scheme_Env*menv=scheme_primitive_module(scheme_intern_symbol("fluxus-openal"), env);

	scheme_add_global("oa-start", scheme_make_prim_w_arity(start, "oa-start", 0, 0), menv);
	scheme_add_global("oa-load-sample", scheme_make_prim_w_arity(load_sample, "oa-load-sample", 1, 1), menv);
	scheme_add_global("oa-update", scheme_make_prim_w_arity(update, "oa-update", 0, 0), menv);
	scheme_add_global("oa-play", scheme_make_prim_w_arity(play, "oa-play", 4, 4), menv);
	scheme_add_global("oa-set-head-pos", scheme_make_prim_w_arity(set_head_pos, "oa-set-head-pos", 2, 2), menv);
	scheme_add_global("oa-set-poly", scheme_make_prim_w_arity(set_poly, "oa-set-poly", 1, 1), menv);
	scheme_add_global("oa-set-cull-dist", scheme_make_prim_w_arity(set_cull_dist, "oa-set-cull-dist", 1, 1), menv);
	scheme_add_global("oa-set-acoustics", scheme_make_prim_w_arity(set_acoustics, "oa-set-acoustics", 4, 4), menv);

	scheme_finish_primitive_module(menv);	
	
	return scheme_void;
}

Scheme_Object *scheme_initialize(Scheme_Env*env)
{
	return scheme_reload(env);
}

Scheme_Object *scheme_module_name()
{
	return scheme_intern_symbol("fluxus-openal");