예제 #1
0
    def __init__(self, session, audio_stream):
        self.session = session
        self.stream = audio_stream
        self.start_time = None

        notification_center = NotificationCenter()
        notification_center.add_observer(self, sender=self.stream)

        self.beep = WavePlayer(SIPApplication.voice_audio_mixer,
                               Resources.get('answering_machine_tone.wav'))
        notification_center.add_observer(self, sender=self.beep)

        message_wav = SIPSimpleSettings().answering_machine.unavailable_message
        if message_wav:
            self.unavailable_message = WavePlayer(
                SIPApplication.voice_audio_mixer, message_wav.sound_file.path,
                message_wav.sound_file.volume, 1, 2, False)
            notification_center.add_observer(self,
                                             sender=self.unavailable_message)
            self.stream.bridge.add(self.unavailable_message)
        else:
            self.unavailable_message = None
            self.stream.bridge.add(self.beep)

        self.stream.device.input_muted = True
예제 #2
0
 def _play(self):
     config = get_config(
         '%s@%s' %
         (self.session.request_uri.user, self.session.request_uri.host))
     if config is None:
         config = get_config('%s' % self.session.request_uri.user)
     try:
         audio_stream = next(stream for stream in self.session.streams
                             if stream.type == 'audio')
     except StopIteration:
         self.proc = None
         return
     player = WavePlayer(audio_stream.mixer, config.file)
     audio_stream.bridge.add(player)
     log.info(u'Playing file %s for session %s' %
              (config.file, self.session.call_id))
     try:
         player.play().wait()
     except (ValueError, WavePlayerError) as e:
         log.warning(u'Error playing file %s: %s' % (config.file, e))
     except proc.ProcExit:
         pass
     finally:
         player.stop()
         self.proc = None
         audio_stream.bridge.remove(player)
         self.session.end()
         self.session = None
예제 #3
0
 def capture(self):
     try:
         self.image = self.vncclient.image.copy()
     except AttributeError:
         pass
     else:
         player = WavePlayer(SIPApplication.alert_audio_bridge.mixer, Resources.get('sounds/screenshot.wav'), volume=30)
         SIPApplication.alert_audio_bridge.add(player)
         player.start()
예제 #4
0
 def play_audio_welcome(self, welcome_prompt):
     try:
         audio_stream = next(stream for stream in self.session.streams
                             if stream.type == 'audio')
     except StopIteration:
         return
     player = WavePlayer(audio_stream.mixer,
                         '',
                         pause_time=1,
                         initial_delay=1,
                         volume=50)
     audio_stream.bridge.add(player)
     try:
         if welcome_prompt:
             file = Resources.get('sounds/co_welcome_conference.wav')
             self.play_file_in_player(player, file, 1)
         user_count = len({
             str(s.remote_identity.uri)
             for s in self.room.sessions
             if s.remote_identity.uri != self.session.remote_identity.uri
             and any(stream
                     for stream in s.streams if stream.type == 'audio')
         })
         if user_count == 0:
             file = Resources.get('sounds/co_only_one.wav')
             self.play_file_in_player(player, file, 0.5)
         elif user_count == 1:
             file = Resources.get('sounds/co_there_is_one.wav')
             self.play_file_in_player(player, file, 0.5)
         elif user_count < 100:
             file = Resources.get('sounds/co_there_are.wav')
             self.play_file_in_player(player, file, 0.2)
             if user_count <= 24:
                 file = Resources.get('sounds/bi_%d.wav' % user_count)
                 self.play_file_in_player(player, file, 0.1)
             else:
                 file = Resources.get('sounds/bi_%d0.wav' %
                                      (user_count / 10))
                 self.play_file_in_player(player, file, 0.1)
                 file = Resources.get('sounds/bi_%d.wav' %
                                      (user_count % 10))
                 self.play_file_in_player(player, file, 0.1)
             file = Resources.get('sounds/co_more_participants.wav')
             self.play_file_in_player(player, file, 0)
         file = Resources.get('sounds/connected_tone.wav')
         self.play_file_in_player(player, file, 0.1)
     except proc.ProcExit:
         # No need to remove the bridge from the stream, it's done automatically
         pass
     else:
         audio_stream.bridge.remove(player)
         self.room.audio_conference.add(audio_stream)
         self.room.audio_conference.unhold()
     finally:
         player.stop()
예제 #5
0
    def play_hangup(self):
        settings = SIPSimpleSettings()

        if settings.audio.silent:
            return

        if time.time(
        ) - self.last_hangup_tone_time > HANGUP_TONE_THROTLE_DELAY:
            hangup_tone = WavePlayer(SIPApplication.voice_audio_mixer,
                                     Resources.get('hangup_tone.wav'),
                                     volume=30)
            NotificationCenter().add_observer(self,
                                              sender=hangup_tone,
                                              name="WavePlayerDidEnd")
            SIPApplication.voice_audio_bridge.add(hangup_tone)
            hangup_tone.start()
            self.last_hangup_tone_time = time.time()
예제 #6
0
 def _NH_SIPSessionDidStart(self, notification):
     log.msg('Session started')
     session = notification.sender
     audio_stream = session.streams[0]
     prompt = os.path.realpath(
         os.path.join(os.path.dirname(__file__), 'jamesbond.wav'))
     player = WavePlayer(audio_stream.mixer,
                         prompt,
                         pause_time=1,
                         initial_play=False)
     audio_stream.bridge.add(player)
     try:
         player.play().wait()
     except WavePlayerError:
         pass
     audio_stream.bridge.remove(player)
     session.end()
