int ConnectNode::addSlicedAudioDataBuffer()

in nlsCppSdk/transport/connectNode.cpp [1249:1350]


int ConnectNode::addSlicedAudioDataBuffer(const uint8_t *frame, size_t length) {
  int filling_ret = 0;

  if (_nlsEncoder && _encoderType != ENCODER_NONE) {
#ifdef ENABLE_NLS_DEBUG
    // LOG_DEBUG("Node(%p) addSlicedAudioDataBuffer input data %d bytes.", this,
    //           length);
#endif
    _maxFrameSize = _nlsEncoder->getFrameSampleBytes();
    if (_maxFrameSize <= 0) {
      return _maxFrameSize;
    }
    if (_audioFrame == NULL) {
      _audioFrame =
          (unsigned char *)calloc(_maxFrameSize, sizeof(unsigned char *));
      if (_audioFrame == NULL) {
        LOG_ERROR("Node(%p) malloc audio_data_buffer failed.", this);
        return -(MallocFailed);
#ifdef ENABLE_NLS_DEBUG
      } else {
        LOG_DEBUG("Node(%p) create audio frame data %d bytes.", this,
                  _maxFrameSize);
#endif
      }
      _audioFrameSize = 0;
    }

    int ret = 0;
    size_t frame_used_size = 0;        /*frame已经传入buffer的字节数*/
    size_t frame_remain_size = length; /*frame未传入buffer的字节数*/
    do {
      size_t buffer_space_size =
          _maxFrameSize -
          _audioFrameSize; /*buffer中空闲空间, 最大为_maxFrameSize*/
      if (frame_remain_size < buffer_space_size) {
        memcpy(_audioFrame + _audioFrameSize, frame + frame_used_size,
               frame_remain_size);
        _audioFrameSize += frame_remain_size;
        frame_used_size += frame_remain_size;
        frame_remain_size = 0;
      } else {
        memcpy(_audioFrame + _audioFrameSize, frame + frame_used_size,
               buffer_space_size);
        _audioFrameSize += buffer_space_size;
        frame_used_size += buffer_space_size;
        frame_remain_size -= buffer_space_size;
      }

      if (_audioFrameSize >= _maxFrameSize) {
        /*每次填充完整的一包数据*/
        ret = addAudioDataBuffer(_audioFrame, _maxFrameSize);
        memset(_audioFrame, 0, _maxFrameSize);
        filling_ret += _maxFrameSize;
        _audioFrameSize = 0;
#ifdef ENABLE_NLS_DEBUG
        // LOG_DEBUG(
        //     "Node(%p) ready to push audio data(%d) into nls_buffer, has
        //     digest "
        //     "%dbytes, ret:%d.",
        //     this, _maxFrameSize, frame_used_size, ret);
#endif
        if (ret < 0) {
          filling_ret = ret;
          break;
        }
      } else {
        if (_isFirstAudioFrame == false && _encoderType != ENCODER_OPU) {
          /*数据不足一包, 且非第一包数据. OPU第一包如果未满, 则会编码失败*/
          ret = addAudioDataBuffer(_audioFrame, _audioFrameSize);
          filling_ret += _audioFrameSize;
#ifdef ENABLE_NLS_DEBUG
          // LOG_DEBUG(
          //     "Node(%p) ready to push audio data(%d) into nls_buffer, has "
          //     "digest %dbytes, ret:%d.",
          //     this, _audioFrameSize, frame_used_size, ret);
#endif
          memset(_audioFrame, 0, _maxFrameSize);
          _audioFrameSize = 0;
          if (ret < 0) {
            filling_ret = ret;
            break;
          }
        } else {
#ifdef ENABLE_NLS_DEBUG
          // LOG_DEBUG("Node(%p) leave audio data(%d) for the next round.",
          // this,
          //           _audioFrameSize);
#endif
          break;
        }
      }
    } while (frame_used_size < length);
  } else {
    filling_ret = addAudioDataBuffer(frame, length);
  }

#ifdef ENABLE_NLS_DEBUG
  // LOG_DEBUG("Node(%p) pushed audio data(%d:%d) into audio_data_tmp_buffer.",
  //           this, length, filling_ret);
#endif
  return filling_ret;
}