int ConnectNode::addAudioDataBuffer()

in nlsCppSdk/transport/connectNode.cpp [1358:1447]


int ConnectNode::addAudioDataBuffer(const uint8_t *frame, size_t frameSize) {
  REQUEST_CHECK(_request, this);
  int ret = 0;
  uint8_t *tmp = NULL;
  size_t tmpSize = 0;
  size_t length = 0;
  struct evbuffer *buff = NULL;
  if (frame == NULL || frameSize == 0) {
    return -(NlsEncodingFailed);
  }
  if (_nlsEncoder && _encoderType != ENCODER_NONE) {
    uint8_t *outputBuffer = new uint8_t[frameSize];
    if (outputBuffer == NULL) {
      LOG_ERROR("Node(%p) new outputBuffer failed.", this);
      return -(NewOutputBufferFailed);
    } else {
      memset(outputBuffer, 0, frameSize);
      int nSize = _nlsEncoder->nlsEncoding(frame, (int)frameSize, outputBuffer,
                                           (int)frameSize);
#ifdef ENABLE_NLS_DEBUG
      // LOG_DEBUG(
      //     "Node(%p) Opus encoder(%d) encoding %dbytes data, and return "
      //     "nSize:%d.",
      //     this, _encoderType, frameSize, nSize);
#endif
      if (nSize < 0) {
        LOG_ERROR("Node(%p) Opus encoder failed:%d.", this, nSize);
        delete[] outputBuffer;
        return -(NlsEncodingFailed);
      }
      _webSocket.binaryFrame(outputBuffer, nSize, &tmp, &tmpSize);
      delete[] outputBuffer;
    }
  } else {
    // pack frame data
    _webSocket.binaryFrame(frame, frameSize, &tmp, &tmpSize);
  }

  if (_request && _request->getRequestParam()->_enableWakeWord == true &&
      !getWakeStatus()) {
    buff = _wwvEvBuffer;
  } else {
    buff = _binaryEvBuffer;
  }

  evbuffer_lock(buff);
  length = evbuffer_get_length(buff);
  if (length >= _limitSize) {
    LOG_WARN("Too many audio data in evbuffer.");
    evbuffer_unlock(buff);
    return -(EvbufferTooMuch);
  }

  evbuffer_add(buff, (void *)tmp, tmpSize);

  if (tmp) free(tmp);
  tmp = NULL;

  evbuffer_unlock(buff);

  if (length == 0 && _workStatus == NodeStarted) {
    MUTEX_LOCK(_mtxNode);
    if (!_isStop) {
      ret = nlsSendFrame(buff);
    }
    MUTEX_UNLOCK(_mtxNode);
  }

  if (length == 0 && _workStatus == NodeWakeWording) {
    MUTEX_LOCK(_mtxNode);
    if (!_isStop) {
      ret = nlsSendFrame(buff);
    }
    MUTEX_UNLOCK(_mtxNode);
  }

  if (ret == 0) {
    ret = sendControlDirective();
  }

  if (ret < 0) {
    disconnectProcess();
    handlerTaskFailedEvent(getErrorMsg());
  } else {
    ret = frameSize;
    _isFirstAudioFrame = false;
  }

  return ret;
}