Страница 1 из 1

Добавлено: 03 Март 2004, 11:39
Гость
Уважаемые коллеги!
--
Как извлечь звуки из динамика в системном блоке для 32-разрядного режима?
--
Файл со звуковым примером на Кларионе обнаружил на сайте http://www.clarionlife.net
Этот сайт поразил меня своим емким содержанием и диалоговыми возможностями: богатый FAQ, очень удобные сортировки по полям таблиц, удобный интерфейс для возврата к предыдущей станице, досье на выдающихся кларионщиков с их фотографиями, с выходом по пункту ресурсы на статьи и материалы, созданными этими опытными талантливыми кларионщиками, обзор книг по Клариону, выход на родные сайты фирмы создателя Клариона.
Для себя на этом сайте я обнаружил громадный океан полезнейшей практической информации с великолепными примерами по использования Клариона в практике создания высоко эффективных программ.
--
Но на сайте я не обнаружил: а кто же автор этого замечательного сайта?
Подскажите, кто автор этого сайта?
--
Путь к архивному файлу по созданию звуков от стартовой страницы сайта:
Файловый архив :: Примеры с исходниками (*.APP, и т.п.)
--
Строка в списке:
Библиотечка процедур для выдачи звуковых сигналов - файл sounf.zip
--
Привожу текст этого примера.
Для простоты эксперимента я слегка изменил пример по сравнению с файлом sounf.zip
Чтобы не применять никаких библиотек типа DLL и LIB, приведенных в файле sounf.zip
Я создал малюсенькую процедуру Sound типа Sourse
-----------------
Две глобальные переменные:

Код: Выделить всё

GLO_freg  short !Частота звукового сигнала в герцах
GLO_dlit  short !Длительность звукового сигнала ( 100 единиц = 1 секунде )
----------------

Процедура Sound ( типа Sourse )
------------------------------------
Область переменных:
-------------------
tm1     long,auto
tm2     long,auto
devisor ushort
bytes   byte,dim(2),over(devisor)
p       byte
p1      byte

Область code:
-------------
  devisor = 1193180 / GLO_freg
  p = 182
  Out(67,p)
  Out(66,bytes[1])
  Out(66,bytes[2])
  In(97,p)
  p1 = bshift(p,-2)
  p1 = bshift(p,2) + 3
  Out(97,p1)
  tm1 = Clock() + GLO_dlit
  loop
    tm2 =Clock()
    if tm2 > tm1 then break.
  end
  Out(97,p)
-------------------------------------------------------
Выполнение звукового сигнала - по нажатию кнопки в окне.
Нужно создать вставку после события нажатия кнопки:
--
GLO_freg = 800; GLO_dlit = 10 ; Sound()
-------------------------------------------------------
После трансляции только в 16-разрядном режиме при выполнении вы нажимаете на кнопку и динамик системного блока выдает звук частотой 800 герц и длительностью в 10 сотых секунды.
--
Теперь я в проекте APP нажимаю на кнопку Project потом на кнопку Propertis.
В окне Global Options я выбираю для Target OS: Windows - 32 bit
После этого транслирую программу.
Трансляция проходит успешно.
Но при выполнении выдается аварийное предупреждение и программа завершает свою работу в 32 разрядном режиме.
--
Режим 32-бита не работает ни в какой из версий Клариона: ( проверял для CLARION-5 и CLARION-5.5h )
--
С уважением, Валерий Демахин
Казань valdem5@yandex.ru

(Добавление)

Hi

Нету в СW функций IN и OUT. Там более в 32 р. Нету в 32-р у прикладных программ доступа к регистрам аппаратуры. Поэтому и BEEP стал другим.

WBR, Nick Tsigouro Mailto:N.Tsigouro@mtu-net.ru
Написал: ClaList(2)

