Exemple #1
0
 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
Exemple #2
0
 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)
Exemple #3
0
 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
Exemple #4
0
 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
Exemple #5
0
 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()
Exemple #6
0
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