C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как проиграть wav файл через внутрениий динамик?, Ну очень надо!!!
Umka
  Отправлено: 10.05.2004, 10:08


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Как проиграть wav файл через внутрениий динамик?
Очень надо срочно.
Guest
Отправлено: 13.05.2004, 14:36


Не зарегистрирован







На сколько я знаю в Builder нет методов для управления внутренним динамиком.
А насчет проигрывания wav можешь поискать в нете. Сам делал реализацию на асме.
fadd
Отправлено: 13.05.2004, 14:42


Ученик-кочегар

Группа: Участник
Сообщений: 3



никак. Внутренний — это пищалка, что ли? Была байка двадцатилетней давности про воспроизведение wav через бипер. DireSoft использовал, помню... Фуфло, не верь. А если он внутренний и втыкнут, как у меня, в звуковушку, бери да проигрывай через... Да хоть mplayer'ом.
full_lamer
Отправлено: 13.05.2004, 16:02


Машинист паровоза

Группа: Участник
Сообщений: 225



враки все это можно через пищалку вав пустить! токо как не знаю.... sad.gif
Shura
Отправлено: 13.05.2004, 17:46


Дежурный стрелочник

Группа: Участник
Сообщений: 45



можно, но не из под винды
Глеб
Отправлено: 13.05.2004, 22:06


Не зарегистрирован







QUOTE (Shura @ 13/05/2004, 18:48)
можно, но не из под винды

Как я уже писал сам делал прогу на асме (паскаль + асм). Там используются ползовательские адреса и прерывания, которы винда не перекрывает (вот только не помню какие).
P.S. извините что в прошлый раз не представился.
AVC
Отправлено: 15.05.2004, 09:26


Не зарегистрирован







Адреса, прерывания и порты доступны только на линеке Win9x. NT — у меня нет сведени. 2000 и далее запрещают обращаться к портам таймера. Приходилось эмулировать Beep для Windows.
Для проигрывания wav через внутренний динамик нужно брать на себя управление двумя каналами внутреннего таймера. Один — выдает непрерывный тон, второй за счет скважности первого управляет громкостью.
Качество паршивое. Легко сделать для DOS. У винды даже браться не буду.
Вывод — надо найти другое решение.
Umk@
  Отправлено: 15.05.2004, 13:08


Не зарегистрирован







В билдере есть функция Beep(int H, int Time);
H = частота
Time — длятильность в мс

Всё работает, но мне кроме как пищать, нужно wav воспроизвести.
Для той проги, которую я делаю это ооочень надо, так как она будет использоваться на компах, где не колонок не звуковухи нет wink.gif
Я заказщику сказал, что не знаю, что смогу, но буду очень стараться чтоб вав через динамик игрался.

А, ну так вот, я незнаком с форматом вав файла, но по-моему если перекодировать его вф формат:

частота1, длительнось1;
частота2, длительнось2;
частота3, длительнось3;
.
.
.
частотаn, длительносьn;

И потом играть простым бипом

Или я чегото не понимаю
Глеб
Отправлено: 15.05.2004, 21:50


Не зарегистрирован







Про формат wav файла можешь прочитать здесь
Wav файл это набор выборок из гармонического сигнала. Пищалка умеет производить только меандр. Следовательно, стобы воспроизвести гармонический сигнал через speacker, нужно им промодулировать меандр по ширине импульсов. Если взять частоту меандра значително выше звукового порога (>>20000Гц) и менять ширину импульсов по синусоидальному закону, то динамик проинтегрирует это дело и мы получим красивый синусоидальный сигнал. Если менять ширину импульсов в соответствии с выборками записанными в Wav, то получим необходимый проигрыватель.
Хотел бы я увидеть человека воторый реализует этот алгоритм в Buildere wink.gif
AVC
Отправлено: 16.05.2004, 16:27


Не зарегистрирован







Функция Beep хотя и есть — не на всех виндах работает. Приметр был приведен для показа возможных трудностей. Проигравытель такого типа мне приходилось делать в DOS'е.
QUOTE
Хотел бы я увидеть человека воторый реализует этот алгоритм в Buildere
Могу привести это код, реализованный на Turbo C 2 для использования в DOS'е в программах на Clipper'е. Переводить на Bilder лень из за ненужности этой работы.
Umka
  Отправлено: 22.05.2004, 15:42


Дежурный стрелочник

Группа: Участник
Сообщений: 32



AVC, выложи исходник.
Beep проверял на win9x win2000, winXP, и даже на виртуальной машине с вин98 и везде работает нормально

Тут компонент даже есть для этого специальный.

Компоненты для PC-Speaker wink.gif
AVC
Отправлено: 24.05.2004, 08:50


Ветеран

Группа: Модератор
Сообщений: 1583



По поводу Beep: странно, но у меня 98 пищать не захотел и я быстро сделал свою функцию.
По поводу wav:
Функции были написаны на TurboC2 для использования в Clipper (и реально использовались). Код не изменялся с 1995 года. Адаптация к вашим нужнам — за вами. Проинрывается не wav файл, а громкость оцифрованная по времени. Эту информацию вам еще придется вытащить из vaw.
Пример использования:
CODE

_dpsp_start (mode, &dps_buf, wait);
while (dps_buf.mode)
 if (RAM_KEY_TST ()) break;
_dpsp_stop ();
ikey_clr   ();

mode (int)  — способ проигрывания звукового сообщения
dps_buf (char*) — буфер звуков
wait  — скорость проигрывания
остальное смотрите по тексту.

Текст присоединяю к сообщению.

User Attached Image Скачать файл
DPSP_SUB.C


Глеб
Отправлено: 24.05.2004, 16:07


Не зарегистрирован







Umka, для проигрывания wav не поможет тебе функция BEEP, так как нельзя набор выборок превратить в тот формат о коктором ты говорил. В наборе выборок может присутствовать несколько частот одновременно и каждая со своим весом.
Так что только asm и шим...
Shura
Отправлено: 27.05.2004, 17:46


Дежурный стрелочник

Группа: Участник
Сообщений: 45



ошибочка вышла

Отредактировано Shura — 27/05/2004, 18:50

Вернуться в Вопросы программирования в C++Builder