Example #1
0
 def _run(self):
     notification_center = NotificationCenter()
     try:
         while True:
             command = self._channel.wait()
             if command.name == 'play':
                 self._wave_file = WaveFile(self.mixer, self.filename)
                 notification_center.add_observer(self, sender=self._wave_file, name='WaveFileDidFinishPlaying')
                 self._wave_file.volume = self.volume
                 try:
                     self._wave_file.start()
                 except SIPCoreError, e:
                     notification_center.post_notification('WavePlayerDidFail', sender=self, data=TimestampedNotificationData(error=e))
                     break
                 else:
                     if self._current_loop == 0:
                         notification_center.post_notification('WavePlayerDidStart', sender=self, data=TimestampedNotificationData())
                     notification_center.post_notification('AudioPortDidChangeSlots', sender=self, data=TimestampedNotificationData(consumer_slot_changed=False, producer_slot_changed=True,
                                                                                                                                    old_producer_slot=None, new_producer_slot=self._wave_file.slot))
             elif command.name == 'reschedule':
                 self._current_loop += 1
                 notification_center.remove_observer(self, sender=self._wave_file, name='WaveFileDidFinishPlaying')
                 self._wave_file = None
                 notification_center.post_notification('AudioPortDidChangeSlots', sender=self, data=TimestampedNotificationData(consumer_slot_changed=False, producer_slot_changed=True,
                                                                                                                                old_producer_slot=None, new_producer_slot=None))
                 if self.loop_count == 0 or self._current_loop < self.loop_count:
                     from twisted.internet import reactor
                     reactor.callLater(self.pause_time, self._channel.send, Command('play'))
                 else:
                     notification_center.post_notification('WavePlayerDidEnd', sender=self, data=TimestampedNotificationData())
                     break
             elif command.name == 'stop':
                 if self._wave_file is not None:
                     notification_center.remove_observer(self, sender=self._wave_file, name='WaveFileDidFinishPlaying')
                     self._wave_file.stop()
                     self._wave_file = None
                     notification_center.post_notification('AudioPortDidChangeSlots', sender=self, data=TimestampedNotificationData(consumer_slot_changed=False, producer_slot_changed=True,
                                                                                                                                    old_producer_slot=None, new_producer_slot=None))
                     notification_center.post_notification('WavePlayerDidEnd', sender=self, data=TimestampedNotificationData())
                 break
Example #2
0
 def _run(self):
     notification_center = NotificationCenter()
     try:
         while True:
             command = self._channel.wait()
             if command.name == 'play':
                 self._wave_file = WaveFile(self.mixer, self.filename)
                 notification_center.add_observer(
                     self,
                     sender=self._wave_file,
                     name='WaveFileDidFinishPlaying')
                 self._wave_file.volume = self.volume
                 try:
                     self._wave_file.start()
                 except SIPCoreError, e:
                     notification_center.post_notification(
                         'WavePlayerDidFail',
                         sender=self,
                         data=NotificationData(error=e))
                     raise WavePlayerError(e)
                 else:
                     if self._current_loop == 0:
                         notification_center.post_notification(
                             'WavePlayerDidStart', sender=self)
                     notification_center.post_notification(
                         'AudioPortDidChangeSlots',
                         sender=self,
                         data=NotificationData(
                             consumer_slot_changed=False,
                             producer_slot_changed=True,
                             old_producer_slot=None,
                             new_producer_slot=self._wave_file.slot))
             elif command.name == 'reschedule':
                 self._current_loop += 1
                 notification_center.remove_observer(
                     self,
                     sender=self._wave_file,
                     name='WaveFileDidFinishPlaying')
                 self._wave_file = None
                 notification_center.post_notification(
                     'AudioPortDidChangeSlots',
                     sender=self,
                     data=NotificationData(consumer_slot_changed=False,
                                           producer_slot_changed=True,
                                           old_producer_slot=None,
                                           new_producer_slot=None))
                 if self.loop_count == 0 or self._current_loop < self.loop_count:
                     reactor.callLater(self.pause_time, self._channel.send,
                                       Command('play'))
                 else:
                     notification_center.post_notification(
                         'WavePlayerDidEnd', sender=self)
                     break
             elif command.name == 'stop':
                 if self._wave_file is not None:
                     notification_center.remove_observer(
                         self,
                         sender=self._wave_file,
                         name='WaveFileDidFinishPlaying')
                     self._wave_file.stop()
                     self._wave_file = None
                     notification_center.post_notification(
                         'AudioPortDidChangeSlots',
                         sender=self,
                         data=NotificationData(consumer_slot_changed=False,
                                               producer_slot_changed=True,
                                               old_producer_slot=None,
                                               new_producer_slot=None))
                     notification_center.post_notification(
                         'WavePlayerDidEnd', sender=self)
                 break
