import audioop import disnake class TrackedAudioSource(disnake.AudioSource): def __init__(self, source): self._source = source self.read_count = 0 def read(self) -> bytes: data = self._source.read() if data: self.read_count += 1 return data def fast_forward(self, seconds: int): for _ in range(int(seconds / 0.02)): self.read() @property def progress(self) -> float: return self.read_count * 0.02 class PCMVolumeTransformer(disnake.AudioSource): def __init__(self, original: TrackedAudioSource, volume: float = 1.0) -> None: if original.is_opus(): raise disnake.ClientException("AudioSource must not be Opus encoded") self.original = original self.volume = volume def cleanup(self) -> None: self.original.cleanup() def read(self) -> bytes: ret = self.original.read() return audioop.mul(ret, 2, self.volume)