Esempio n. 1
0
void vrpn_Sound_Server_Miles::changeSoundStatus(vrpn_SoundID id, vrpn_SoundDef soundDef)
{
	vrpn_float32 uX = 0, uY = 1, uZ = 0;	// up vector

	if (provider != 0) {

	  // need to negate the Z values to get this into left handed before shipping to Miles..
      soundDef.pose.orientation[2] *= -1.0;
	  soundDef.pose.orientation[3] *= -1.0;
	  soundDef.pose.position[2]    *= -1.0;  

	  //get pose info from quaternion	in soundDef, put it into the above vectors
	  AIL_set_3D_position(getSample(id),soundDef.pose.position[0] , soundDef.pose.position[1], soundDef.pose.position[2]);
	  
	  // normalize
	  soundDef.pose.orientation[0] /= soundDef.pose.orientation[3];
	  soundDef.pose.orientation[1] /= soundDef.pose.orientation[3];
	  soundDef.pose.orientation[2] /= soundDef.pose.orientation[3];
	  soundDef.pose.orientation[3] /= soundDef.pose.orientation[3];

	  AIL_set_3D_orientation(getSample(id), soundDef.pose.orientation[0], soundDef.pose.orientation[1], soundDef.pose.orientation[2], uX, uY, uZ);

	  AIL_set_3D_velocity(getSample(id), soundDef.velocity[0], soundDef.velocity[1], soundDef.velocity[2], soundDef.velocity[3]);

	  /*set the volume to the new level.*/
	  AIL_set_3D_sample_volume(getSample(id), soundDef.volume);
 
	  AIL_set_3D_sample_distances(getSample(id), soundDef.max_front_dist, soundDef.min_front_dist);
	 }
	else fprintf(stderr,"No provider has been set prior to changeSoundStatus\n");
}
Esempio n. 2
0
void vrpn_Sound_Server_Miles::setProvider(int index, int providerRoomSetting)
{
  DWORD result;

  unloadAllSounds();
  //If a provider is already open, then close it
  AIL_close_3D_provider(provider);

  //load the new provider
  
  result = AIL_open_3D_provider(providers[index]);
  if (result != M3D_NOERR) {
	  fprintf(stderr,"Error Opening 3D Provider: %s\n",AIL_last_error());
  }
  else {
  
    provider = providers[index];
    //open a listener.  Position defaults to the origin, looking down the -Z axis with (
    listener = AIL_open_3D_listener(provider);
    AIL_set_3D_position(listener, 0, 0, 0);
    AIL_set_3D_orientation(listener, 0, 0, -1, 0, 1, 0);
    AIL_set_3D_velocity(listener, 0, 0, 0, 0);
    //set a room style
    AIL_set_3D_provider_preference(provider, "EAX environment selection", &providerRoomSetting);
  }
}
Esempio n. 3
0
void vrpn_Sound_Server_Miles::changeListenerStatus(vrpn_ListenerDef listenerDef)
//change pose, etc for listener
{
	if (provider != 0) {
	  vrpn_float32 uX = 0, uY = 1, uZ = 0;

	  // switch to left handed
      listenerDef.pose.orientation[2] *= -1.0;
	  listenerDef.pose.orientation[3] *= -1.0;
	  listenerDef.pose.position[2]    *= -1.0;  


	  AIL_set_3D_position(listener, listenerDef.pose.position[0], listenerDef.pose.position[1], listenerDef.pose.position[2]);

	  // normalize
	  listenerDef.pose.orientation[0] /= listenerDef.pose.orientation[3];
	  listenerDef.pose.orientation[1] /= listenerDef.pose.orientation[3];
	  listenerDef.pose.orientation[2] /= listenerDef.pose.orientation[3];
	  listenerDef.pose.orientation[3] /= listenerDef.pose.orientation[3];

	  q_matrix_type mymatrix;
	  q_matrix_type multmatrix;
	  q_type facevec;

	  q_to_row_matrix(mymatrix, listenerDef.pose.orientation);

	  // 90 degree rotation about x
	  multmatrix[0][0] = 1;
	  multmatrix[0][1] = 0;
	  multmatrix[0][2] = 0;
	  multmatrix[0][3] = 0;

	  multmatrix[1][0] = 0;
	  multmatrix[1][1] = 0;
	  multmatrix[1][2] = -1;
	  multmatrix[1][3] = 0;

	  multmatrix[2][0] = 0;
	  multmatrix[2][1] = 1;
	  multmatrix[2][2] = 0;
	  multmatrix[2][3] = 0;

	  multmatrix[3][0] = 0;
	  multmatrix[3][1] = 0;
	  multmatrix[3][2] = 0;
	  multmatrix[3][3] = 1;

	  q_matrix_mult(mymatrix, mymatrix, multmatrix);

	  q_from_row_matrix(facevec, mymatrix);

      AIL_set_3D_orientation(listener, listenerDef.pose.orientation[0], listenerDef.pose.orientation[1], listenerDef.pose.orientation[2], facevec[0], facevec[1], facevec[2]);
	
	  AIL_set_3D_velocity(listener, listenerDef.velocity[0], listenerDef.velocity[1], listenerDef.velocity[2], listenerDef.velocity[3]);
	} else fprintf(stderr,"No provider has been set prior to changeListenerStatus\n");
}
      //
      // UpdateEffect3D
      //
      // Update effect data (TRUE if effect was playing)
      //
      Bool UpdateEffect3D
      (
        Effect *e, F32 x, F32 y, F32 z, F32 dx, F32 dy, F32 dz, F32 priority, S32 vol
      )
      {
        // See if this effect is still being played
        Voice *voice = FindVoicePlayingEffect(e);

        // If so, update the 3D world position and velocity
        if (voice)
        {
          AIL_set_3D_position(voice->handle3D, x, y, z);
          AIL_set_3D_velocity_vector(voice->handle3D, dx, dy, dz);
          AIL_set_3D_sample_volume(voice->handle3D, vol);
          voice->priority = priority;
          return (TRUE);
        }

        return (FALSE);
      }
