# Copyright (c) 2021 by xfangfang. All Rights Reserved.
#
# Using pi_fm_rds as DLNA media renderer
# https://github.com/ChristopheJacquet/PiFmRds
#
# Macast Metadata
# PIFMRDS Renderer
# PIFMRenderer
# linux
# 0.2
# 0.7
# xfangfang
# PIFMRDS support for Macast. Only for raspberry pi, visit the plugin repository for more information.
import os
import time
import threading
import subprocess
from macast import cli
from macast.renderer import Renderer
class PIFMRenderer(Renderer):
def __init__(self):
super(PIFMRenderer, self).__init__()
self.start_position = 0
self.position_thread_running = True
self.position_thread = threading.Thread(target=self.position_tick, daemon=True)
self.position_thread.start()
self.sox = None
self.fm = subprocess.Popen(['sudo', 'pi_fm_rds', '-freq', '108', '-audio', '-'],
stdin=subprocess.PIPE,
bufsize=1024)
def position_tick(self):
while self.position_thread_running:
time.sleep(1)
self.start_position += 1
sec = self.start_position
position = '%d:%02d:%02d' % (sec // 3600, (sec % 3600) // 60, sec % 60)
self.set_state_position(position)
def set_media_stop(self):
if self.sox is not None:
self.sox.terminate()
os.waitpid(-1, 1)
self.set_state_transport('STOPPED')
def set_media_url(self, data, start=0):
self.start_position = 0
self.sox = subprocess.Popen(['sox', '-t', 'mp3', data, '-t', 'wav', '-'],
stdout=self.fm.stdin)
self.set_state_transport("PLAYING")
def stop(self):
super(PIFMRenderer, self).stop()
os._exit()
# if self.sox is not None:
# self.sox.terminate()
# kill = subprocess.Popen(['sudo', 'killall', 'pi_fm_rds'])
# kill.communicate()
# os.waitpid(-1, 1)
if __name__ == '__main__':
cli(PIFMRenderer())