code: def run(self):
      
      # From now on, it's multi-thread. Let the force be with them.
      st = self.stream._stream
  
      for chunk in chunks(self.audio,
                          size=self.chunk_size*self.nchannels,
                          dfmt=self.dfmt):
        #Below is a faster way to call:
        #  self.stream.write(chunk, self.chunk_size)
        self.write_stream(st, chunk, self.chunk_size, False)
        if not self.go.is_set():
          self.stream.stop_stream()
          if self.halting:
            break
          self.go.wait()
          self.stream.start_stream()
  
      # Finished playing! Destructor-like step: let's close the thread
      with self.lock:
        if self in self.device_manager._threads: # If not already closed
          self.stream.close()
          self.device_manager.thread_finished(self)
docs: Plays the audio. This method plays the audio, and shouldn't be called
      explicitly, let the constructor do so.