Add volume and stop, improve fading

This commit is contained in:
Keith Edmunds 2021-04-21 08:39:49 +01:00
parent 1c078a2d69
commit f452362c2a
6 changed files with 71 additions and 16 deletions

View File

@ -2,9 +2,10 @@
import os
from pydub import AudioSegment
from pydub import AudioSegment, effects
DIR = "/home/kae/git/musicmuster/archive"
# DIR = "/home/kae/git/musicmuster/archive"
DIR = "/home/kae/git/musicmuster"
# Iterate through flac files
@ -12,13 +13,13 @@ DIR = "/home/kae/git/musicmuster/archive"
def process(path):
audio = AudioSegment.from_file(path, "flac")
print(path)
print(f"{audio.dBFS=}")
print(f"audio.dBFS={audio.dBFS}")
print(f"audio.max_dBFS={audio.max_dBFS}")
print(f"audio.rms={audio.rms}")
print(f"audio.max={audio.max}")
print("-----------------")
# normalised = effects.normalize(audio)
# normalised.export(os.path.basename(path) + "n.flac", format="flac")
for f in os.scandir(DIR):

View File

@ -19,7 +19,7 @@ class Config(object):
DISPLAY_SQL = False
ERRORS_TO = ['kae@midnighthax.com']
FADE_STEPS = 20
FADE_TIME = 5000
FADE_TIME = 3000
LOG_LEVEL_STDERR = logging.DEBUG
LOG_LEVEL_SYSLOG = logging.DEBUG
LOG_NAME = "musicmuster"

View File

@ -13,10 +13,11 @@ class Music:
Manage the playing of music tracks
"""
def __init__(self):
def __init__(self, max_volume=100):
self.fading = False
self.player = None
self.track_path = None
self.max_volume = max_volume
def fade(self):
"""
@ -50,14 +51,26 @@ class Music:
DEBUG("_fade()")
fade_time = Config.FADE_TIME / 1000
sleep_time = fade_time / Config.FADE_STEPS
step_percent = int((Config.VOLUME_VLC_MAX / Config.FADE_STEPS) * -1)
steps = Config.FADE_STEPS
sleep_time = fade_time / steps
# We reduce volume by one mesure first, then by two measures,
# then three, and so on.
# The sum of the arithmetic sequence 1, 2, 3, ..n is
# (n**2 + n) / 2
total_measures_count = (steps**2 + steps) / 2
# Take a copy of current player to allow another track to be
# started without interfering here
p = self.player
for i in range(Config.VOLUME_VLC_MAX, 0, step_percent):
p.audio_set_volume(i)
measures_to_reduce_by = 0
for i in range(1, steps + 1):
measures_to_reduce_by += i
DEBUG(f"measures_to_reduce_by={measures_to_reduce_by}")
volume_factor = 1 - (measures_to_reduce_by / total_measures_count)
DEBUG(f"volume_factor={volume_factor}")
p.audio_set_volume(int(self.max_volume * volume_factor))
sleep(sleep_time)
p.pause()
@ -85,7 +98,7 @@ class Music:
self.track_path = path
self.player = vlc.MediaPlayer(path)
self.player.audio_set_volume(Config.VOLUME_VLC_MAX)
self.player.audio_set_volume(self.max_volume)
self.player.play()
def playing(self):
@ -108,3 +121,18 @@ class Music:
"Set current play time in milliseconds from start"
return self.player.set_time(ms)
def set_volume(self, volume):
"Set maximum volume used for player"
self.max_volume = volume
self.player.audio_set_volume(volume)
def stop(self):
"Immediately stop playing"
position = self.player.get_position()
self.player.stop()
self.player.release()
return position

View File

@ -119,6 +119,8 @@ class Window(QMainWindow, Ui_MainWindow):
self.btnPrevious.clicked.connect(self.play_previous)
self.btnSetNext.clicked.connect(self.set_next_track)
self.btnSkipNext.clicked.connect(self.play_next)
self.btnStop.clicked.connect(self.playlist.stop)
self.spnVolume.valueChanged.connect(self.change_volume)
self.timer.timeout.connect(self.tick)
@ -133,6 +135,13 @@ class Window(QMainWindow, Ui_MainWindow):
if ok:
self.playlist.create_playlist(dlg.textValue())
def change_volume(self, volume):
"Change player maximum volume"
DEBUG(f"change_volume({volume})")
self.playlist.music.set_volume(volume)
def disable_play_next_controls(self):
DEBUG("disable_play_next_controls()")
self.actionPlay_next.setEnabled(False)

View File

@ -282,7 +282,8 @@ class Playlist(QTableWidget):
self.repaint()
def fade(self):
self.music.fade()
self.previous_track = self.current_track
self.previous_track_position = self.music.fade()
def get_current_artist(self):
try:
@ -602,6 +603,12 @@ class Playlist(QTableWidget):
return False
def stop(self):
"Stop playing immediately"
self.previous_track = self.current_track
self.previous_track_position = self.music.stop()
def music_ended(self):
"Update display"

View File

@ -435,6 +435,16 @@ border: 1px solid rgb(85, 87, 83);</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spnVolume">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>