Версия для печати темы
Форум на 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" в неконсольной софтине, например. вызов из кода на С++. ждём-с демонстрации лёгкости и простоты!
Автор: Litkevich Yuriy 19.10.2012, 21:41
да он что-то вообще мимо темы.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)