Exemple #1
0
    def _play(self, message):
        """ Implementation specific async method to handle playback.
            This allows mpg123 service to use the "next method as well
            as basic play/stop.
        """
        LOG.info('SimpleAudioService._play')
        repeat = message.data.get('repeat', False)
        self._is_playing = True
        self._paused = False
        if isinstance(self.tracks[self.index], list):
            track = self.tracks[self.index][0]
            mime = self.tracks[self.index][1]
            mime = mime.split('/')
        else:  # Assume string
            track = self.tracks[self.index]
            mime = find_mime(track)
        # Indicate to audio service which track is being played
        if self._track_start_callback:
            self._track_start_callback(track)

        # Replace file:// uri's with normal paths
        track = track.replace('file://', '')
        try:
            if 'mpeg' in mime[1]:
                self.process = play_mp3(track)
            elif 'ogg' in mime[1]:
                self.process = play_ogg(track)
            elif 'wav' in mime[1]:
                self.process = play_wav(track)
            else:
                # If no mime info could be determined guess mp3
                self.process = play_mp3(track)
        except FileNotFoundError as e:
            LOG.error('Couldn\'t play audio, {}'.format(repr(e)))
            self.process = None

        # Wait for completion or stop request
        while (self.process and self.process.poll() is None
               and not self._stop_signal):
            sleep(0.25)

        if self._stop_signal:
            self.process.terminate()
            self.process = None
            self._is_playing = False
            self._paused = False
            return

        self.index += 1
        # if there are more tracks available play next
        if self.index < len(self.tracks) or repeat:
            if self.index >= len(self.tracks):
                self.index = 0
            self.bus.emit(Message('SimpleAudioServicePlay',
                                  {'repeat': repeat}))
        else:
            self._is_playing = False
            self._paused = False
Exemple #2
0
    def test_play_ogg_exception(self, mock_log, mock_subprocess, mock_conf):
        """Test that stack trace is provided when unknown excpetion occurs"""
        def raise_exception(*arg, **kwarg):
            raise Exception

        mock_subprocess.Popen.side_effect = raise_exception
        mock_conf.get.return_value = test_config
        self.assertEqual(play_ogg('insult.ogg'), None)
        mock_log.exception.called_once_with(Anything())
Exemple #3
0
    def _play(self, message):
        """ Implementation specific async method to handle playback.
            This allows mpg123 service to use the "next method as well
            as basic play/stop.
        """
        LOG.info('SimpleAudioService._play')
        repeat = message.data.get('repeat', False)
        self._is_playing = True
        if isinstance(self.tracks[self.index], list):
            track = self.tracks[self.index][0]
            mime = self.tracks[self.index][1]
            mime = mime.split('/')
        else:  # Assume string
            track = self.tracks[self.index]
            mime = find_mime(track)
        # Indicate to audio service which track is being played
        if self._track_start_callback:
            self._track_start_callback(track)

        # Replace file:// uri's with normal paths
        track = track.replace('file://', '')
        try:
            if 'mpeg' in mime[1]:
                self.process = play_mp3(track)
            elif 'ogg' in mime[1]:
                self.process = play_ogg(track)
            elif 'wav' in mime[1]:
                self.process = play_wav(track)
            else:
                # If no mime info could be determined guess mp3
                self.process = play_mp3(track)
        except FileNotFoundError as e:
            LOG.error('Couldn\'t play audio, {}'.format(repr(e)))
            self.process = None

        # Wait for completion or stop request
        while (self.process and self.process.poll() is None and
                not self._stop_signal):
            sleep(0.25)

        if self._stop_signal:
            self.process.terminate()
            self.process = None
            self._is_playing = False
            return

        self.index += 1
        # if there are more tracks available play next
        if self.index < len(self.tracks) or repeat:
            if self.index >= len(self.tracks):
                self.index = 0
            self.bus.emit(Message('SimpleAudioServicePlay',
                                  {'repeat': repeat}))
        else:
            self._is_playing = False
    def test_play_ogg_file_not_found(self, mock_log,
                                     mock_subprocess, mock_conf):
        """Test that simple log is raised when subprocess can't find command.
        """
        def raise_filenotfound(*arg, **kwarg):
            raise FileNotFoundError('TEST FILE NOT FOUND')

        mock_subprocess.Popen.side_effect = raise_filenotfound
        mock_conf.get.return_value = test_config
        self.assertEqual(play_ogg('insult.ogg'), None)
        mock_log.error.called_once_with(Anything())
