def _release_media_transport(self, path, access_type): """ Should be called by subclass when it is finished with the media transport file descriptor """ try: os.close(self.fd) # Clean-up previously taken fd transport = BTMediaTransport(path=path) transport.release(access_type) except: pass
def _notify_media_transport_available(self, path, transport): """ Called by the endpoint when a new media transport is available """ print("Transport available! transport=%s" % transport) self.source = BTMediaTransport(transport) self.state = 'idle' self.source.add_signal_receiver( self._property_change_event_handler, BTAudioSource.SIGNAL_PROPERTY_CHANGED, # noqa transport)
def _acquire_media_transport(self, path, access_type): """ Should be called by subclass when it is ready to acquire the media transport file descriptor """ transport = BTMediaTransport(path=path) (fd, read_mtu, write_mtu) = transport.acquire(access_type) self.fd = fd.take() # We must do the clean-up later self.write_mtu = write_mtu self.read_mtu = read_mtu self.access_type = access_type self.path = path
def _release_media_transport(self, path, access_type): """ Should be called by subclass when it is finished with the media transport file descriptor """ try: self._uninstall_transport_ready() os.close(self.fd) # Clean-up previously taken fd transport = BTMediaTransport(path=path) transport.release(access_type) except: pass
def _acquire_media_transport(self, path, access_type): """ Should be called by subclass when it is ready to acquire the media transport file descriptor """ transport = BTMediaTransport(path=path) (fd, read_mtu, write_mtu) = transport.acquire(access_type) self.fd = fd.take() # We must do the clean-up later self.write_mtu = write_mtu self.read_mtu = read_mtu self.access_type = access_type self.path = path self._install_transport_ready()
class SBCAudioSink(SBCAudioCodec): """ SBC audio sink media endpoint SBCAudioSink implies the BT adapter takes on the role of a sink and the external device is the source e.g., iPhone, media player. Refer to :py:class:`SBCAudioCodec` for basic overview of endpoint steps """ def __init__(self, path='/endpoint/a2dpsink'): uuid = dbus.String(SERVICES['AudioSink'].uuid) SBCAudioCodec.__init__(self, uuid, path) self.register_transport_ready_event(self._process_decoded, ()) def _property_change_event_handler(self, signal, transport, *args): """ Handler for property change event. We catch certain state transitions in order to trigger media transport acquisition/release """ new_properties = args[1] for k in new_properties.keys(): if k == 'State': self._state_changed(new_properties[k], transport) elif k == 'Volume': self.volume(new_properties[k]) def _state_changed(self, new_state, transport): if (self.state == 'idle' and new_state == 'pending'): self._acquire_media_transport(transport, 'r') self.start() elif (self.state == 'active' and new_state == 'idle'): self._release_media_transport(transport, 'r') self.stop() print("State changed from %s to %s." % (self.state, new_state)) self.state = new_state def _notify_media_transport_available(self, path, transport): """ Called by the endpoint when a new media transport is available """ print("Transport available! transport=%s" % transport) self.source = BTMediaTransport(transport) self.state = 'idle' self.source.add_signal_receiver( self._property_change_event_handler, BTAudioSource.SIGNAL_PROPERTY_CHANGED, # noqa transport) def _process_decoded(self, args): self.raw_audio(self.read_transport()) def raw_audio(self, data): pass def start(self): pass def stop(self): pass def volume(self, new_volume): pass