Здравстуйте!
Работаю под Linux (Ubuntu 7.10).
Нужно издать короткий звук задаваемой частоты (в смысле частота как параметр). Издать любым способом - хоть через колонки, хоть через системный динамик.
Процедура Beep ничего не воспроизводит почему-то вообще. На форуме подобного, и чтобы под Linux, - не нашел. Помогите пожалуйста.
Как издать звук в Linux
Модератор: Модераторы
-
Alexey_Bulatov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 10.03.2008 22:03:32
- Откуда: Россия, Нижний Новгород
Я делел через OpenAL:
1. Надо подключить модуль OpenAL ( в новіх фрипаскалькомпилерах он включен в дист)
2. Почитать доки по OpenAL (или посмотреть демку в том же дистре фрипаскаля)
3. Установить под линью необходимые либы openal.so ... или че-то такое
4. Сгенерить программно буфер в памяти с синусоидальной волной необходимой частоты (sin,cos... легко воопщем)
5. Передать его в буфер ОпенАЛ и воспроизвести через источник
...
По идее можно это же сделать через OSS, или этот как его ... забыл.. в линухе аудиодройвер. Ну воопщем проще не будет
А если через системный динамик, то возможно и проще, но как - не знаю
1. Надо подключить модуль OpenAL ( в новіх фрипаскалькомпилерах он включен в дист)
2. Почитать доки по OpenAL (или посмотреть демку в том же дистре фрипаскаля)
3. Установить под линью необходимые либы openal.so ... или че-то такое
4. Сгенерить программно буфер в памяти с синусоидальной волной необходимой частоты (sin,cos... легко воопщем)
5. Передать его в буфер ОпенАЛ и воспроизвести через источник
...
По идее можно это же сделать через OSS, или этот как его ... забыл.. в линухе аудиодройвер. Ну воопщем проще не будет
А если через системный динамик, то возможно и проще, но как - не знаю
-
Alexey_Bulatov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 10.03.2008 22:03:32
- Откуда: Россия, Нижний Новгород
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
в консоле
Код: Выделить всё
man aplay-
Alexey_Bulatov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 10.03.2008 22:03:32
- Откуда: Россия, Нижний Новгород
На сколько я понял, aplay проигрывает звуковые файлы.
В общем, суть задачи следующая: у меня есть самодельное утройство, подключенное к LPT. Периодически приходят импульсы (я просто постоянно опрашиваю порт). И мне нужно, чтобы при очередном импульсе компьютер пискнул с частотой, зависящей от интервала между пришедшим импульсом и предыдущим. То есть, частота почти произвольная. (На самом деле мне всё-же нужно издавать ближайшую к этой частоте ноту, но записывать все ноты в звуковые файлы и проигрывать их aplay не хочется
). Хотелось бы всё-же написать функцию типа PlaySound(frequency, duration).
Поразбираюсь с OpenAL, но хотелось бы по-проще...
В общем, суть задачи следующая: у меня есть самодельное утройство, подключенное к LPT. Периодически приходят импульсы (я просто постоянно опрашиваю порт). И мне нужно, чтобы при очередном импульсе компьютер пискнул с частотой, зависящей от интервала между пришедшим импульсом и предыдущим. То есть, частота почти произвольная. (На самом деле мне всё-же нужно издавать ближайшую к этой частоте ноту, но записывать все ноты в звуковые файлы и проигрывать их aplay не хочется
Поразбираюсь с OpenAL, но хотелось бы по-проще...
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
ну тогда только 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. Для остановки сигнала значение тона устанавливается
ЗЫ не проверял, если получится нарисуй пример на фпц
но их насколько помню 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. Для остановки сигнала значение тона устанавливается
ЗЫ не проверял, если получится нарисуй пример на фпц
-
Alexey_Bulatov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 10.03.2008 22:03:32
- Откуда: Россия, Нижний Новгород
Все-таки остановился на следуюдщем:
Есть у меня TProcess, который запускает "aplay <нота>.wav".
Вроде бы так:
По поводу 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>
Есть у меня 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>
