Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Мультимедиа _ Простой beep (звук) под Linux

Автор: 512es 14.9.2010, 13:36

Народ, подскажите пожалуйста, как на Qt под линукс надёжнее всего и быстрее играть звуки?

Требования очень простые. Чтобы проигрывался писк (beep). Можно из динамика, можно из колонок, всё равно. Главное чтобы работало это на винде и линуксе без бубна.

QApplication::beep() работает хорошо на винде, а на линуксе не знаю чего ему не хватает.
QSound так и не завёлся. Да и желания ставить NAS что то нет..
Phonon - работает. Но это стрельба из пушки по воробьям.. Не айс как то..

Ось Gentoo.
Вот даже не знаю, ковырять снова beep() или QSound...

Автор: kwisp 14.9.2010, 13:51

Цитата(512es @ 14.9.2010, 14:36) *
Ось Gentoo.

:) не могу не посодействовать.
давай разбираться

Автор: 512es 14.9.2010, 13:58

Цитата(kwisp @ 14.9.2010, 13:51) *
:) не могу не посодействовать.
давай разбираться


Давай =)

Прежде всего, пытаюсь вкомпилить модуль pcspkr в ядро. Но в конфиге его в упор не вижу..
Ядро 2.6.35


Тыкс.. В menuconfig его почему то не нашёл вообще. Пришлось вручную включить CONFIG_PCSPKR_PLATFORM=y, тогда и CONFIG_INPUT_PCSPKR=m появился.
Сразу конечно хочется настроить так чтобы ни из каких других приложений не пикал..

Автор: kwisp 14.9.2010, 14:06

Цитата(512es @ 14.9.2010, 14:58) *
Ядро 2.6.35

ну ты передовик. у меня 32

grep -i beep /usr/src/linux/.config
# CONFIG_SND_HDA_INPUT_BEEP is not set

:(

Автор: maint 14.9.2010, 14:12

я в федоре плюнул и вывожу звук через SDL_sound в линухе. В винде стандартным QSound. Просто сделал условную компиляцию в зависимости от системы своей функции play_sound.

Автор: kwisp 14.9.2010, 14:14

512es,
вообще конечно на линуксе. вопросов со звуком много..
если к примеру на звучке нет аппаратного миксера. как разруливается если твое приложенеи не единственное которое использует звук в процессе работы.... ?

Автор: 512es 14.9.2010, 14:17

Цитата(kwisp @ 14.9.2010, 15:06) *
grep -i beep /usr/src/linux/.config
# CONFIG_SND_HDA_INPUT_BEEP is not set

:(


у меня такой строчки вообще нет в конфиге...
ммм.. это от интеловских драйверов. интересно попробовать будет, такая карточка тоже есть на другом компе.

Цитата(maint @ 14.9.2010, 15:12) *
я в федоре плюнул и вывожу звук через SDL_sound в линухе. В винде стандартным QSound. Просто сделал условную компиляцию в зависимости от системы своей функции play_sound.

о! а это интересно. можно примерчик коротенький?))

Автор: kwisp 14.9.2010, 14:19

Цитата(512es @ 14.9.2010, 15:17) *
у меня такой строчки вообще нет в конфиге...

какие исходники ядра используешь?

Автор: kuzulis 14.9.2010, 14:26

А напрямую писать в линухе в регистры таймера (как в досе) не пробовали? Для биипа - мож как вариант?.

Автор: 512es 14.9.2010, 14:26

Цитата(kwisp @ 14.9.2010, 15:19) *
какие исходники ядра используешь?


gentoo-sources-2.6.35-r5 размаскированное

мне кажется это просто по тому что у меня модуль интелловской звуковухи выключен из ядра. так что, всё ок

системный бип я вкомпилил в ядро, через пол часа ребутнусь, проверю. вот только всё равно не айс как то что теперь все приложения будут пытаться пищать. надо как то хитро всё отключить ))

Автор: kwisp 14.9.2010, 14:48

а с http://www.forum.crossplatform.ru/index.php?showtopic=5578&view=findpost&p=39793 что?

Автор: 512es 14.9.2010, 15:47

Цитата(kwisp @ 14.9.2010, 15:48) *
а с http://www.forum.crossplatform.ru/index.php?showtopic=5578&view=findpost&p=39793 что?

вспомнил что на моём компе давным давно вырван системный динамик )))
так что перехожу тестировать на ноут с интеловской звуковушкой:

вкомпилил в ядро CONFIG_SND_HDA_INPUT_BEEP
но никаких бипов не слышно..

Автор: kwisp 14.9.2010, 16:29

512es,
миксера аудио какой?
когда бипаешь другие приложения использующие звук запущены.
предлагаю тебе установить обычный линуксовый beep и им проверять когда он запищит тогда запищит и твоя прога.
emerge -av beep

Автор: 512es 14.9.2010, 16:39

Цитата(kwisp @ 14.9.2010, 17:29) *
512es,
миксера аудио какой?
когда бипаешь другие приложения использующие звук запущены.
предлагаю тебе установить обычный линуксовый beep и им проверять когда он запищит тогда запищит и твоя прога.
emerge -av beep


юзаю alsamixer, там есть ползунок Speaker, всё на максимуме. что то мне подсказывает что ещё должен быть ещё и Beep. а нету..

давно поставил программу beep и проверяю им, даже пробовал через echo -e '\a', а так же через QApplication:beep()

