Size: a a a

2020 December 11

M

Mr.Mait in Qt
Александр Вольнов
Привет.
Кто-нибудь в курсе, как устроен звук в Qt? У меня на целевой железке звук глючит, и я пытаюсь понять, в чём вообще дело. Глючит как QSoundEffect, так и QMediaPlayer, но по-разному.

Создаю простейшее консольное приложение с QSoundEffect, воспроизвожу любой WAV 16-bit 44100. Слышу равномерные заикания много раз в секунду и вижу, как в консоль сыпется примерно 20 сообщений в секунду с таким содержанием:
ALSA lib ../../../alsa-lib-1.1.6/src/pcm/pcm.c:8424:(snd_pcm_recover) underrun occurred
Через aplay всё работает нормально. QMediaPlayer сам со себе звук воспроизводит хорошо, но если добавить нагрузку, например, рисовать что-то в QML, то звук тоже начинает заикаться. При этом aplay, запущенный в фоновом процессе даёт идеальный звук даже при нагрузке. Так что возникает вопрос, который почему-то не удаётся нагуглить: в каком потоке работает заполнение буфера? Зависит ли это от используемого бекенда для аудио или это делает Qt код, общий для всех бекендов? А то похоже, что аудио микшируется в главном потоке, чего я никак не ожидал от такой высокоуровневой библиотеки как Qt. И если так, то как я могу это исправить с минимальными усилиями?
На форуме что-то подобное что у тебя, но не связанно с Qt. Посмотри, мб там решения тебе помогут https://bbs.archlinux.org/viewtopic.php?id=185736
источник

АВ

Александр Вольнов... in Qt
Mr.Mait
пробовал обновить кодеки? QMediaPlayer на линуксе дергает GStreamer
А какие там кодеки? Это же прострейший несжатый wav, там даже декодировать нечего.
источник

M

Mr.Mait in Qt
Александр Вольнов
А какие там кодеки? Это же прострейший несжатый wav, там даже декодировать нечего.
Попробуй что-нибудь сделать что ссылку выше дал
источник

АВ

Александр Вольнов... in Qt
Mr.Mait
На форуме что-то подобное что у тебя, но не связанно с Qt. Посмотри, мб там решения тебе помогут https://bbs.archlinux.org/viewtopic.php?id=185736
На мой случай не похоже. У меня никакого pulseaudio нет.

Целевая железка вообще на ARM (Variscite i.MX6 Quad), там embedded linux без иксов. Звук ALSA с GStreamer, я так понимаю.
источник

AD

Android Developer in Qt
этот код работает только в форме MainWindow. ошибка в других формах

#error: 'menuBar' was not declared in this scope QMenu
           
  QMenu * fileMenu = menuBar()->addMenu(tr("&File"));
  fileMenu->addAction("newAct");
  fileMenu->addAction("openAct");
  fileMenu->addAction("saveAct");
источник

A

Amir in Qt
Android Developer
этот код работает только в форме MainWindow. ошибка в других формах

#error: 'menuBar' was not declared in this scope QMenu
           
  QMenu * fileMenu = menuBar()->addMenu(tr("&File"));
  fileMenu->addAction("newAct");
  fileMenu->addAction("openAct");
  fileMenu->addAction("saveAct");
Вот у тебя в тайтле написано "Разработчик". Ладно хоть в кавычках 😀 Тебе не стыдно такие вопросы задавать? Написано же все в сообщении ошибки. Незадекларировано менюбар в этом скоупе. Открой документацию qt и посмотри на все методы класса, в котом хочешь вызвать метод. Почитай про скоупы, про классы и методы и сразу поймёшь почему метод одного класса не виден в другом классе, если нет наследования.
источник

FS

Flower Surgeon in Qt
Продублирую вопрос с вашего позволения.
источник

FS

Flower Surgeon in Qt
Переслано от Flower Surgeon
Всем привет. Имею окно (форму) c QHBoxLayout с двумя виджетами внутри него. Необходимо по клику на чекбокс скрывать один из них. Как после этого можно идиоматично ресайзнуть окно, чтобы оставшийся виджет не висел с гигантскими полями посреди формы? Пока что вычитал про такой хак: завести QTimer::singleShot на 0 милек и в его слоте уже ресайзить, но беда в том, что ресайзить только по ширине не получается. Т.е. такая конструкция работает:

mainWindow->resize(mainWindow->minimumWidth(), mainWindow->minimumHeight());

а вот такая уже нет:

mainWindow->resize(mainWindow->minimumWidth(), mainWindow->height());
источник

А

Александр in Qt
попробуйте запомнить высоту до изменения размеров и подставить ее в resize
источник

FS

Flower Surgeon in Qt
Александр
попробуйте запомнить высоту до изменения размеров и подставить ее в resize
попробовал, не получается
источник

jp

jon pedro in Qt
Flower Surgeon
Переслано от Flower Surgeon
Всем привет. Имею окно (форму) c QHBoxLayout с двумя виджетами внутри него. Необходимо по клику на чекбокс скрывать один из них. Как после этого можно идиоматично ресайзнуть окно, чтобы оставшийся виджет не висел с гигантскими полями посреди формы? Пока что вычитал про такой хак: завести QTimer::singleShot на 0 милек и в его слоте уже ресайзить, но беда в том, что ресайзить только по ширине не получается. Т.е. такая конструкция работает:

mainWindow->resize(mainWindow->minimumWidth(), mainWindow->minimumHeight());

а вот такая уже нет:

mainWindow->resize(mainWindow->minimumWidth(), mainWindow->height());
Я не помню как называется этот виджет но помню как он выглядит. Есть же виджет, который растягивается группы компанентов по выделенной области. Соответственно, если вызвать метод hide нужного виджета, твой виджет растянется автоматически на выделеннцю область
источник

FS

Flower Surgeon in Qt
jon pedro
Я не помню как называется этот виджет но помню как он выглядит. Есть же виджет, который растягивается группы компанентов по выделенной области. Соответственно, если вызвать метод hide нужного виджета, твой виджет растянется автоматически на выделеннцю область
Хорошо будет, если вспомните.
источник

Е

Егор in Qt
источник

jp

jon pedro in Qt
Flower Surgeon
Хорошо будет, если вспомните.
Layout
источник

jp

jon pedro in Qt
Уверен, что про них слышали, есть вертикальные, горизонтальные и т.д
источник

FS

Flower Surgeon in Qt
jon pedro
Layout
Я им и так пользуюсь, не помогает, вы же читали внимательно мой меседж.
источник

jp

jon pedro in Qt
Flower Surgeon
Я им и так пользуюсь, не помогает, вы же читали внимательно мой меседж.
Извиняюсь, упустил из виду т.к засыпаю) кроме вашего же решения в голову тоже ничего не лезет (
источник

DA

Dmitry Antipin in Qt
jon pedro
Я не помню как называется этот виджет но помню как он выглядит. Есть же виджет, который растягивается группы компанентов по выделенной области. Соответственно, если вызвать метод hide нужного виджета, твой виджет растянется автоматически на выделеннцю область
Hspacer vspacer вроде
источник
2020 December 12

FS

Flower Surgeon in Qt
Как в моём случае поможет spacer?
источник

DA

Dmitry Antipin in Qt
Flower Surgeon
Как в моём случае поможет spacer?
Он забирает на себя растягивание
источник