3737 mp3play = None
3838
3939
40+ # Qt-Phonon
41+ try :
42+ from PyQt4 .phonon import Phonon
43+ except ImportError :
44+ Phonon = None
45+
46+
4047class Backend (object ):
4148 __metaclass__ = abc .ABCMeta
4249 def __init__ (self , parent , temp_dir ):
@@ -148,6 +155,46 @@ def close(self):
148155 pass
149156
150157
158+ class PhononBackend (Backend ):
159+ def __init__ (self , parent , temp_dir ):
160+ self ._player = Phonon .createPlayer (Phonon .NoCategory )
161+ self ._player .finished .connect (self ._onFinished )
162+ self ._alive = set ()
163+
164+ def _onFinished (self ):
165+ self ._clean_tmp ()
166+
167+ def _play (self ):
168+ source = Phonon .MediaSource (self ._path )
169+ self ._player .setCurrentSource (source )
170+ self ._player .play ()
171+
172+ def play (self , data ):
173+ self ._player .stop ()
174+ self ._clean_tmp ()
175+ with NamedTemporaryFile (mode = 'w+b' , prefix = '' ,
176+ suffix = '.tmp.mp3' , delete = False ) as f :
177+ f .write (data )
178+ self ._path = f .name
179+ self ._alive .add (f .name )
180+ QTimer .singleShot (0 , self ._play )
181+
182+ def _clean_tmp (self ):
183+ removed = []
184+ for path in self ._alive :
185+ try :
186+ os .unlnk (path )
187+ except :
188+ pass
189+ else :
190+ removed .append (path )
191+ self ._alive .difference_update (removed )
192+
193+ def close (self ):
194+ self ._player .stop ()
195+ self ._clean_tmp ()
196+
197+
151198class AppKitBackend (Backend ):
152199 def __init__ (self , parent , temp_dir ):
153200 self ._sound = None
@@ -173,6 +220,8 @@ def create_soundplayer(parent, temp_dir):
173220 backends .append (AppKitBackend )
174221 if mp3play :
175222 backends .append (WinMCIBackend )
223+ if Phonon :
224+ backends .append (PhononBackend )
176225 if gst :
177226 backends .append (GstreamerBackend )
178227 backends .append (NullBackend )
0 commit comments