llvoicevisualizer.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvoicevisualizer.h
  3.  * @brief Draws in-world speaking indicators.
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. //--------------------------------------------------------------------
  33. //
  34. // VOICE VISUALIZER
  35. // author: JJ Ventrella, Linden Lab
  36. // (latest update to this info: Jan 18, 2007)
  37. //
  38. // The Voice Visualizer is responsible for taking realtime signals from actual users speaking and 
  39. // visualizing this speech in two forms: 
  40. //
  41. // (1) as a dynamic sound symbol (also referred to as the "voice indicator" that appears over the avatar's head
  42. // (2) as gesticulation events that are used to trigger avatr gestures 
  43. //
  44. // The input for the voice visualizer is a continual stream of voice amplitudes. 
  45. //-----------------------------------------------------------------------------
  46. #ifndef LL_VOICE_VISUALIZER_H
  47. #define LL_VOICE_VISUALIZER_H
  48. #include "llhudeffect.h"
  49. //-----------------------------------------------------------------------------------------------
  50. // The values of voice gesticulation represent energy levels for avatar animation, based on 
  51. // amplitude surge events parsed from the voice signal. These are made available so that 
  52. // the appropriate kind of avatar animation can be triggered, and thereby simulate the physical
  53. // motion effects of speech. It is recommended that multiple body parts be animated as well as 
  54. // lips, such as head, shoulders, and hands, with large gestures used when the energy level is high.
  55. //-----------------------------------------------------------------------------------------------
  56. enum VoiceGesticulationLevel
  57. {
  58. VOICE_GESTICULATION_LEVEL_OFF = -1,
  59. VOICE_GESTICULATION_LEVEL_LOW = 0,
  60. VOICE_GESTICULATION_LEVEL_MEDIUM,
  61. VOICE_GESTICULATION_LEVEL_HIGH,
  62. NUM_VOICE_GESTICULATION_LEVELS
  63. };
  64. const static int NUM_VOICE_SYMBOL_WAVES = 7;
  65. //----------------------------------------------------
  66. // LLVoiceVisualizer class 
  67. //----------------------------------------------------
  68. class LLVoiceVisualizer : public LLHUDEffect
  69. {
  70. //---------------------------------------------------
  71. // public methods 
  72. //---------------------------------------------------
  73. public:
  74. LLVoiceVisualizer ( const U8 type ); //constructor
  75. ~LLVoiceVisualizer(); //destructor
  76. friend class LLHUDObject;
  77. void setVoiceSourceWorldPosition( const LLVector3 &p ); // this should be the position of the speaking avatar's head
  78. void setMinGesticulationAmplitude( F32 ); // the lower range of meaningful amplitude for setting gesticulation level 
  79. void setMaxGesticulationAmplitude( F32 ); // the upper range of meaningful amplitude for setting gesticulation level 
  80. void setStartSpeaking(); // tell me when the av starts speaking
  81. void setVoiceEnabled( bool ); // tell me whether or not the user is voice enabled
  82. void setSpeakingAmplitude( F32 ); // tell me how loud the av is speaking (ranges from 0 to 1)
  83. void setStopSpeaking(); // tell me when the av stops speaking
  84. bool getCurrentlySpeaking(); // the get for the above set
  85. VoiceGesticulationLevel getCurrentGesticulationLevel(); // based on voice amplitude, I'll give you the current "energy level" of avatar speech
  86. static void setPreferences( );
  87. static void lipStringToF32s ( std::string& in_string, F32*& out_F32s, U32& count_F32s ); // convert a string of digits to an array of floats
  88. void lipSyncOohAah( F32& ooh, F32& aah );
  89. void render(); // inherited from HUD Effect
  90. void  packData(LLMessageSystem *mesgsys); // inherited from HUD Effect
  91. void  unpackData(LLMessageSystem *mesgsys, S32 blocknum); // inherited from HUD Effect
  92. void markDead(); // inherited from HUD Effect
  93. //----------------------------------------------------------------------------------------------
  94. // "setMaxGesticulationAmplitude" and "setMinGesticulationAmplitude" allow for the tuning of the 
  95. // gesticulation level detector to be responsive to different kinds of signals. For instance, we 
  96. // may find that the average voice amplitude rarely exceeds 0.7 (in a range from 0 to 1), and 
  97. // therefore we may want to set 0.7 as the max, so we can more easily catch all the variance 
  98. // within that range. Also, we may find that there is often noise below a certain range like 0.1, 
  99. // and so we would want to set 0.1 as the min so as not to accidentally use this as signal.
  100. //----------------------------------------------------------------------------------------------
  101. void setMaxGesticulationAmplitude(); 
  102. void setMinGesticulationAmplitude(); 
  103. //---------------------------------------------------
  104. // private members 
  105. //---------------------------------------------------
  106. private:
  107. struct SoundSymbol
  108. {
  109. F32 mWaveExpansion [ NUM_VOICE_SYMBOL_WAVES ];
  110. bool mWaveActive [ NUM_VOICE_SYMBOL_WAVES ];
  111. F64 mWaveFadeOutStartTime [ NUM_VOICE_SYMBOL_WAVES ];
  112. F32 mWaveOpacity [ NUM_VOICE_SYMBOL_WAVES ];
  113. LLPointer<LLViewerFetchedTexture> mTexture [ NUM_VOICE_SYMBOL_WAVES ];
  114. bool mActive;
  115. LLVector3 mPosition;
  116. };
  117. LLFrameTimer mTimer; // so I can ask the current time in seconds
  118. F64 mStartTime; // time in seconds when speaking started
  119. F64 mCurrentTime; // current time in seconds, captured every step
  120. F64 mPreviousTime; // copy of "current time" from last frame
  121. SoundSymbol mSoundSymbol; // the sound symbol that appears over the avatar's head
  122. bool mVoiceEnabled; // if off, no rendering should happen
  123. bool mCurrentlySpeaking; // is the user currently speaking?
  124. LLVector3 mVoiceSourceWorldPosition; // give this to me every step - I need it to update the sound symbol
  125. F32 mSpeakingAmplitude; // this should be set as often as possible when the user is speaking
  126. F32 mMaxGesticulationAmplitude; // this is the upper-limit of the envelope of detectable gesticulation leves
  127. F32 mMinGesticulationAmplitude; // this is the lower-limit of the envelope of detectable gesticulation leves
  128. //---------------------------------------------------
  129. // private static members 
  130. //---------------------------------------------------
  131. static BOOL   sLipSyncEnabled;  // 0 disabled, 1 babble loop
  132. static bool   sPrefsInitialized;  // the first instance will initialize the static members
  133. static F32*   sOoh;  // the babble loop of amplitudes for the ooh morph
  134. static F32*   sAah;  // the babble loop of amplitudes for the ooh morph
  135. static U32   sOohs;  // the number of entries in the ooh loop
  136. static U32   sAahs;  // the number of entries in the aah loop
  137. static F32   sOohAahRate;  // frames per second for the babble loop
  138. static F32*   sOohPowerTransfer;  // the power transfer characteristics for the ooh amplitude
  139. static U32   sOohPowerTransfers;  // the number of entries in the ooh transfer characteristics
  140. static F32   sOohPowerTransfersf;  // the number of entries in the ooh transfer characteristics as a float
  141. static F32*   sAahPowerTransfer;  // the power transfer characteristics for the aah amplitude
  142. static U32   sAahPowerTransfers;  // the number of entries in the aah transfer characteristics
  143. static F32   sAahPowerTransfersf;  // the number of entries in the aah transfer characteristics as a float
  144. };//-----------------------------------------------------------------
  145.  //   end of LLVoiceVisualizer class
  146. //------------------------------------------------------------------
  147. #endif //LL_VOICE_VISUALIZER_H