Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 13, 2012 16:57:41

Nightwing
Зарегистрирован: 2012-08-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Треды, gstreamer и dbus

Есть такой вот модуль с классом

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gobject
import pygst
import gst
import threading
import Queue
class Playbin:
	def play(self,playlist,vol):
		gobject.threads_init()
		self.playloop = gobject.MainLoop()
		self.bin = gst.element_factory_make("playbin2")
		self.bin.set_property('volume', (int(vol) / 100.0))
		self.queue = Queue.Queue()
		for playfile in playlist:
			self.queue.put(playfile)
		playthread = threading.Thread(target=self.really_play, args=(self.queue,))
		playthread.start()
							
	def on_eos(self,bus,msg):
		self.bin.set_state(gst.STATE_NULL)
		self.playloop.quit()
		
	def really_play(self):
		playfile = self.queue.get()
		self.bin.set_property("uri", "file://" + playfile)
		print "Playing: " + playfile
		self.bin.set_state(gst.STATE_PLAYING)
		bus = self.bin.get_bus()
		bus.add_signal_watch()
		bus.connect('message::eos', self.on_eos)
		self.playloop.run()
		self.queue.task_done()
	self.queue.join()

Импортирую его и все прекрасно играет:
import playbin
player = playbin.Playbin()
player.play(['/path/to/file1.mp3','/path/to/file2.mp3/','/path/to/file3.mp3'], 50)
Но если все это через dbus экспортировать:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gobject
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
import playbin
gobject.threads_init()
class MyDBusService(dbus.service.Object):
	interface = "my.interface"
	def __init__(self):
		self.service_name = "com.my.app"
		bus_name = dbus.service.BusName(self.service_name, bus=dbus.SessionBus())
		dbus.service.Object.__init__(self, bus_name, "/com/my/app")
	@dbus.service.method(interface)
	def Play_Sound(self):
		player = playbin.Playbin()
		player.play(['/path/to/file1.mp3','/path/to/file2.mp3/','/path/to/file3.mp3'], 50)
DBusGMainLoop(set_as_default=True)
mainloop = gobject.MainLoop()
myservice = MyDBusService()
mainloop.run()
То некоторые файлы пропускаются, хотя print “Playing: ” + playfile выводит соответствующую строку для всех файлов. Однако убрать треды, то все работает как надо.

Отредактировано Nightwing (Авг. 13, 2012 17:59:45)

Офлайн

#2 Авг. 14, 2012 23:53:29

Nightwing
Зарегистрирован: 2012-08-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Треды, gstreamer и dbus

Проблему локализовал - если запущен gobject.MainLoop(), нужный dbus'у, и плеер работает в отдельном треде, то возникает эта проблема.
Код вида:

import threading
import time
import playbin
def myloop():
	while True:
		player = playbin.Playbin()
		player.play(['/path/to/file1.mp3','/path/to/file2.mp3/','/path/to/file3.mp3'], 50)
		sleep(20)
		
threading.Thread(target=myloop).start
Работает нормально.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version