Da ich das Rad nicht neu erfinden will, wuerde ich gerne die beiden Mainloops gleichzeitig laufen lassen, bin mir aber nicht wirklich sicher, ob meine Loesung wirklich gut ist.
Ich habe das Problem mal mit threading geloest, da ich aber keinerlei Erfahrung mit threading habe und viele Horrorstories gelesen habe, wuerde ich gerne euren Rat fragen, ob ich das denn auch richtig gemacht habe. Es geht mir hauptsaechlich darum, ob es nicht entweder eine leichtere Loesung gibt oder diese Loesung mir potentiell spaeter in den Allerwertesten beisst, weil sich ein neues Problem auftut (Keine Ahnung. ein memory leak oder anderes schlimmes)
Hier ist ein sinngemaesses Minimalbeispiel, dass leider aber immernoch recht lang ist. Ich habe die entsprechenden Abschnitte versucht hervorzuheben (Python 2.6, wxPython 2.8, Gstreamer 0.10, Windows XP)
Vielen Dank schonmal fuer eure Hilfe.
EDIT: Ich sollte vielleicht noch erwaehnen, dass die Audiodatei sofort bei Start losspielen sollte.
Code: Alles auswählen
#!usr/bin/python
import os
import urllib
from threading import Thread
import wx
import pygst
pygst.require("0.10")
import gst
import gobject
class MyFrame(wx.Frame, Thread):
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
###############
## Threading ##
###############
self.t = GstThread()
self.t.start()
# Close Event
self.Bind(wx.EVT_CLOSE, self.on_close)
self.__set_properties()
self.__do_layout()
def on_close(self, event):
self.t.quit()
self.Destroy()
def __set_properties(self):
self.SetTitle("Test")
def __do_layout(self):
self.Layout()
class GstThread(Thread):
def __init__(self):
Thread.__init__(self)
##############################
self.loop = gobject.MainLoop() # The mainloop to be separated from wx
##############################
# This is almost straight out of the tutorial
p = os.path.join("your", "path", "to", "your", "audiofile")
path = urllib.pathname2url(p)
self.player = gst.element_factory_make("playbin2", "player")
fakesink = gst.element_factory_make("fakesink", "fakesink")
self.player.set_property("video-sink", fakesink)
self.player.set_property("uri", "file:" + path)
self.player.set_state(gst.STATE_PLAYING)
def run(self): # Called on Thread.start()
self.loop.run()
def quit(self):
# If state not set to NULL, Critical Error occurs on gobject quit
state = self.player.get_state()
if state[1] == gst.STATE_PLAYING:
self.player.set_state(gst.STATE_NULL)
# Stops the gobject Mainloop
self.loop.quit()
if __name__ == "__main__":
gobject.threads_init()
# wxGlade's my Friend here
# Just basics
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame = MyFrame(None, -1, "")
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()