Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Beep [D6, Win2k]


AlexandrRya ©   (2003-05-19 22:35:00) 

Народ, кто знает, как сделать аналог Sound и Nosound в W2k? Beep мне не подходитЮ так как я не знаю, с колько времени будет продолжаться сигнал. Я делал так:

////////////////////////////////////////////////////////////////
void DoBeep(WORD wFreq, WORD wDelay)
{
DWORD dwParam;
if (bPlayed) {
TerminateThread(hThread, 0);
CloseHandle(hThread);
}
dwParam = (DWORD)MAKELONG(wFreq, wDelay);
hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID)&dwParam, 0, &dwThread);
bPlayed = TRUE;
}

//////////////////////////////////////////////////////////

DWORD WINAPI ThreadProc (LPVOID lpParam)
{
DWORD dwParam;
WORD wFreq;

dwParam = *(LPDWORD)lpParam;
wFreq = HIWORD(dwParam);
Beep(wFreq+100,LOWORD(dwParam)+100);
bPlayed = FALSE;
SendMessage(hwnd, SM_SOUNDSTOP, 0, 0);
return 0;
}

/////////////////////////////////////////////////////

То есть как только сигнал нужно было прервать я просто грохал нитку :). Но при этом оказалось, что каждый раз после некорректного завершения такой нитки остается открытым файл-устройство \Device\Beep. Если кто-то знает, помогите. Может кто-то подскажет, ка закрыть уже открытый файл, зная только его имя.
Но лучше объясните, как написать Sound и NoSound. Знаю, что для этого kernel32 использует NtDeviceIoControlFile(...), может кто-то стакими чтуками сталкивался? В NtDDK она не описана, хотя пару раз упомиается в комментарих.


AlexandrRya   (2003-05-21 22:21:00) [1]

To KDS:
Именно ее я и использую:

...
Beep(wFreq+100,LOWORD(dwParam)+100);
...


Verg   (2003-05-21 21:21:00) [2]

Windows 95:The parameter is ignored.


Вот, вот....


KDS   (2003-05-21 17:14:00) [3]

Используй "Бипку" из модуля "Виндовз"
Windows.Beep(1024,3000);
Цитирую Била Гейтса (из хэлпа):
The Beep function generates simple tones on the speaker. The function is synchronous; it does not return control to its caller until the sound finishes.

BOOL Beep(
DWORD dwFreq, // sound frequency, in hertz
DWORD dwDuration // sound duration, in milliseconds
);

Parameters

dwFreq

Windows NT:Specifies the frequency, in hertz, of the sound. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF).
Windows 95:The parameter is ignored.

dwDuration
Windows NT:Specifies the duration, in milliseconds, of the sound.
Windows 95:The parameter is ignored.


KDS   (2003-05-21 17:12:00) [4]

Используй "Бипку" из модуля "Виндовз"
Windows.Beep(1024,3000);
Цитирую Била Гейтса (из хэлпа):
The Beep function generates simple tones on the speaker. The function is synchronous; it does not return control to its caller until the sound finishes.

BOOL Beep(
DWORD dwFreq, // sound frequency, in hertz
DWORD dwDuration // sound duration, in milliseconds
);

Parameters

dwFreq

Windows NT:Specifies the frequency, in hertz, of the sound. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF).
Windows 95:The parameter is ignored.

dwDuration
Windows NT:Specifies the duration, in milliseconds, of the sound.
Windows 95:The parameter is ignored.


AlexandrRya   (2003-05-20 22:28:00) [5]

Thanks to all

To Bogachev> мне надо через спикер :)


Bogachev   (2003-05-20 20:21:00) [6]

USES mmsystem;

sndPlaySound("C:\TEST.WAV",SND_ASYNC); // PLAY
sndPlaySound("C:\TETS.WAV",SND_ASYNC+SND_LOOP); // Loop Mode (зацикливание)
sndPlaySound(Nil,SND_ASYNC); //STOP

Плай саунд делать в отдельной нитке а останавливать в гланой.
плюс прописать FreeOnTerminate := True побочной нитке!


Севостьянов Игорь   (2003-05-20 11:42:00) [7]

Да забыл вставить либо Sleep(0); либо Apllication.ProcessMessages


Севостьянов Игорь   (2003-05-20 11:41:00) [8]

Какие-то сложности у тя с этим - по моему проще

DoBeep := True;
while DoBeep do
begin
Beep(100, 1);
if <условие> then DoBeep := False;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо