<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AutoIt v3: подача звукового сигнала через системный динамик]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=5900</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5900&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AutoIt v3: подача звукового сигнала через системный динамик».]]></description>
		<lastBuildDate>Mon, 13 Jun 2011 15:27:15 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AutoIt v3: подача звукового сигнала через системный динамик]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=49107#p49107</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em><br />Скрипт включает системный динамик на заданной частоте. Аналогичен скрипту представленному <a href="http://www.forum.script-coding.com/viewtopic.php?pid=31674#p31674">здесь</a>.</p><p>Потребуется библиотека <a href="http://www.pcports.ru/files/inpout32.rar">INPOUT32.DLL</a> установленная в каталог %systemdir%.</p><p>Lang AutoIt v3<br />OC WinXP</p><div class="codebox"><pre><code>;=========================================================
; Включение системного динамика на заданной частоте.
;=========================================================
; Потребуется библиотека INPOUT32.DLL установленная в 
; каталог %systemdir% (http://www.pcports.ru/files/inpout32.rar)
;
; Lang AutoIt v3
; OC WinXP
;=========================================================
 #NoTrayIcon


    Global Const $GUI_EVENT_CLOSE        = -3
    ;-------------------------------------------------
    Global Const $BS_CENTER            = 0x0300
    Global Const $BS_MULTILINE            = 0x2000
    Global Const $BS_VCENTER            = 0x0C00
    Global Const $BS_FLAT                = 0x8000
    Global Const $SS_CENTER            = 1
    Global Const $ES_CENTER            = 1
    Global Const $BS_DEFPUSHBUTTON        = 0x0001
    ;-------------------------------------------------
    Global Const $WS_BORDER            = 0x00800000
    Global Const $WS_SYSMENU            = 0x00080000
    Global Const $WS_CAPTION            = 0x00C00000
    Global Const $WS_VISIBLE            = 0x10000000
    ;-------------------------------------------------
    

;=========================================================
 Global $IODLL = DllOpen(&#039;INPOUT32.DLL&#039;)
 If $IODLL = -1 Then MsgBox(262192,&#039;Error&#039;,&#039;Установите INPOUT32.DLL.&#039;);Exit;

 Global $iTimer = 0x0043    ;Базовый адрес системного таймера        
 Global $iTimer1 = 0x0040    ;Адрес канала 0
 Global $iTimer1 = 0x0041    ;Адрес канала 1
 Global $iTimer2 = 0x0042    ;Адрес канала 2

 Global $iSysBeep = 0x0061    ;Адрес системного динамика
 Global $a            ;Начальное состояние младшей тетрады регистра 0x61 системного динамика, когда он находится в отключенном состоянии 

 Global $isBeep = False
;---------------------------------------------------------
 Opt(&#039;GUICloseOnESC&#039;,1)
 $hGUI =    GUICreate (&#039;System Beep&#039;,135,200,-1,-1, _
        BitOr($WS_SYSMENU,$WS_CAPTION,$WS_VISIBLE))

 $hLabel1 = GUICtrlCreateLabel (&#039;Укажите частоту,гц&#039;,5,2,120,20, _
        BitOr($WS_BORDER,$SS_CENTER))

 $hInput1 = GUICtrlCreateInput (&#039;1000&#039;,5,30,120,30, _
        BitOr($WS_BORDER,$ES_CENTER))


 $hCommand1 = GUICtrlCreateButton (&#039;[beep]&#039;,5,65,120,30, _
        BitOr($BS_CENTER,$BS_DEFPUSHBUTTON))
        
 GUISetState()

    While 1
        $iMSG = GUIGetMsg()
        Select
            Case $iMSG = $GUI_EVENT_CLOSE
                ExitLoop;
            Case $iMSG = $hCommand1
                SysBeep1();
        EndSelect
    Wend
    Exit;

;[Включение/заглушка системного динамика]
;=========================================================
 Func SysBeep1()

    ;[Включить системный динамик на заданной частоте]
    ;-------------------------------------------------
    If Not $IsBeep Then

        ;[Прочитать начальное состояние системного динамика]
        ;-----------------------------------------
        $iState0 = &#039;0x&#039; &amp; Hex(Inp32($iSysBeep));

        ;[Получить частоту]
        ;-----------------------------------------
        Local $hFreq = GuiCtrlRead($hInput1);
        If StringRegExp ($hFreq, &#039;\D&#039; , 0) Then
            MsgBox(262192,&#039;Error&#039;,&#039;Укажите корректное значение частоты.&#039;);
            return
        EndIf
        
        $hFreq = &#039;0x&#039; &amp; Hex(Int(1193180/Number($hFreq)));
        
        ;[Получить младший и старший байт значения частоты счета]
        ;-----------------------------------------
        $iHByte = &#039;0x&#039; &amp; Hex(BitAnd(0x0000ff00, $hFreq));
        $iHByte = &#039;0x&#039; &amp; Hex(BitShift($iHByte,8))    ;Старший байт        

        $iLByte = &#039;0x&#039; &amp; Hex(BitAnd(0x000000ff,$hFreq))    ;Младший байт

        ;Команда записанная в базовый порт трехканального 
        ;таймера разрешает последовательную запись младшего и старшего байта
        ;начального значения счетчика в канал 2 таймера и циклический 
        ;счет в этом канале.
        ;-----------------------------------------
        Out32($iTimer,0x00b6);    

        ;При первом обращении к порту записывается младший 
        ;регистр начального значения счетчика, при втором - старший.
        ;-----------------------------------------
        Out32($iTimer2,$iLByte);
        Out32($iTimer2,$iHByte);

        ;Включение звука
        ;-----------------------------------------
        ;Запись битов 4-7 в регистр динамика запрещена, поэтому, вполне достаточно работать с битами 0-3
        $a = &#039;0x&#039; &amp; Hex(BitAnd(0x0f,$iState0))    ;Исключить старшую тетраду
        ;-----------------------------------------
        ;1=1b-нулевой бит(слева направо), разрешает счет в канале 2 таймера
        ;2=10b-первый бит, разрешает поступление импульсов с канала 2 таймера на системный динамик
        $b = $a+1+2

        Out32($iSysBeep,$b);        

        $IsBeep = True;
        GUICtrlSetData ($hCommand1, &#039;[mute]&#039;);

    Else
        Out32($iSysBeep,$a)    ;Заглушить системный динамик, восстановление исходного значения младшей тетрады регистра
        $IsBeep = False;
        GUICtrlSetData ($hCommand1, &#039;[beep]&#039;);
    EndIf
 EndFunc

;[Чтение данных порта устройства]
;=========================================================
 Func Inp32($sPort)

    SetError(0);
    $result=DllCall($IODLL, _
                &#039;short&#039;    ,&#039;Inp32&#039;, _
                &#039;short&#039;    ,$sPort);
    If Not @error Then
        return $result[0];
    Else 
        return -1;
    EndIf
 EndFunc

;[Запись данных в порт устройства]
;=========================================================
 Func Out32($sPort,$sData)

    SetError(0);
    $result=DllCall($IODLL, _
                &#039;none&#039;    ,&#039;Out32&#039;, _
                &#039;short&#039;    ,$sPort, _
                &#039;short&#039;, $sData);


    
    If Not @error Then
        return 1;
    Else 
        return -1;
    EndIf
 EndFunc
;=========================================================
;pltrgst</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Mon, 13 Jun 2011 15:27:15 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=49107#p49107</guid>
		</item>
	</channel>
</rss>
