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
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
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()
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()
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()
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()
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))
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)