def __init__(self):
        self.bridge = RootAudioBridge(SIPApplication.voice_audio_mixer)
        self.device = AudioDevice(SIPApplication.voice_audio_mixer)
        self.on_hold = False
        self.streams = []
        self._lock = RLock()

        self.bridge.add(self.device)
Пример #2
0
    def _initialize_subsystems(self):
        notification_center = NotificationCenter()

        with self._lock:
            stop_pending = self._stop_pending
            if stop_pending:
                self.state = 'stopping'
        if stop_pending:
            notification_center.post_notification('SIPApplicationWillEnd',
                                                  sender=self)
            # stop the subsystems we already started: threads, engine and reactor
            self.engine.stop()
            self.engine.join(timeout=5)
            thread_manager = ThreadManager()
            thread_manager.stop()
            reactor.stop()
            return

        account_manager = AccountManager()
        addressbook_manager = AddressbookManager()
        dns_manager = DNSManager()
        session_manager = SessionManager()
        settings = SIPSimpleSettings()

        xcap_client.DEFAULT_HEADERS = {'User-Agent': settings.user_agent}

        # initialize TLS
        self._initialize_tls()

        # initialize PJSIP internal resolver
        self.engine.set_nameservers(dns_manager.nameservers)

        # initialize audio objects
        alert_device = settings.audio.alert_device
        if alert_device not in (
                None, 'system_default'
        ) and alert_device not in self.engine.output_devices:
            alert_device = 'system_default'
        input_device = settings.audio.input_device
        if input_device not in (
                None, 'system_default'
        ) and input_device not in self.engine.input_devices:
            input_device = 'system_default'
        output_device = settings.audio.output_device
        if output_device not in (
                None, 'system_default'
        ) and output_device not in self.engine.output_devices:
            output_device = 'system_default'
        tail_length = settings.audio.echo_canceller.tail_length if settings.audio.echo_canceller.enabled else 0
        voice_mixer = AudioMixer(input_device, output_device,
                                 settings.audio.sample_rate, tail_length)
        voice_mixer.muted = settings.audio.muted
        self.voice_audio_device = AudioDevice(voice_mixer)
        self.voice_audio_bridge = RootAudioBridge(voice_mixer)
        self.voice_audio_bridge.add(self.voice_audio_device)
        alert_mixer = AudioMixer(None, alert_device,
                                 settings.audio.sample_rate, 0)
        if settings.audio.silent:
            alert_mixer.output_volume = 0
        self.alert_audio_device = AudioDevice(alert_mixer)
        self.alert_audio_bridge = RootAudioBridge(alert_mixer)
        self.alert_audio_bridge.add(self.alert_audio_device)

        settings.audio.input_device = voice_mixer.input_device
        settings.audio.output_device = voice_mixer.output_device
        settings.audio.alert_device = alert_mixer.output_device

        # initialize video
        self.video_device = VideoDevice(settings.video.device,
                                        settings.video.resolution,
                                        settings.video.framerate)
        self.video_device.muted = settings.video.muted
        settings.video.device = self.video_device.name
        self.engine.set_video_options(settings.video.resolution,
                                      settings.video.framerate,
                                      settings.video.max_bitrate)
        self.engine.set_h264_options(settings.video.h264.profile,
                                     settings.video.h264.level)

        # initialize instance id
        if not settings.instance_id:
            settings.instance_id = uuid4().urn

        # initialize path for ZRTP cache file
        if ISIPSimpleApplicationDataStorage.providedBy(self.storage):
            self.engine.zrtp_cache = os.path.join(self.storage.directory,
                                                  'zrtp.db')

        # save settings in case something was modified during startup
        settings.save()

        # initialize middleware components
        dns_manager.start()
        account_manager.start()
        addressbook_manager.start()
        session_manager.start()

        notification_center.add_observer(self,
                                         name='CFGSettingsObjectDidChange')
        notification_center.add_observer(self, name='DNSNameserversDidChange')
        notification_center.add_observer(self, name='SystemIPAddressDidChange')
        notification_center.add_observer(self, name='SystemDidWakeUpFromSleep')

        with self._lock:
            self.state = 'started'
            stop_pending = self._stop_pending

        notification_center.post_notification('SIPApplicationDidStart',
                                              sender=self)

        if stop_pending:
            self.stop()
