Russian Qt Forum
Ноябрь 22, 2024, 22:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Синхронизация потоков: Qt + Jack API  (Прочитано 5676 раз)
mezmay
Гость
« : Декабрь 26, 2014, 18:45 »

Работаю с Jack audio connection kit API, нужна обработка звука в "реальном" времени. Сама обработка делается в callback-функции, вызываемой из другого потока. Но в описании сказано, что нельзя применять длительные операции, в т.ч. мьютексы. Но как тогда работать с общими с основным потоком данными? (QReadLock - QWriteLock ?) Какие варианты?

Цитировать
Код:
int jack_set_process_callback 	( 	jack_client_t *  	client,
JackProcessCallback   process_callback,
void *   arg
)
      

Tell the Jack server to call process_callback whenever there is work be done, passing arg as the second argument.

The code in the supplied function must be suitable for real-time execution. That means that it cannot call functions that might block for a long time. This includes all I/O functions (disk, TTY, network), malloc, free, printf, pthread_mutex_lock, sleep, wait, poll, select, pthread_join, pthread_cond_wait, etc, etc.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 26, 2014, 19:10 »

Лучше всего lock-free, но надо знать задачу. А если нужно "в общем виде" - то атомарный лок, хотя тормоза возможны.
Записан
mezmay
Гость
« Ответ #2 : Декабрь 26, 2014, 20:05 »

Мне надо реализовать буфер задержки для одного из каналов. Ну и несколько int , float переменных передать
Записан
mezmay
Гость
« Ответ #3 : Декабрь 27, 2014, 06:38 »

Итак, у меня два потока - GUI и поток обработки звука. Как ясно из первого сообщения, в потоке обработки звука нельзя пользоваться мьютексами и т.д. И есть как минимум пять переменных :
Код:
int shift_left;
float volume_left;
float volume_right
Filter *filter_left;
Filter *filter_right;
shift_left - текущая задержка левого канала,
volume_left, volume_right - громкость каналов.

GUI поток пишет значения этих переменных, поток обработки звука - читает. Как синхронизировать? Особенно интересуют объекты типа Filter...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 27, 2014, 09:25 »

GUI поток пишет значения этих переменных, поток обработки звука - читает. Как синхронизировать?
Код
C++ (Qt)
struct Jack {
int mDone;         // устанавливается true читателем если можно удалять
 
int shift_left;
...
};
 
// глобальные переменные
Jack * theJack = 0, * prvJack = 0;  
QList <Jack> lstJack;
 
// GUI (хост)
lstJack.push_back(Jack());
Jack * jack = &lst.back();   // этот адрес валиден при удалении/вставке в QList
jack->mDone = false;
jack->shift_left = ..   // заполняем данные
...
theJack = jack;  // установили текущие данные
 
// удаляем неиспользуемые данные
for (int i = lstJack.size() - 2; i >= 0; --i)
if (lstJack[i].mDone) {
  lstJack.erase(lstJack.begin(), lstJack.begin() + i + 1)
  break;
}
 
// Читатель
Jack * jack = theJack;  // взять текущие установки
if (prvJack && prvJack != jack)  // предыдущие можно удалить
prvJack->mDone = true;
prvJack = jack;
 
....    // чтение
if (jack != theJack)  {   // если хост изменил установки..
..
}
..
 
Правда это не обобщается на 2 и более читателей (тогда придется с atomic)

Особенно интересуют объекты типа Filter...
Должны полностью копироваться при создании Jack (а не только указатели)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 28, 2014, 13:15 »

Наверное перемудрил - может здесь достаточно std::shared_ptr  Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Декабрь 28, 2014, 14:49 »

ИМХО, тут потоки и каллбеки вообще лишние сущности. Не верю что там нет работы с fd и прочее вместо каллбеков. Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 23.