feat: Apply the fade-in trick to the beginning of the stream.

This commit is contained in:
Terry Geng 2020-07-07 21:42:24 +08:00
parent e981782dd7
commit 892fa502e6
No known key found for this signature in database
GPG Key ID: F982F8EA1DF720E7

View File

@ -486,12 +486,15 @@ class MumbleBot:
# Adjust the volume and send it to mumble # Adjust the volume and send it to mumble
self.volume_cycle() self.volume_cycle()
if not self.on_interrupting: if not self.on_interrupting and self.read_pcm_size > 0:
self.mumble.sound_output.add_sound( self.mumble.sound_output.add_sound(
audioop.mul(raw_music, 2, self.volume_helper.real_volume)) audioop.mul(raw_music, 2, self.volume_helper.real_volume))
elif self.read_pcm_size == 0:
self.mumble.sound_output.add_sound(
audioop.mul(self._fadeout(raw_music, self.stereo, fadein=True), 2, self.volume_helper.real_volume))
else: else:
self.mumble.sound_output.add_sound( self.mumble.sound_output.add_sound(
audioop.mul(self._fadeout(raw_music, self.stereo), 2, self.volume_helper.real_volume)) audioop.mul(self._fadeout(raw_music, self.stereo, fadein=False), 2, self.volume_helper.real_volume))
self.thread.kill() self.thread.kill()
time.sleep(0.1) time.sleep(0.1)
self.on_interrupting = False self.on_interrupting = False
@ -599,10 +602,14 @@ class MumbleBot:
self.on_ducking = True self.on_ducking = True
self.ducking_release = time.time() + 1 # ducking release after 1s self.ducking_release = time.time() + 1 # ducking release after 1s
def _fadeout(self, _pcm_data, stereo=False): def _fadeout(self, _pcm_data, stereo=False, fadein=False):
pcm_data = bytearray(_pcm_data) pcm_data = bytearray(_pcm_data)
if stereo: if stereo:
mask = [math.exp(-x/60) for x in range(0, int(len(pcm_data) / 4))] if not fadein:
mask = [math.exp(-x/60) for x in range(0, int(len(pcm_data) / 4))]
else:
mask = [math.exp(-x / 60) for x in reversed(range(0, int(len(pcm_data) / 4)))]
for i in range(int(len(pcm_data) / 4)): for i in range(int(len(pcm_data) / 4)):
pcm_data[4 * i:4 * i + 2] = struct.pack("<h", pcm_data[4 * i:4 * i + 2] = struct.pack("<h",
round(struct.unpack("<h", pcm_data[4 * i:4 * i + 2])[0] * mask[i])) round(struct.unpack("<h", pcm_data[4 * i:4 * i + 2])[0] * mask[i]))