commit
7237c6f562
22
command.py
22
command.py
@ -594,12 +594,12 @@ def cmd_volume(bot, user, text, command, parameter):
|
||||
|
||||
# The volume is a percentage
|
||||
if parameter and parameter.isdigit() and 0 <= int(parameter) <= 100:
|
||||
bot.volume_set = float(float(parameter) / 100)
|
||||
bot.send_msg(constants.strings('change_volume', volume=int(bot.volume_set * 100), user=bot.mumble.users[text.actor]['name']), text)
|
||||
var.db.set('bot', 'volume', str(bot.volume_set))
|
||||
log.info(f'cmd: volume set to {bot.volume_set * 100}')
|
||||
bot.volume_helper.set_volume(float(parameter) / 100.0)
|
||||
bot.send_msg(constants.strings('change_volume', volume=parameter, user=bot.mumble.users[text.actor]['name']), text)
|
||||
var.db.set('bot', 'volume', str(float(parameter) / 100.0))
|
||||
log.info(f'cmd: volume set to {float(parameter) / 100.0}')
|
||||
else:
|
||||
bot.send_msg(constants.strings('current_volume', volume=int(bot.volume_set * 100)), text)
|
||||
bot.send_msg(constants.strings('current_volume', volume=int(bot.volume_helper.plain_volume_set * 100)), text)
|
||||
|
||||
|
||||
def cmd_ducking(bot, user, text, command, parameter):
|
||||
@ -608,8 +608,6 @@ def cmd_ducking(bot, user, text, command, parameter):
|
||||
if parameter == "" or parameter == "on":
|
||||
bot.is_ducking = True
|
||||
var.db.set('bot', 'ducking', True)
|
||||
bot.ducking_volume = var.config.getfloat("bot", "ducking_volume", fallback=0.05)
|
||||
bot.ducking_threshold = var.config.getint("bot", "ducking_threshold", fallback=5000)
|
||||
bot.mumble.callbacks.set_callback(pymumble.constants.PYMUMBLE_CLBK_SOUNDRECEIVED, bot.ducking_sound_received)
|
||||
bot.mumble.set_receive_sound(True)
|
||||
log.info('cmd: ducking is on')
|
||||
@ -642,12 +640,12 @@ def cmd_ducking_volume(bot, user, text, command, parameter):
|
||||
|
||||
# The volume is a percentage
|
||||
if parameter and parameter.isdigit() and 0 <= int(parameter) <= 100:
|
||||
bot.ducking_volume = float(float(parameter) / 100)
|
||||
bot.send_msg(constants.strings('change_ducking_volume', volume=int(bot.ducking_volume * 100), user=bot.mumble.users[text.actor]['name']), text)
|
||||
var.db.set('bot', 'ducking_volume', str(bot.ducking_volume))
|
||||
log.info(f'cmd: volume on ducking set to {bot.ducking_volume * 100}')
|
||||
bot.volume_helper.set_ducking_volume(float(parameter) / 100.0)
|
||||
bot.send_msg(constants.strings('change_ducking_volume', volume=parameter, user=bot.mumble.users[text.actor]['name']), text)
|
||||
var.db.set('bot', 'ducking_volume', float(parameter) / 100.0)
|
||||
log.info(f'cmd: volume on ducking set to {parameter}')
|
||||
else:
|
||||
bot.send_msg(constants.strings('current_ducking_volume', volume=int(bot.ducking_volume * 100)), text)
|
||||
bot.send_msg(constants.strings('current_ducking_volume', volume=int(bot.volume_helper.plain_ducking_volume_set * 100)), text)
|
||||
|
||||
|
||||
def cmd_current_music(bot, user, text, command, parameter):
|
||||
|
34
interface.py
34
interface.py
@ -319,7 +319,7 @@ def status():
|
||||
'empty': False,
|
||||
'play': not var.bot.is_pause,
|
||||
'mode': var.playlist.mode,
|
||||
'volume': var.bot.volume_set,
|
||||
'volume': var.bot.volume_helper.plain_volume_set,
|
||||
'playhead': var.bot.playhead
|
||||
})
|
||||
|
||||
@ -329,7 +329,7 @@ def status():
|
||||
'empty': True,
|
||||
'play': not var.bot.is_pause,
|
||||
'mode': var.playlist.mode,
|
||||
'volume': var.bot.volume_set,
|
||||
'volume': var.bot.volume_helper.plain_volume_set,
|
||||
'playhead': 0
|
||||
})
|
||||
|
||||
@ -486,31 +486,31 @@ def post():
|
||||
elif action == "clear":
|
||||
var.bot.clear()
|
||||
elif action == "volume_up":
|
||||
if var.bot.volume_set + 0.03 < 1.0:
|
||||
var.bot.volume_set = var.bot.volume_set + 0.03
|
||||
if var.bot.volume_helper.plain_volume_set + 0.03 < 1.0:
|
||||
var.bot.volume_helper.set_volume(var.bot.volume_helper.plain_volume_set + 0.03)
|
||||
else:
|
||||
var.bot.volume_set = 1.0
|
||||
var.db.set('bot', 'volume', str(var.bot.volume_set))
|
||||
log.info("web: volume up to %d" % (var.bot.volume_set * 100))
|
||||
var.bot.volume_helper.set_volume(1.0)
|
||||
var.db.set('bot', 'volume', str(var.bot.volume_helper.plain_volume_set))
|
||||
log.info("web: volume up to %d" % (var.bot.volume_helper.plain_volume_set * 100))
|
||||
elif action == "volume_down":
|
||||
if var.bot.volume_set - 0.03 > 0:
|
||||
var.bot.volume_set = var.bot.volume_set - 0.03
|
||||
if var.bot.volume_helper.plain_volume_set - 0.03 > 0:
|
||||
var.bot.volume_helper.set_volume(var.bot.unconverted_volume - 0.03)
|
||||
else:
|
||||
var.bot.volume_set = 0
|
||||
var.db.set('bot', 'volume', str(var.bot.volume_set))
|
||||
log.info("web: volume up to %d" % (var.bot.volume_set * 100))
|
||||
var.bot.volume_helper.set_volume(1.0)
|
||||
var.db.set('bot', 'volume', str(var.bot.volume_helper.plain_volume_set))
|
||||
log.info("web: volume down to %d" % (var.bot.volume_helper.plain_volume_set * 100))
|
||||
elif action == "volume_set_value":
|
||||
if 'new_volume' in request.form:
|
||||
if float(request.form['new_volume']) > 1:
|
||||
var.bot.volume_set = 1
|
||||
var.bot.volume_helper.set_volume(1.0)
|
||||
elif float(request.form['new_volume']) < 0:
|
||||
var.bot.volume_set = 0
|
||||
var.bot.volume_helper.set_volume(0)
|
||||
else:
|
||||
# value for new volume is between 0 and 1, round to two decimal digits
|
||||
var.bot.volume_set = round(float(request.form['new_volume']), 2)
|
||||
var.bot.volume_helper.set_volume(round(float(request.form['new_volume']), 2))
|
||||
|
||||
var.db.set('bot', 'volume', str(var.bot.volume_set))
|
||||
log.info("web: volume set to %d" % (var.bot.volume_set * 100))
|
||||
var.db.set('bot', 'volume', str(var.bot.volume_helper.plain_volume_set))
|
||||
log.info("web: volume set to %d" % (var.bot.volume_helper.plain_volume_set * 100))
|
||||
|
||||
return status()
|
||||
|
||||
|
35
mumbleBot.py
35
mumbleBot.py
@ -39,10 +39,6 @@ class MumbleBot:
|
||||
self.log.info(f"bot: botamusique version {self.version}, starting...")
|
||||
signal.signal(signal.SIGINT, self.ctrl_caught)
|
||||
self.cmd_handle = {}
|
||||
self.volume_set = var.config.getfloat('bot', 'volume', fallback=0.1)
|
||||
if var.db.has_option('bot', 'volume'):
|
||||
self.volume_set = var.db.getfloat('bot', 'volume')
|
||||
self.volume = self.volume_set
|
||||
|
||||
self.stereo = var.config.getboolean('bot', 'stereo', fallback=True)
|
||||
|
||||
@ -130,18 +126,30 @@ class MumbleBot:
|
||||
self.join_channel()
|
||||
self.mumble.set_bandwidth(200000)
|
||||
|
||||
# ====== Volume ======
|
||||
self.volume_helper = util.VolumeHelper()
|
||||
|
||||
_volume = var.config.getfloat('bot', 'volume', fallback=0.1)
|
||||
if var.db.has_option('bot', 'volume'):
|
||||
_volume = var.db.getfloat('bot', 'volume')
|
||||
self.volume_helper.set_volume(_volume)
|
||||
|
||||
self.is_ducking = False
|
||||
self.on_ducking = False
|
||||
self.ducking_release = time.time()
|
||||
self.last_volume_cycle_time = time.time()
|
||||
|
||||
self._ducking_volume = 0
|
||||
_ducking_volume = var.config.getfloat("bot", "ducking_volume", fallback=0.05)
|
||||
_ducking_volume = var.db.getfloat("bot", "ducking_volume", fallback=_ducking_volume)
|
||||
self.volume_helper.set_ducking_volume(_ducking_volume)
|
||||
|
||||
self.ducking_threshold = var.config.getfloat("bot", "ducking_threshold", fallback=5000)
|
||||
self.ducking_threshold = var.db.getfloat("bot", "ducking_threshold", fallback=self.ducking_threshold)
|
||||
|
||||
if not var.db.has_option("bot", "ducking") and var.config.getboolean("bot", "ducking", fallback=False) \
|
||||
or var.config.getboolean("bot", "ducking"):
|
||||
self.is_ducking = True
|
||||
self.ducking_volume = var.config.getfloat("bot", "ducking_volume", fallback=0.05)
|
||||
self.ducking_volume = var.db.getfloat("bot", "ducking_volume", fallback=self.ducking_volume)
|
||||
self.ducking_threshold = var.config.getfloat("bot", "ducking_threshold", fallback=5000)
|
||||
self.ducking_threshold = var.db.getfloat("bot", "ducking_threshold", fallback=self.ducking_threshold)
|
||||
self.mumble.callbacks.set_callback(pymumble.constants.PYMUMBLE_CLBK_SOUNDRECEIVED,
|
||||
self.ducking_sound_received)
|
||||
self.mumble.set_receive_sound(True)
|
||||
@ -480,10 +488,10 @@ class MumbleBot:
|
||||
|
||||
if not self.on_interrupting:
|
||||
self.mumble.sound_output.add_sound(
|
||||
audioop.mul(raw_music, 2, self.volume))
|
||||
audioop.mul(raw_music, 2, self.volume_helper.real_volume))
|
||||
else:
|
||||
self.mumble.sound_output.add_sound(
|
||||
audioop.mul(self._fadeout(raw_music, self.stereo), 2, self.volume))
|
||||
audioop.mul(self._fadeout(raw_music, self.stereo), 2, self.volume_helper.real_volume))
|
||||
self.thread.kill()
|
||||
time.sleep(0.1)
|
||||
self.on_interrupting = False
|
||||
@ -566,9 +574,12 @@ class MumbleBot:
|
||||
|
||||
if delta > 0.001:
|
||||
if self.is_ducking and self.on_ducking:
|
||||
self.volume = (self.volume - self.ducking_volume) * math.exp(- delta / 0.2) + self.ducking_volume
|
||||
self.volume_helper.real_volume = \
|
||||
(self.volume_helper.real_volume - self.volume_helper.ducking_volume_set) * math.exp(- delta / 0.2) \
|
||||
+ self.volume_helper.ducking_volume_set
|
||||
else:
|
||||
self.volume = self.volume_set - (self.volume_set - self.volume) * math.exp(- delta / 0.5)
|
||||
self.volume_helper.real_volume = self.volume_helper.volume_set - \
|
||||
(self.volume_helper.volume_set - self.volume_helper.real_volume) * math.exp(- delta / 0.5)
|
||||
|
||||
self.last_volume_cycle_time = time.time()
|
||||
|
||||
|
31
util.py
31
util.py
@ -414,3 +414,34 @@ class LoggerIOWrapper(io.TextIOWrapper):
|
||||
else:
|
||||
self.logger.log(self.logging_level, text.rstrip())
|
||||
super().write(text + "\n")
|
||||
|
||||
|
||||
class VolumeHelper:
|
||||
def __init__(self, plain_volume = 0, ducking_plain_volume = 0):
|
||||
self.plain_volume_set = 0
|
||||
self.plain_ducking_volume_set = 0
|
||||
self.volume_set = 0
|
||||
self.ducking_volume_set = 0
|
||||
|
||||
self.real_volume = 0
|
||||
|
||||
self.set_volume(plain_volume)
|
||||
self.set_ducking_volume(ducking_plain_volume)
|
||||
|
||||
def set_volume(self, plain_volume):
|
||||
self.volume_set = self._convert_volume(plain_volume)
|
||||
self.plain_volume_set = plain_volume
|
||||
|
||||
def set_ducking_volume(self, plain_volume):
|
||||
self.ducking_volume_set = self._convert_volume(plain_volume)
|
||||
self.plain_ducking_volume_set = plain_volume
|
||||
|
||||
def _convert_volume(self, volume):
|
||||
if volume == 0:
|
||||
return 0
|
||||
|
||||
# convert input of 0~1 into -35~5 dB
|
||||
dB = -35 + volume * 40
|
||||
|
||||
# Some dirty trick to stretch the function, to make to be 0 when input is -35 dB
|
||||
return (10 ** (dB / 20) - 10 ** (-35 / 20)) / (1 - 10 ** (-35 / 20))
|
||||
|
Loading…
x
Reference in New Issue
Block a user