docs: def getStringTrackedDeviceProperty(self, unDeviceIndex, prop):
          """
          Returns a string property. If the device index is not valid or the property is not a string type this function will 
          return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
          null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters.
          """
  
          fn = self.function_table.getStringTrackedDeviceProperty
          pError = ETrackedPropertyError()
          # TODO: automate this string argument manipulation ****
          unRequiredBufferLen = fn( unDeviceIndex, prop, None, 0, byref(pError) )
          if unRequiredBufferLen == 0:
              return b""
          pchBuffer = ctypes.create_string_buffer(unRequiredBufferLen)
          fn( unDeviceIndex, prop, pchBuffer, unRequiredBufferLen, byref(pError) )
          if pError.value != TrackedProp_Success:
              raise OpenVRError(str(pError))
          sResult = bytes(pchBuffer.value)
          return sResult