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;
}