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