Esempio n. 5
0
void vrpn_Sound_Server_Miles::changeSoundStatus(vrpn_SoundID id, vrpn_SoundDef soundDef)
{
	vrpn_float32 uX = 0, uY = 1, uZ = 0;	// up vector

	if (provider != 0) {

	  //get pose info from quaternion	in soundDef, put it into the above vectors
	  AIL_set_3D_position(getSample(id),soundDef.pose.position[0] , soundDef.pose.position[1], soundDef.pose.position[2]);
	  
	  // normalize
	  soundDef.pose.orientation[0] /= soundDef.pose.orientation[3];
	  soundDef.pose.orientation[1] /= soundDef.pose.orientation[3];
	  soundDef.pose.orientation[2] /= soundDef.pose.orientation[3];
	  soundDef.pose.orientation[3] /= soundDef.pose.orientation[3];

	  AIL_set_3D_orientation(getSample(id), soundDef.pose.orientation[0], soundDef.pose.orientation[1], soundDef.pose.orientation[2], uX, uY, uZ);

	  AIL_set_3D_velocity(getSample(id), soundDef.velocity[0], soundDef.velocity[1], soundDef.velocity[2], soundDef.velocity[3]);

	  /*set the volume to the new level.*/
	  AIL_set_3D_sample_volume(getSample(id), soundDef.volume);


	  // Since the RSX software sets max front/back to 128.0 * min front/back,
	  // we will divide max front/back by 128 and set this to min 
	  // before giving it to miles
	  // We will change GetCurrentDistances to multiply by 128.0 before displaying
	  // value to the user.. This mess may need to be cleaned up if the Miles people
	  // come to their senses...

	  soundDef.min_back_dist = soundDef.max_back_dist / 128.0;
	  soundDef.min_front_dist = soundDef.max_front_dist / 128.0;
	  
	  AIL_set_3D_sample_distances(getSample(id), soundDef.max_front_dist, soundDef.min_front_dist, soundDef.max_back_dist, soundDef.min_back_dist);
	 }
	else fprintf(stderr,"No provider has been set prior to changeSoundStatus\n");
}
      //
      // Play3D
      //
      // Play a record as a 3D sample (TRUE if actually started)
      //
      Bool Play3D
      (
        Effect *e, Record *r, S32 vol, U32 owner, F32 priority, S32 loop, 
        F32 x, F32 y, F32 z, F32 min, F32 max
      )
      {
        ASSERT(e);
        ASSERT(r);

        // Request a 3D voice
        Voice *voice = Request(priority, TRUE, e->GetVoiceIndex());

        if (!voice)
        {
          return (FALSE);
        }

        ASSERT(voice->flag3D);

        // Request the cache data
        Cache::Item *item = Cache::Request(r);

        if (!item)
        {
          // Unable to load data
          return (FALSE);
        }

        // Stop any sounds from this owner
        if (owner != NO_OWNER) 
        {
          Output::StopByOwner(owner);
        }

        // The current time
        U32 time = AIL_ms_count();

        // Are we under the minimum repeat time
        if ((time - r->lastUse) < MIN_REPEATTIME)
        {
          return (FALSE);
        }

        // Save info about this use
        r->lastUse = time;

        // Initialise the sound effect data
        if (!AIL_set_3D_sample_file(voice->handle3D, item->data))
        {
          LOG_WARN(("Invalid 3D data '%s' (Require MS Mono Uncompressed PCM WAV)", r->Name()));
          r->valid = FALSE;
          return (FALSE);
        }

        // Setup the voice
        voice->effect = e;
        voice->record = r;
        voice->owner = owner;
        voice->priority = priority;

        // Set the volume
        AIL_set_3D_sample_volume(voice->handle3D, vol);

        // Set the loop count for this voice
        AIL_set_3D_sample_loop_count(voice->handle3D, loop);

        // Set the 3D world position
        AIL_set_3D_position(voice->handle3D, x, y, z);

        // Set the distances for this sample
        AIL_set_3D_sample_distances(voice->handle3D, max, min);

        // Always face the listener 
        AIL_set_3D_orientation(voice->handle3D, -x, -y, -z, 0.0F, 1.0F, 0.0F);

        // Start the sample playing
        AIL_start_3D_sample(voice->handle3D);

        return (TRUE);
      }
