NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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