ocarina/trunk/src/song.py

127 lines
2.9 KiB
Python

import sys
import time
import pygst
pygst.require("0.10")
import gst
from duration import Duration
class Song():
#def __init__(self,info,exitFunc,prnt):
def __init__(self,exitFunc):
self.quit=exitFunc
#self.prnt=prnt
#self.info = info
#self.info.tags = dict()
#self.setInfo = None
#self.getNext = None
#self.current = 0
# initialize player pipeline
self.next = None
self.player = gst.Pipeline("player")
self.bin = gst.element_factory_make("playbin",None)
#bin.set_property("uri","file://"+self.info.filename)
self.player.add(self.bin)
# initialize bus
bus = self.player.get_bus()
bus.add_signal_watch()
bus.connect("message",self.onMessage)
# Pause song
#self.pause()
# Initialize stuff for finding duration
self.time_format = gst.Format(gst.FORMAT_TIME)
#self.length = None
#self.taglist = None
# Called on bus messages
def onMessage(self,bus,message):
t = message.type
if t == gst.MESSAGE_EOS:
#print "End of stream"
#self.prnt(["End of stream"])
if self.quit != None:
self.quit("","")
elif t == gst.MESSAGE_ERROR:
err, debug = message.parse_error()
#if self.prnt != None:
# self.prnt(["Error: "+ str(err) + " " +str(debug)])
self.close()
print "Error: %s" % err, debug
print "Trying next song"
self.next()
#self.getNext(None,None)
#if self.quit != None:
# self.quit("")
#elif t == gst.MESSAGE_TAG:
# tags = message.parse_tag()
# for tag in tags.keys():
# self.info.tags[tag] = tags[tag]
# if tag=="title":
# self.info.title = tags[tag]
# elif tag=="album":
# self.info.album = tags[tag]
# elif tag=="artist":
# self.info.artist = tags[tag]
# self.setInfo(tags)
#self.taglist = message.parse_tag()
# return
# Change state to "playing"
def play(self,widgit,data):
self.player.set_state(gst.STATE_PLAYING)
# Start main loop and find duration (if this hasn't been done yet)
#while self.duration() == False:
# time.sleep(0.1)
# Change state to "paused"
def pause(self,widgit,data):
self.player.set_state(gst.STATE_PAUSED)
# Stop playback
def stop(self):
self.player.set_state(gst.STATE_PAUSED)
self.current = 0
self.player.seek_simple(self.time_format,gst.SEEK_FLAG_FLUSH,self.current)
# Close the song
def close(self):
self.player.set_state(gst.STATE_NULL)
# Find the duration of the pipeline
#def duration(self):
# try:
# self.info.length = Duration()
# length = self.player.query_duration(self.time_format,None)[0]
# self.total = length
# self.info.length.setTime(length)
# return True
#except:
# return False
#self.length.disp(self.prnt)
# Print out current running time
def curTime(self):
try:
length = self.player.query_position(self.time_format,None)[0]
self.current = length
dur = Duration()
dur.setTime(length)
return (True,dur)
except:
return (False,None)
def passInfo(self,info):
self.info = info
self.bin.set_property("uri","file://"+self.info.filename)