我很好奇将已经正确调整大小的QByteArray
的数据指针传递给将填充其中内存的c函数是否安全。
我认为它不应该是一个问题,但我觉得有点粗心。
SpeexBits bits;
void *dec_state;
int bufferPosition = 0;
const int SAMPLES_PER_SEC = 32000;
const int BUFFER_LEN_SECONDS = 5;
const int FRAME_SIZE_BYTES = SAMPLES_PER_SEC / (1000 / 20) * sizeof(int16_t);
QByteArray outBuf;
outBuf.resize(SAMPLES_PER_SEC * sizeof(int16_t) * BUFFER_LEN_SECONDS);
...
speex_bits_read_from(&bits, msg->payload, msg->size);
speex_decode_int(dec_state, &bits, outBuf.data() + bufferPosition);
bufferPosition += FRAME_SIZE_BYTES;
...
<playback>
虽然我认为这应该有效,但感觉不对,但是,除了用QByteArray
填充QByteArray
之外,我不想创建数据的多个副本。插入方法调用。所以我想我的问题是,我可以安全地做到这一点吗?这是从函数填充{{1}}的推荐方法吗?有没有更好的方法不需要多个数据副本?
谢谢!
答案 0 :(得分:2)
非常安全,QByteArray
有两种获取数据的方法,constData()
和data()
您可以传递数据并将其视为char *
缓冲区,并使用它作为一个没有问题的交流功能。
在缓冲区溢出等情况下会出现同样的问题,因此您必须像在c中一样小心。