#!/usr/bin/env python2.5 # # Copyright (c) 2011 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # # ============================================================================ # Name : MeHear.py # Author : Esa-Petri and Hilmi # Version : 0.1 # Description : MeHear Maemo hearing aid program # ============================================================================ from optparse import OptionParser from time import sleep import sys, os, time import pygtk, gtk, gobject import hildon import dbus, gst, pygst Volume=100 Cratio=10 class Record(): mic = None def __init__(self, sink): """ @summary: The Constructor class, that searches for the microphone on initialization """ bus = dbus.SystemBus() hal_manager = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") hal_manager = dbus.Interface(hal_manager, "org.freedesktop.Hal.Manager") print hal_manager devices = hal_manager.FindDeviceStringMatch("alsa.type", "capture") identifiers = [] for dev in devices: device = bus.get_object("org.freedesktop.Hal", dev) card = device.GetAllProperties(dbus_interface="org.freedesktop.Hal.Device") if card["alsa.card"] not in identifiers: print "%d. %s" % (card["alsa.card"], card["alsa.card_id"]) identifiers.append(card["alsa.card"]) self.mic = identifiers[0] """ @attention: this is important it initializes softfare playtrought (audioconvert is not nesesity) @summary: takes stream from mic to autosink notice volume or compression ratio is not changable after program strats as they aare in constructor of main window(MeHear) """ self.pipeline = gst.parse_launch("""alsasrc device=hw:%d ! volume %d !audiodynamic ratio=%d ! autoaudiosink location=%s""" % (self.mic, Volume, Cratio, sink)) def rec(self): """ @summary: sets recording on """ self.pipeline.set_state(gst.STATE_PLAYING) print "" print "recording started" def stoprec(self): """ @summary: sets recording off """ self.pipeline.set_state(gst.STATE_NULL) print "" print "recording, stoped" class player(): def __init__(self): """ @summary: player part """ self.player = gst.element_factory_make("playbin2", "player") fakesink = gst.element_factory_make("fakesink", "fakesink") self.player.set_property("video-sink", fakesink) self.audiosink = gst.element_factory_make("autoaudiosink", "audio-output") """ @attention: intance of record class is created here and gstreamer started. """ self.recorder=Record(self.audiosink) """ @attention: next links raw data from mic to player mekanism of gstreamer """ self.player.set_property("audio-sink",self.audiosink) self.playmode = True bus = self.player.get_bus() bus.add_signal_watch() bus.connect("message", self.on_message) def on_message(self, bus, message): t = message.type if t == gst.MESSAGE_EOS: self.player.set_state(gst.STATE_NULL) self.playmode = False elif t == gst.MESSAGE_ERROR: self.player.set_state(gst.STATE_NULL) err, debug = message.parse_error() print "Error: %s" % err, debug self.playmode = False def play(self): self.recorder.rec() self.player.set_state(gst.STATE_PLAYING) print "playing" def stop(self): #self.playmode = False self.player.set_state(gst.STATE_NULL) self.recorder.stoprec() print "stoped" class MeHear(hildon.Program): def __init__(self): """ @summary: creates an intance of pleyer class and that why starts also gsteamer """ self.pl= player() def addvol_button_clicked(self, button, label, sm): #this changes the value of adjustment and thats why changes also progress bars value as it is linked to adjesment a=self.adjus.get_value() self.adjus.set_value(a+10) volume=a+10 print "volume %d"%(a+10) def decvol_button_clicked(self, button, label, sm): #this changes the value of adjustment and thats why changes also progress bars value as it is linked to adjesment a=self.adjus.get_value() self.adjus.set_value(a-10) volume=a-10 print "volume %d"%(a-10) def amplify_button_clicked(self, button, label): buttontext = button.get_label() text = buttontext if text == "AMPlify" : label.set_text("") button.set_label("Stop") self.pl.play() print "play button pressed" if text == "Stop" : label.set_text("Stopped") button.set_label("AMPlify") self.pl.stop() print "stop button pressed" def main(self): # place where fin info about pygtk http://www.pygtk.org/pygtk2tutorial/ win = hildon.StackableWindow() # Create and pack labels vbox = gtk.VBox(False, 10) hbox3 = gtk.HBox(False, 10) hbox2 = gtk.HBox(False, 10) hbox = gtk.HBox(False, 10) #interface.. buttons, labels ,... etc labelHeader = gtk.Label("MeHear") labelSubHeader = gtk.Label("voice amplifier") self.adjus = gtk.Adjustment(value=60, lower=0, upper=100, step_incr=1, page_incr=0, page_size=0) # Create the ProgressBar self.pbar = gtk.ProgressBar(adjustment=self.adjus) self. pbar.set_fraction(0.99) self.addvol = gtk.Button("+") self.addvol.connect("clicked", self.addvol_button_clicked, labelSubHeader,0.20) self.decvol = gtk.Button("-") self.decvol.connect("clicked", self.decvol_button_clicked, labelSubHeader,0.11) buttonGTK = gtk.ToggleButton("AMPlify") buttonGTK.connect("clicked", self.amplify_button_clicked, labelSubHeader) self.ratiotext= gtk.Label("Ratio:") #http://www.pygtk.org/pygtk2tutorial/sec-ComboWidget.html combo = gtk.Combo() combo.entry.set_text("Compresion") slist = [ "1", "3", "5", "10","15","20" ] combo.set_popdown_strings(slist) hbox.pack_start(buttonGTK, True, True, 0) vbox.pack_start(labelHeader, True, True, 0) vbox.pack_start(labelSubHeader, True, True, 0) self.volumetext= gtk.Label("Volume:") hbox3.pack_start(self.ratiotext, True, True, 0) hbox3.pack_start(combo, True, True, 0) hbox2.pack_start(self.decvol, True, True, 0) hbox2.pack_start(self.pbar, True, True, 0) hbox2.pack_start(self.addvol, True, True, 0) vbox.pack_start(hbox3, True, True, 0) vbox.pack_start(self.volumetext,True,False,0) vbox.pack_start(hbox2, True, True, 0) vbox.pack_start(hbox, True, True, 0) # Add label's box to window win.add(vbox) win.connect("delete_event", gtk.main_quit) win.show_all() gtk.main() if __name__ == "__main__": app = MeHear() app.main() #EOF