Esempio n. 7
0
void vrpn_Sound_Server_Miles::loadSound(char* filename, vrpn_SoundID id)
/*loads a .wav file into memory.  gives back id to reference the sound
currently (7/28/99) this does not reuse space previously vacated in 
samples by unloading sounds*/
{
	if (provider != 0) {
      fprintf(stdout,"Loading sound: #%d %s\n", id, filename);
	  ChangeSoundIdBox(0,id);
	  //load into handle
	  unsigned long *s;
	  long type;
	  H3DSAMPLE handle;
	  void *sample_address;
	  void *d;
	  AILSOUNDINFO info;

	  LastSoundId = id;

	  //load the .wav file into memory
	  s = (unsigned long *)AIL_file_read(filename, FILE_READ_WITH_SIZE);

	  if (s==0)
        return;

	  type=AIL_file_type(s+1,s[0]);

	  switch (type) {
        case AILFILETYPE_PCM_WAV:
          sample_address = s+1;
	      break;

        case AILFILETYPE_ADPCM_WAV:
          AIL_WAV_info(s+1,&info);
          AIL_decompress_ADPCM(&info,&d,0);
          AIL_mem_free_lock(s);
	      sample_address = d;
          break;

        default:
          AIL_mem_free_lock(s);
          return;
	  }

	  //initialize handle
      handle = AIL_allocate_3D_sample_handle(provider);
	  //tell handle where the .wav file is in memory
	  AIL_set_3D_sample_file(handle, sample_address);
	  //set defaults
	  AIL_set_3D_sample_volume(handle, 100);	//default volume is 100 on 0...127 inclusive
	  AIL_set_3D_position(handle,0,0,0);
	  AIL_set_3D_orientation(handle, 0,0,-1,0,1,0);
	  AIL_set_3D_velocity(handle,0,0,-1,0);
	  AIL_set_3D_sample_distances(handle, 200, 20);

	  //load handle into samples
	  addSample(handle, id);

	  /*Sample level environment preferences (ie, EAX_ENVIRONMENT_BATHROOM)
	  could be added in here as a passed-in parameter*/
	}
	else fprintf(stderr,"No provider has been set prior to LoadSound\n");
}