Ejemplo n.º 1
0
/*
 * _alcSpeakerMove( ALuint cid )
 *
 * Moves speakers for context named by cid, using listener orientation and
 * position as modifiers.
 *
 * If cid is invalid, set ALC_INVALID_CONTEXT.
 *
 * assumes context cid is locked
 *
 * FIXME:
 *    please check my math
 */
void _alcSpeakerMove( ALuint cid ) {
    AL_context *cc;
    ALfloat vec[3];
    ALfloat *pos;    /* listener position */
    ALfloat *ori;    /* listener orientation */
    ALfloat ipos[3]; /* inverse listener position */
    ALuint i;
    ALfloat m[3][3];
    ALfloat pm[3];
    ALfloat rm[3];

    cc = _alcGetContext( cid );
    if(cc == NULL) {
        _alDebug(ALD_CONTEXT, __FILE__, __LINE__,
                 "_alcSpeakerMove: invalid context id %d", cid);

        _alcSetError( ALC_INVALID_CONTEXT );

        return;
    }

    pos = cc->listener.position;
    ori = cc->listener.orientation;

    _alVectorCrossProduct(vec, ori + 0, ori + 3);
    _alVectorNormalize(m[0], vec);

    _alVectorCrossProduct(vec, m[0], ori + 0);
    _alVectorNormalize(m[1], vec);

    _alVectorNormalize(m[2], ori + 0);

    /* reset speaker position */
    _alcSpeakerInit(cid);

    _alVectorInverse( ipos, cc->listener.position );

    /* rotate about at and up vectors */
    for(i = 0; i < _alcGetNumSpeakers(cid); i++) {
        _alVectorTranslate(pm,
                           cc->_speaker_pos[i].pos, ipos);

        _alVecMatrixMulA3(rm, pm, m);

        _alVectorTranslate(cc->_speaker_pos[i].pos,
                           rm, pos);
    }

    _alDebug(ALD_MATH, __FILE__, __LINE__,
             "SpAdj: l/r [%f|%f|%f] [%f|%f|%f]",
             cc->_speaker_pos[0].pos[0],
             cc->_speaker_pos[0].pos[1],
             cc->_speaker_pos[0].pos[2],

             cc->_speaker_pos[1].pos[0],
             cc->_speaker_pos[1].pos[1],
             cc->_speaker_pos[1].pos[2]);

    return;
}
Ejemplo n.º 2
0
/*
 * _alGetDoublev( ALenum param, ALdouble *dv )
 *
 * Non locking version of alGetDoublev
 *
 */
void _alGetDoublev(ALenum param, ALdouble *dv) {
	AL_context *cc;

	cc = _alcDCGetContext();
	if( cc == NULL ) {
		/* no current context, set error and return */
		_alcSetError( ALC_INVALID_CONTEXT );

		return;
	}

	switch( param ) {
		case AL_DOPPLER_FACTOR:
			*dv = cc->doppler_factor;
			break;
		case AL_DOPPLER_VELOCITY:
			*dv = cc->doppler_velocity;
			break;
		default:
			_alDCSetError( AL_ILLEGAL_ENUM );
			break;
	}

	return;
}
Ejemplo n.º 3
0
/*
 * alGetString( ALenum param )
 *
 * Returns readable string representation of param, or NULL if no string
 * representation is available.
 */
const ALubyte *alGetString( ALenum param ) {
	AL_context *cc;

	static ALubyte extensions[4096];

	/*
	 * First, we check to see if the param corresponds to an
	 * error, in which case we return the value from _alGetErrorString.
	 */
	if(_alIsError(param) == AL_TRUE) {
		return _alGetErrorString(param);
	}

	/*
	 * Next, we check to see if the param corresponds to an alc
	 * error, in which case we return the value from _alcGetErrorString.
	 */
	if( alcIsError( param ) == AL_TRUE ) {
		return _alcGetErrorString( param );
	}

	switch(param) {
		case AL_VENDOR:
			return (const ALubyte *) "J. Valenzuela";
			break;
		case AL_VERSION:
			return (const ALubyte *) LAL_VERSION;
			break;
		case AL_RENDERER:
			return (const ALubyte *) "Software";
			break;
		case AL_EXTENSIONS:
			_alGetExtensionStrings( extensions, sizeof( extensions ) );
			return extensions;
			break;
		case 0xfeedabee:
			return (const ALubyte *) "Mark 12:31";
			break;
		default:
		  break;
	}

	cc = _alcDCGetContext();
	if( cc == NULL ) {
		/* no current context, set error and return */
		_alcSetError( ALC_INVALID_CONTEXT );

		return NULL;
	}
	else
	{
		_alDCSetError( AL_ILLEGAL_ENUM );
	}

	return NULL;
}
Ejemplo n.º 4
0
/*
 * _alGetIntegerv( ALenum param, ALint *iv )
 *
 * Non locking version of alGetIntegerv
 */
void _alGetIntegerv(UNUSED(ALenum param), UNUSED(ALint *iv)) {
	AL_context *cc;

	cc = _alcDCGetContext();
	if( cc == NULL ) {
		/* no current context, set error and return */
		_alcSetError( ALC_INVALID_CONTEXT );

		return;
	}

	switch( param ) {
		case AL_DISTANCE_MODEL:
			*iv = cc->distance_model;
			break;
		default:
			_alDCSetError( AL_ILLEGAL_ENUM );
			break;
	}

	return;
}