Добавлено: 03 Март 2004, 15:05
Гость
Ник, я с тобой согласен - эти функции не задекларированы в CW, но посмотри libmaker-ом библиотеку CXXrunx.dll - Cla$IN, Cla$OUT присутствуют. Кроме того в 16 бит-модели прекрасно работают, если применять прототипы как в CFD2.1. Жаль, что не работают в 32-бит. :((
Какую-нибудь нехитрую сиренку уже в проге на Кларе не сваяешь - запускай муз.редактор и создавай .WAW, потом засовывай его в Звук.схему Винды и цепляй к BEEPу - Обидно :((((.

С уважением,
Александр Полонский

Зачем цеплять? Музыку проиграть и так можно. Неупакованный (не RIFF) Wav можно исполнить через sndPlaySound, другие звуки, при наличии кодека - через mciSendString. Или через OCX ActiveMovie ...

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

Согласен, но звуковой файл все-равно нужно в чем-то создавать.

Александр

Для проигрывания звуков есть соответствующая функция WindowsAPI sndPlaySound. Так, что засовывать в Звук. схему WAV совсем не обязательно.

Удачи!
__________________________________
Владимир Якимченко (ICQ: 16993194)

Как я уже ответил в предыдущем письме, для sndPlaySound нужен звуковой файл, который надо создавать в спец.редакторе, а этого не хочется.
Собственно, предыстория была такая. Пока писал в ДОС (CPD2.1, CDD3) пользовался BEEP(freq, durat) для создания последовательности нескольких звуков различной частоты и длительности. Когда перешел на CW, сначала проектировал в 16-бит модели.
В силу привычки к ДОСовскому BEEP написал библиотечку функций для работы со звуком, эмулирующую (по сути) оператор BEEP и использующую ф-ции IN и OUT.
Все прекрасно работало и никаких проблем.
С полпинка создавай любые звук.последовательности.
А вот при переходе на 32-разр.модель получил облом: IN и OUT не работают.
А конкретно хочется вот чего (для 32-бит модели):
1. В программе на Кларе легко создавать простейшие звуковые последовательности из звуков заданной частоты и длительности (без использования других сторонних инструментов (редакторов)
2.Чтобы звуки выводились только на динамик системного блока, а не на колонки (телефоны) независимо от того, есть ли звуковая карта в РС или нет.

Увы, пока ответов на эти вопросы я не получил, хотя флейм поднимался неоднократно.

С уважением,
Александр Полонский

(Добавление)

Может с прототипами что то не то?

ClaIN(UNSIGNED Port,UNSIGNED *Input,UNSIGNED Bytes),RAW,NAME('Cla$IN')
ClaOUT(UNSIGNED Port,*? Output,UNSIGNED Bytes),RAW,NAME('Cla$OUT')

Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com

Hello Andrew,

Можно попробовать MessageBeep(-1) По доке написано что производиться простой бип через звуковую карту, ежели отсутствует через спикер.
Проверить не могу так как имею звуковую... Пробуйте прототип:

!BOOL MessageBeep(
! UINT uType // sound type
!);
MessageBeep(Ulong SoundType), Bool, Name('MessageBeep')

Best regards,
Andrew Listiev
Work mailto:andrewl@inbox.lv
Home mailto:gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger: werdna_werdna@hotmail.com

В проге на CW5 эти функции не прототипировал,
а в коде программы вызывал как в CPD2.1, т.е.
IN(port,S), где S - переменная типа BYTE для приема из порта,
OUT(port,D), где D - переменная типа BYTE для вывода в порт.
В 16-разр. модели эти функции прекрасно отрабатывали.
В 32-разр. - компиляция проходит успешно, при запуске функции не отрабатывают, GPFа нет, но зависания бывали.

Александр

(Добавление)

Привет.

Я не спец в этом вопросе, но все же есть предположение... А нельзя ли на асме вызвать какой-нить INT в бивисе, чтоб котяра замурлыкала?

Сергей.

...и получишь в тыкву от системы, если это NT и выше.
Драйверок, видимо, писать придется...

--
Best regards,
Maxim Yemelyanov,
Enigma Soft Company
phone: +380 572 177977
WEB: http://enigmasoft.com.ua
e-mail: clalist@enigmasoft.com.ua
ICQ: 12253836

Теоретически, наверно, можно. Не пробовал, но думаю, что Winda все-равно отлуп даст на 32-бит модели.

Александр

(Добавление)
Режим 32-бита не работает ни в какой из версий Клариона:
( проверял для CLARION-5 и CLARION-5.5h )
Библиотечку звуковую ты юзал мою, но она работает только для 16-бит приложений, т.к.
использует процедуры IN и OUT прямого доступа к портам.
В 32-бит приложениях это не работает, хотя и компилится без ошибок. Видимо, это связано с тем, что 32-бит ОС запрещают прямой доступ к портам. Во всяком случае, мне так и не удалось напрямую (через порты) вывести звук на динамик РС.
На этот вопрос в рассылке никто толково так и не ответил.
Помнится, Олег Руденко, кажется высылал WinAPI функции для доступа к портам. Я их пробовал юзать в 32-бит режиме, но снова - облом. Так что - остается только 16-бит. Да и тут есть проблемы - звук выводится на динамик РС только в том случае, когда нет звук.карты, если она есть - то вывод идет не на динамик, а через карту - на колонки (телефоны).
Но на сайте я не обнаружил: а кто же автор этого замечательного сайта?
Подскажите, кто автор этого сайта?
Автор сайта - Евгений Стефаненко

С уважением,
Александр Полонский

(Добавление)
Увы, пока ответов на эти вопросы я не получил, хотя флейм поднимался неоднократно.
Может это поможет:
Какие есть api-функции для работы со звуком, кроме sndplay?

waveIn*() / waveOut*() ну и DirectX.

RV> Чеpез поpты... Вот, завалялось ;)

Код: Выделить всё

 RV> --== Cut: [Windows Clipboard] ===
 RV> Procedure Sound(Duration: Integer; Freq: Word);
 RV> var
 RV>   Ver: TOsVersionInfo;
 RV> begin
 RV>   Ver.dwOSVersionInfoSize := SizeOf(Ver);
 RV>   GetVersionEx(Ver);
 RV>   if ver.dwPlatformId = VER_PLATFORM_WIN32_NT then
 RV>     Windows.Beep(Duration, Freq)
 RV>   else begin
 RV>     asm
 RV>       mov al,0b6H
 RV>       out 43H,al
 RV>       mov ax,Freq
В AX надо класть (1193180 div Freq), AX - это _делитель_ частоты 1193180 Гц для получения нужной...

Код: Выделить всё

 RV>       out 42h,al
 RV>       ror ax,8
 RV>       out 42h,al
 RV>       in  al,61H
 RV>       or  al,03H
 RV>       out 61H,al
 RV>     end;
 RV>     Sleep(Duration);
 RV>     asm
 RV>       in  al,61H
 RV>       and al,0fcH
 RV>       out 61H,al
 RV>     end;
 RV>   end;
 RV> end;
Всякие midiOutы со странными buffерами работают, содержимое которых нихрена в msdn не описано.
Лирическое вступление:
Я - человек пещерный, самое могучее, что у меня стоит на 486 - Борланд4.5, еще есть ВижуалС какой-то вообще без номера, но 16-битный - так вот, для этого ВижуалаС я неоднократно писал мидизвукоизвлекатели используя функции описанные в отдельном файле WIN31MWH.HLP - хелп по мультимедиа 3-их виндов

Теперь конкретно:
Открываем миди девайс (в данном случае MIDI_MAPPER):
#include <mmsystem.h>
HMIDIOUT hMidiOut;
midiOutOpen(&hMidiOut,MIDI_MAPPER,0,0,0);//returns 0 if successful
//или (UINT)MIDI_MAPPER - как повезет... Hе помню, в чем дело...

И поем:
midiOutShortMsg(hMidiOut,midiMessage);
Где midiMessage строится исходя из принципов миди, например:
- выбор инструмента - 0XiiCc, где ii - номер инструмента (0..7F)
- дать тон - 0Xvvnn9c, где vv- громкость (0..7F), nn - нота (0..7F)
- cнять тон - 0Xvvnn8c, где все то же...
буква "c" в этих трех сообщениях означает номер канала миди (0..F)

Хватит, напелись, закрываем лавочку:
midiOutClose(hMidiOut);
Вроде бы совсем кристально...

Лирическое заключение:
Вот дай только Бог, чтобы я ничего не напутал...

В хелпе Борланда4.5, относящемся к 32-битным виндам (WIN32.HLP) описано значительно больше мультимедийных функций, чем в вышеуказанном, однако совместимость, похоже, не потерялась. Конкретно - нехитрый миди-редактор, который я ваял месяцев 5 назад, нормально компилировался и в указанном ВижуалС и в Борланд5.02... Только теперь у меня этого Борланда нет...

с почтеньем,
Rodion

-
Best regards,
Maxim Yemelyanov
Написал: ClaList(2)

Добавлено: 04 Март 2004, 14:52
Гость
Ник, я с тобой согласен - эти функции не задекларированы в CW, но посмотри libmaker-ом библиотеку CXXrunx.dll - Cla$IN, Cla$OUT присутствуют.
Никогда не пользую undocumented и другим не советую. Там более, что в 6-ке и далее это наверняка никогда не заработает.
Какую-нибудь нехитрую сиренку уже в проге на Кларе не сваяешь - ...
Для нехитрых сиренок есть BEEP и стандартные звуки.
... запускай муз.редактор и создавай .WAW, потом засовывай его ...
Все гораздо проще. Берешь микрофон, запускаешь запись и сообщаешь юзеру все, что ты про его способности думаешь ;)
... в Звук.схему Винды и цепляй к BEEPу - Обидно :((((.
Не понял? Обидно использовать штатные возможности? Хочется чего нибудь
этакого? Запусти медиаплейер и добавь к словам выражение своего лица и
движение рук ;)))

WBR, Nick Tsigouro
Написал: ClaList(2)