aboutsummaryrefslogtreecommitdiffstats
path: root/solo-tool-project/src/solo_tool/player_mpv.py
diff options
context:
space:
mode:
authorEddy Pedroni <epedroni@pm.me>2026-10-22 22:34:17 +0200
committerEddy Pedroni <epedroni@pm.me>2026-10-22 22:34:17 +0200
commit3e9f9b12fc7104cde2ba141c95ae9eaa99614330 (patch)
tree3ab02074e71692479883df28bb07f5686b2a8c5c /solo-tool-project/src/solo_tool/player_mpv.py
parent9048b18b47d903990be169a238d7835bb11a5047 (diff)
Multitrack support in the library
Diffstat (limited to 'solo-tool-project/src/solo_tool/player_mpv.py')
-rw-r--r--solo-tool-project/src/solo_tool/player_mpv.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/solo-tool-project/src/solo_tool/player_mpv.py b/solo-tool-project/src/solo_tool/player_mpv.py
index 58902e0..77e0651 100644
--- a/solo-tool-project/src/solo_tool/player_mpv.py
+++ b/solo-tool-project/src/solo_tool/player_mpv.py
@@ -1,13 +1,45 @@
import mpv
+def _complexGraph(tracks):
+ graph = ""
+ for i, enabled in tracks.items():
+ graph += f"[aid{i}]volume={"1.0" if enabled else "0.0"}[a{i}];"
+ graph += "[a1][a2][a3][a4][a5][a6]amix=inputs=6:"
+ graph += "duration=longest:normalize=0[ao]"
+ return graph
+
+def _simpleGraph():
+ return (
+ "[aid1]volume=1.0[a1];"
+ "[a1]amix=inputs=1:"
+ "duration=longest:normalize=1[ao]"
+ )
+
class Player:
+ VOCAL_TRACK = 1
+ GUITAR_TRACK = 2
+ BASS_TRACK = 3
+ PIANO_TRACK =4
+ DRUM_TRACK = 5
+ OTHER_TRACK = 6
+
def __init__(self):
self._player = mpv.MPV(ao="jack")
self._player.loop = "inf"
+ self._player.lavfi_complex = _simpleGraph()
self._playingStateCallback = self._dummyCallback
self._volumeCallback = self._dummyCallback
self._player.observe_property("pause", lambda name, value: self._playingStateCallback())
self._player.observe_property("volume", lambda name, value: self._volumeCallback())
+ self._player.observe_property("track-list/count", lambda name, value: self._updateGraph())
+ self._tracks = {
+ self.VOCAL_TRACK: True,
+ self.GUITAR_TRACK: True,
+ self.BASS_TRACK: True,
+ self.PIANO_TRACK: True,
+ self.DRUM_TRACK: True,
+ self.OTHER_TRACK: True
+ }
def __del__(self):
self._player.close()
@@ -15,6 +47,12 @@ class Player:
def _dummyCallback(self):
pass
+ def _updateGraph(self):
+ if self.tracksSupported():
+ self._player.lavfi_complex = _complexGraph(self._tracks)
+ else:
+ self._player.lavfi_complex = _simpleGraph()
+
def play(self):
self._player.pause = False
@@ -51,3 +89,13 @@ class Player:
def setPlaybackVolumeChangedCallback(self, callback):
self._volumeCallback = callback
+
+ def tracksSupported(self):
+ return len(self._player.track_list) == 6
+
+ def trackEnabled(self, trackId):
+ return self._tracks[trackId]
+
+ def setTrackEnabled(self, trackId, enable):
+ self._tracks[trackId] = enable
+ self._updateGraph()