~luisbg/dexs/trunk

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()