Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Взаимодействие с beep.sys

5.3K
24 декабря 2006 года
Somebody
185 / / 24.12.2006
Пишу crt для Windows. Не знаю, как сделать sound, точнее как открыть драйвер (beep.sys) и как его использовать. Кто-нибудь, помогите.
1.9K
26 декабря 2006 года
AxXxB
229 / / 21.11.2006
ЯЗЫК КАКОЙ???!!!! :mad: :mad: :mad:
5.3K
27 декабря 2006 года
Somebody
185 / / 24.12.2006
Цитата:
ЯЗЫК КАКОЙ???!!!!


Лучше Delphi, но вообще можно C или assembler.

1.8K
27 декабря 2006 года
k3Eahn
365 / / 19.12.2005
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
Работоспособность этого кода я не проверял...
5.3K
28 декабря 2006 года
Somebody
185 / / 24.12.2006
А через CreateFile нельзя? Или надо DDK скачивать? Я с функциями из ntdll никогда не работал, заголовочных файлов для C нет, модулей для Delphi тоже.
1.8K
28 декабря 2006 года
k3Eahn
365 / / 19.12.2005
В общем, забей на ту ссылку, что я кинул, ибо
"изобретать велосипед" нет необходимости:
http://msdn2.microsoft.com/en-us/library/ms679277.aspx
5.3K
29 декабря 2006 года
Somebody
185 / / 24.12.2006
Меня интересует именно создание звука через драйвер.
Во-первых, драйвера я никогда даже не открывал.
Во-вторых, хочу этому научиться.
В-третьих, мне нужен именно sound(freq), как в досовских Pascal/C, без длительности.
Beep(freq,1) в цикле – как-то нехорошо, Beep(freq,cardinal(-1)) в отдельном потоке - тоже нехорошо, т.к. если его прервать TerminateThread'ом, то останется открытый хэндл.
А с драйвером должно бы получиться всё нормально, только как это сделать?
--------------------------------------
Поздравляю всех с наступающим!
1.8K
02 января 2007 года
k3Eahn
365 / / 19.12.2005
Значит так. Набросал код функции, которая, делает практически то же, что и Beep из Platform SDK. Вот она:
Код:
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;
}
Функция асинхронная:
Несмотря на то, что устройство открывается для работы в синхронном режиме, DeviceIoControl отрабатывает асинхронно, т.е. возвращает управление функции, не дожидаясь окончания операции вывода.
Есть такая функция - CancelIo, которая прерывает операцию ввода/вывода, но она работает только с устройствами, открытыми в асинхронном режиме, поэтому в данном случае она не подходит. Но зато вот CloseHandle как раз и вырубает динамик, не обращая внимания на незаконченный вывод.
5.3K
04 января 2007 года
Somebody
185 / / 24.12.2006
Спасибо, всё работает.
Вот 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;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог