class AudioMonitorCore(dbus.service.Object): def __init__(self, *args): dbus.service.Object.__init__(self, *args) # State Variables self.playing = False self.audioChan = 0x20; self.selectedAudioChan = self.audioChan self.subChan = 0; #most likely will refere to a tetrode sub-channel self.selectedSubChan = self.subChan self.eio = NetEventIO("10.0.0.2") # AudioControl Event Constants setup on 10/13/08 self.AUDIO_EVENT_CMD = 0x12 self.ENABLE_AUDIO_EVENTS = 1 self.DISABLE_AUDIO_EVENTS = 0 self.AUDIO_REQUEST = 0 self.AUDIO_UPDATE = 1 #Create GST elements - pipeline will not be created gobject.type_register(SomaAudioEventFilter) self.eventSource = gst.element_factory_make('somaeventsource', "SomaEventSource") self.audioEventFilter = SomaAudioEventFilter() self.AUDIO_SINK = "pulsesink" self.audioSink = gst.element_factory_make(self.AUDIO_SINK) self.audioConverter = gst.element_factory_make("audioconvert") self.audioResampler= gst.element_factory_make("audioresample") self.queue = gst.element_factory_make("queue") self.pipeline = None def setChannel(self, src): print "setting Channel to:", src self.selectedAudioChan = src def getChannel(self): return self.audioChan def setSubChannel(self, chan): print "stting SubChannel to:", chan self.selectedSubChan = chan def getSubChannel(self): return self.subChan def startPlaying(self): if self.pipeline == None: self.__createNewPipeline() print "Create Pipeline" print "Play Pipeline" self.pipeline.set_state(gst.STATE_PLAYING) def stopPlaying(self): print "Destroy Pipeline" if self.pipeline != None: self.pipeline.set_state(gst.STATE_NULL) self.pipeline = None # ----- Private Methods, Pipeline control, Event Transmission, and looping def __createNewPipeline(self): self.pipeline = gst.Pipeline() self.audioEventFilter.set_audio_src(self.audioChan) self.pipeline.add(self.eventSource, self.audioEventFilter) self.pipeline.add(self.queue, self.audioConverter, self.audioResampler) self.pipeline.add(self.audioSink) gst.element_link_many(self.eventSource, self.audioEventFilter,self.queue, self.audioConverter, self.audioResampler, self.audioSink) def __loop(self): if self.audioChan != self.selectedAudioChan: changeSource() if self.subChan != self.selectedSubChan: changeSource() self.processEvents(self.eio.getEvents(), False) def changeSource(self): self.stopPlaying() self.disableCurrentSource() self.enableDesiredSource() if self.playing==True: self.startPlaying() def disableCurrentSource(self): e = self.disableEvent() self.eio.addRxMask(self.AUDIO_EVENT_CMD, self.audioChan) ea = eaddr.TXDest() ea[self.audioChan] = 1 self.eio.sendEvent(e, ea) # Send the disable Event self.processEvents(self.eio.getEvents(), True) # Act when the disable Event is echoed back ea[self.audioChan] = 0 self.playing = False def enableDesiredSource(self): self.eio.addRxMask(self.AUDIO_EVENT_CMD, self.selectedAudioChan, True) e = self.enableEvent() ea[self.selectedAudioChan] = 0 self.eio.sendEvent(e, ea) # Send the enable event self.processEvents(self.eio.getEvents(), True) # Act when the enable Event is echoed back def processEvents(self, events, active): for e in events: src = e.src if unpack('>H', e.data[0])[0] == 1: #Reporting a Change if unpack('>H', e.data[1])[0] == 0: #Device has been disabled if src==self.audioChan: self.stopPlaying() if active==False: # if the source wasn't actively changed re-enable it self.enableDesiredSource() if unpack('>H', e.data[1])[0] == 1: #Device has been enabled if src==self.selectedAudioChan: self.audioChan = self.selectedAudioChan #selected chan is playing make def disableEvent(self): e = Event() e.cmd = self.AUDIO_EVENT_CMD e.src = eaddr.NETWORK e.data[0] = pack('>H', 0) #Requesting Change e.data[1] = pack('>H', 0) #Set Channel to Off return e def enableEvent(self): e = Event() e.cmd = self.AUDIO_EVENT_CMD e.src = eaddr.NETWORK e.data[0] = pack('>H', 0) #Requesting Change e.data[1] = pack('>H', 1) #Set Channel to On e.data[2] = pack('>H', self.selectedSubChan) e.data[3] = pack('>H', 32000) return e # ---------- DBus Methods @dbus.service.method("soma.audio.AudioMonitor") def start_playing(self): print "DBus call to start audio monitor" self.startPlaying() @dbus.service.method("soma.audio.AudioMonitor") def stop_playing(self): print "DBus call to pause audio monitor" self.stopPlaying() @dbus.service.method("soma.audio.AudioMonitor", in_signature='i') def set_audio_channel(self, src): print src self.setChannel(src) @dbus.service.method("soma.audio.AudioMonitor", out_signature='i') def get_audio_channel(self): return self.getChannel() @dbus.service.method("soma.audio.AudioMonitor", in_signature='i') def set_sub_channel(self, src): self.setSubChannel(src) @dbus.service.method("soma.audio.AudioMonitor", out_signature='i') def get_sub_channel(self): return self.getSubChannel() @dbus.service.method("soma.audio.AudioMonitor", out_signature='b') def get_playing_state(self): return self.playing