Example #3
0
class WavePlayer(object):
    """
    An object capable of playing a WAV file. It can be used as part of an
    AudioBridge as it implements the IAudioPort interface.
    """

    implements(IAudioPort, IObserver)

    def __init__(self,
                 mixer,
                 filename,
                 volume=100,
                 loop_count=1,
                 pause_time=0,
                 initial_delay=0):
        self.mixer = mixer
        self.filename = filename
        self.initial_delay = initial_delay
        self.loop_count = loop_count
        self.pause_time = pause_time
        self.volume = volume
        self._channel = None
        self._current_loop = 0
        self._state = 'stopped'
        self._wave_file = None

    @property
    def is_active(self):
        return self._state == "started"

    @property
    def consumer_slot(self):
        return None

    @property
    def producer_slot(self):
        return self._wave_file.slot if self._wave_file else None

    def start(self):
        self.play()

    @run_in_twisted_thread
    def stop(self):
        if self._state != 'started':
            return
        self._channel.send(Command('stop'))

    @run_in_waitable_green_thread
    def play(self):
        if self._state != 'stopped':
            raise WavePlayerError('already playing')
        self._state = 'started'
        self._channel = coros.queue()
        self._current_loop = 0
        if self.initial_delay:
            reactor.callLater(self.initial_delay, self._channel.send,
                              Command('play'))
        else:
            self._channel.send(Command('play'))
        self._run().wait()

    @run_in_waitable_green_thread
    def _run(self):
        notification_center = NotificationCenter()
        try:
            while True:
                command = self._channel.wait()
                if command.name == 'play':
                    self._wave_file = WaveFile(self.mixer, self.filename)
                    notification_center.add_observer(
                        self,
                        sender=self._wave_file,
                        name='WaveFileDidFinishPlaying')
                    self._wave_file.volume = self.volume
                    try:
                        self._wave_file.start()
                    except SIPCoreError, e:
                        notification_center.post_notification(
                            'WavePlayerDidFail',
                            sender=self,
                            data=NotificationData(error=e))
                        raise WavePlayerError(e)
                    else:
                        if self._current_loop == 0:
                            notification_center.post_notification(
                                'WavePlayerDidStart', sender=self)
                        notification_center.post_notification(
                            'AudioPortDidChangeSlots',
                            sender=self,
                            data=NotificationData(
                                consumer_slot_changed=False,
                                producer_slot_changed=True,
                                old_producer_slot=None,
                                new_producer_slot=self._wave_file.slot))
                elif command.name == 'reschedule':
                    self._current_loop += 1
                    notification_center.remove_observer(
                        self,
                        sender=self._wave_file,
                        name='WaveFileDidFinishPlaying')
                    self._wave_file = None
                    notification_center.post_notification(
                        'AudioPortDidChangeSlots',
                        sender=self,
                        data=NotificationData(consumer_slot_changed=False,
                                              producer_slot_changed=True,
                                              old_producer_slot=None,
                                              new_producer_slot=None))
                    if self.loop_count == 0 or self._current_loop < self.loop_count:
                        reactor.callLater(self.pause_time, self._channel.send,
                                          Command('play'))
                    else:
                        notification_center.post_notification(
                            'WavePlayerDidEnd', sender=self)
                        break
                elif command.name == 'stop':
                    if self._wave_file is not None:
                        notification_center.remove_observer(
                            self,
                            sender=self._wave_file,
                            name='WaveFileDidFinishPlaying')
                        self._wave_file.stop()
                        self._wave_file = None
                        notification_center.post_notification(
                            'AudioPortDidChangeSlots',
                            sender=self,
                            data=NotificationData(consumer_slot_changed=False,
                                                  producer_slot_changed=True,
                                                  old_producer_slot=None,
                                                  new_producer_slot=None))
                        notification_center.post_notification(
                            'WavePlayerDidEnd', sender=self)
                    break
