· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ELECTRONICS —› Beep

Посл.отвђт Сообщенiе


Дата: Сен 10, 2004 16:04:56

Господа, такой вопрос.
Как можно написать ф-цию подобную системной beep? Задача возникла от того, что эта ф-ция выполняет все нужные мне ф-ции, но только в НТ-шных системах. А именно если ей передать два параметра: frequency и duration, то обрабатывать она их будет только под НТ. В 9х они игнорируются.

Не скажете как она производит звук на колонках и как это сделать самому с поддержкой этих 2х параметров в 9х?

Заранее всем спасибо!


Дата: Сен 10, 2004 16:20:53


Дата: Сен 10, 2004 16:27:20 · Поправил: Arvis

Только через HalMakeBeep? Больше никак? А будет ли оно работать под 9х?


Дата: Сен 10, 2004 17:33:20

Попробовал использовать HalMakeBeep, как ты описывал в своем посте. Все получил - AV. Так будет ли оно работать в 9х? Я думаю нет, тогда как быть ведь это основное условие.


Дата: Сен 10, 2004 17:53:21

HalMakeBeep это для дров. Я хотел сказать этой ссылкой, что путь к тому месту где оно пищать начинает весьма тернист, не более. Попробуй дизасмни MessageBeep для 9х и посмотри чего она делает.


Дата: Сен 10, 2004 18:36:38

Хорошо попробую. А нельзя ли каким-нибудь хитрым образом через порты ввода/вывода? В 9х кажется к ним можно обращаться напрямую, или я ошибаюсь?
Жаль, что никто не страдал тем же....


Дата: Сен 10, 2004 19:38:15 · Поправил: bogrus

Попробуй эти примеры :
http://www.dinform.ru/kuban/htmls/public_htmls/2-11299.html
http://forum.vingrad.ru/index.php?showtopic=20338&view=new

Случаем не встречал , где мелодии для такого бипа водяться ?


Дата: Сен 13, 2004 11:14:07

Нет, не встречал


Дата: Сен 15, 2004 03:03:27

К драйверу giveio.sys прилагалась демка для теста - тм как раз через порты
/********************************************************************* 

Author:     Dale Roberts
Date:       8/30/95
Program:    TSTIO.EXE
Compile:    cl -DWIN32 tstio.c

Purpose:    Test the GIVEIO device driver by doing some direct
            port I/O.  We access the PC's internal speaker.

*********************************************************************/ 
#include <stdio.h>
#include <windows.h>
#include <math.h>
#include <conio.h>

typedef struct {
	short int pitch;
	short int duration;
} NOTE;

/*
 *  Table of notes.  Given in half steps.  It's a communication from
 * the "other side."
 */
NOTE notes[] = {{14, 500}, {16, 500}, {12, 500}, {0, 500}, {7, 1000}};

/********************************************************************* 
  Set PC's speaker frequency in Hz.  The speaker is controlled by an
Intel 8253/8254 timer at I/O port addresses 0x40-0x43.
*********************************************************************/ 
void setfreq(int hz)
{
	hz = 1193180 / hz;						// clocked at 1.19MHz
	_outp(0x43, 0xb6);						// timer 2, square wave
	_outp(0x42, hz);
	_outp(0x42, hz >> 8);
}

/********************************************************************* 
  Pass a note, in half steps relative to 400 Hz.  The 12 step scale
is an exponential thing.  The speaker control is at port 0x61.
Setting the lowest two bits enables timer 2 of the 8253/8254 timer
and turns on the speaker.
*********************************************************************/ 
void playnote(NOTE note)
{
	_outp(0x61, _inp(0x61) | 0x03);			// start speaker going
	setfreq((int)(400 * pow(2, note.pitch / 12.0)));
	Sleep(note.duration);
	_outp(0x61, _inp(0x61) & ~0x03);		// stop that racket!
}

/********************************************************************* 
  Open and close the GIVEIO device.  This should give us direct I/O
access.  Then try it out by playin' our tune.
*********************************************************************/ 
int main()
{
	int i;
	HANDLE h;

    h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,
					OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(h == INVALID_HANDLE_VALUE) {
        printf("Couldn't access giveio device\n");
        return -1;
    }
	CloseHandle(h);

	for(i=0; i < sizeof(notes)/sizeof(int); ++i)
		playnote(notes[i]);

	return 0;
}


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038