typedef struct _BEEP_SET_PARAMETERS {
ULONG Frequency;
ULONG Duration;
} BEEP_SET_PARAMETERS, *PBEEP_SET_PARAMETERS;
#define IOCTL_BEEP_SET \
CTL_CODE(FILE_DEVICE_BEEP,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
HRESULT CustomBeep (UINT uFreq, UINT uDuration)
{
HANDLE hBeep;
BEEP_SET_PARAMETERS BeepSetParameters;
DWORD dwReturned;
TCHAR tszDevPath[MAX_PATH];
bool bOwnDevName = false;
static const TCHAR tcszFileName[] = _T("\\\\.\\Buzz");
static const TCHAR *ptcszDevName =
tcszFileName + (sizeof(_T("\\\\.\\")) - sizeof(TCHAR)) / sizeof(TCHAR);
if(0 == QueryDosDevice(ptcszDevName, tszDevPath, MAX_PATH))
{
DefineDosDevice(DDD_RAW_TARGET_PATH, ptcszDevName,
_T("\\Device\\Beep"));
bOwnDevName = true;
};
hBeep = CreateFile(tcszFileName,
FILE_GENERIC_READ | FILE_GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if (hBeep == INVALID_HANDLE_VALUE)
return E_FAIL;
BeepSetParameters.Frequency = uFreq;
BeepSetParameters.Duration = uDuration;
DeviceIoControl(hBeep,
IOCTL_BEEP_SET, &BeepSetParameters, sizeof(BEEP_SET_PARAMETERS),
NULL, 0, &dwReturned, NULL);
if(bOwnDevName)
DefineDosDevice(DDD_REMOVE_DEFINITION, ptcszDevName, NULL);
CloseHandle (hBeep);
return S_OK;
}
Взаимодействие с beep.sys
Пишу crt для Windows. Не знаю, как сделать sound, точнее как открыть драйвер (beep.sys) и как его использовать. Кто-нибудь, помогите.
ЯЗЫК КАКОЙ???!!!! :mad: :mad: :mad:
Цитата:
ЯЗЫК КАКОЙ???!!!!
Лучше Delphi, но вообще можно C или assembler.
http://209.85.135.104/search?q=cache:B49zBf7443sJ:www.reactos.org/pipermail/ros-diffs/2005-October/009173.html+beep.sys,+deviceiocontrol&hl=ru&gl=ru&ct=clnk&cd=2
Работоспособность этого кода я не проверял...
Работоспособность этого кода я не проверял...
А через CreateFile нельзя? Или надо DDK скачивать? Я с функциями из ntdll никогда не работал, заголовочных файлов для C нет, модулей для Delphi тоже.
В общем, забей на ту ссылку, что я кинул, ибо
Во-первых, драйвера я никогда даже не открывал.
Во-вторых, хочу этому научиться.
В-третьих, мне нужен именно sound(freq), как в досовских Pascal/C, без длительности.
Beep(freq,1) в цикле – как-то нехорошо, Beep(freq,cardinal(-1)) в отдельном потоке - тоже нехорошо, т.к. если его прервать TerminateThread'ом, то останется открытый хэндл.
А с драйвером должно бы получиться всё нормально, только как это сделать?
--------------------------------------
Поздравляю всех с наступающим!
Код:
Несмотря на то, что устройство открывается для работы в синхронном режиме, DeviceIoControl отрабатывает асинхронно, т.е. возвращает управление функции, не дожидаясь окончания операции вывода.
Есть такая функция - CancelIo, которая прерывает операцию ввода/вывода, но она работает только с устройствами, открытыми в асинхронном режиме, поэтому в данном случае она не подходит. Но зато вот CloseHandle как раз и вырубает динамик, не обращая внимания на незаконченный вывод.
Вот Beep на Delphi:
Код:
type BEEP_SET_PARAMETERS= record
Frequency,Duration:cardinal;
end;
const IOCTL_BEEP_SET=$10000;
FileNameStr:array [0..9] of char='\\.\Zzzz'#0;
FileName:PChar=@FileNameStr[0];
DevName:PChar=@FileNameStr[3];
var DevPath:array [0..MAX_PATH] of char;
function CustomBeep(Freq,Duration:cardinal):longint; stdcall;
var hBeep:cardinal;
BeepSetParams:BEEP_SET_PARAMETERS;
BytesReturned:cardinal;
OwnDevName:longbool;
begin
OwnDevName:=false;
if QueryDosDevice(DevName,DevPath,MAX_PATH)=0 then begin
DefineDosDevice(DDD_RAW_TARGET_PATH,DevName,'\Device\Beep');
OwnDevName:=true;
end;
hBeep:=CreateFile (FileName,GENERIC_READ or GENERIC_WRITE,
0,nil,OPEN_EXISTING,0,0);
if hBeep=INVALID_HANDLE_VALUE then begin
Result:=E_FAIL; exit;
end;
BeepSetParams.Frequency:=2000;
BeepSetParams.Duration:=1000;
DeviceIOControl (hBeep,IOCTL_BEEP_SET,{@BeepSetParams,}@Freq,
sizeof(BEEP_SET_PARAMETERS),nil,0,BytesReturned,nil);
if OwnDevName then DefineDosDevice(DDD_REMOVE_DEFINITION,DevName,nil);
Sleep(BeepSetParams.Duration);
CloseHandle(hBeep);
Result:=S_OK;
end;
Frequency,Duration:cardinal;
end;
const IOCTL_BEEP_SET=$10000;
FileNameStr:array [0..9] of char='\\.\Zzzz'#0;
FileName:PChar=@FileNameStr[0];
DevName:PChar=@FileNameStr[3];
var DevPath:array [0..MAX_PATH] of char;
function CustomBeep(Freq,Duration:cardinal):longint; stdcall;
var hBeep:cardinal;
BeepSetParams:BEEP_SET_PARAMETERS;
BytesReturned:cardinal;
OwnDevName:longbool;
begin
OwnDevName:=false;
if QueryDosDevice(DevName,DevPath,MAX_PATH)=0 then begin
DefineDosDevice(DDD_RAW_TARGET_PATH,DevName,'\Device\Beep');
OwnDevName:=true;
end;
hBeep:=CreateFile (FileName,GENERIC_READ or GENERIC_WRITE,
0,nil,OPEN_EXISTING,0,0);
if hBeep=INVALID_HANDLE_VALUE then begin
Result:=E_FAIL; exit;
end;
BeepSetParams.Frequency:=2000;
BeepSetParams.Duration:=1000;
DeviceIOControl (hBeep,IOCTL_BEEP_SET,{@BeepSetParams,}@Freq,
sizeof(BEEP_SET_PARAMETERS),nil,0,BytesReturned,nil);
if OwnDevName then DefineDosDevice(DDD_REMOVE_DEFINITION,DevName,nil);
Sleep(BeepSetParams.Duration);
CloseHandle(hBeep);
Result:=S_OK;
end;