40 lines
991 B
Python
40 lines
991 B
Python
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)
|