diff --git a/torchlight_changes_unloze/torchlight3/Torchlight/AudioManager.py b/torchlight_changes_unloze/torchlight3/Torchlight/AudioManager.py index 6a94eb4..bfd2d86 100755 --- a/torchlight_changes_unloze/torchlight3/Torchlight/AudioManager.py +++ b/torchlight_changes_unloze/torchlight3/Torchlight/AudioManager.py @@ -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: