Version

menu_open

include/AK/SpatialAudio/Common/AkSpatialAudio.h

Go to the documentation of this file.
00001 /*******************************************************************************
00002 The content of this file includes portions of the AUDIOKINETIC Wwise Technology
00003 released in source code form as part of the SDK installer package.
00004 
00005 Commercial License Usage
00006 
00007 Licensees holding valid commercial licenses to the AUDIOKINETIC Wwise Technology
00008 may use this file in accordance with the end user license agreement provided
00009 with the software or, alternatively, in accordance with the terms contained in a
00010 written agreement between you and Audiokinetic Inc.
00011 
00012 Apache License Usage
00013 
00014 Alternatively, this file may be used under the Apache License, Version 2.0 (the
00015 "Apache License"); you may not use this file except in compliance with the
00016 Apache License. You may obtain a copy of the Apache License at
00017 http://www.apache.org/licenses/LICENSE-2.0.
00018 
00019 Unless required by applicable law or agreed to in writing, software distributed
00020 under the Apache License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
00021 OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License for
00022 the specific language governing permissions and limitations under the License.
00023 
00024 Version: <VERSION>  Build: <BUILDNUMBER>
00025 Copyright (c) <COPYRIGHTYEAR> Audiokinetic Inc.
00026 *******************************************************************************/
00027 
00028 /// \file 
00029 /// Spatial Audio interface.
00030 
00031 #pragma once
00032 
00033 #include <AK/SpatialAudio/Common/AkSpatialAudioTypes.h>
00034 #include <AK/Plugin/AkReflectGameData.h>
00035 
00036 /// AkDiffractionFlags determine if diffraction values for sound passing through portals will be calculated, and how to apply those calculations to Wwise parameters.
00037 enum AkDiffractionFlags
00038 {
00039     DiffractionFlags_UseBuiltInParam = 1 << 0,              ///< Set the Wwise built-in game parameter value for diffraction angle. This is a flexible approach that can be mapped to any Wwise parameter.  Can also be used simply to monitor diffraction using the game object profiler in Wwise.
00040     DiffractionFlags_UseObstruction = 1 << 1,               ///< Use Wwise obstruction for dry-path diffraction. Dry-path diffraction is related to the angle off of a straight line of sight to a sound emitter.
00041     DiffractionFlags_CalcEmitterVirtualPosition = 1 << 3,   ///< An emitter that is not in the same room as the listener will have its apparent or virtual position calculated by Wwise spatial audio and passed on to the sound engine.
00042 
00043     DefaultDiffractionFlags = DiffractionFlags_UseBuiltInParam | DiffractionFlags_UseObstruction | DiffractionFlags_CalcEmitterVirtualPosition
00044 };
00045 
00046 /// Initialization settings of the spatial audio module.
00047 struct AkSpatialAudioInitSettings
00048 {
00049     AkSpatialAudioInitSettings() : uPoolID(AK_INVALID_POOL_ID)
00050         , uPoolSize(4 * 1024 * 1024)
00051         , uMaxSoundPropagationDepth(AK_MAX_SOUND_PROPAGATION_DEPTH)
00052         , uDiffractionFlags((AkUInt32)DefaultDiffractionFlags)
00053         , fDiffractionShadowAttenFactor(AK_DEFAULT_DIFFR_SHADOW_ATTEN)
00054         , fDiffractionShadowDegrees(AK_DEFAULT_DIFFR_SHADOW_DEGREES)
00055     {}
00056 
00057     AkMemPoolId uPoolID;                    ///< User-provided pool ID (see AK::MemoryMgr::CreatePool).
00058     AkUInt32 uPoolSize;                     ///< Desired memory pool size if a new pool should be created. A pool will be created if uPoolID is not set (AK_INVALID_POOL_ID).
00059     AkUInt32 uMaxSoundPropagationDepth;     ///< Maximum number of portals that sound can propagate through; must be less than or equal to AK_MAX_SOUND_PROPAGATION_DEPTH.
00060     AkUInt32 uDiffractionFlags;             ///< Enable or disable specific diffraction features. See AkDiffractionFlags.
00061     AkReal32 fDiffractionShadowAttenFactor; ///< Multiplier that is applied to the distance attenuation of diffracted sounds (sounds that are in the 'shadow region') to simulate the phenomenon where by diffracted sound waves decay faster than incident sound waves. 
00062     AkReal32 fDiffractionShadowDegrees;     ///< Interpolation angle, in degrees, over which the fDiffractionShadowAttenFactor is applied.  
00063                                             ///< At a diffraction of 0, a multiplier of 1 (ie. none) is applied, and at an angle of fDiffractionShadowDegrees or greater, fDiffractionShadowAttenFactor is applied.
00064                                             ///< A linear interpolation between 1 and fDiffractionShadowAttenFactor is applied when the angle is between 0 and fDiffractionShadowDegrees.
00065 };
00066 
00067 // Settings for individual image sources.
00068 struct AkImageSourceSettings
00069 {
00070     AkImageSourceSettings() {}
00071 
00072     AkImageSourceSettings(AkVector in_sourcePosition, AkReal32 in_fDistanceScalingFactor, AkReal32 in_fLevel)
00073         : params(in_sourcePosition, in_fDistanceScalingFactor, in_fLevel)
00074         , texture()
00075         , name()
00076     {
00077     }
00078 
00079     ~AkImageSourceSettings()
00080     {
00081         name.Term();
00082     }
00083 
00084     /// Operator =
00085     AkImageSourceSettings& operator =(const AkImageSourceSettings & src)
00086     {
00087         params = src.params;
00088         texture = src.texture;
00089         name = src.name;
00090         name.AllocCopy();
00091         return *this;
00092     }
00093 
00094     void SetOneTexture(AkUniqueID in_texture)
00095     {
00096         texture.uNumTexture = 1;
00097         texture.arTextureID[0] = in_texture;
00098     }
00099 
00100     void SetName(const char* in_pName)
00101     {
00102         name = in_pName;
00103         name.AllocCopy();
00104     }
00105 
00106     /// Image source parameters.
00107     AkImageSourceParams params;
00108 
00109     /// Acoustic texture that goes with this image source.
00110     AkImageSourceTexture texture;
00111 
00112     /// Name given to image source, can be used to identify the image source in the AK Reflect plugin UI.
00113     AK::SpatialAudio::String name;
00114 };
00115 
00116 /// Settings for a sound emitter.
00117 struct AkEmitterSettings
00118 {
00119     /// Constructor
00120     AkEmitterSettings() : reflectAuxBusID(AK_INVALID_UNIQUE_ID)
00121                         , reflectionMaxPathLength(kDefaultMaxPathLength)
00122                         , reflectionsAuxBusGain(1.0f)
00123                         , reflectionsOrder(1)
00124                         , reflectorFilterMask(0xFFFFFFFF)
00125                         , roomReverbAuxBusGain(1.0f)
00126     {
00127         useImageSources = true;
00128     }
00129 
00130     /// Operator =
00131     AkEmitterSettings& operator =(const AkEmitterSettings & src)
00132     {
00133         name = src.name;
00134         reflectAuxBusID = src.reflectAuxBusID;
00135         reflectionMaxPathLength = src.reflectionMaxPathLength;
00136         reflectionsAuxBusGain = src.reflectionsAuxBusGain;
00137         reflectionsOrder = src.reflectionsOrder;
00138         reflectorFilterMask = src.reflectorFilterMask;
00139         roomReverbAuxBusGain = src.roomReverbAuxBusGain;
00140         useImageSources = src.useImageSources;
00141         return *this;
00142     }
00143 
00144     /// Name given to this sound emitter.
00145     AK::SpatialAudio::OsString name;
00146 
00147     /// Aux bus with the AkReflect plug-in that is used by the geometric reflections API. Set to AK_INVALID_UNIQUE_ID to disable geometric reflections.
00148     /// \aknote For proper operation with AkReflect and the SpatialAudio API, any aux bus using AkReflect should have 'Enable Positioning' checked and the positioning type should be set to 2D in the Wwise authoring tool. See the Wwise Reflect documentation for more details. \endaknote
00149     AkUniqueID reflectAuxBusID;
00150 
00151     /// A heuristic to stop the computation of reflections. Should be no longer (and possibly shorter for less CPU usage) than the maximum attenuation of
00152     /// the sound emitter.
00153     AkReal32 reflectionMaxPathLength;
00154 
00155     /// Send gain (0.f-1.f) that is applied when sending to the bus that has the AkReflect plug-in. (reflectAuxBusID)
00156     AkReal32 reflectionsAuxBusGain;
00157 
00158     /// Maximum number of reflections that will be processed when computing indirect paths via the geometric reflections API. Reflection processing grows
00159     /// exponentially with the order of reflections, so this number should be kept low.  Valid range: 1-4.
00160     AkUInt32 reflectionsOrder;
00161 
00162     /// Bit field that allows for filtering of reflector surfaces (triangles) for this sound emitter. Setting/or clearing bits that correspond to the same bits set in 
00163     /// the \c reflectorChannelMask of each \c AkTriangle can be used to filter out specific geometry for specific emitters. An example usage is to disable reflections 
00164     /// off the floor for sounds positioned at the camera. When processing the reflections, this bit mask is ANDed with each potential triangle's reflectorChannelMask to determine if the reflector/emitter pair can produce a valid hit.  
00165     AkUInt32 reflectorFilterMask;
00166 
00167     /// Send gain (0.f-1.f) that is applied when sending to the bus that is associated with the room that the emitter is in (assigned via ReverbAuxBus field of AkRoomParams).
00168     /// This value is multiplied with the room-specific gain (ReverbLevel of AkRoomParams).  Note that this value is not applied to aux sends that are set via SetEmitterAuxSendValues(),
00169     /// and therefore may be used to scale and/or disable room reverb, either temporarily or permanently, for a specific emitter.
00170     /// \sa
00171     /// - \ref AkRoomParams
00172     /// - \ref AK::SpatialAudio::SetEmitterAuxSendValues
00173     AkReal32 roomReverbAuxBusGain;
00174 
00175     /// Enable reflections from image sources that have been added via the \c AK::SpatialAudio::SetImageSource() API. (Does not apply to geometric reflections.)
00176     AkUInt8 useImageSources : 1;
00177 };
00178 
00179 /// Structure for describing information about individual triangles 
00180 struct AkTriangle
00181 {
00182     /// Constructor
00183     AkTriangle(): textureID(AK_INVALID_UNIQUE_ID)
00184                 , reflectorChannelMask((AkUInt32)-1)
00185                 , strName(NULL) 
00186     {}
00187 
00188     /// Vertices 
00189     AkVector point0;
00190     AkVector point1;
00191     AkVector point2;
00192 
00193     /// Acoustic texture ShareSet ID
00194     AkUInt32 textureID;
00195 
00196     /// Bitfield of channels that this triangle belongs to. When processing the reflections, this bit mask is ANDed with each of the emitter's <tt>reflectorFilterMask</tt>s to determine if the reflector/emitter pair can produce a valid hit.  
00197     AkUInt32 reflectorChannelMask;
00198 
00199     /// Name to describe this triangle. When passing into \c SetGeometry, this string is copied internally and may be freed as soon as the function returns.
00200     const char* strName;
00201 };
00202 
00203 /// Structure for retrieving information about the indirect paths of a sound that have been calculated via the geometric reflections API. Useful for debug draw applications.
00204 struct AkSoundPathInfo
00205 {
00206     /// Apparent source of the reflected sound that follows this path.
00207     AkVector imageSource;
00208     
00209     /// Vertices of the indirect path.
00210     /// reflectionPoint[0] is closest to the emitter, reflectionPoint[numReflections-1] is closest to the listener.
00211     AkVector reflectionPoint[AK_MAX_REFLECT_ORDER];
00212 
00213     /// The triangles that were hit in the path. The vertices in \c reflectionPoint[] correspond to points on these triangles.
00214     /// triangles[0] is closest to the emitter, triangles[numReflections-1] is closest to the listener.
00215     AkTriangle triangles[AK_MAX_REFLECT_ORDER];
00216 
00217     /// Number of reflections and valid elements in the \c reflectionPoint[] and \c triangles[] arrays.
00218     AkUInt32 numReflections;
00219 
00220     /// The point that was hit to cause the path to be occluded. Note that the spatial audio library must be recompiled with \c #define AK_DEBUG_OCCLUSION to enable generation of occluded paths.
00221     AkVector occlusionPoint;
00222 
00223     /// True if the sound path was occluded. Note that the spatial audio library must be recompiled with \c #define AK_DEBUG_OCCLUSION to enable generation of occluded paths.
00224     bool isOccluded;
00225 };
00226 
00227 /// Structure for retrieving information about the sound propagation paths that have been calculated via the rooms and portals API.  Useful for debug draw applications.
00228 struct AkPropagationPathInfo
00229 {
00230     /// Defines the maximum number of nodes that a user can retrieve information about.  Longer paths will be truncated. 
00231     static const AkUInt32 kMaxNodes = AK_MAX_SOUND_PROPAGATION_DEPTH;
00232 
00233     ///  Nodes in the path; they repreent vertices within the bounds of a portal's opening.  
00234     AkVector nodePoint[kMaxNodes];
00235 
00236     /// ID of the portal's that the path passes through.  portal[0] is the portal closest to the listener; portal[numNodes-1] is the portal closest to the emitter.
00237     AkPortalID portals[kMaxNodes];
00238 
00239     /// ID's of the rooms that the path passes through. There is always one more room than portal. room[0] is the listener's room; the emitters room is room[numNodes].
00240     AkRoomID rooms[kMaxNodes+1];
00241 
00242     /// Represents the number of valid nodes in nodePoint[] and the number of valid portals in portals[].  The number of rooms in rooms[] is numNodes+1. There is always one more room than portal.
00243     AkUInt32 numNodes;
00244 
00245     /// The sum of all straight line path segments, including the segment from the listener to nodePoint[0], between each subsequent nodePoint, and from nodePoint[numNodes-1] to the emitter.
00246     AkReal32 length;
00247     
00248     /// The cumulative gain (linear) of all portals traversed.  
00249     AkReal32 gain;
00250 
00251     /// The dry diffraction angle is measured in radians, and calculated from the maximum deviation from a straight line, of all angles at each nodePoint.  Can be thought of as how
00252     //  far into the 'shadow region' the sound has to 'bend' to reach the listener.  Valid range: 0 - PI radians.
00253     /// Depending on the spatial audio initialization settings, this value that is applied internally, by spatial audio, to the obstruction or built-in parameter of the emitter game object.
00254     /// \sa
00255     /// - \ref AkDiffractionFlags
00256     /// - \ref AkSpatialAudioInitSettings
00257     AkReal32 dryDiffractionAngle;
00258 
00259     /// The wet diffraction for the portal closest to the listener.  
00260     /// The wet diffraction angle is measured in radians and calculated from how far into the 'shadow region' the listener is from the closest portal.  Unlike dry diffraction, the 
00261     /// wet diffraction does not depend on the incident angle, but only the normal of the portal.  Valid range: 0 - PI radians.
00262     /// Depending on the spatial audio initialization settings, this value that is applied internally, by spatial audio, to the obstruction/built-in parameter of the room game object that is
00263     /// on the other side of the portal closest to the listener.
00264     /// \sa
00265     /// - \ref AkDiffractionFlags
00266     /// - \ref AkSpatialAudioInitSettings
00267     AkReal32 wetDiffractionAngle;
00268 };
00269 
00270 /// Parameters passed to \c SetPortal
00271 struct AkPortalParams
00272 {
00273     /// Constructor
00274     AkPortalParams() :
00275         bEnabled(false)
00276     {}
00277 
00278     /// Portal's position and orientation in the 3D world. 
00279     /// Position vector is the center of the opening.
00280     /// OrientationFront vector must be unit-length and point along the normal of the portal, and must be orthogonal to Up. It defines the local positive-Z dimension (depth/transition axis) of the portal, used by Extent. 
00281     /// OrientationTop vector must be unit-length and point along the top of the portal (tangent to the wall), must be orthogonal to Front. It defines the local positive-Y direction (height) of the portal, used by Extent.
00282     AkTransform                     Transform;
00283 
00284     /// Portal extent. Defines the dimensions of the portal relative to its center; all components must be positive numbers. The local X and Y dimensions (side and top) are used in diffraction calculations, 
00285     /// whereas the Z dimension (front) defines a depth value which is used to implement smooth transitions between rooms. It is recommended that users experiment with different portal depths to find a value 
00286     /// that results in appropriately smooth transitions between rooms.
00287     AkVector                        Extent;
00288 
00289     /// Whether or not the portal is active/enabled. For example, this parameter may be used to simulate open/closed doors.
00290     /// Portal diffraction is simulated when at least one portal exists and is active between an emitter and the listener. Otherwise, transmission is simulated. 
00291     /// Diffraction uses obstruction or the diffraction built-in game parameter, while transmission uses occlusion.
00292     bool                            bEnabled;
00293 
00294     /// Name used to identify portal (optional).
00295     AK::SpatialAudio::OsString      strName;
00296 
00297     /// ID of the room to which the portal connects, in the direction of the Front vector.  If a room with this ID has not been added via AK::SpatialAudio::SetRoom,
00298     /// a room will be created with this ID and with default AkRoomParams.  If you would later like to update the AkRoomParams, simply call AK::SpatialAudio::SetRoom again with this same ID.
00299     /// - \ref AK::SpatialAudio::SetRoom
00300     /// - \ref AK::SpatialAudio::RemoveRoom
00301     /// - \ref AkRoomParams
00302     AkRoomID FrontRoom;
00303 
00304     /// ID of the room to which the portal connects, in the direction opposite to the Front vector. If a room with this ID has not been added via AK::SpatialAudio::SetRoom,
00305     /// a room will be created with this ID and with default AkRoomParams.  If you would later like to update the AkRoomParams, simply call AK::SpatialAudio::SetRoom again with this same ID.
00306     /// - \ref AK::SpatialAudio::SetRoom
00307     /// - \ref AK::SpatialAudio::RemoveRoom
00308     /// - \ref AkRoomParams
00309     AkRoomID BackRoom;
00310 };
00311 
00312 /// Parameters passed to \c SetRoom
00313 struct AkRoomParams
00314 {
00315     /// Constructor
00316     AkRoomParams() :  ReverbAuxBus(AK_INVALID_AUX_ID)
00317                     , ReverbLevel(1.f)
00318                     , WallOcclusion(1.f)
00319                     , RoomGameObj_AuxSendLevelToSelf(0.f)
00320                     , RoomGameObj_KeepRegistered(false)
00321                     
00322     {
00323         Up.X = 0.f;
00324         Up.Y = 1.f;
00325         Up.Z = 0.f;
00326         Front.X = 0.f;
00327         Front.Y = 0.f;
00328         Front.Z = 1.f;
00329     }
00330 
00331     /// Room Orientation. Up and Front must be orthonormal.
00332     /// Room orientation has an effect when the associated aux bus (see ReverbAuxBus) is set with 3D positioning in Wwise, as 3D positioning implements relative rotation of the emitter (room) and listener.
00333     AkVector                        Up;
00334     AkVector                        Front;
00335 
00336     /// The reverb aux bus that is associated with this room.  
00337     /// When Spatial Audio is told that a game object is in a particular room via SetGameObjectInRoom, a send to this aux bus will be created to model the reverb of the room.
00338     /// Using a combination of Rooms and Portals, Spatial Audio manages which game object the aux bus is spawned on, and what control gain is sent to the bus.  
00339     /// When a game object is inside a connected portal, as defined by the portal's orientation and extent vectors, both this aux send and the aux send of the adjacent room are active.
00340     /// Spatial audio modulates the control value for each send based on the game object's position, in relation to the portal's z-azis and extent, to crossfade the reverb between the two rooms.
00341     /// If more advanced control of reverb is desired, SetEmitterAuxSendValues can be used to add additional sends on to a game object.
00342     /// - \ref AK::SpatialAudio::SetGameObjectInRoom
00343     /// - \ref AK::SpatialAudio::SetEmitterAuxSendValues
00344     AkAuxBusID                      ReverbAuxBus;
00345 
00346     /// The reverb control value for the send to ReverbAuxBus. Valid range: (0.f-1.f)
00347     /// Can be used to implement multiple rooms that share the same aux bus, but have different reverb levels.
00348     AkReal32                        ReverbLevel;
00349 
00350     /// Occlusion level to set when modeling transmission through walls.  Transmission is modeled only when no paths to the listener are found, meaning that there are no active portals between the listener's
00351     /// room and the emitter's room. Valid range: (0.f-1.f)
00352     AkReal32                        WallOcclusion;
00353 
00354     /// Unused
00355     AkInt32                         Priority;
00356 
00357     /// Name used to identify room (optional)
00358     AK::SpatialAudio::OsString      strName;
00359 
00360     /// Send level for sounds that are posted on the room game object; adds reverb to ambience and room tones. Valid range: (0.f-1.f).  Set to a value greater than 0 to have spatial audio create a send on the room game object, 
00361     /// where the room game object itself is specified as the listener and ReverbAuxBus is specified as the aux bus. A value of 0 disables the aux send. This should not be confused with ReverbLevel, which is the send level 
00362     /// for spatial audio emitters sending to the room game object.
00363     /// \aknote The room game object can be accessed though the ID that is passed to \c SetRoom() and the \c AkRoomID::AsGameObjectID() method.  Posting an event on the room game object leverages automatic room game object placement 
00364     /// by spatial audio so that when the listener is inside the room, the sound comes from all around the listener, and when the listener is outside the room, the sound comes from the portal(s). Typically, this would be used for
00365     /// surround ambiance beds or room tones. Point source sounds should use separate game objects that are registered as spatial audio emitters.
00366     /// \sa
00367     /// - \ref AkRoomParams::RoomGameObj_KeepRegistered
00368     /// - \ref AkRoomID
00369     AkReal32                        RoomGameObj_AuxSendLevelToSelf;
00370 
00371     /// If set to true, the room game object will be registered on calling \c SetRoom(), and not released untill the room is deleted or removed with \c RemoveRoom(). If set to false, spatial audio will register
00372     /// the room object only when it is needed by the sound propagation system for the purposes of reverb, and will unregister the game object when all reverb tails have finished.
00373     /// If the game intends to post events on the room game object for the purpose of ambiance or room tones, RoomGameObj_KeepRegistered should be set to true.
00374     /// \aknote The room game object can be accessed though the ID that is passed to \c SetRoom() and the \c AkRoomID::AsGameObjectID() method.  Posting an event on the room game object leverages automatic room game object placement 
00375     /// by spatial audio so that when the listener is inside the room, the sound comes from all around the listener, and when the listener is outside the room, the sound comes from the portal(s). Typically, this would be used for
00376     /// surround ambiance beds or room tones. Point source sounds should use separate game objects that are registered as spatial audio emitters.
00377     /// \sa
00378     /// - \ref AkRoomParams::RoomGameObj_AuxSendLevelToSelf
00379     /// - \ref AkRoomID
00380     bool                            RoomGameObj_KeepRegistered;
00381 
00382 
00383 };
00384 
00385 /// Audiokinetic namespace
00386 namespace AK
00387 {
00388     /// Audiokinetic spatial audio namespace
00389     namespace SpatialAudio
00390     {
00391         ////////////////////////////////////////////////////////////////////////
00392         /// @name Basic functions. 
00393         /// In order to use SpatialAudio, you need to initalize it using Init, and register all emitters and listeners that you plan on using with any of the services offered by SpatialAudio, using 
00394         /// RegisterEmitter and RegisterListener respectively, _after_ having registered their corresponding game object to the sound engine. The position of these objects and game-defined sends should be updated with 
00395         /// SetPosition and SetEmitterAuxSendValues instead of their AK::SoundEngine counterparts.
00396         ///\akwarning At the moment, there can be only one Spatial Audio listener registered at any given time.
00397         //@{
00398 
00399         /// Access the internal pool ID passed to Init.
00400         AK_EXTERNAPIFUNC(AkMemPoolId, GetPoolID)();
00401     
00402         /// Initialize the SpatialAudio API.  
00403         AK_EXTERNAPIFUNC(AKRESULT, Init)(const AkSpatialAudioInitSettings& in_initSettings);
00404         
00405         /// Register a game object as a sound emitter in the SpatialAudio API or update settings on a previously registered sound emitter. The game object must have already been 
00406         /// registered in the sound engine via \c AK::SoundEngine::RegisterGameObj().  
00407         /// \sa 
00408         /// - \ref AkEmitterSettings
00409         AK_EXTERNAPIFUNC(AKRESULT, RegisterEmitter)(
00410             AkGameObjectID in_gameObjectID,             ///< Game object ID
00411             const AkEmitterSettings& in_settings        ///< Settings for the spatial audio emitter.
00412         );
00413 
00414         /// Unregister a game object as a sound emitter in the SpatialAudio API; clean up Spatial Audio listener data associated with in_gameObjectID.  
00415         /// This function is optional - emitters are automatically unregistered when their game object is deleted in the sound engine.
00416         /// \sa 
00417         /// - \ref AK::SpatialAudio::RegisterEmitter
00418         AK_EXTERNAPIFUNC(AKRESULT, UnregisterEmitter)(
00419             AkGameObjectID in_gameObjectID              ///< Game object ID
00420         );
00421 
00422         /// Assign a game object as the Spatial Audio listener.  There can be only one Spatial Audio listener registered at any given time; in_gameObjectID will replace any previously set Spatial Audio listener.
00423         /// The game object passed in must be registered by the client, at some point, for sound to be heard.  It is not necessary to be registered at the time of calling this function.
00424         /// If not listener is explicitly registered to spatial audio, then a default listener (set via \c AK::SoundEngine::SetDefaultListeners()) is selected.  If the are no default listeners, or there are more than one
00425         /// default listeners, then it is necessary to call RegisterListener() to specify which listener to use with Spatial Audio.
00426         AK_EXTERNAPIFUNC(AKRESULT, RegisterListener)(
00427             AkGameObjectID in_gameObjectID              ///< Game object ID
00428             );
00429 
00430         /// Unregister a game object as a listener in the SpatialAudio API; clean up Spatial Audio listener data associated with in_gameObjectID.  
00431         /// If in_gameObjectID is the current registered listener, calling this function will clear the Spatial Audio listener and
00432         /// Spatial Audio features will be disabled until another listener is registered.
00433         /// This function is optional - listener are automatically unregistered when their game object is deleted in the sound engine.
00434         /// \sa 
00435         /// - \ref AK::SpatialAudio::RegisterListener
00436         AK_EXTERNAPIFUNC(AKRESULT, UnregisterListener)(
00437             AkGameObjectID in_gameObjectID              ///< Game object ID
00438             );
00439 
00440         /// Set the position of an emitter game object that has been registered with the SpatialAudio API.  
00441         /// This function should be called instead of \c AK::SoundEngine::SetPosition(). The argument \c in_sourcePosition should represent the real position of the emitter. It is this position that is used 
00442         /// for all spatial audio services, such as Rooms and GeometrySets (see SpatialAudio::SetRoom and SpatialAudio::SetGeometry).
00443         /// When an emitter is in a different room from the listener, its virtual positions are automatically calculated based on the relative positions of the listener and nearby portals, and it is these virtual positions
00444         /// that are passed to the sound engine and used to render audio.
00445         /// If the game object is registered with the sound engine, but not with the SpatialAudio API, then the call will be passed on to AK::SoundEngine::SetPosition().
00446         AK_EXTERNAPIFUNC(AKRESULT, SetPosition)(
00447             AkGameObjectID in_gameObjectID,         ///< Game object ID of the sound emitter.
00448             const AkTransform& in_sourcePosition    ///< Physical position of the emitter in the simulation.
00449             );
00450 
00451         /// Set the aux send values for an emitter game object that has been registered with the SpatialAudio API.  
00452         /// This function should be called instead of \c AK::SoundEngine::SetGameObjectAuxSendValues() because the spatial audio API adds additional sends for room's late reverb and
00453         //  for early reflection processing.
00454         /// If the game object is registered with the sound engine, but not with the SpatialAudio API, then the call will be passed on to \c AK::SoundEngine::SetGameObjectAuxSendValues().
00455         /// \sa 
00456         /// - \ref AK::SoundEngine::SetGameObjectAuxSendValues
00457         AK_EXTERNAPIFUNC(AKRESULT, SetEmitterAuxSendValues)(
00458             AkGameObjectID in_gameObjectID, ///< Game object ID of the sound emitter.
00459             AkAuxSendValue* in_pAuxSends,   ///< Aux send values
00460             AkUInt32 in_uNumAux             ///< Number of elements in in_pAuxSends
00461             );
00462 
00463         //@}
00464 
00465         ////////////////////////////////////////////////////////////////////////
00466         /// @name Helper functions for passing game data to the Wwise Reflect plug-in. 
00467         /// Use this API for detailed placement of reflection image sources.
00468         /// \aknote These functions are low-level and useful when your game engine already implements a geometrical approach to sound propagation such as an image-source or a ray tracing algorithm.
00469         /// Functions of Geometry are preferred and easier to use with the Wwise Reflect plug-in. \endaknote
00470         //@{
00471 
00472         /// Add or update an individual image source for processing via the AkReflect plug-in.  Use this API for detailed placement of
00473         /// reflection image sources, whose positions have been determined by the client, such as from the results of a ray cast, computation or by manual placement.  One possible
00474         /// use case is generating reflections that originate far enough away that they can be modeled as a static point source, for example, off of a distant mountain.
00475         /// The SpatialAudio API manages image sources added via SetImageSource() and sends them to the AkReflect plug-in that is on the aux bus with ID \c in_AuxBusID. 
00476         /// The image source will apply to all registered spatial audio emitters, if \c AK_INVALID_GAME_OBJECT is passed for \c in_gameObjectID, 
00477         /// or to one particular game object, if \c in_gameObjectID contains the ID of a valid registered spatial audio emitter. 
00478         /// SetImageSource takes a room ID to indicate which room the reflection is logically part of, even though the position of the image source may be outside of the extents of the room.  
00479         /// This ID is used as a filter, so that it is not possible to hear reflections for rooms that the emitter is not inside.  To use this feature, the emitter and listeners rooms must be
00480         /// specified using SetGameObjectInRoom.  If you are not using the rooms and portals API, or the image source is not associated with a room, pass a default-constructed room ID.
00481         /// \aknote The \c AkImageSourceSettings struct passed in \c in_info must contain a unique image source ID to be able to identify this image source across frames and when updating and/or removing it later.  
00482         /// Each instance of AkReflect has its own set of data, so you may reuse ID, if desired, as long as \c in_gameObjectID and \c in_AuxBusID are different.
00483         /// If you are using the geometric reflections API on the same aux bus (as set in \c AkEmitterSettings) and game object(s), there is a small chance of ID conflict, because IDs for 
00484         /// geometric reflections' image sources are generated internally using a hash function. If a conflict does occur, you will only hear one of the two reflections. \endaknote
00485         /// \aknote For proper operation with AkReflect and the SpatialAudio API, any aux bus using AkReflect should have 'Enable Positioning' checked and the positioning type should be set to 2D in the Wwise authoring tool. See the Wwise Reflect documentation for more details. \endaknote
00486         /// \sa 
00487         /// - \ref AK::SpatialAudio::RegisterEmitter
00488         /// - \ref AK::SpatialAudio::RemoveImageSource
00489         /// - \ref AK::SpatialAudio::SetGameObjectInRoom
00490         AK_EXTERNAPIFUNC(AKRESULT, SetImageSource)(
00491             AkImageSourceID in_srcID,                               ///< The ID of the image source being added.
00492             const AkImageSourceSettings& in_info,                   ///< Image source information.
00493             AkUniqueID in_AuxBusID,                                 ///< Aux bus that has the AkReflect plug in for early reflection DSP.
00494             AkRoomID in_roomID,                                     ///< The ID of the room that the image source is logically a part of; pass a default-constructed ID if not in, or not using, a room.
00495             AkGameObjectID in_gameObjectID = AK_INVALID_GAME_OBJECT ///< The ID of the emitter game object to which the image source applies. Pass AK_INVALID_GAME_OBJECT to apply to all emitter game objects.
00496         );
00497 
00498         /// Remove an individual reflection image source that was previously added via \c SetImageSource.
00499         /// \sa 
00500         /// - \ref AK::SpatialAudio::SetImageSource
00501         AK_EXTERNAPIFUNC(AKRESULT, RemoveImageSource)(
00502             AkImageSourceID in_srcID,                                   ///< The ID of the image source to remove.
00503             AkUniqueID in_AuxBusID,                                     ///< Aux bus that was passed to SetImageSource.
00504             AkGameObjectID in_gameObjectID = AK_INVALID_GAME_OBJECT     ///< Game object ID that was passed to SetImageSource.
00505         );
00506 
00507         //@}
00508 
00509         ////////////////////////////////////////////////////////////////////////
00510         /// @name Geometry 
00511         /// Geometry API for early reflection processing using Wwise Reflect.
00512         //@{
00513 
00514         /// Add or update a set of geometry from the \c SpatialAudio module for geometric reflection processing. A geometry set is a logical set of triangles, formed by any criteria that suits the client,
00515         /// which will be referenced by the same ID. The ID (\c in_GeomSetID) must be unique and is also chosen by the client in a manner similar to \c AkGameObjectID's. 
00516         /// The data pointed to by \c in_pTriangles will be copied internally and may be released after this function returns.
00517         /// \sa 
00518         /// - \ref AkTriangle
00519         /// - \ref AK::SpatialAudio::RemoveGeometry
00520         AK_EXTERNAPIFUNC(AKRESULT, SetGeometry)(
00521             AkGeometrySetID in_GeomSetID,   ///< Unique geometry set ID, chosen by client.
00522             AkTriangle* in_pTriangles,      ///< Pointer to an array of AkTriangle structures.
00523             AkUInt32 in_uNumTriangles       ///< Number of triangles in in_pTriangles.
00524         );
00525         
00526         /// Remove a set of geometry to the SpatialAudio API.
00527         /// \sa 
00528         /// - \ref AK::SpatialAudio::SetGeometry
00529         AK_EXTERNAPIFUNC(AKRESULT, RemoveGeometry)(
00530             AkGeometrySetID in_SetID        ///< ID of geometry set to be removed.
00531         );
00532 
00533         /// Query information about the indirect paths that have been calculated via geometric reflection processing in the SpatialAudio API. This function can be used for debugging purposes.
00534         /// This function must acquire the global sound engine lock and therefore, may block waiting for the lock.
00535         /// \sa
00536         /// - \ref AkSoundPathInfo
00537         AK_EXTERNAPIFUNC(AKRESULT, QueryIndirectPaths)(
00538             AkGameObjectID in_gameObjectID, ///< The ID of the game object that the client wishes to query.
00539             AkVector& out_listenerPos,      ///< Returns the position of the listener game object that is associated with the game object \c in_gameObjectID.
00540             AkVector& out_emitterPos,       ///< Returns the position of the emitter game object \c in_gameObjectID.
00541             AkSoundPathInfo* out_aPaths,    ///< Pointer to an array of \c AkSoundPathInfo's which will be filled after returning.
00542             AkUInt32& io_uArraySize         ///< The number of slots in \c out_aPaths, after returning the number of valid elements written.
00543             );
00544 
00545         //@}
00546 
00547         ////////////////////////////////////////////////////////////////////////
00548         /// @name Rooms and Portals
00549         /// Sound Propagation API using rooms and portals.
00550         //@{
00551 
00552         /// Add or update a room. Rooms are used to connect portals and define an orientation for oriented reverbs. This function may be called multiple times with the same ID to update the parameters of the room.
00553         /// The ID (\c in_RoomID) must be chosen in the same manner as \c AkGameObjectID's, as they are in the same ID-space. The spatial audio lib manages the 
00554         /// registration/unregistration of internal game objects for rooms that use these IDs and, therefore, must not collide.
00555         /// \sa
00556         /// - \ref AkRoomID
00557         /// - \ref AkRoomParams
00558         /// - \ref AK::SpatialAudio::RemoveRoom
00559         AK_EXTERNAPIFUNC(AKRESULT, SetRoom)(
00560             AkRoomID in_RoomID,             ///< Unique room ID, chosen by the client.
00561             const AkRoomParams& in_Params   ///< Parameter for the room.
00562             );
00563 
00564         /// Remove a room.
00565         /// \sa
00566         /// - \ref AkRoomID
00567         /// - \ref AK::SpatialAudio::SetRoom
00568         AK_EXTERNAPIFUNC(AKRESULT, RemoveRoom)(
00569             AkRoomID in_RoomID  ///< Room ID that was passed to \c SetRoom.
00570             );
00571 
00572         /// Add or update an acoustic portal. A portal is an opening that connects two or more rooms to simulate the transmission of reverberated (indirect) sound between the rooms. 
00573         /// This function may be called multiple times with the same ID to update the parameters of the portal. The ID (\c in_PortalID) must be chosen in the same manner as \c AkGameObjectID's, 
00574         /// as they are in the same ID-space. The spatial audio lib manages the registration/unregistration of internal game objects for portals that use these IDs, and therefore must not collide.
00575         /// \sa
00576         /// - \ref AkPortalID
00577         /// - \ref AkPortalParams
00578         /// - \ref AK::SpatialAudio::RemovePortal
00579         AK_EXTERNAPIFUNC(AKRESULT, SetPortal)(
00580             AkPortalID in_PortalID,     ///< Unique portal ID, chosen by the client.
00581             const AkPortalParams& in_Params ///< Parameter for the portal.
00582             );
00583 
00584         /// Remove a portal.
00585         /// \sa
00586         /// - \ref AkPortalID
00587         /// - \ref AK::SpatialAudio::SetPortal
00588         AK_EXTERNAPIFUNC(AKRESULT, RemovePortal)(
00589             AkPortalID in_PortalID      ///< ID of portal to be removed, which was originally passed to SetPortal.
00590             );
00591 
00592         /// Set the room that the game object is currently located in - usually the result of a containment test performed by the client. The room must have been registered with \c SetRoom.
00593         /// Setting the room for a game object provides the basis for the sound propagation service, and also sets which room's reverb aux bus to send to.  The sound propagation service traces the path
00594         /// of the sound from the emitter to the listener, and calculates the diffraction as the sound passes through each portal.  The portals are used to define the spatial location of the diffracted and reverberated
00595         /// audio.
00596         /// \sa 
00597         /// - \ref AK::SpatialAudio::SetRoom
00598         /// - \ref AK::SpatialAudio::RemoveRoom
00599         AK_EXTERNAPIFUNC(AKRESULT, SetGameObjectInRoom)(
00600             AkGameObjectID in_gameObjectID, ///< Game object ID 
00601             AkRoomID in_CurrentRoomID       ///< RoomID that was passed to \c AK::SpatialAudio::SetRoom
00602             );
00603 
00604         /// Set the obstruction value of an emitter game object that has been registered with the SpatialAudio API.  
00605         /// This function should be called instead of \c AK::SoundEngine::SetObjectObstructionAndOcclusion(), and can be used for setting the obstruction value on a Spatial Audio emitter.
00606         /// SetEmitterObstruction() should be used to simulate obstructing objects between the emitter and the listener, if they are in the same room, or between the emitter and a portal, if the emitter
00607         /// and listener are in different room.  
00608         /// If the listener and the emitter are in different rooms, the maximum of the value passed into SetEmitterObstruction() and the the obstruction value calculated from the diffraction angle is passed to the sound engine.
00609         /// If the game object is not registered as an emitter with Spatial Audio, then an error will be reported, and the call will have no effect.
00610         /// \aknote The game is responsible to differentiate between obstruction between the emitter and the portal (where \c AK::SoundEngine::SetEmitterObstruction() should be used), and occlusion from room boundaries, 
00611         /// which is better handled by the spatial audio diffraction system.  For example, games that use ray-testing for obstruction may report 100 % obstruction when an object is very close to the the opening of a portal, 
00612         /// because the ray between the emitter and the listener hits a nearby wall. If the game then sends 100 %, this will erroneously override the diffraction angle calculation which is probably much less than 180 degrees, 
00613         /// and better matches the expected audibility of the sound. To prevent this scenario, games can ray-test for obstruction objects between the emitter and the portal, passing the results with \c AK::SoundEngine::SetEmitterObstruction(), 
00614         /// and then test for obstructing objects between the portal and the listener, passing the results with \c AK::SoundEngine::SetPortalObstruction().
00615         /// \sa 
00616         /// - \ref AK::SpatialAudio::SetPortalObstruction
00617         AK_EXTERNAPIFUNC(AKRESULT, SetEmitterObstruction)(
00618             AkGameObjectID in_gameObjectID,         ///< Game object ID of the sound emitter.
00619             AkReal32 in_fObstruction                ///< Obstruction value.  Valid range 0.f-1.f
00620             );
00621 
00622         /// Set the obstruction value for a portal that has been registered with Spatial Audio.
00623         /// Portal obstruction is used to simulate objects between the portal and the listener that are obstructing the sound coming from the portal.  The obstruction value should relate to how much of the opening
00624         /// is obstructed, and must be calculated by the client.  Only portals connecting directly to the listeners current room need to have their obstruction value updated. If the listener moves to a new room, 
00625         /// the new set of portals must be updated.
00626         AK_EXTERNAPIFUNC(AKRESULT, SetPortalObstruction)(
00627             AkPortalID in_PortalID,                 ///< Portal ID.
00628             AkReal32 in_fObstruction                ///< Obstruction value.  Valid range 0.f-1.f
00629             );
00630 
00631         /// Query information about the sound propagation state for a particular listener and emitter, which has been calculated using the data provided via the rooms and portals API. This function can be used for debugging purposes.
00632         /// This function must acquire the global sound engine lock and therefore, may block waiting for the lock.
00633         /// \sa
00634         /// - \ref AkPropagationPathInfo
00635         AK_EXTERNAPIFUNC(AKRESULT, QuerySoundPropagationPaths)(
00636             AkGameObjectID in_gameObjectID,     ///< The ID of the game object that the client wishes to query.
00637             AkVector& out_listenerPos,          ///< Returns the position of the listener game object that is associated with the game object \c in_gameObjectID.
00638             AkVector& out_emitterPos,           ///< Returns the position of the emitter game object \c in_gameObjectID.
00639             AkPropagationPathInfo* out_aPaths,  ///< Pointer to an array of \c AkPropagationPathInfo's which will be filled after returning.
00640             AkUInt32& io_uArraySize             ///< The number of slots in \c out_aPaths, after returning the number of valid elements written.
00641         );
00642 
00643         //@}
00644     }
00645 };

Was this page helpful?

Need Support?

Questions? Problems? Need more info? Contact us, and we can help!

Visit our Support page

Tell us about your project. We're here to help.

Register your project and we'll help you get started with no strings attached!

Get started with Wwise