Пример #3
0
    def _NH_CFGSettingsObjectDidChange(self, notification):
        settings = SIPSimpleSettings()
        account_manager = AccountManager()

        try:
            if notification.sender is settings:
                if 'audio.sample_rate' in notification.data.modified:
                    alert_device = settings.audio.alert_device
                    if alert_device not in (
                            None, 'system_default'
                    ) and alert_device not in self.engine.output_devices:
                        alert_device = 'system_default'
                    input_device = settings.audio.input_device
                    if input_device not in (
                            None, 'system_default'
                    ) and input_device not in self.engine.input_devices:
                        input_device = 'system_default'
                    output_device = settings.audio.output_device
                    if output_device not in (
                            None, 'system_default'
                    ) and output_device not in self.engine.output_devices:
                        output_device = 'system_default'
                    tail_length = settings.audio.echo_canceller.tail_length if settings.audio.echo_canceller.enabled else 0
                    voice_mixer = AudioMixer(input_device, output_device,
                                             settings.audio.sample_rate,
                                             tail_length)
                    voice_mixer.muted = settings.audio.muted
                    self.voice_audio_device = AudioDevice(voice_mixer)
                    self.voice_audio_bridge = RootAudioBridge(voice_mixer)
                    self.voice_audio_bridge.add(self.voice_audio_device)
                    alert_mixer = AudioMixer(None, alert_device,
                                             settings.audio.sample_rate, 0)
                    self.alert_audio_device = AudioDevice(alert_mixer)
                    self.alert_audio_bridge = RootAudioBridge(alert_mixer)
                    self.alert_audio_bridge.add(self.alert_audio_device)
                    if settings.audio.silent:
                        alert_mixer.output_volume = 0
                    settings.audio.input_device = voice_mixer.input_device
                    settings.audio.output_device = voice_mixer.output_device
                    settings.audio.alert_device = alert_mixer.output_device
                    settings.save()
                else:
                    if {
                            'audio.input_device', 'audio.output_device',
                            'audio.alert_device',
                            'audio.echo_canceller.enabled',
                            'audio.echo_canceller.tail_length'
                    }.intersection(notification.data.modified):
                        input_device = settings.audio.input_device
                        if input_device not in (
                                None, 'system_default'
                        ) and input_device not in self.engine.input_devices:
                            input_device = 'system_default'
                        output_device = settings.audio.output_device
                        if output_device not in (
                                None, 'system_default'
                        ) and output_device not in self.engine.output_devices:
                            output_device = 'system_default'
                        tail_length = settings.audio.echo_canceller.tail_length if settings.audio.echo_canceller.enabled else 0
                        if (input_device, output_device,
                                tail_length) != attrgetter(
                                    'input_device', 'output_device',
                                    'ec_tail_length')(
                                        self.voice_audio_bridge.mixer):
                            self.voice_audio_bridge.mixer.set_sound_devices(
                                input_device, output_device, tail_length)
                            settings.audio.input_device = self.voice_audio_bridge.mixer.input_device
                            settings.audio.output_device = self.voice_audio_bridge.mixer.output_device
                            settings.save()
                        alert_device = settings.audio.alert_device
                        if alert_device not in (
                                None, 'system_default'
                        ) and alert_device not in self.engine.output_devices:
                            alert_device = 'system_default'
                        if alert_device != self.alert_audio_bridge.mixer.output_device:
                            self.alert_audio_bridge.mixer.set_sound_devices(
                                None, alert_device, 0)
                            settings.audio.alert_device = self.alert_audio_bridge.mixer.output_device
                            settings.save()
                    if 'audio.muted' in notification.data.modified:
                        self.voice_audio_bridge.mixer.muted = settings.audio.muted
                    if 'audio.silent' in notification.data.modified:
                        if settings.audio.silent:
                            self.alert_audio_bridge.mixer.output_volume = 0
                        else:
                            self.alert_audio_bridge.mixer.output_volume = 100
                if 'video.muted' in notification.data.modified:
                    self.video_device.muted = settings.video.muted
                if {'video.h264.profile', 'video.h264.level'
                    }.intersection(notification.data.modified):
                    self.engine.set_h264_options(settings.video.h264.profile,
                                                 settings.video.h264.level)
                if {
                        'video.device', 'video.resolution', 'video.framerate',
                        'video.max_bitrate'
                }.intersection(notification.data.modified):
                    if {'video.device', 'video.resolution', 'video.framerate'
                        }.intersection(
                            notification.data.modified
                        ) or settings.video.device != self.video_device.name:
                        self.video_device.set_camera(settings.video.device,
                                                     settings.video.resolution,
                                                     settings.video.framerate)
                        settings.video.device = self.video_device.name
                        settings.save()
                    self.engine.set_video_options(settings.video.resolution,
                                                  settings.video.framerate,
                                                  settings.video.max_bitrate)
                if 'user_agent' in notification.data.modified:
                    self.engine.user_agent = settings.user_agent
                if 'sip.udp_port' in notification.data.modified:
                    self.engine.set_udp_port(settings.sip.udp_port)
                if 'sip.tcp_port' in notification.data.modified:
                    self.engine.set_tcp_port(settings.sip.tcp_port)
                if {'sip.tls_port', 'tls.ca_list', 'default_account'
                    }.intersection(notification.data.modified):
                    self._initialize_tls()
                if 'rtp.port_range' in notification.data.modified:
                    self.engine.rtp_port_range = (
                        settings.rtp.port_range.start,
                        settings.rtp.port_range.end)
                if 'rtp.audio_codec_list' in notification.data.modified:
                    print(settings.rtp.audio_codec_list)
                    self.engine.codecs = list(
                        codec.encode()
                        for codec in settings.rtp.audio_codec_list)
                if 'rtp.video_codec_list' in notification.data.modified:
                    print(settings.rtp.video_codec_list)
                    self.engine.video_codecs = list(
                        codec.encode()
                        for codec in settings.rtp.video_codec_list)
                if 'logs.trace_sip' in notification.data.modified:
                    self.engine.trace_sip = settings.logs.trace_sip
                if {'logs.trace_pjsip', 'logs.pjsip_level'
                    }.intersection(notification.data.modified):
                    self.engine.log_level = settings.logs.pjsip_level if settings.logs.trace_pjsip else 0
            elif notification.sender is account_manager.default_account:
                if {'tls.verify_server', 'tls.certificate'
                    }.intersection(notification.data.modified):
                    self._initialize_tls()
        except (SIPCoreError, PJSIPError) as e:
            print('Error setting core option: %s' % str(e))
