<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_samples(self, samples, reverse=False):
 """ Concatenate the given new samples to the current audio data. This function initializes the memory if no audio data is present already. If ``reverse`` is ``True``, the new samples will be reversed and then concatenated. :param samples: the new samples to be concatenated :type samples: :class:`numpy.ndarray` (1D) :param bool reverse: if ``True``, concatenate new samples after reversing them .. versionadded:: 1.2.1 """

        self.log(u"Adding samples...")
        samples_length = len(samples)
        current_length = self.__samples_length
        future_length = current_length + samples_length
        if (self.__samples is None) or (self.__samples_capacity < future_length):
            self.preallocate_memory(2 * future_length)
        if reverse:
            self.__samples[current_length:future_length] = samples[::-1]
        else:
            self.__samples[current_length:future_length] = samples[:]
        self.__samples_length = future_length
        self._update_length()
        self.log(u"Adding samples... done")