Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Speak.activity/audio.py
diff options
context:
space:
mode:
authorJoshua Minor <j@lux.vu>2007-12-22 00:23:11 (GMT)
committer Joshua Minor <j@lux.vu>2007-12-22 00:23:11 (GMT)
commit81c32d12cf7ef1619a518a97a93acc994cba031e (patch)
treee8d5574a97cad8f90e668a791af0dc4e26cfebda /Speak.activity/audio.py
Initial version of Speak.activity
Diffstat (limited to 'Speak.activity/audio.py')
-rw-r--r--Speak.activity/audio.py147
1 files changed, 147 insertions, 0 deletions
diff --git a/Speak.activity/audio.py b/Speak.activity/audio.py
new file mode 100644
index 0000000..278f9a6
--- /dev/null
+++ b/Speak.activity/audio.py
@@ -0,0 +1,147 @@
+import pygst
+pygst.require("0.10")
+import gst
+import pygtk
+import gtk, gobject
+import signal, os
+
+import time
+
+import dbus
+
+import audioop
+
+from struct import *
+
+
+
+class AudioGrab(gobject.GObject):
+ __gsignals__ = {
+ 'new-buffer': (gobject.SIGNAL_RUN_FIRST, None, [gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN, gobject.TYPE_PYOBJECT])
+ }
+
+ def __init__(self, datastore, _jobject):
+ gobject.GObject.__init__(self)
+
+ self.wave_copy= None
+ self.electrical_ui_copy= None
+
+ self.datastore = datastore
+ self._jobject = _jobject
+
+ self.pipeline = None
+ self.fakesink = None
+
+ self.logging_status = False
+ self.count1 = 48000/9600
+ self.final_count = 0
+
+ self.count_temp = 0
+ self.entry_count = 0
+
+ self.draw_graph_status = False
+ self.f = None
+
+ self.temp_buffer = []
+ self.snapshot_buffer = []
+
+ def playfile(self, filename):
+ p = 'filesrc name=file-source ! decodebin ! tee name=tee tee.! audioconvert ! alsasink tee.! queue ! audioconvert name=conv'
+ self.pipeline = gst.parse_launch(p)
+
+ self.fakesink = gst.element_factory_make("fakesink", "fakesink")
+ self.fakesink.connect("handoff",self.on_buffer)
+ self.fakesink.set_property("signal-handoffs",True)
+ self.pipeline.add(self.fakesink)
+
+ conv = self.pipeline.get_by_name("conv")
+ gst.element_link_many(conv, self.fakesink)
+
+ self.pipeline.get_by_name("file-source").set_property('location', filename)
+ self.pipeline.set_state(gst.STATE_PLAYING)
+
+ def disable_handoff_signal(self):
+ self.fakesink.set_property("signal-handoffs",False)
+
+ def enable_handoff_signal(self):
+ self.fakesink.set_property("signal-handoffs",True)
+
+ def on_quit(self):
+ self.fakesink.set_property("signal-handoffs",False)
+ self.pipeline.set_state(gst.STATE_NULL)
+
+ def _new_buffer(self, buf):
+ # on the main thread
+
+ if(self.logging_status == True):
+
+ if(self.final_count==777700): #777700 is a special value for indicating 'Snapshot'
+ #buffer_temp = unpack( str(int(len(self.temp_buffer))/2)+'h' , self.temp_buffer)
+ for val in self.snapshot_buffer:
+ self.f.write(str(val)+'\n') #Write the latest buffer
+ self.f.write("stop")
+ self.f.close()
+ self.datastore.write(self._jobject)
+ self.logging_status=False
+
+ else:
+ self.count_temp+=1
+
+ if(self.count_temp==self.final_count):
+ self.count_temp=0
+ write_buffer = unpack( str(int(len(buf))/2)+'h' , buf)
+ self.f.write(str(write_buffer[int(len(buf)/4.0)])+'\n') #Writing the middle value of the buffer available at each logging time
+ self.entry_count+=1
+
+
+ self.emit("new-buffer", buf, self.draw_graph_status, self.f)
+ return False
+
+
+ def on_buffer(self,element,buffer,pad):
+ # could be in a different thread
+ #print len(str(buffer))
+ gobject.timeout_add(30, self._new_buffer, str(buffer))
+ #gobject.idle_add(self._new_buffer, str(buffer))
+ return True
+
+
+ def set_logging_status(self, status, f, multiplier):
+ self.logging_status = status
+
+ if(status==True):
+ self.f = f
+ self.final_count = (multiplier*(48000/960)*2)
+ self.count_temp=0
+ self.entry_count=0
+
+ if(status==False):
+ self.f.write("stop")
+ self.f.close()
+ self.datastore.write(self._jobject)
+ self.logging_status=False
+
+
+ def start_drawing_graph(self, status, f):
+ self.draw_graph_status = status
+ if(self.draw_graph_status==True):
+ self.f = f
+ return
+
+ def snapshot(self):
+ self.snapshot_buffer = self.wave_copy.buffers
+ return
+
+ def set_wave_copy(self, wave):
+ self.wave_copy = wave
+ return
+
+ def set_reference_electrical(self,electrical_ui):
+ self.electrical_ui_copy=electrical_ui
+
+ def stop_sound_device(self):
+ self.pipeline.set_state(gst.STATE_NULL)
+
+ def restart_sound_device(self):
+ self.pipeline.set_state(gst.STATE_PLAYING)
+