Пример #4
0
    def _initialize_subsystems(self):
        notification_center = NotificationCenter()

        with self._lock:
            stop_pending = self._stop_pending
            if stop_pending:
                self.state = 'stopping'
        if stop_pending:
            notification_center.post_notification('SIPApplicationWillEnd', sender=self)
            reactor.stop()
            return

        account_manager = AccountManager()
        dns_manager = DNSManager()
        session_manager = SessionManager()
        settings = SIPSimpleSettings()

        # Initialize default account
        default_account = DefaultAccount()
        account_manager.default_account = default_account

        # initialize TLS
        self._initialize_tls()

        # initialize PJSIP internal resolver
        self.engine.set_nameservers(['8.8.8.8'])

        # initialize audio objects
        voice_mixer = AudioMixer(None, None, settings.audio.sample_rate, 0, 9999)
        self.voice_audio_device = AudioDevice(voice_mixer)
        self.voice_audio_bridge = RootAudioBridge(voice_mixer)
        self.voice_audio_bridge.add(self.voice_audio_device)

        # initialize video objects
        self.video_device = VideoDevice(u'Colorbar generator', settings.video.resolution, settings.video.framerate)

        # initialize instance id
        settings.instance_id = uuid4().urn
        settings.save()

        # initialize ZRTP cache
        makedirs(ServerConfig.spool_dir.normalized)
        self.engine.zrtp_cache = os.path.join(ServerConfig.spool_dir.normalized, 'zrtp.db')

        # initialize middleware components
        dns_manager.start()
        account_manager.start()
        session_manager.start()

        notification_center.add_observer(self, name='CFGSettingsObjectDidChange')

        self.state = 'started'
        notification_center.post_notification('SIPApplicationDidStart', sender=self)

        # start SylkServer components
        self.web_server = WebServer()
        self.web_server.start()
        self.request_handler = IncomingRequestHandler()
        self.request_handler.start()
        if ThorNodeConfig.enabled:
            from sylk.interfaces.sipthor import ConferenceNode
            self.thor_interface = ConferenceNode()
            thor_roles = []
            if 'conference' in self.request_handler.application_registry:
                thor_roles.append('conference_server')
            if 'xmppgateway' in self.request_handler.application_registry:
                thor_roles.append('xmpp_gateway')
            if 'webrtcgateway' in self.request_handler.application_registry:
                thor_roles.append('webrtc_gateway')
            self.thor_interface.start(thor_roles)