Example #4
0
class WavePlayer(object):
    """
    An object capable of playing a WAV file. It can be used as part of an
    AudioBridge as it implements the IAudioPort interface.
    """

    implements(IAudioPort, IObserver)

    def __init__(self, mixer, filename, volume=100, loop_count=1, pause_time=0, initial_delay=0):
        self.mixer = mixer
        self.filename = filename
        self.initial_delay = initial_delay
        self.loop_count = loop_count
        self.pause_time = pause_time
        self.volume = volume
        self._channel = None
        self._current_loop = 0
        self._state = 'stopped'
        self._wave_file = None

    @property
    def is_active(self):
        return self._state == "started"

    @property
    def consumer_slot(self):
        return None

    @property
    def producer_slot(self):
        return self._wave_file.slot if self._wave_file else None

    def start(self):
        self.play()

    @run_in_twisted_thread
    def stop(self):
        if self._state != 'started':
            return
        self._channel.send(Command('stop'))

    @run_in_waitable_green_thread
    def play(self):
        if self._state != 'stopped':
            raise WavePlayerError('already playing')
        self._state = 'started'
        self._channel = coros.queue()
        self._current_loop = 0
        if self.initial_delay:
            reactor.callLater(self.initial_delay, self._channel.send, Command('play'))
        else:
            self._channel.send(Command('play'))
        self._run().wait()

    @run_in_waitable_green_thread
    def _run(self):
        notification_center = NotificationCenter()
        try:
            while True:
                command = self._channel.wait()
                if command.name == 'play':
                    self._wave_file = WaveFile(self.mixer, self.filename)
                    notification_center.add_observer(self, sender=self._wave_file, name='WaveFileDidFinishPlaying')
                    self._wave_file.volume = self.volume
                    try:
                        self._wave_file.start()
                    except SIPCoreError, e:
                        notification_center.post_notification('WavePlayerDidFail', sender=self, data=NotificationData(error=e))
                        raise WavePlayerError(e)
                    else:
                        if self._current_loop == 0:
                            notification_center.post_notification('WavePlayerDidStart', sender=self)
                        notification_center.post_notification('AudioPortDidChangeSlots', sender=self, data=NotificationData(consumer_slot_changed=False, producer_slot_changed=True,
                                                                                                                            old_producer_slot=None, new_producer_slot=self._wave_file.slot))
                elif command.name == 'reschedule':
                    self._current_loop += 1
                    notification_center.remove_observer(self, sender=self._wave_file, name='WaveFileDidFinishPlaying')
                    self._wave_file = None
                    notification_center.post_notification('AudioPortDidChangeSlots', sender=self, data=NotificationData(consumer_slot_changed=False, producer_slot_changed=True,
                                                                                                                        old_producer_slot=None, new_producer_slot=None))
                    if self.loop_count == 0 or self._current_loop < self.loop_count:
                        reactor.callLater(self.pause_time, self._channel.send, Command('play'))
                    else:
                        notification_center.post_notification('WavePlayerDidEnd', sender=self)
                        break
                elif command.name == 'stop':
                    if self._wave_file is not None:
                        notification_center.remove_observer(self, sender=self._wave_file, name='WaveFileDidFinishPlaying')
                        self._wave_file.stop()
                        self._wave_file = None
                        notification_center.post_notification('AudioPortDidChangeSlots', sender=self, data=NotificationData(consumer_slot_changed=False, producer_slot_changed=True,
                                                                                                                            old_producer_slot=None, new_producer_slot=None))
                        notification_center.post_notification('WavePlayerDidEnd', sender=self)
                    break