使用soxr重新采样时访问冲突

时间:2015-03-02 13:19:43

标签: c++ audio libsox

我无法使用以下代码:

soxr_error_t err;
soxr_datatype_t itype = SOXR_INT16_I;
soxr_datatype_t otype = SOXR_INT16_I;
soxr_io_spec_t iospec = soxr_io_spec(itype, otype);
size_t idone = 0;
size_t odone = 0;
size_t const olen = (size_t)((speed * 44100) * (numframes * 2) / (44100 + (44100 * speed)) + .5);

// Do the resampling
short* output = new short[numframes * 2];
soxr_t sox = soxr_create(44100, 44100 * speed, 2, &err, &iospec, NULL, NULL);
if (!err)
    soxr_process(sox, input, numframes * 2, &idone, output, olen * 2, &odone);
soxr_delete(sox);

我有PCM短数据进入(input对象),我希望它也可以重新采样到值speed,正如您所看到的那样与原始采样率相乘(44100是标准)。另外numframes是我发送的数据块(立体声)中的帧数

问题是我的应用程序在执行soxr_process()方法时崩溃了。 soxr_create()方法似乎没有错误,所以我真的不知道它可能是什么。

我目前只是试图加快声音,所以我把输出缓冲区设置得和原版一样大,这样就足以在重新采样后保存所有内容。

我该如何解决这个问题?我是否为soxr_process()方法提供了错误的值?

编辑:
我也尝试过这种方法:

soxr_oneshot(4410, 44100 * speed, 2, input, numframes * 2, &idone, output, outputFrames * 2, &odone, &iospec, NULL, NULL);

但是这也会引发Acces Violation错误。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我已经能够使用此代码修复它:

// Check the number of frames needed to fill extra or send to the next block
int outputFrames = numframes * speed;
int extraReadNeeded = numframes - outputFrames;

soxr_error_t err;

soxr_datatype_t itype = SOXR_INT16_I;
soxr_datatype_t otype = SOXR_INT16_I;
soxr_io_spec_t iospec = soxr_io_spec(itype, otype);

size_t idone = 0;
size_t odone = 0;

size_t const olen = (size_t)((speed * 44100) * (numframes * 2) / (44100 + (44100 * speed)) + .5);

// Do the resampling
short* output = new short[outputFrames * 4];
soxr_t sox = soxr_create(44100, 44100 * speed, 2, &err, &iospec, NULL, NULL);
if (!err)
    err = soxr_process(sox, input, numframes * 2, &idone, output, outputFrames, &odone);
soxr_delete(sox);

看起来输出并不像我预期的那么大。不知道它是如何写入指针的。它现在已经修好了。

如果有人有任何评论,请随时指出错误