Exemple #5
0
    def laugh(self):
        # dont laugh over a speech message
        if is_speaking():
            wait_while_speaking()

        sound = random.choice(self.sounds[self.settings["gender"]])
        if ".mp3" in sound:
            self.p = play_mp3(sound)
        elif ".ogg" in sound:
            self.p = play_ogg(sound)
        else:
            self.p = play_wav(sound)
Exemple #6
0
    def laugh(self):
        # dont laugh over a speech message
        if is_speaking():
            wait_while_speaking()

        sound = random.choice(self.sounds[self.settings["gender"]])

        self.gui.clear()
        pic = random.randint(0, 3)
        self.gui.show_image(
            join(dirname(__file__), "ui", "images",
                 str(pic) + ".jpg"))
        if ".mp3" in sound:
            self.p = play_mp3(sound)
        elif ".ogg" in sound:
            self.p = play_ogg(sound)
        else:
            self.p = play_wav(sound)
        self.p.wait()
        self.gui.clear()
 def test_play_ogg(self, mock_subprocess, mock_conf):
     mock_conf.get.return_value = test_config
     play_ogg('insult.ogg')
     mock_subprocess.Popen.assert_called_once_with(['mock_ogg',
                                                    'insult.ogg'],
                                                   env=Anything())
 def handle_ogg_output_test(self, message):
     self.speak_dialog('playing', {'type': 'ogg'})
     wait_while_speaking()
     play_ogg(join(self.audio_dir, 'audio_test.ogg'))
Exemple #9
0
    def _play(self, message):
        """Implementation specific async method to handle playback.

        This allows mpg123 service to use the next method as well
        as basic play/stop.
        """
        LOG.info('SimpleAudioService._play')

        # Stop any existing audio playback
        self._stop_running_process()

        repeat = message.data.get('repeat', False)
        self._is_playing = True
        self._paused = False
        with self.track_lock:
            if len(self.tracks) > self.index:
                track, mime = self._get_track(self.tracks[self.index])
            else:
                return

        LOG.debug('Mime info: {}'.format(mime))

        # Indicate to audio service which track is being played
        if self._track_start_callback:
            self._track_start_callback(track)

        # Replace file:// uri's with normal paths
        track = track.replace('file://', '')
        try:
            if 'mpeg' in mime[1]:
                self.process = play_mp3(track)
            elif 'ogg' in mime[1]:
                self.process = play_ogg(track)
            elif 'wav' in mime[1]:
                self.process = play_wav(track)
            else:
                # If no mime info could be determined guess mp3
                self.process = play_mp3(track)
        except FileNotFoundError as e:
            LOG.error('Couldn\'t play audio, {}'.format(repr(e)))
            self.process = None
        except Exception as e:
            LOG.exception(repr(e))
            self.process = None

        # Wait for completion or stop request
        while (self._is_process_running() and not self._stop_signal):
            sleep(0.25)

        if self._stop_signal:
            self._stop_running_process()
            self._is_playing = False
            self._paused = False
            return
        else:
            self.process = None

        # if there are more tracks available play next
        self.index += 1
        with self.track_lock:
            if self.index < len(self.tracks) or repeat:
                if self.index >= len(self.tracks):
                    self.index = 0
                self.bus.emit(Message('SimpleAudioServicePlay',
                                      {'repeat': repeat}))
            else:
                self._track_start_callback(None)
                self._is_playing = False
                self._paused = False