|
|
@ -50,6 +50,7 @@ import subprocess |
|
|
|
import shlex |
|
|
|
import functools |
|
|
|
import datetime |
|
|
|
import audioop |
|
|
|
import nacl.secret |
|
|
|
|
|
|
|
log = logging.getLogger(__name__) |
|
|
@ -70,6 +71,7 @@ class StreamPlayer(threading.Thread): |
|
|
|
self._connected = connected |
|
|
|
self.after = after |
|
|
|
self.delay = encoder.frame_length / 1000.0 |
|
|
|
self._volume = 1.0 |
|
|
|
|
|
|
|
def run(self): |
|
|
|
self.loops = 0 |
|
|
@ -86,6 +88,10 @@ class StreamPlayer(threading.Thread): |
|
|
|
|
|
|
|
self.loops += 1 |
|
|
|
data = self.buff.read(self.frame_size) |
|
|
|
|
|
|
|
if self._volume != 1.0: |
|
|
|
data = audioop.mul(data, 2, min(self._volume, 2.0)) |
|
|
|
|
|
|
|
if len(data) != self.frame_size: |
|
|
|
self.stop() |
|
|
|
break |
|
|
@ -103,6 +109,14 @@ class StreamPlayer(threading.Thread): |
|
|
|
except: |
|
|
|
pass |
|
|
|
|
|
|
|
@property |
|
|
|
def volume(self): |
|
|
|
return self._volume |
|
|
|
|
|
|
|
@volume.setter |
|
|
|
def volume(self, value): |
|
|
|
self._volume = max(value, 0.0) |
|
|
|
|
|
|
|
def pause(self): |
|
|
|
self._resumed.clear() |
|
|
|
|
|
|
@ -550,6 +564,10 @@ class VoiceClient: |
|
|
|
+---------------------+-----------------------------------------------------+ |
|
|
|
| player.resume() | Resumes the audio stream. | |
|
|
|
+---------------------+-----------------------------------------------------+ |
|
|
|
| player.volume | Allows you to set the volume of the stream. 1.0 is | |
|
|
|
| | equivalent to 100% and 0.0 is equal to 0%. The | |
|
|
|
| | maximum the volume can be set to is 2.0 for 200%. | |
|
|
|
+---------------------+-----------------------------------------------------+ |
|
|
|
|
|
|
|
The stream must have the same sampling rate as the encoder and the same |
|
|
|
number of channels. The defaults are 48000 Hz and 2 channels. You |
|
|
|