потом собрал даже CONFIG_PCSPKR_PLATFORM=y, и CONFIG_INPUT_PCSPKR=m. всё равно та же история.
ничего больше использующего звук не включаю.

кстати, в модуле CONFIG_SND_HDA_INPUT_BEEP пробовал ставить моде в 1 (включён постоянно) и в 2 (управляется миксером). результата 0

а вообще CONFIG_SND_HDA_INPUT_BEEP должен работать без CONFIG_PCSPKR_PLATFORM=y и CONFIG_INPUT_PCSPKR??

вот такие вот дела..

Автор: kwisp 14.9.2010, 17:02

давай права смотреть на утилиту beep
ls -l /usr/bin/beep что даёт?

Автор: 512es 14.9.2010, 23:23

Цитата(kwisp @ 14.9.2010, 18:02) *
давай права смотреть на утилиту beep
ls -l /usr/bin/beep что даёт?

с правами всё впорядке.

именно модуль интела не хочет пищать.
много гуглил по этому вопросу.
http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=hda+beep+module

вообщем, надоело )) теперь буду ковырять в сторону QSound или SDL_sound

Автор: 512es 15.9.2010, 0:10

Итак,
я кажется нашёл отличное решение этой проблемы!

Очень простое и эффективное решение будет играть звуки просто внешней командой в линуксе. Благо маленьких и шустрых консольных команд там предостаточно)) Ибо unix-way))

QProcess::startDetached("aplay -q blip2.wav");

Звук играется даже лучше чем через Phonon! Быстрее, нет нагрузки на процессор и при быстром многократном проигрывании легко накладывается друг на друга а так же на музыку, которая в тот момент играет на компе, без какого либо шума, тормозов или глюков! ))

Можно пойти и дальше, вкомпилировав в программу код плеера. Тут есть не плохой кусок кода, вырванный из линуксовой программы aplay, уже адаптированный для qt:
http://lists.trolltech.com/qt-interest/2007-01/thread00147-0.html

Но мне лично это пока не надо. Т.к. всё равно будет зависимость от alsalib. А команда aplay почти стандартная, входит в состав пакета alsa-utils, в котором кстати и сам alsamixer.

А для винды и далее буду использовать QApplication::beep(). Там оно работает хорошо.

Автор: 512es 15.9.2010, 0:54

Спасибо всем за ответы и поддержку))
Поделюсь полученным плеером. Мне не жалко))

void MainWindow::clicker()
{
#ifdef Q_OS_WIN32
    QApplication::beep();
#else
    QProcess player;
    QFile snd(":/sound/blip2.wav");
    if (!snd.open(QIODevice::ReadOnly)) return;
    player.start("aplay -q");
    if (player.write(snd.readAll()) == -1) return;
    player.closeWriteChannel();
    snd.close();
    if (!player.waitForFinished(5000)) player.kill();
#endif
}


Звук играется прямо из ресурсов.
Если за 5 секунд плеер не завершился мы его убиваем.
На винде используем стандартный бип.

Работает быстро, надёжно и универсально!) Задача решена!

Автор: molchanoviv 15.9.2010, 7:51

А если у пользователя нет ALSA? Вдруг OSS стоит, или еще что?

Автор: 512es 15.9.2010, 13:39

Цитата(molchanoviv @ 15.9.2010, 8:51) *
А если у пользователя нет ALSA? Вдруг OSS стоит, или еще что?

Ну alsa это вроде как стандарт начиная с ядра 2.6. И кроме того, в большинстве дистрибутивов именно alsa стоит по дефолту. OSS устарел.
Существует ещё конечно много звуковых серверов, и если надо их поддерживать, можно легко заменить команду aplay -q на любую другую похожую. Например, можно в настройках программы позволить выбирать команду для проигрывания звуков.

Но по любому alsa чаще встречается в системах чем рабочий и включёный системный динамик =)

Автор: grio 2.7.2011, 19:53

Цитата(512es @ 15.9.2010, 1:54) *
Работает быстро, надёжно и универсально!) Задача решена!


Спасибо за альтернативное решение.
Сам я пользуюсь Фононом. Прекрасно работает и в Линуксе и под Виндой.

#include <phonon/MediaObject>
..

YoMain::YoMain(QWidget *parent)
{
..
    audioOutput = new Phonon::AudioOutput(Phonon::NotificationCategory);
}

void YoMain::MetronomeTick()
{
..
    metronomeSound->setCurrentSource (Phonon::MediaSource ("./click.wav"));
    metronomeSound->play ();
..
}


Рабочий пример http://gitorious.org/yoklmn

Автор: Mimokrokodil 19.10.2012, 8:41

Ребята, вы точно извращенцы.

Linux: echo -e "\007" >/dev/tty10
Windows: echo "^G" (нажать Ctrl-G)

Если вам нужен простой бип, то зачем вам эти ваши Кютеки?

--
И вот на таких вот, зиждется наше отечественное ИТ

Автор: Алексей1153 19.10.2012, 8:49

Mimokrokodil, ответ: кроссплатформа. См. сообщение ТС

Автор: Iron Bug 19.10.2012, 15:05

Цитата(Mimokrokodil @ 19.10.2012, 11:41) *
Если вам нужен простой бип, то зачем вам эти ваши Кютеки?

угу. а теперь продемонстрируйте нам, недалёким, чудеса этого "echo" в неконсольной софтине, например. вызов из кода на С++. ждём-с демонстрации лёгкости и простоты! :D

Автор: Litkevich Yuriy 19.10.2012, 21:41

да он что-то вообще мимо темы.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)