crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Ищу библиотеку обработки звука, обработка в реальном времени
mezmay
  опции профиля:
сообщение 18.12.2014, 14:19
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Задача: сделать устройство эквализации звука в реальном времени.
Пробовал на 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 - 18.12.2014, 14:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 18.12.2014, 17:12
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Попробовал сделать опять же в винде на библиотеке PortAudio. Задержки все равно слишком большие.
Возможно, это потому что используется стандартный аудио драйвер (т.е. не с малыми задержками = не ASIO).

Будет ли в линуксе быстрее со стандартным драйвером? Или в операционной системе это нереально, даже с ASIO?

Сообщение отредактировал mezmay - 18.12.2014, 17:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 18.12.2014, 18:47
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


в Линюксе музыка нормально работает только с jackd. драйвер тут ни при чём, он работает с железякой. а jackd - это шина для обмена данными для звуковых девайсов. при достаточно шустром проце задержки при работе с jackd минимальны (миллисекунды или меньше). но насчёт Qt не могу сказать, будет ли она сама тормозить или умеет ли она работать с jackd.
с другой стороны, jackd - не дефолтная шина для большинства дистрибутивов. по умолчанию обычно ставится PulseAudio - тормозная шина, которая имеет жирную юзерскую обвязку и всякие плагины для приложений, но не годится для профессиональной работы со звуком.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 19.12.2014, 13:24
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Поставил 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 - 19.12.2014, 15:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 19.12.2014, 17:53
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


upd 3:Jack'ом проблема судя по всему не решится: сконнектил в джеке вход на выход, всё равно задержка есть
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 19.12.2014, 20:15
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(mezmay @ 19.12.2014, 19:53) *
upd 3:Jack'ом проблема судя по всему не решится: сконнектил в джеке вход на выход, всё равно задержка есть

его настраивать надо. и давать ему риалтаймовский приоритет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 20.12.2014, 14:05
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


А как вообще делать чтобы приложение "работало через JACK"?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.12.2014, 15:43
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


использовать API для jackd. всё стандартно, как работа с любой другой библиотекой.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 16:47