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