PageRenderTime 44ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/plugins/equalizer/__init__.py

https://bitbucket.org/synic/exaile
Python | 369 lines | 247 code | 61 blank | 61 comment | 35 complexity | 813a8de036ace109dae0a07c4cd36904 MD5 | raw file
Possible License(s): GPL-2.0, GPL-3.0, BSD-2-Clause, BSD-3-Clause
  1. # Copyright (C) 2009-2010 Dave Aitken
  2. #
  3. # This program is free software; you can redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as published by
  5. # the Free Software Foundation; either version 2, or (at your option)
  6. # any later version.
  7. #
  8. # This program is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. # GNU General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU General Public License
  14. # along with this program; if not, write to the Free Software
  15. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  16. #
  17. #
  18. # The developers of the Exaile media player hereby grant permission
  19. # for non-GPL compatible GStreamer and Exaile plugins to be used and
  20. # distributed together with GStreamer and Exaile. This permission is
  21. # above and beyond the permissions granted by the GPL license by which
  22. # Exaile is covered. If you modify this code, you may extend this
  23. # exception to your version of the code, but you are not obligated to
  24. # do so. If you do not wish to do so, delete this exception statement
  25. # from your version.
  26. # support python 2.5
  27. from __future__ import with_statement
  28. from xl import providers, event, settings, xdg
  29. from xl.player.pipe import ElementBin
  30. from xlgui.widgets import menu
  31. from xl.nls import gettext as _
  32. import gst, gtk, glib
  33. import os, string
  34. def enable(exaile):
  35. providers.register("postprocessing_element", GSTEqualizer)
  36. if exaile.loading:
  37. event.add_callback(_enable, 'gui_loaded')
  38. else:
  39. _enable(None, exaile, None)
  40. def _enable(event_type, exaile, nothing):
  41. """
  42. Called when the player is loaded.
  43. """
  44. global EQ_MAIN
  45. EQ_MAIN = EqualizerPlugin(exaile)
  46. def disable(exaile):
  47. providers.unregister("postprocessing_element", GSTEqualizer)
  48. global EQ_MAIN
  49. EQ_MAIN.disable()
  50. EQ_MAIN = None
  51. class GSTEqualizer(ElementBin):
  52. """
  53. Equalizer GST class
  54. """
  55. index = 99
  56. name = "equalizer-10bands"
  57. def __init__(self, player):
  58. ElementBin.__init__(self, player, name=self.name)
  59. self.audioconvert = gst.element_factory_make("audioconvert")
  60. self.elements[40] = self.audioconvert
  61. self.preamp = gst.element_factory_make("volume")
  62. self.elements[50] = self.preamp
  63. self.eq10band = gst.element_factory_make("equalizer-10bands")
  64. self.elements[60] = self.eq10band
  65. self.setup_elements()
  66. event.add_callback(self._on_option_set,
  67. "plugin_equalizer_option_set")
  68. setts = ["band%s" for n in xrange(10)] + ["pre", "enabled"]
  69. for setting in setts:
  70. self._on_option_set("plugin_equalizer_option_set", None,
  71. "plugin/equalizer/%s"%setting)
  72. def _on_option_set(self, name, object, data):
  73. for band in range(10):
  74. if data == "plugin/equalizer/band%s"%band:
  75. if settings.get_option("plugin/equalizer/enabled") == True:
  76. self.eq10band.set_property("band%s"%band,
  77. settings.get_option("plugin/equalizer/band%s"%band))
  78. else:
  79. self.eq10band.set_property("band%s"%band, 0.0)
  80. if data == "plugin/equalizer/pre":
  81. if settings.get_option("plugin/equalizer/enabled") == True:
  82. self.preamp.set_property("volume", self.dB_to_percent(
  83. settings.get_option("plugin/equalizer/pre")))
  84. else:
  85. self.preamp.set_property("volume", 1.0)
  86. if data == "plugin/equalizer/enabled":
  87. if settings.get_option("plugin/equalizer/enabled") == True:
  88. self.preamp.set_property("volume", self.dB_to_percent(
  89. settings.get_option("plugin/equalizer/pre")))
  90. for band in range(10):
  91. self.eq10band.set_property("band%s"%band,
  92. settings.get_option("plugin/equalizer/band%s"%band))
  93. else:
  94. self.preamp.set_property("volume", 1.0)
  95. for band in range(10):
  96. self.eq10band.set_property("band%s"%band, 0.0)
  97. def dB_to_percent(self, dB):
  98. return 10**(dB / 10)
  99. class EqualizerPlugin:
  100. """
  101. Equalizer plugin class
  102. """
  103. def __init__(self, exaile):
  104. self.window = None
  105. # add menu item to tools menu
  106. self.MENU_ITEM = menu.simple_menu_item('equalizer', ['plugin-sep'], _('Equalizer'),
  107. callback=lambda *x: self.show_gui(exaile))
  108. providers.register('menubar-tools-menu', self.MENU_ITEM)
  109. self.presets_path = os.path.join(xdg.get_config_dir(), 'eq-presets.dat')
  110. self.presets = gtk.ListStore(str, float, float, float, float,
  111. float, float, float, float, float, float, float)
  112. self.load_presets()
  113. self.check_default_settings()
  114. def check_default_settings(self):
  115. for band in range(10):
  116. if settings.get_option("plugin/equalizer/band%s"%band) == None:
  117. settings.set_option("plugin/equalizer/band%s"%band, 0.0)
  118. if settings.get_option("plugin/equalizer/pre") == None:
  119. settings.set_option("plugin/equalizer/pre", 0.0)
  120. if settings.get_option("plugin/equalizer/enabled") == None:
  121. settings.set_option("plugin/equalizer/enabled", True)
  122. def disable(self):
  123. if self.MENU_ITEM:
  124. providers.unregister('menubar-tools-menu', self.MENU_ITEM)
  125. self.MENU_ITEM = None
  126. if self.window:
  127. self.window.hide()
  128. self.window.destroy()
  129. def load_presets(self):
  130. """
  131. Populate the GTK ListStore with presets
  132. """
  133. def show_gui(self, exaile):
  134. """
  135. Display main window.
  136. """
  137. if self.window:
  138. self.window.present()
  139. return
  140. signals = {
  141. 'on_main-window_destroy':self.destroy_gui,
  142. 'on_chk-enabled_toggled':self.toggle_enabled,
  143. 'on_combo-presets_changed':self.preset_changed,
  144. 'on_add-preset_clicked':self.add_preset,
  145. 'on_remove-preset_clicked':self.remove_preset,
  146. 'on_pre_format_value':self.adjust_preamp,
  147. 'on_band0_format_value':self.adjust_band,
  148. 'on_band1_format_value':self.adjust_band,
  149. 'on_band2_format_value':self.adjust_band,
  150. 'on_band3_format_value':self.adjust_band,
  151. 'on_band4_format_value':self.adjust_band,
  152. 'on_band5_format_value':self.adjust_band,
  153. 'on_band6_format_value':self.adjust_band,
  154. 'on_band7_format_value':self.adjust_band,
  155. 'on_band8_format_value':self.adjust_band,
  156. 'on_band9_format_value':self.adjust_band
  157. }
  158. self.ui = gtk.Builder()
  159. self.ui.add_from_file( os.path.join( os.path.dirname(
  160. os.path.realpath(__file__)), 'equalizer.ui'))
  161. self.ui.connect_signals(signals)
  162. self.window = self.ui.get_object('main-window')
  163. #Setup bands/preamp from current equalizer settings
  164. for x in (0,1,2,3,4,5,6,7,8,9):
  165. self.ui.get_object('band%s' % x).set_value(self.get_band(x))
  166. self.ui.get_object("pre").set_value(self.get_pre())
  167. #Put the presets into the presets combobox
  168. combobox = self.ui.get_object("combo-presets")
  169. combobox.set_model(self.presets)
  170. combobox.set_text_column(0)
  171. combobox.set_active(0)
  172. self.ui.get_object('chk-enabled').set_active(
  173. settings.get_option("plugin/equalizer/enabled"))
  174. self.window.show_all()
  175. def destroy_gui(self, widget):
  176. self.window = None
  177. def get_band(self, x):
  178. """
  179. Get the current value of band x
  180. """
  181. return settings.get_option("plugin/equalizer/band%s"%x)
  182. def get_pre(self):
  183. """
  184. Get the current value of pre-amp
  185. """
  186. return settings.get_option("plugin/equalizer/pre")
  187. #Widget callbacks
  188. def adjust_band(self, widget, data):
  189. """
  190. Adjust the specified band
  191. """
  192. # Buildable.get_name clashes with Widget.get_name. See
  193. # https://bugzilla.gnome.org/show_bug.cgi?id=591085#c19
  194. widget_name = gtk.Buildable.get_name(widget)
  195. band = widget_name[-1]
  196. if widget.get_value() != settings.get_option(
  197. "plugin/equalizer/band" + band):
  198. settings.set_option("plugin/equalizer/band" + band,
  199. widget.get_value())
  200. self.ui.get_object("combo-presets").set_active(0)
  201. def adjust_preamp(self, widget, data):
  202. """
  203. Adjust the preamp
  204. """
  205. if widget.get_value() != settings.get_option("plugin/equalizer/pre"):
  206. settings.set_option("plugin/equalizer/pre", widget.get_value())
  207. self.ui.get_object("combo-presets").set_active(0)
  208. def add_preset(self, widget):
  209. new_preset = []
  210. new_preset.append(self.ui.get_object("combo-presets"
  211. ).get_child().get_text())
  212. new_preset.append(settings.get_option("plugin/equalizer/pre"))
  213. for band in range(10):
  214. new_preset.append(settings.get_option(
  215. "plugin/equalizer/band%s"%band))
  216. # print "EQPLUGIN: debug: ", new_preset
  217. self.presets.append(new_preset)
  218. self.save_presets()
  219. def remove_preset(self, widget):
  220. entry = self.ui.get_object("combo-presets").get_active()
  221. if entry > 1:
  222. self.presets.remove(self.presets.get_iter(entry))
  223. self.ui.get_object("combo-presets").set_active(0)
  224. self.save_presets()
  225. def preset_changed(self, widget):
  226. d = widget.get_model()
  227. i = widget.get_active()
  228. #If an option other than "Custom" is chosen:
  229. if i > 0:
  230. settings.set_option("plugin/equalizer/pre",
  231. d.get_value( d.get_iter(i), 1))
  232. self.ui.get_object("pre").set_value(
  233. d.get_value( d.get_iter(i), 1))
  234. for band in range(10):
  235. settings.set_option("plugin/equalizer/band%s"%band,
  236. d.get_value( d.get_iter(i), band+2))
  237. self.ui.get_object("band%s"%band).set_value(
  238. d.get_value( d.get_iter(i), band+2))
  239. def toggle_enabled(self, widget):
  240. settings.set_option("plugin/equalizer/enabled", widget.get_active())
  241. def save_presets(self):
  242. if os.path.exists(self.presets_path):
  243. os.remove(self.presets_path)
  244. with open(self.presets_path, 'w') as f:
  245. for row in self.presets:
  246. f.write(row[0] + '\n')
  247. s = ""
  248. for i in range(1, 12):
  249. s += str(row[i]) + " "
  250. s += "\n"
  251. f.write(s)
  252. def load_presets(self):
  253. if os.path.exists(self.presets_path):
  254. with open(self.presets_path, 'r') as f:
  255. line = f.readline()
  256. while (line != ""):
  257. preset = []
  258. preset.append(line[:-1])
  259. line = f.readline()
  260. vals = string.split(line, " ")
  261. for i in range(11):
  262. preset.append(float(vals[i]))
  263. self.presets.append(preset)
  264. line = f.readline()
  265. else:
  266. self.presets.append(["Custom",
  267. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  268. self.presets.append(["Default",
  269. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  270. self.presets.append(["Classical",
  271. 0, 0, 0, 0, 0, 0, 0, -7.2, -7.2, -7.2, -9.6])
  272. self.presets.append(["Club",
  273. 0, 0, 0, 8, 5.6, 5.6, 5.6, 3.2, 0, 0, 0])
  274. self.presets.append(["Dance",
  275. 0, 9.6, 7.2, 2.4, 0, 0, -5.6, -7.2, -7.2, 0, 0])
  276. self.presets.append(["Full Bass",
  277. 0, -8, 9.6, 9.6, 5.6, 1.6, -4, -8, -10.4, -11.2, -11.2])
  278. self.presets.append(["Full Bass and Treble",
  279. 0, 7.2, 5.6, 0, -7.2, -4.8, 1.6, 8, 11.2, 12, 12])
  280. self.presets.append(["Full Treble",
  281. 0, -9.6, -9.6, -9.6, -4, 2.4, 11.2, 16, 16, 16, 16.8])
  282. self.presets.append(["Laptop Speakers and Headphones",
  283. 0, 4.8, 11.2, 5.6, -3.2, -2.4, 1.6, 4.8, 9.6, 11.9, 11.9])
  284. self.presets.append(["Large Hall",
  285. 0, 10.4, 10.4, 5.6, 5.6, 0, -4.8, -4.8, -4.8, 0, 0])
  286. self.presets.append(["Live",
  287. 0, -4.8, 0, 4, 5.6, 5.6, 5.6, 4, 2.4, 2.4, 2.4])
  288. self.presets.append(["Party",
  289. 0, 7.2, 7.2, 0, 0, 0, 0, 0, 0, 7.2, 7.2])
  290. self.presets.append(["Pop",
  291. 0, -1.6, 4.8, 7.2, 8, 5.6, 0, -2.4, -2.4, -1.6, -1.6])
  292. self.presets.append(["Reggae",
  293. 0, 0, 0, 0, -5.6, 0, 6.4, 6.4, 0, 0, 0])
  294. self.presets.append(["Rock",
  295. 0, 8, 4.8, -5.6, -8, -3.2, 4, 8.8, 11.2, 11.2, 11.2])
  296. self.presets.append(["Ska",
  297. 0, -2.4, -4.8, -4, 0, 4, 5.6, 8.8, 9.6, 11.2, 9.6])
  298. self.presets.append(["Soft",
  299. 0, 4.8, 1.6, 0, -2.4, 0, 4, 8, 9.6, 11.2, 12])
  300. self.presets.append(["Soft Rock",
  301. 0, 4, 4, 2.4, 0, -4, -5.6, -3.2, 0, 2.4, 8.8])
  302. self.presets.append(["Techno",
  303. 0, 8, 5.6, 0, -5.6, -4.8, 0, 8, 9.6, 9.6, 8.8])