Update torchlight_changes_unloze/torchlight3/Torchlight/AudioManager.py

This commit is contained in:
Metroid_Skittles 2026-02-07 07:43:40 +01:00
parent e607ff3e0f
commit ff3dff14a6

View File

@ -6,6 +6,24 @@ import math
import time
from .FFmpegAudioPlayer import FFmpegAudioPlayerFactory
def _progress_delta(old_position, new_position, elapsed = None, jitter = 0.25):
try:
delta = abs(float(new_position) - float(old_position))
except (TypeError, ValueError):
return 0.0
if not math.isfinite(delta):
return 0.0
if elapsed is not None:
try:
elapsed = float(elapsed)
except (TypeError, ValueError):
return 0.0
if not math.isfinite(elapsed) or elapsed < 0.0:
return 0.0
delta = min(delta, elapsed + jitter)
return delta
class AudioPlayerFactory():
AUDIOPLAYER_FFMPEG = 1
@ -33,7 +51,6 @@ class AntiSpam():
self.LastClips = dict()
self.DisabledTime = None
self.SaidHint = False
def CheckAntiSpam(self, player):
if self.DisabledTime and self.DisabledTime > self.Torchlight().Master.Loop.time() and \
@ -75,7 +92,7 @@ class AntiSpam():
def OnPlay(self, clip):
Now = self.Torchlight().Master.Loop.time()
self.LastClips[clip] = dict({"timestamp": Now, "duration": 0.0, "dominant": False, "active": True})
self.LastClips[clip] = dict({"timestamp": Now, "duration": 0.0, "dominant": False, "active": True, "last_update_realtime": time.time()})
HasDominant = False
for Key, Clip in self.LastClips.items():
@ -100,7 +117,6 @@ class AntiSpam():
self.LastClips[clip]["dominant"] = False
def OnUpdate(self, clip, old_position, new_position):
Delta = abs(new_position - old_position)
if clip not in self.LastClips:
if self.Logger.isEnabledFor(logging.DEBUG):
self.Logger.debug(
@ -110,6 +126,12 @@ class AntiSpam():
)
return
Clip = self.LastClips[clip]
now = time.time()
elapsed = None
if Clip.get("last_update_realtime") is not None:
elapsed = now - Clip["last_update_realtime"]
Clip["last_update_realtime"] = now
Delta = _progress_delta(old_position, new_position, elapsed = elapsed)
if Delta <= 0.0 or not Clip["dominant"]:
return
@ -151,7 +173,7 @@ class Advertiser():
def OnPlay(self, clip):
Now = self.Torchlight().Master.Loop.time()
self.LastClips[clip] = dict({"timestamp": Now, "duration": 0.0, "dominant": False, "active": True, "hinted": False})
self.LastClips[clip] = dict({"timestamp": Now, "duration": 0.0, "dominant": False, "active": True, "hinted": False, "last_update_realtime": time.time()})
HasDominant = False
for Key, Clip in self.LastClips.items():
@ -176,10 +198,15 @@ class Advertiser():
self.LastClips[clip]["dominant"] = False
def OnUpdate(self, clip, old_position, new_position):
Delta = abs(new_position - old_position)
if clip not in self.LastClips:
return
Clip = self.LastClips[clip]
now = time.time()
elapsed = None
if Clip.get("last_update_realtime") is not None:
elapsed = now - Clip["last_update_realtime"]
Clip["last_update_realtime"] = now
Delta = _progress_delta(old_position, new_position, elapsed = elapsed)
if Delta <= 0.0 or not Clip["dominant"]:
return
@ -270,7 +297,12 @@ class AudioManager():
if not self.CheckLimits(player):
return None
Clip = AudioClip(self, player, uri, _type)
try:
Clip = AudioClip(self, player, uri, _type)
except ValueError as ex:
self.Logger.warning("Rejected unsupported audio player type %r: %s", _type, ex)
self.Torchlight().SayPrivate(player, "Unsupported audio player type.")
return None
self.AudioClips.append(Clip)
if not player.Access or player.Access["level"] < self.Torchlight().Config["AntiSpam"]["ImmunityLevel"]:
@ -302,6 +334,7 @@ class AudioClip():
self.Type = _type
self.URI = uri
self.LastPosition = None
self.LastUpdateRealtime = None
self.StartedAt = None
self.StopHinted = False
self.Stops = set()
@ -332,6 +365,7 @@ class AudioClip():
self.Player.Storage["Audio"]["LastUse"] = self.Torchlight().Master.Loop.time()
self.Player.Storage["Audio"]["LastUseLength"] = 0.0
self.StartedAt = self.Player.Storage["Audio"]["LastUse"]
self.LastUpdateRealtime = time.time()
self.StopHinted = False
def OnStop(self):
@ -340,9 +374,7 @@ class AudioClip():
self.Master.AudioClips.remove(self)
played = None
if self.LastPosition is not None:
played = self.LastPosition
elif self.AudioPlayer and self.AudioPlayer.StartedPlaying is not None:
if self.AudioPlayer and self.AudioPlayer.StartedPlaying is not None:
elapsed = time.time() - self.AudioPlayer.StartedPlaying
if self.AudioPlayer.Seconds:
elapsed = min(elapsed, self.AudioPlayer.Seconds)
@ -367,7 +399,13 @@ class AudioClip():
del self.AudioPlayer
def OnUpdate(self, old_position, new_position):
Delta = abs(new_position - old_position)
now = time.time()
elapsed = None
if self.LastUpdateRealtime is not None:
elapsed = now - self.LastUpdateRealtime
self.LastUpdateRealtime = now
Delta = _progress_delta(old_position, new_position, elapsed = elapsed)
self.LastPosition = new_position
if Delta <= 0.0: