| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import url_shortener | 
					
						
							|  |  |  | import audio_services | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import logging as original_logger  | 
					
						
							|  |  |  | log = original_logger.getLogger("sound") | 
					
						
							|  |  |  | import paths | 
					
						
							|  |  |  | import sound_lib | 
					
						
							|  |  |  | import subprocess | 
					
						
							|  |  |  | import platform | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  | import output | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  | system = platform.system() | 
					
						
							|  |  |  | from mysc.repeating_timer import RepeatingTimer | 
					
						
							| 
									
										
										
										
											2015-05-14 10:01:37 -04:00
										 |  |  | from mysc.thread_utils import call_threaded | 
					
						
							| 
									
										
										
										
											2015-04-19 19:10:34 -04:00
										 |  |  | import application | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  | URLPlayer = None | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | def setup(): | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  |  global URLPlayer | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  |  if not URLPlayer: | 
					
						
							| 
									
										
										
										
											2015-01-18 17:19:39 -06:00
										 |  |  |   log.debug("creating stream URL player...") | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  |   URLPlayer = URLStream() | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | def recode_audio(filename, quality=4.5): | 
					
						
							|  |  |  |  global system | 
					
						
							|  |  |  |  if system == "Windows": subprocess.call(r'"%s" -q %r "%s"' % (paths.app_path('oggenc2.exe'), quality, filename)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def recording(filename): | 
					
						
							|  |  |  | # try: | 
					
						
							|  |  |  |  val = sound_lib.recording.WaveRecording(filename=filename) | 
					
						
							|  |  |  | # except sound_lib.main.BassError: | 
					
						
							|  |  |  | #  sound_lib.input.Input() | 
					
						
							|  |  |  | #  val = sound_lib.recording.WaveRecording(filename=filename) | 
					
						
							|  |  |  |  return val | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class soundSystem(object): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  def check_soundpack(self): | 
					
						
							|  |  |  |   """ Checks if the folder where live the current soundpack exists.""" | 
					
						
							|  |  |  |   self.soundpack_OK = False | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  |   if os.path.exists(paths.sound_path(self.config["current_soundpack"])): | 
					
						
							|  |  |  |    self.path = paths.sound_path(self.config["current_soundpack"]) | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |    self.soundpack_OK = True | 
					
						
							|  |  |  |   elif os.path.exists(paths.sound_path("default")): | 
					
						
							| 
									
										
										
										
											2015-01-18 17:19:39 -06:00
										 |  |  |    log.error("The soundpack does not exist, using default...") | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |    self.path = paths.sound_path("default") | 
					
						
							|  |  |  |    self.soundpack_OK = True | 
					
						
							|  |  |  |   else: | 
					
						
							| 
									
										
										
										
											2015-04-19 19:10:34 -04:00
										 |  |  |    log.error("The current soundpack could not be found and the default soundpack has been deleted, " + application.name + " will not play sounds.") | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |    self.soundpack_OK = False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  |  def __init__(self, soundConfig): | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   """ Sound Player.""" | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  |   self.config = soundConfig | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   # Set the output and input default devices. | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  |   try: | 
					
						
							|  |  |  |    self.output = sound_lib.output.Output() | 
					
						
							|  |  |  |    self.input = sound_lib.input.Input() | 
					
						
							|  |  |  |   except: | 
					
						
							|  |  |  |    pass | 
					
						
							|  |  |  |    # Try to use the selected device from the configuration. It can fail if the machine does not has a mic. | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   try: | 
					
						
							| 
									
										
										
										
											2015-01-18 17:19:39 -06:00
										 |  |  |    log.debug("Setting input and output devices...") | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  |    self.output.set_device(self.output.find_device_by_name(self.config["output_device"])) | 
					
						
							|  |  |  |    self.input.set_device(self.input.find_device_by_name(self.config["input_device"])) | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   except: | 
					
						
							| 
									
										
										
										
											2015-01-18 17:19:39 -06:00
										 |  |  |    log.error("Error in input or output devices, using defaults...") | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  |    self.config["output_device"] = "Default" | 
					
						
							|  |  |  |    self.config["input_device"] = "Default" | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |   self.files = [] | 
					
						
							|  |  |  |   self.cleaner = RepeatingTimer(60, self.clear_list) | 
					
						
							|  |  |  |   self.cleaner.start() | 
					
						
							|  |  |  |   self.check_soundpack() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  def clear_list(self): | 
					
						
							|  |  |  |   log.debug("Cleaning sounds... Total sounds found: %i" % len(self.files)) | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  |   if len(self.files) == 0: return | 
					
						
							|  |  |  |   try: | 
					
						
							|  |  |  |    for i in range(0, len(self.files)): | 
					
						
							|  |  |  |     if self.files[i].is_playing == False: | 
					
						
							|  |  |  |      self.files[i].free() | 
					
						
							|  |  |  |      self.files.pop(i) | 
					
						
							|  |  |  |   except IndexError: | 
					
						
							|  |  |  |    pass | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   log.debug("Files used now: %i" % len(self.files)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  def play(self, sound, argument=False): | 
					
						
							|  |  |  |   if self.soundpack_OK == False: return | 
					
						
							| 
									
										
										
										
											2015-03-11 17:17:29 -06:00
										 |  |  |   if self.config["session_mute"] == True: return | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound)) | 
					
						
							| 
									
										
										
										
											2015-01-20 15:40:33 -06:00
										 |  |  |   sound_object.volume = float(self.config["volume"]) | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   self.files.append(sound_object) | 
					
						
							|  |  |  |   sound_object.play() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  | class URLStream(object): | 
					
						
							| 
									
										
										
										
											2015-05-13 10:39:21 -04:00
										 |  |  |  def __init__(self,url=None): | 
					
						
							|  |  |  |   self.url = url | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   self.prepared = False | 
					
						
							| 
									
										
										
										
											2015-03-11 06:11:42 -06:00
										 |  |  |   log.debug("URL Player initialized") | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  |  def prepare(self, url): | 
					
						
							| 
									
										
										
										
											2015-03-11 06:11:42 -06:00
										 |  |  |   log.debug("Preparing URL: %s" % (url,)) | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |   self.prepared = False | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  |   self.url = url_shortener.unshorten(url) | 
					
						
							| 
									
										
										
										
											2015-03-11 06:11:42 -06:00
										 |  |  |   log.debug("Expanded URL: %s" % (self.url,)) | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  |   if self.url != None: | 
					
						
							|  |  |  |    transformer = audio_services.find_url_transformer(self.url) | 
					
						
							|  |  |  |    self.url = transformer(self.url) | 
					
						
							| 
									
										
										
										
											2015-03-11 06:11:42 -06:00
										 |  |  |    log.debug("Transformed URL: %s. Prepared" % (self.url,)) | 
					
						
							|  |  |  |    self.prepared = True | 
					
						
							|  |  |  |   else: | 
					
						
							|  |  |  |    self.url = url | 
					
						
							|  |  |  |    log.debug("Transformed URL: %s. Prepared" % (self.url,)) | 
					
						
							| 
									
										
										
										
											2014-11-12 20:41:29 -06:00
										 |  |  |    self.prepared = True | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 17:29:58 -04:00
										 |  |  |  def play(self, url=None, volume=1.0, stream=None,announce=True): | 
					
						
							| 
									
										
										
										
											2015-07-03 17:23:25 -05:00
										 |  |  |   if announce: | 
					
						
							|  |  |  |    output.speak(_(u"Playing...")) | 
					
						
							|  |  |  |   log.debug("Attempting to play an URL...") | 
					
						
							|  |  |  |   if url != None: | 
					
						
							|  |  |  |    self.prepare(url) | 
					
						
							|  |  |  |   elif stream != None: | 
					
						
							|  |  |  |    self.stream=stream | 
					
						
							|  |  |  |   if self.prepared == True: | 
					
						
							|  |  |  |    self.stream = sound_lib.stream.URLStream(url=self.url) | 
					
						
							|  |  |  |   if hasattr(self,'stream'): | 
					
						
							|  |  |  |    self.stream.volume = float(volume) | 
					
						
							|  |  |  |    self.stream.play() | 
					
						
							|  |  |  |    log.debug("played") | 
					
						
							| 
									
										
										
										
											2015-10-14 17:07:30 -05:00
										 |  |  | #   call_threaded(self.delete_when_done) | 
					
						
							| 
									
										
										
										
											2015-05-14 10:01:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 21:34:26 -04:00
										 |  |  |  def stop_audio(self,delete=False): | 
					
						
							| 
									
										
										
										
											2015-05-14 10:01:37 -04:00
										 |  |  |   if hasattr(self, "stream"): | 
					
						
							| 
									
										
										
										
											2015-06-01 11:18:39 -05:00
										 |  |  |    output.speak(_(u"Stopped."), True) | 
					
						
							| 
									
										
										
										
											2015-05-14 10:01:37 -04:00
										 |  |  |    try: | 
					
						
							|  |  |  |     self.stream.stop() | 
					
						
							|  |  |  |     log.debug("Stopped audio stream.") | 
					
						
							|  |  |  |    except: | 
					
						
							|  |  |  |     log.exception("Exception while stopping stream.") | 
					
						
							| 
									
										
										
										
											2015-10-23 11:29:59 -05:00
										 |  |  |    if delete: | 
					
						
							|  |  |  |     del self.stream | 
					
						
							| 
									
										
										
										
											2015-05-13 21:34:26 -04:00
										 |  |  |     log.debug("Deleted audio stream.") | 
					
						
							|  |  |  |    return True | 
					
						
							|  |  |  |   else: | 
					
						
							|  |  |  |    return False | 
					
						
							| 
									
										
										
										
											2015-07-03 17:23:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-27 16:29:04 -06:00
										 |  |  |  @staticmethod | 
					
						
							|  |  |  |  def delete_old_tempfiles(): | 
					
						
							|  |  |  |   for f in glob(os.path.join(tempfile.gettempdir(), 'tmp*.wav')): | 
					
						
							|  |  |  |    try: | 
					
						
							|  |  |  |     os.remove(f) | 
					
						
							|  |  |  |    except: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 |