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