Запись с использованием sox в c / c

#c #c #audio-recording #alsa #sox

#c #c #аудиозапись #alsa #sox

Вопрос:

Я пытаюсь записать звук с помощью микрофона и библиотеки sox на C / C .

 sox_open_read("default", amp;_input->signal, NULL, NULL)
  

Я пытаюсь использовать устройство ввода по умолчанию. Я получаю сообщение об ошибке

 formats: can't open input file `default': No such file or directory
  

Я предполагаю, что это вызвано тем, что я не передал последний аргумент: filetype и sox пытается найти файл с именем ‘default’.
Списки Sox:

  • Форматы аудиофайлов: 8svx aif aifc aiff aiffc al amb au avr caf cdda cdr cvs cvsd cvu dat dvms f32 f4 f64 f8 fap flac fssd gsm gsrt hcom htk ima ircam la lpc lpc10 lu mat mat4 mat5 maud mp2 mp3 nist ogg opus paf prc pvf raw s1 s16 s2 s24 s3 s32 s4 s8 sb sd2 sds sf sl sln smp snd sndfile sndr sndt sou sox sph sw txw u1 u16 u2 u24 u3 u32 u4 u8 ub ul uw vms voc vorbis vox w64 wav wavpcm wv wve xa xi
  • драйверы аудиоустройств: alsa, oss, ossdsp

Что я должен передать функции sox_open_read в качестве последнего параметра для использования микрофона в качестве входного сигнала?

Комментарии:

1. Тип файла, похоже, будет чем-то вроде «WAV» или «MP3». Однако отсутствие документации даже для таких базовых параметров говорит само за себя. Последняя версия самого sox выпущена в 2015 году; libsox, похоже, также заброшен. Страница руководства имеет дату защиты авторских прав в 2011 году.

2. Я просмотрел исходные тексты sox и считаю, что мне следует указать «alsa» в качестве последнего параметра. Я не могу подтвердить это, потому что приложение вылетает сразу после вызова sox_open_read, но это может быть связано с ошибочной настройкой системы, а не с неправильным параметром. Я пока не знаю.

Ответ №1:

В качестве последнего параметра функции sox_open_read для ввода микрофона следует передать один из драйверов аудиоустройств. В моем случае это ‘alsa’.
Пример:

 #include <sox.h>
#include <memory>

sox_signalinfo_t _intermediateSignal;
sox_format_t* input;
sox_format_t* output;
sox_effects_chain_t* effectsChain;

void addEffect(std::string effectName, sox_format_t* options) {
    std::unique_ptr<sox_effect_t> effect(sox_create_effect(sox_find_effect(effectName.c_str())));
    char *args[] = {reinterpret_cast<char *>(options)};
    sox_effect_options(effect.get(), 1, args);
    sox_add_effect(effectsChain, effect.get(), amp;_intermediateSignal, amp;input->signal);
}

int main() {
    if (sox_init() != SOX_SUCCESS)
        throw std::runtime_error("Could not initialise SOX.");

    input = sox_open_read("default", NULL, NULL, "alsa");
    output = sox_open_write("recorded.wav", amp;input->signal, NULL, NULL, NULL, NULL);
    if (!input || !output)
        throw std::runtime_error("SOX I/O error");

    _intermediateSignal = input->signal;

    effectsChain = sox_create_effects_chain(amp;input->encoding, amp;output->encoding);

    if (!effectsChain)
        throw std::runtime_error("SOX could not initialize effects chain.");

    addEffect("input", input);
    addEffect("output", output);

    sox_flow_effects(effectsChain, NULL, NULL);
    sox_quit();
}
  

Этот пример никогда не завершится, поскольку вызов sox_flow_effects блокирует выполнение. После завершения работы программы с помощью ctrl c файл recorded.wav содержит записанный звук.