libSox を使用してプログラムでいくつかの効果を適用しようとしていますが、現在、正しく行っているかどうかを理解できません。たとえば、テンポとゲイン エフェクトを適用し、結果のオーディオをバッファーに読み取ってさらに処理する必要があります。ドキュメントは本当に少なく、グーグルはうまくいきませんでした。これが私のコードです:
sox_format_t* input = sox_open_read("<file.wav>", NULL, NULL, NULL);
//sox_format_t* out;
sox_format_t* output = sox_open_memstream_write(&buffer, &buffer_size,
&input->signal, &input->encoding, "raw", NULL);
//assert(output = sox_open_write("/home/egor/hello_processed.wav", &input->signal, NULL, NULL, NULL, NULL));
sox_effects_chain_t* chain = sox_create_effects_chain(&input->encoding, &output->encoding);
char* sox_args[10];
//input effect
sox_effect_t* e = sox_create_effect(sox_find_effect("input"));
sox_args[0] = (char*)input;
assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &input->signal, &input->signal) ==
SOX_SUCCESS);
free(e);
e = sox_create_effect(sox_find_effect("tempo"));
std::string tempo_str = "1.01";
sox_args[0] = (char*)tempo_str.c_str();
assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &input->signal,&input->signal) ==
SOX_SUCCESS);
free(e);
e = sox_create_effect(sox_find_effect("output"));
sox_args[0] = (char*)output;
assert(sox_effect_options(e, 1, sox_args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &input->signal, &input->signal) ==
SOX_SUCCESS);
free(e);
sox_flow_effects(chain, NULL, NULL);
static const size_t maxSamples=4096;
sox_sample_t samples[maxSamples];
std::vector<sox_sample_t> audio_buffer;
for (size_t r; 0 != (r=sox_read(output,samples,maxSamples));)
for(int i=0;i<r ;i++)
audio_buffer.push_back(samples[i]);
std::cout << audio_buffer.size() << std::endl;
私の質問は次のとおりです。
エフェクトチェーンを正しく設定していますか?
メモリ内の結果のオーディオ サンプルを読み取る方法は?
テンポ値 < 1 を使用すると、出力から正しいサンプル数 (audio_buffer 内) が得られますが、たとえば 1.2 に変更すると、サンプル数が突然非常に少なくなり、値 1.0 を使用すると 0 になります。チェーン構成または出力からのデータ読み取りにバグがあるかどうか疑問に思っていますか? libsox を使用するのは初めてで、例に従おうとしましたが、ここで行き詰まりました。
助けてくれてありがとう!
ありがとうございました!