1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#!/usr/bin/env python
import sys, os, os.path
import pygtk, gtk, gobject
import pygst
pygst.require("0.10")
import gst
from gtk import glade
class Untitled:
def __init__(self):
self.gladefile = "gui.glade"
self.wTree = gtk.glade.XML(self.gladefile)
self.window = self.wTree.get_widget("mainWindow")
self.filechooserA = self.wTree.get_widget("filechooserA")
self.filechooserB = self.wTree.get_widget("filechooserB")
self.volumeA = self.wTree.get_widget("volumeA")
self.volumeB = self.wTree.get_widget("volumeB")
self.crossfader = self.wTree.get_widget("crossfader")
dic = { "on_mainWindow_destroy" : gtk.main_quit,
"on_playA_clicked" : self.playA,
"on_playB_clicked" : self.playB,
"on_pauseA_clicked" : self.pauseA,
"on_pauseB_clicked" : self.pauseB,
"on_stopA_clicked" : self.stopA,
"on_stopB_clicked" : self.stopB,
"on_fileA_set" : self.fileAset,
"on_fileB_set" : self.fileBset,
"on_volumeA_value_changed" : self.volumeAchanged,
"on_volumeB_value_changed" : self.volumeBchanged,
"on_crossfader_value_changed" : self.crossfader_changed,
}
self.wTree.signal_autoconnect(dic)
self.window.show()
self.playA = Player()
self.playB = Player()
def playA(self, widget):
self.playA.pipeline.set_state(gst.STATE_PLAYING)
def playB(self, widget):
self.playB.pipeline.set_state(gst.STATE_PLAYING)
def pauseA(self, widget):
self.playA.pipeline.set_state(gst.STATE_PAUSED)
def pauseB(self, widget):
self.playB.pipeline.set_state(gst.STATE_PAUSED)
def stopA(self, widget):
self.playA.pipeline.set_state(gst.STATE_NULL)
def stopB(self, widget):
self.playB.pipeline.set_state(gst.STATE_NULL)
def fileAset(self, widget):
self.playA.pipeline.set_state(gst.STATE_NULL)
filename = self.filechooserA.get_filename()
self.playA.source.set_property('location', filename)
self.playA.pipeline.set_state(gst.STATE_READY)
def fileBset(self, widget):
self.playB.pipeline.set_state(gst.STATE_NULL)
filename = self.filechooserB.get_filename()
self.playB.source.set_property('location', filename)
self.playB.pipeline.set_state(gst.STATE_READY)
def volumeAchanged(self, widget):
value = self.volumeA.get_value()
self.playA.volume.set_property("volume", value)
def volumeBchanged(self, widget):
value = self.volumeB.get_value()
self.playB.volume.set_property("volume", value)
def crossfader_changed(self, widget):
value = self.crossfader.get_value()
if value < 100:
value = value / 100
self.playA.volume_fader.set_property("volume", 1.0)
self.playB.volume_fader.set_property("volume", value)
else:
value = (100 - (value - 100)) / 100
self.playA.volume_fader.set_property("volume", value)
self.playB.volume_fader.set_property("volume", 1.0)
class Player:
def __init__(self):
self.pipeline = gst.Pipeline("pipeline")
self.source = gst.element_factory_make("filesrc", "file-source")
self.pipeline.add(self.source)
self.decoder = gst.element_factory_make("decodebin", "decoder")
self.decoder.connect("new-decoded-pad", self.OnDynamicPad)
self.pipeline.add(self.decoder)
self.source.link(self.decoder)
self.convert = gst.element_factory_make("audioconvert", "converter")
self.pipeline.add(self.convert)
self.volume = gst.element_factory_make("volume", "volume")
self.pipeline.add(self.volume)
self.convert.link(self.volume)
self.volume_fader = gst.element_factory_make("volume", "volume_fader")
self.pipeline.add(self.volume_fader)
self.volume.link(self.volume_fader)
self.sink = gst.element_factory_make("alsasink", "audio-output")
self.pipeline.add(self.sink)
self.volume_fader.link(self.sink)
def OnDynamicPad(self, dbin, pad, islast):
pad.link(self.convert.get_pad("sink"))
gtk.gdk.threads_init()
Untitled()
gtk.main()
|