2015-03-02 3 views
0

У меня возникли проблемы при получении следующего кода для работы:Нарушения прав доступа при передискретизации с помощью soxr

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()?

EDIT:
Я также попытался с помощью этого метода:

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

но также бросает ошибку Нарушение Acces.

Заранее благодарен!

ответ

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

Похоже, что выход не был достаточно большим, как я ожидал. Не знаю, как это написано указателю. На данный момент это исправлено.

Если у кого есть замечания, не стесняйтесь указать на ошибки

Смежные вопросы