예제 #7
0
 def _play(self):
     config = get_config(
         '%s@%s' %
         (self.session.request_uri.user, self.session.request_uri.host))
     if config is None:
         config = get_config('%s' % self.session.request_uri.user)
     try:
         audio_stream = next(stream for stream in self.session.streams
                             if stream.type == 'audio')
     except StopIteration:
         self.proc = None
         return
     player = WavePlayer(audio_stream.mixer, config.file)
     audio_stream.bridge.add(player)
     log.msg(u"Playing file %s for session %s" %
             (config.file, self.session.call_id))
     try:
         player.play().wait()
     except (ValueError, WavePlayerError), e:
         log.warning(u"Error playing file %s: %s" % (config.file, e))
예제 #8
0
    def update_ringtones(self, account=None):
        settings = SIPSimpleSettings()

        if account is None:
            account = AccountManager().default_account

        app = SIPApplication()

        def change_tone(name, new_tone):
            current = getattr(self, name)
            if current and current.is_active:
                current.stop()
                if new_tone:
                    new_tone.start()
            setattr(self, name, new_tone)

        change_tone(
            "initial_hold_tone",
            WavePlayer(app.voice_audio_mixer,
                       Resources.get('hold_tone.wav'),
                       volume=10))
        app.voice_audio_bridge.add(self.initial_hold_tone)
        change_tone(
            "secondary_hold_tone",
            WavePlayer(app.voice_audio_mixer,
                       Resources.get('hold_tone.wav'),
                       loop_count=0,
                       pause_time=45,
                       volume=10,
                       initial_delay=45))
        app.voice_audio_bridge.add(self.secondary_hold_tone)

        if account:
            audio_primary_ringtone = account.sounds.audio_inbound.sound_file if account.sounds.audio_inbound is not None else None
        else:
            audio_primary_ringtone = None

        if audio_primary_ringtone and not settings.audio.silent:
            # Workaround not to use same device from two bridges. -Saul
            if settings.audio.alert_device is not None and app.alert_audio_mixer.real_output_device == app.voice_audio_mixer.real_output_device:
                new_tone = WavePlayer(app.voice_audio_mixer,
                                      audio_primary_ringtone.path,
                                      loop_count=0,
                                      pause_time=6)
                app.voice_audio_bridge.add(new_tone)
            else:
                new_tone = WavePlayer(app.alert_audio_mixer,
                                      audio_primary_ringtone.path,
                                      loop_count=0,
                                      pause_time=6)
                app.alert_audio_bridge.add(new_tone)
        else:
            new_tone = None
        change_tone("audio_primary_ringtone", new_tone)

        if audio_primary_ringtone and not settings.audio.silent:
            new_tone = WavePlayer(app.voice_audio_mixer,
                                  Resources.get('ring_tone.wav'),
                                  loop_count=0,
                                  pause_time=6)
            app.voice_audio_bridge.add(new_tone)
        else:
            new_tone = None
        change_tone("audio_secondary_ringtone", new_tone)

        if audio_primary_ringtone and not settings.audio.silent:
            # Workaround not to use same device from two bridges. -Saul
            if settings.audio.alert_device is not None and app.alert_audio_mixer.real_output_device == app.voice_audio_mixer.real_output_device:
                new_tone = WavePlayer(app.voice_audio_mixer,
                                      Resources.get('ring_tone.wav'),
                                      loop_count=0,
                                      pause_time=6)
                app.voice_audio_bridge.add(new_tone)
            else:
                new_tone = WavePlayer(app.alert_audio_mixer,
                                      Resources.get('ring_tone.wav'),
                                      loop_count=0,
                                      pause_time=6)
                app.alert_audio_bridge.add(new_tone)
        else:
            new_tone = None
        change_tone("chat_primary_ringtone", new_tone)

        if audio_primary_ringtone and not settings.audio.silent:
            new_tone = WavePlayer(app.voice_audio_mixer,
                                  Resources.get('ring_tone.wav'),
                                  loop_count=0,
                                  pause_time=6)
            app.voice_audio_bridge.add(new_tone)
        else:
            new_tone = None
        change_tone("chat_secondary_ringtone", new_tone)

        chat_message_outgoing_sound = settings.sounds.message_sent
        if chat_message_outgoing_sound and not settings.audio.silent:
            new_tone = WavePlayer(app.voice_audio_mixer,
                                  chat_message_outgoing_sound.path,
                                  volume=chat_message_outgoing_sound.volume)
            app.voice_audio_bridge.add(new_tone)
        else:
            new_tone = None
        change_tone("chat_message_outgoing_sound", new_tone)

        chat_message_incoming_sound = settings.sounds.message_received
        if chat_message_incoming_sound and not settings.audio.silent:
            new_tone = WavePlayer(app.voice_audio_mixer,
                                  chat_message_incoming_sound.path,
                                  volume=chat_message_incoming_sound.volume)
            app.voice_audio_bridge.add(new_tone)
        else:
            new_tone = None
        change_tone("chat_message_incoming_sound", new_tone)

        file_transfer_outgoing_sound = settings.sounds.file_sent
        if file_transfer_outgoing_sound and not settings.audio.silent:
            new_tone = WavePlayer(app.voice_audio_mixer,
                                  file_transfer_outgoing_sound.path,
                                  volume=file_transfer_outgoing_sound.volume)
            app.voice_audio_bridge.add(new_tone)
        else:
            new_tone = None
        change_tone("file_transfer_outgoing_sound", new_tone)

        file_transfer_incoming_sound = settings.sounds.file_received
        if file_transfer_incoming_sound and not settings.audio.silent:
            new_tone = WavePlayer(app.voice_audio_mixer,
                                  file_transfer_incoming_sound.path,
                                  volume=file_transfer_incoming_sound.volume)
            app.voice_audio_bridge.add(new_tone)
        else:
            new_tone = None
        change_tone("file_transfer_incoming_sound", new_tone)