Как издать звук в Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как издать звук в Linux

Сообщение Alexey_Bulatov » 10.03.2008 23:25:00

Здравстуйте!
Работаю под Linux (Ubuntu 7.10).
Нужно издать короткий звук задаваемой частоты (в смысле частота как параметр). Издать любым способом - хоть через колонки, хоть через системный динамик.

Процедура Beep ничего не воспроизводит почему-то вообще. На форуме подобного, и чтобы под Linux, - не нашел. Помогите пожалуйста.
Alexey_Bulatov
незнакомец
 
Сообщения: 6
Зарегистрирован: 10.03.2008 23:03:32
Откуда: Россия, Нижний Новгород

Сообщение FedeX » 11.03.2008 00:37:03

Я делел через OpenAL:
1. Надо подключить модуль OpenAL ( в новіх фрипаскалькомпилерах он включен в дист)
2. Почитать доки по OpenAL (или посмотреть демку в том же дистре фрипаскаля)
3. Установить под линью необходимые либы openal.so ... или че-то такое
4. Сгенерить программно буфер в памяти с синусоидальной волной необходимой частоты (sin,cos... легко воопщем)
5. Передать его в буфер ОпенАЛ и воспроизвести через источник
...

По идее можно это же сделать через OSS, или этот как его ... забыл.. в линухе аудиодройвер. Ну воопщем проще не будет :wink:

А если через системный динамик, то возможно и проще, но как - не знаю :lol:
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение Attid » 11.03.2008 11:45:59

нормально бип у меня работает , чет у тя с динамиком =)
ожно еще aplay или play запустить(не помню что там в 7,10)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Alexey_Bulatov » 11.03.2008 22:47:44

А можно по-подробнее про play?

Динамик у меня в принципе работает - открою калькулятор, начну на клавиатуре все кнопки подряд нажимать - сразу сигналит :) . Только Beep - молчит.
Alexey_Bulatov
незнакомец
 
Сообщения: 6
Зарегистрирован: 10.03.2008 23:03:32
Откуда: Россия, Нижний Новгород

Сообщение Attid » 12.03.2008 12:31:24

в консоле
Код: Выделить всё
man aplay
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Alexey_Bulatov » 13.03.2008 23:01:32

На сколько я понял, aplay проигрывает звуковые файлы.
В общем, суть задачи следующая: у меня есть самодельное утройство, подключенное к LPT. Периодически приходят импульсы (я просто постоянно опрашиваю порт). И мне нужно, чтобы при очередном импульсе компьютер пискнул с частотой, зависящей от интервала между пришедшим импульсом и предыдущим. То есть, частота почти произвольная. (На самом деле мне всё-же нужно издавать ближайшую к этой частоте ноту, но записывать все ноты в звуковые файлы и проигрывать их aplay не хочется :) ). Хотелось бы всё-же написать функцию типа PlaySound(frequency, duration).

Поразбираюсь с OpenAL, но хотелось бы по-проще...
Alexey_Bulatov
незнакомец
 
Сообщения: 6
Зарегистрирован: 10.03.2008 23:03:32
Откуда: Россия, Нижний Новгород

Сообщение Attid » 14.03.2008 00:07:15

ну тогда только beep
но их насколько помню 2 штуки один в сисутилс, а второй не помню где , так вот один работает другой никогда нет =)


а можно еще попробывать юникс вей
http://lazarus-ccr.sourceforge.net/docs ... ioctl.html

Встроенный < динамик > часть консоли < Linux > и, поэтому является символьным устройством. Как следствие, существуют запросы ioctl для манипуляций с ним:

1. KDMKTONE

Генерирует сигнал beep заданной длительности, используя таймер ядра.

Пример: ioctl (fd, KDMKTONE,(long) argument).
2. KIOCSOUND

Генерирует бесконечный beep или прерывает звучащий < в > настоящий момент.

Пример: ioctl(fd,KIOCSOUND,(int) tone).

Третий аргумент первого примера содержит значение тона < в > нижнем слове и сдвиг < в > верхнем. Тон это не частота. Таймер 8254 материнской платы ПК заведен на 1.19 МГц и поэтому тон = 1190000/частота. Сдвиг измеряется < в > шагах таймера. Оба вызова срабатывают немедленно, поэтому вы можете порождать звуковые сигналы, не блокируя программу.
KDMKTONE можно использовать для предупреждающих сигналов, поскольку вам не приходится заботиться о его прекращении.
При помощи KIOCSOUND можно проигрывать мелодии, как это демонстрируется < в > примере программы splay. Для остановки сигнала значение тона устанавливается


ЗЫ не проверял, если получится нарисуй пример на фпц
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Alexey_Bulatov » 18.03.2008 16:45:21

Все-таки остановился на следуюдщем:
Есть у меня TProcess, который запускает "aplay <нота>.wav".

Вроде бы так:

uses ..., process;

var Process1: TProcess;
...

Process1 := TProcess.Create(nil);
Process1.CommandLine := 'aplay C1.wav';

Process1.Execute; {При этом играет}





По поводу ioctl:

Во-первых: прошу прощения, что не догадался просто погуглить "динамик linux".

Attid, судя по всему это цитируемая выше статья:

http://citforum.ncstu.ru/operating_systems/linux_pg/lpg_04.shtml

:)

По поводу KIOCSOUND - по умолчанию в юните Termio такой константы нет (KDMKTONE - тоже). Пришлось забивать вручную. Далее, пока не разобрался, что означает первый параметр ioctl (линукса я не знаю толком, методом тыка пробовал 1, 2 (вроде-бы где-то был пример с единицей)), и в каком формате нужно задавать третий параметр (пробовал byte, integer - ничего вообще не получил, правда больше не экспериментировал (по идее, при неправильном формате хоть что-то да может пропищать)). В общем не получил ничего, хотя особо не старался.

Зато нашел относительно простой способ записи нот в отдельные звуковые файлы:
Качаю GuitarPro Demo (под WINE, вполне хватит), сохраняю в midi-шки ноты (в wav сохранять - придется повозиться), затем
timidity -Ow <имя.mid>
(эта программа не зависит от железа, все пишет сама)
В результате имею <имя.wav>
Alexey_Bulatov
незнакомец
 
Сообщения: 6
Зарегистрирован: 10.03.2008 23:03:32
Откуда: Россия, Нижний Новгород


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54

Рейтинг@Mail.ru