Господа, такой вопрос. Как можно написать ф-цию подобную системной beep? Задача возникла от того, что эта ф-ция выполняет все нужные мне ф-ции, но только в НТ-шных системах. А именно если ей передать два параметра: frequency и duration, то обрабатывать она их будет только под НТ. В 9х они игнорируются. Не скажете как она производит звук на колонках и как это сделать самому с поддержкой этих 2х параметров в 9х? Заранее всем спасибо!
Попробовал использовать HalMakeBeep, как ты описывал в своем посте. Все получил - AV. Так будет ли оно работать в 9х? Я думаю нет, тогда как быть ведь это основное условие.
HalMakeBeep это для дров. Я хотел сказать этой ссылкой, что путь к тому месту где оно пищать начинает весьма тернист, не более. Попробуй дизасмни MessageBeep для 9х и посмотри чего она делает.
Хорошо попробую. А нельзя ли каким-нибудь хитрым образом через порты ввода/вывода? В 9х кажется к ним можно обращаться напрямую, или я ошибаюсь? Жаль, что никто не страдал тем же....
Попробуй эти примеры : http://www.dinform.ru/kuban/htmls/public_htmls/2-11299.html http://forum.vingrad.ru/index.php?showtopic=20338&view=new Случаем не встречал , где мелодии для такого бипа водяться ?
К драйверу giveio.sys прилагалась демка для теста - тм как раз через порты Код (Text): /********************************************************************* 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; }