Add standalone player running ability.
This commit is contained in:
parent
517f32773d
commit
5076bb2e36
2 changed files with 106 additions and 40 deletions
7
.vscode/launch.json
vendored
7
.vscode/launch.json
vendored
|
@ -1,6 +1,13 @@
|
|||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: Launch Player Standalone",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "./player.py",
|
||||
"console": "integratedTerminal"
|
||||
},
|
||||
{
|
||||
"name": "Python: Launch Server Standalone",
|
||||
"type": "python",
|
||||
|
|
139
player.py
139
player.py
|
@ -1,12 +1,13 @@
|
|||
from queue import Empty
|
||||
import multiprocessing
|
||||
import setproctitle
|
||||
import copy
|
||||
import json
|
||||
import time
|
||||
from pygame import mixer
|
||||
from state_manager import StateManager
|
||||
from mutagen.mp3 import MP3
|
||||
from pygame import mixer
|
||||
import time
|
||||
import json
|
||||
import copy
|
||||
import os
|
||||
import setproctitle
|
||||
|
||||
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
|
||||
|
||||
|
||||
|
@ -33,9 +34,14 @@ class Player():
|
|||
else:
|
||||
return True
|
||||
|
||||
@property
|
||||
def isPlaying(self):
|
||||
return bool(mixer.music.get_busy())
|
||||
|
||||
@property
|
||||
def isLoaded(self):
|
||||
return False
|
||||
|
||||
def play(self):
|
||||
|
||||
mixer.music.play(0)
|
||||
|
@ -83,7 +89,7 @@ class Player():
|
|||
return "OK"
|
||||
|
||||
def updateState(self, pos=None):
|
||||
self.state.update("playing", self.isPlaying())
|
||||
self.state.update("playing", self.isPlaying)
|
||||
if (pos):
|
||||
self.state.update("pos", max(0, pos))
|
||||
else:
|
||||
|
@ -108,49 +114,102 @@ class Player():
|
|||
print("Setting output to: " + loaded_state["output"])
|
||||
self.output(loaded_state["output"])
|
||||
else:
|
||||
print("Using default output device.")
|
||||
self.output()
|
||||
|
||||
if loaded_state["filename"]:
|
||||
print("Loading filename: " + loaded_state["filename"])
|
||||
self.load(loaded_state["filename"])
|
||||
|
||||
if loaded_state["pos"] != 0:
|
||||
print("Seeking to pos: " + str(loaded_state["pos"]))
|
||||
self.seek(loaded_state["pos"])
|
||||
if loaded_state["pos"] != 0:
|
||||
print("Seeking to pos: " + str(loaded_state["pos"]))
|
||||
self.seek(loaded_state["pos"])
|
||||
|
||||
if loaded_state["playing"] == True:
|
||||
print("Resuming.")
|
||||
self.unpause()
|
||||
if loaded_state["playing"] == True:
|
||||
print("Resuming.")
|
||||
self.unpause()
|
||||
else:
|
||||
print("No file was previously loaded.")
|
||||
|
||||
while self.running:
|
||||
time.sleep(0.01)
|
||||
incoming_msg = in_q.get()
|
||||
if (not incoming_msg):
|
||||
continue
|
||||
if self.isInit():
|
||||
self.updateState()
|
||||
if (incoming_msg == 'PLAY'):
|
||||
self.play()
|
||||
if (incoming_msg == 'PAUSE'):
|
||||
self.pause()
|
||||
if (incoming_msg == 'UNPAUSE'):
|
||||
self.unpause()
|
||||
if (incoming_msg == 'STOP'):
|
||||
self.stop()
|
||||
if (incoming_msg == 'QUIT'):
|
||||
self.quit()
|
||||
self.running = False
|
||||
if (incoming_msg.startswith("SEEK")):
|
||||
split = incoming_msg.split(":")
|
||||
self.seek(float(split[1]))
|
||||
if (incoming_msg.startswith("LOAD")):
|
||||
split = incoming_msg.split(":")
|
||||
self.load(split[1])
|
||||
if (incoming_msg == 'DETAILS'):
|
||||
out_q.put(self.getDetails())
|
||||
try:
|
||||
try:
|
||||
incoming_msg = in_q.get_nowait()
|
||||
except Empty:
|
||||
# The incomming message queue was empty,
|
||||
# skip message processing
|
||||
pass
|
||||
else:
|
||||
# We got a message.
|
||||
if self.isInit():
|
||||
self.updateState()
|
||||
|
||||
if (incoming_msg.startswith("OUTPUT")):
|
||||
split = incoming_msg.split(":")
|
||||
out_q.put(self.output(split[1]))
|
||||
if (incoming_msg == 'LOADED?'):
|
||||
out_q.put(self.isLoaded)
|
||||
continue
|
||||
|
||||
if (incoming_msg == 'PLAY'):
|
||||
self.play()
|
||||
if (incoming_msg == 'PAUSE'):
|
||||
self.pause()
|
||||
if (incoming_msg == 'UNPAUSE'):
|
||||
self.unpause()
|
||||
if (incoming_msg == 'STOP'):
|
||||
self.stop()
|
||||
if (incoming_msg == 'QUIT'):
|
||||
self.quit()
|
||||
self.running = False
|
||||
if (incoming_msg.startswith("SEEK")):
|
||||
split = incoming_msg.split(":")
|
||||
self.seek(float(split[1]))
|
||||
if (incoming_msg.startswith("LOAD")):
|
||||
split = incoming_msg.split(":")
|
||||
self.load(split[1])
|
||||
if (incoming_msg == 'DETAILS'):
|
||||
out_q.put(self.getDetails())
|
||||
|
||||
if (incoming_msg.startswith("OUTPUT")):
|
||||
split = incoming_msg.split(":")
|
||||
out_q.put(self.output(split[1]))
|
||||
|
||||
# Catch the player being killed externally.
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
except SystemExit:
|
||||
break
|
||||
except:
|
||||
raise
|
||||
|
||||
print("Quiting player ", channel)
|
||||
self.quit()
|
||||
|
||||
|
||||
def showOutput(in_q, out_q):
|
||||
print("Starting showOutput().")
|
||||
while True:
|
||||
time.sleep(0.01)
|
||||
incoming_msg = out_q.get()
|
||||
print(incoming_msg)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
in_q = multiprocessing.Queue()
|
||||
out_q = multiprocessing.Queue()
|
||||
|
||||
outputProcess = multiprocessing.Process(
|
||||
target=showOutput,
|
||||
args=(in_q, out_q),
|
||||
).start()
|
||||
|
||||
playerProcess = multiprocessing.Process(
|
||||
target=Player,
|
||||
args=(-1, in_q, out_q),
|
||||
).start()
|
||||
|
||||
# Do some testing
|
||||
|
||||
print("Entering infinite loop.")
|
||||
while True:
|
||||
pass
|
||||
|
|
Loading…
Reference in a new issue