c++ - 将 C++ 向量输入到 C 函数中
问题描述
我有一个std::vector<float>
包含声音数据。在不复制其数据的情况下,我想将此向量用作Sonic 库的sonicChangeFloatSpeed函数的输入。此方法需要一个float*
作为第一个参数并改变输入数组。完成后,第一个参数中的指针将指向结果数据。
data
让我可以访问 C++ 向量的内部数组,使用assign
,我可以替换向量的内容。因此,我尝试了以下方法:
float* ptr = vec.data();
int num_samples = sonicChangeFloatSpeed(ptr, vec.size(), 1., 1.5, 1., 1., 0, 41000, 1);
vec.assign(ptr, ptr + num_samples);
但是当我运行这个程序时,我在这个位置得到double free or corruption (!prev)
了错误。SIGABRT
这种方法的问题是什么?如何更恰当地解决这个问题?
解决方案
正如我所提到的,我完全不使用sonicChangeFloatSpeed
,而是使用其中的代码来解决这个问题。在将流中的结果读入之前vec
,我会vec.resize(numSamples)
:
sonicStream stream = sonicCreateStream(16000, 1);
sonicSetSpeed(stream, speed);
sonicSetPitch(stream, pitch);
sonicSetVolume(stream, volume);
sonicSetRate(stream, rate);
auto length = static_cast<int>(vec.size());
sonicWriteFloatToStream(stream, vec.data(), length);
sonicFlushStream(stream);
int numSamples = sonicSamplesAvailable(stream);
vec.resize(numSamples);
sonicReadFloatFromStream(stream, vec.data(), length);
sonicDestroyStream(stream);
推荐阅读
- apache-kafka - 如何为生产者传递 Apache Kafka Mirrormaker2 配置
- php - 我如何在选定的php中排序
- reactjs - firebase facebook javascript sdk photoURL 是一个通用的个人资料图片
- c# - 如何在 ABP 框架中创建自定义 ID?
- java - 使用 POI for Java 在 PowerPoint(.ppt 和 .pptx)中搜索和替换页眉和页脚文本
- python - 在另一个函数中使用一个函数中的变量然后调用它
- powershell - Powershell 帮助,需要搜索模式/字符串并复制到新目的地
- php - 在同一个 PDF 中下载多个 Moodle 表
- testing - 强制将空值作为参数不会包含在调用中
- javascript - Firebase 实时数据库显示奇怪的行为