Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ищу библиотеку обработки звука
Форум на CrossPlatform.RU > Библиотеки > Другие библиотеки
mezmay
Задача: сделать устройство эквализации звука в реальном времени.
Пробовал на Qt 5 в Windows 7 сделать простую передачу звука с микрофона на линейный выход - задержки слишком большие, чтобы это можно было назвать "реальным временем" (ну то есть около 0.3 - 0.5 сек. И это при размере буфера не более 0.001 сек). Конкретно пользовался классами QAudioInput и QAudioOutput.

Сейчас рассматриваю два основных варианта реализации - на одноплатном компьютере и на контроллере.
Будет ли Qt работать в Linux существенно быстрее со звуком? Если нет, то какую быструю библиотеку ввода/вывода звука стоит посмотреть?

upd: код:
// Создание аудио объектов
void cwin::createAudio()
{
    QAudioFormat format;
    format.setSampleRate(44100);
    format.setChannelCount(1);
    format.setSampleSize(16);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::SignedInt);

    m_pAudioInput = new QAudioInput(format, this);
    m_pAudioInput->setBufferSize(440 * sizeof(qint16));
    QIODevice *device = m_pAudioInput->start();
    connect(device, &QIODevice::readyRead,
        this, &cwin::onSound);

    m_pAudioOutput = new QAudioOutput(format, this);
    m_pAudioDevice = m_pAudioOutput->start();
}

// Прием, обработка и вывод
void cwin::onSound()
{
    QIODevice *device = (QIODevice *)(sender());

    QByteArray sound_data_in = device->readAll();

    QByteArray sound_data_out;      
    
    /* здесь простая обработка */
    
    m_pAudioDevice->write(sound_data_out);
}
mezmay
Попробовал сделать опять же в винде на библиотеке PortAudio. Задержки все равно слишком большие.
Возможно, это потому что используется стандартный аудио драйвер (т.е. не с малыми задержками = не ASIO).

Будет ли в линуксе быстрее со стандартным драйвером? Или в операционной системе это нереально, даже с ASIO?
Iron Bug
в Линюксе музыка нормально работает только с jackd. драйвер тут ни при чём, он работает с железякой. а jackd - это шина для обмена данными для звуковых девайсов. при достаточно шустром проце задержки при работе с jackd минимальны (миллисекунды или меньше). но насчёт Qt не могу сказать, будет ли она сама тормозить или умеет ли она работать с jackd.
с другой стороны, jackd - не дефолтная шина для большинства дистрибутивов. по умолчанию обычно ставится PulseAudio - тормозная шина, которая имеет жирную юзерскую обвязку и всякие плагины для приложений, но не годится для профессиональной работы со звуком.
mezmay
Поставил Ubuntu 14.04.1, сначала просто запустил тот же исходник на Qt - быстрее, но явно недостаточно для реального времени.
Установил библиотеку PortAudio (и ALSA для нее), при запуске проги на ней в output Creator'a валятся ошибки:
Цитата
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave


Потом установил jackd, прога на Qt перестала запускаться, output в debug'e:
Цитата
Debugging starts
&"warning: GDB: Failed to set controlling terminal: Inappropriate ioctl for device\n


В релизе просто не запускается.

upd: удалил pulseaudio, прога на Qt стала запускаться и задержки стали меньше. Прога на PortAudio тоже стала запускаться, но звук сильно прерывается. И думаю что они работают не через jack

upd 2: сейчас без pulseaudio на Qt получается "почти риалтайм". При этом сама Ubuntu работает как-то не особенно быстро. Может стоит установить что-нибудь на риалтаймовом ядре, и все будет ок?
mezmay
upd 3:Jack'ом проблема судя по всему не решится: сконнектил в джеке вход на выход, всё равно задержка есть
Iron Bug
Цитата(mezmay @ 19.12.2014, 19:53) *
upd 3:Jack'ом проблема судя по всему не решится: сконнектил в джеке вход на выход, всё равно задержка есть

его настраивать надо. и давать ему риалтаймовский приоритет.
mezmay
А как вообще делать чтобы приложение "работало через JACK"?
Iron Bug
использовать API для jackd. всё стандартно, как работа с любой другой библиотекой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.