waapimanager.py (7802B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\audio2\waapimanager.py 2 try: 3 import audio2 4 except ImportError: 5 audio2 = None 6 7 class WaapiManager: 8 9 def __init__(self): 10 self._waapi_manager = None 11 self._is_connected = False 12 self._subscribed_attenuation_id = None 13 self._subscription_callback = None 14 15 @property 16 def isConnected(self): 17 return self._is_connected 18 19 def _getWaapiManagerInstance(self): 20 if not audio2: 21 return None 22 if not self._waapi_manager: 23 try: 24 self._waapi_manager = audio2.WaapiManager() 25 except AttributeError: 26 return None 27 28 return self._waapi_manager 29 30 def toggleConnection(self): 31 manager = self._getWaapiManagerInstance() 32 if not manager: 33 return False 34 try: 35 if self._is_connected: 36 self.unsubscribeFromMaxRadius() 37 manager.Disconnect() 38 self._is_connected = False 39 else: 40 success = manager.Connect('127.0.0.1', 8080) 41 is_connected = manager.IsConnected() 42 self._is_connected = success and is_connected 43 return self._is_connected 44 except Exception: 45 self._is_connected = False 46 return False 47 48 def loadSoundsForEvent(self, event_name): 49 manager = self._getWaapiManagerInstance() 50 if not manager or not self._is_connected: 51 return [] 52 event_variations = [event_name, 53 event_name.lower(), 54 event_name.upper(), 55 '\\Events\\{}'.format(event_name), 56 '\\Events\\Default Work Unit\\{}'.format(event_name)] 57 target_names = [] 58 target_ids = [] 59 for event_variant in event_variations: 60 try: 61 target_names = manager.GetEventReferencedTargetNames(event_variant) 62 target_ids = manager.GetEventReferencedTargetIds(event_variant) 63 if target_names: 64 break 65 except Exception: 66 continue 67 68 if target_names: 69 options = [ {'displayName': name, 70 'soundId': target_ids[i] if i < len(target_ids) else '', 71 'attenuations': []} for i, name in enumerate(target_names) ] 72 return options 73 return [] 74 75 def loadAttenuationsForSound(self, sound_id): 76 manager = self._getWaapiManagerInstance() 77 if not manager or not self._is_connected or not sound_id: 78 return [] 79 try: 80 attenuation_id = manager.GetSoundReferencedAttenuationId(sound_id) 81 attenuation_name = manager.GetSoundReferencedAttenuationName(sound_id) 82 if not attenuation_id: 83 return [] 84 try: 85 max_radius = manager.GetAttenuationMaxRadius(attenuation_id) 86 except Exception: 87 max_radius = 0.0 88 else: 89 if max_radius is None: 90 max_radius = 0.0 91 92 if not attenuation_name: 93 attenuation_name = manager.GetAttenuationName(attenuation_id) 94 volume_curve_data = None 95 distances = manager.GetAttenuationVolumeCurveDistances(attenuation_id) 96 volumes = manager.GetAttenuationVolumeCurveValues(attenuation_id) 97 shapes = manager.GetAttenuationVolumeCurveShapeInts(attenuation_id) 98 if distances and volumes and shapes: 99 volume_curve_data = {'distances': list(distances), 100 'volumes': list(volumes), 101 'shapes': list(shapes)} 102 return [{'displayName': attenuation_name or 'Attenuation ({})'.format(attenuation_id), 103 'name': attenuation_id, 104 'maxRadius': max_radius, 105 'volumeCurveData': volume_curve_data}] 106 except Exception: 107 return [] 108 109 def getMaxRadiusFromWwise(self, attenuation_id): 110 manager = self._getWaapiManagerInstance() 111 if not manager or not self._is_connected or not attenuation_id: 112 return 0.0 113 try: 114 max_radius = manager.GetAttenuationMaxRadius(attenuation_id) 115 if max_radius is None: 116 max_radius = 0.0 117 return max_radius 118 except Exception: 119 return 0.0 120 121 def updateMaxRadiusInWwise(self, attenuation_id, value): 122 manager = self._getWaapiManagerInstance() 123 if not manager or not self._is_connected or not attenuation_id: 124 return value 125 try: 126 success = manager.SetAttenuationMaxRadius(attenuation_id, value) 127 refreshed_radius = manager.GetAttenuationMaxRadius(attenuation_id) 128 if refreshed_radius is None: 129 refreshed_radius = 0.0 130 return refreshed_radius 131 except Exception: 132 return value 133 134 def updateVolumeCurveInWwise(self, attenuation_id, curve_data, max_radius): 135 manager = self._getWaapiManagerInstance() 136 if not manager or not self._is_connected or not attenuation_id or not curve_data: 137 return False 138 try: 139 distances = curve_data.get('distances', []) 140 volumes = curve_data.get('volumes', []) 141 shapes = curve_data.get('shapes', []) 142 if self._validateCurveData(distances, max_radius): 143 return False 144 success = manager.SetAttenuationVolumeCurve(attenuation_id, distances, volumes, shapes) 145 return success 146 except Exception: 147 return False 148 149 def _validateCurveData(self, distances, max_radius): 150 if not distances or max_radius <= 0: 151 return False 152 return any((distance > max_radius for distance in distances)) 153 154 def subscribeToMaxRadius(self, attenuation_id, callback): 155 manager = self._getWaapiManagerInstance() 156 if not manager or not self._is_connected or not attenuation_id: 157 return False 158 if self._subscribed_attenuation_id: 159 self.unsubscribeFromMaxRadius() 160 try: 161 self._subscription_callback = callback 162 success = manager.SubscribeToAttenuationMaxRadius(attenuation_id, self._onMaxRadiusChanged) 163 if success: 164 self._subscribed_attenuation_id = attenuation_id 165 return success 166 except Exception: 167 return False 168 169 def unsubscribeFromMaxRadius(self): 170 if not self._subscribed_attenuation_id: 171 return 172 manager = self._getWaapiManagerInstance() 173 if not manager: 174 return 175 try: 176 manager.UnsubscribeFromPropertyChanges(self._subscribed_attenuation_id) 177 finally: 178 self._subscribed_attenuation_id = None 179 self._subscription_callback = None 180 181 def _onMaxRadiusChanged(self, object_id, property_name): 182 if self._subscription_callback: 183 self._subscription_callback(object_id, property_name) 184 185 def createAttenuation(self, attenuation_name, parent_path): 186 manager = self._getWaapiManagerInstance() 187 if not manager or not self._is_connected: 188 return None 189 try: 190 attenuation_id = manager.CreateAttenuation(attenuation_name, parent_path) 191 if attenuation_id: 192 return attenuation_id 193 return None 194 except Exception: 195 return None 196 197 def setReference(self, object_id, reference_name, reference_id): 198 manager = self._getWaapiManagerInstance() 199 if not manager or not self._is_connected: 200 return False 201 try: 202 return manager.SetReference(object_id, reference_name, reference_id) 203 except Exception: 204 return False