Форум: "Начинающим";
Текущий архив: 2012.05.13;
Скачать: [xml.tar.bz2];
Внизbeep Найти похожие ветки
← →
Gu (2012-01-07 02:45) [0]ща есть аналог windows.beep какой (как в паскале sound - играть частоту без пауз, как beep)? пример был, но на новых Ос он не фурычит: http://www.kansoftware.ru/?tid=3364 , а на Xe2 x64 вообще асм отменили
← →
Германн © (2012-01-07 02:58) [1]
> Gu (07.01.12 02:45)
>
> ща есть аналог windows.beep какой (как в паскале sound -
> играть частоту без пауз, как beep)? пример был, но на новых
> Ос он не фурычит: http://www.kansoftware.ru/?tid=3364 ,
> а на Xe2 x64 вообще асм отменили
Нет.
← →
Юрий Зотов © (2012-01-07 03:48) [2]А разве Windows.Beep отменили? Или, может, MessageBeep подойдет?
← →
Gu (2012-01-07 06:22) [3]beep с паузами пикает. если 2 бипа подряд написать даже с маленькой задержкой - между ними будет пауза гдето в 0.5-1 сек. а sound паскалевский начинал пищать и мог менять частоту, пока nosound не встретит. написал же.
← →
Gu (2012-01-07 06:28) [4]а и еще он синхронно выполнялся, а бип виндовский прогу вешает на время пика.
← →
Андреевич (2012-01-07 09:31) [5]
> а и еще он синхронно выполнялся, а бип виндовский прогу
> вешает на время пика.
в поток его :)
← →
Сергей М. © (2012-01-11 16:33) [6]
> на Xe2 x64 вообще асм отменили
Это по какому же постановлению партии и правительства ?
← →
han_malign (2012-01-11 17:51) [7]для этого есть DirectSound.
А IDirectSoundBuffer.Play(0,0,DSBPLAY_LOOPING) будет крутиться до морковкиного заговения.
Описывать как работает DX мне лень, но могу описать функцию sin...
> но на новых Ос он не фурычит
- кто ж тебе даст таймер перенастраивать, на котором вся мультизадачность крутится...
И не факт, что на современных MB остался прямой провод с таймера на пищалку...
← →
Gu (2012-01-11 20:33) [8]>> IDirectSoundBuffer.Play
эта штука может частоту указанную проигрывать? 0,0?
← →
Псарь (2012-01-11 22:25) [9]Используй waveOutXXX.
← →
Псарь (2012-01-11 22:28) [10]
> han_malign (11.01.12 17:51) [7]
> Описывать как работает DX мне лень, но могу описать функцию
> sin...
>
Да, вылаживайте.
← →
DVM © (2012-01-12 00:00) [11]
procedure WaveOutCheck(result: MMRESULT);
var
Mess: string;
begin
Mess := "";
case result of
MMSYSERR_NOERROR: Exit;
MMSYSERR_ALLOCATED:
Mess := "Драйвер уже открыт";
MMSYSERR_BADDEVICEID:
Mess := "Неверный идентификатор устройства";
MMSYSERR_NODRIVER:
Mess := "Отсутствует драйвер устройства";
MMSYSERR_NOMEM:
Mess := "Невозможно распределить или зафиксировать память";
WAVERR_BADFORMAT:
Mess := "Неверный формат данных";
WAVERR_SYNC:
Mess := "Попытка воспроизведения на синхронном устройстве";
MMSYSERR_INVALHANDLE:
Mess := "Неверный ключ устройства";
WAVERR_UNPREPARED:
Mess := "Попытка воспроизведения неподготовленного блока данных";
WAVERR_STILLPLAYING:
Mess := "Блок данных находится в очереди на воспроизведение";
end;
raise Exception.Create(Mess);
end;
procedure PlaySignal(AFreq: Integer);
var
WaveOut: HWaveOut;
WaveHdr: TWaveHdr;
Format: TWaveFormatEx;
DataSize: integer;
procedure SetFreq(pos1, pos2, hz: integer);
var
pos: integer;
v: single;
step: single;
begin
v := VOLUME;
step := -VOLUME / (16000 / hz);
pos := pos1;
while pos < pos2 do begin
PByte(cardinal(waveHdr.lpData) + pos)^ := trunc(v);
v := v + step;
if abs(v) > VOLUME then step := -step;
inc(pos);
end;
end;
begin
DataSize := 16000 * 2;
with Format do
begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1;
nSamplesPerSec := 16000;
wBitsPerSample := 8;
nBlockAlign := nChannels * wBitsPerSample div 8;
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
end;
with WaveHdr do
begin
GetMem(lpData, DataSize);
dwBufferLength := DataSize;
dwFlags := 0;
dwLoops := 0;
end;
try
WaveOutCheck(WaveOutOpen(@WaveOut, WAVE_MAPPER, @Format, 0, 0, 0));
try
SetFreq(0, DataSize - 1, AFreq);
WaveOutCheck(WaveOutPrepareHeader(WaveOut, @WaveHdr, SizeOf(TWaveHdr)));
try
WaveOutCheck(WaveOutWrite(WaveOut, @WaveHdr, SizeOf(TWaveHdr)));
Sleep(DataSize div 16);
finally
WaveOutUnprepareHeader(WaveOut, @WaveHdr, SizeOf(TWaveHdr));
WaveOutReset(WaveOut);
end;
finally
WaveOutClose(WaveOut);
end;
finally
FreeMem(WaveHdr.lpData);
end;
end;
← →
han_malign (2012-01-12 10:19) [12]
> эта штука может частоту указанную проигрывать? 0,0?
- вам таки дать описание функции Sin?
Рассказать как связать частоту дискретизации и частоту требуемой гармоники с необходимым количеством сэмплов в 2Pi, а [-1.0,1.0] растянуть на -32767..32767?
> DVM © (12.01.12 00:00) [11]
- это пила и она синхронная...
Тогда уж по полной аналогии с пищалкой надо было меандр выводить(АЧХ пищалки можно проигнорировать)...
← →
DVM © (2012-01-12 10:20) [13]
> han_malign (12.01.12 10:19) [12]
> - это пила
Да можно любую форму соорудить сигнала.
> и она синхронная...
в поток ее
← →
Alex_C (2012-01-12 12:21) [14]Не все так просто. Паскалевкий бип пищал во внутренний динамик компа, DirectSound etc - издает звук на колонки через ЗВУКОВУЮ плату.
Если есть необходимость издать звук именно на внутренний динамик компа советую порыться в статьях на этом сайте - есть достаточно подробная статься тут (сейчас так вот ее не нашел, но была точно).
Но предупреждаю - если ожидаете увидеть одну комманду типа beep - не надейтесь :) Там все не так уж просто - разбираться прийдется.
← →
DVM © (2012-01-12 16:13) [15]
> Alex_C (12.01.12 12:21) [14]
На внутренний динамик уже так просто не попищишь. Сейчас у многих компьютеров вообще нет такого динамика (у ноутов в частности) и все звуки все равно идут на колонки через звуковую карту.
← →
Alex_C (2012-01-12 19:19) [16]
> На внутренний динамик уже так просто не попищишь.
Так я и написал, что это весьма не просто. :)
В свое время интересовался, как это сделать.
Кстати нашел исходники как пишать в динамик, но они на cpp - хотя перевести на дельфи не проблема, если кому надо.
← →
Inovet © (2012-01-12 20:10) [17]> [16] Alex_C (12.01.12 19:19)
> Кстати нашел исходники как пишать в динамик,
Под NT? А так пищать им не сложно: или таймером или посылом бита. Вторым способом можно не только пищать, а вообще воспроизвести что угодно в пределах физических ограничений.
← →
Alex_C (2012-01-13 10:56) [18]
> А так пищать им не сложно
Сложно если нужно пищать допустим мелодию без пауз меняя частоту.
Автор программы -
/*
*
* Пример использования спикера из-под Windows NT/2k/XP
* с испльзованием функций драйвера Beep
*
* (C) Alexandr V. Ryabukhin
* r_a_vic@rambler.ru
* 2003
*
************************************************************************/
Полностью код брал на этом сайте.
Вот фрагмент программы:
BOOL Sound(WORD wFreq)
{
OBJECT_ATTRIBUTES oa;
UNICODE_STRING uniName;
IO_STATUS_BLOCK iosb;
NTSTATUS ntsRes;
BEEP_SET_PARAMETERS bsp;
if (hBeep != NULL)
NoSound();
if (wFreq < BEEP_FREQUENCY_MINIMUM
|| BEEP_FREQUENCY_MAXIMUM < wFreq)
return FALSE;
printf("Cool");
// Не знаю, зачем, но эта функция вызывалась в Beep().
// Пусть так и будет
pWinStationBeepOpen(0xFFFFFFFF);
// Заполняем структуру UNICODE_STRING именем нашего устройства
pRtlInitUnicodeString(&uniName, DD_BEEP_DEVICE_NAME_U);
// Инициализируем структуру OBJECT_ATTRIBUTES
InitializeObjectAttributes(&oa, &uniName, 0, NULL, NULL);
// Открываем спикер
ntsRes = pNtCreateFile(&hBeep, FILE_READ_DATA, &oa, &iosb, 0, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ, FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, 0);
if (hBeep == NULL || ntsRes != STATUS_SUCCESS){
wsprintf(lpTxt, "Can"t open device! Error code: %d\n", ntsRes);
printf(lpTxt);
ShowError(iosb.Status);
return FALSE;
}
wsprintf(lpTxt,
"Device opened successfull! Handle: 0x%08X\n", (DWORD)hBeep);
printf(lpTxt);
ZeroMemory(&iosb, sizeof(IO_STATUS_BLOCK));
// Далее в структуре BEEP_SET_PARAMETERS ставим частоту
// ту, которую нужно, а длителность - почти бесконечность :)
bsp.Frequency = 1000;//(ULONG)wFreq;
bsp.Duration = 0xFFFFFFFF;
// Отправляем данные драйверу устройтва
ntsRes = pNtDeviceIoControlFile(hBeep, NULL, NULL, NULL, &iosb,
IOCTL_BEEP_SET, &bsp, sizeof(bsp), &bsp, sizeof(bsp));
// Константа STATUS_PENDING показывает, что
//операция требует завершения, то есть она еще прододлжается
//это не ошибка.
if (ntsRes != STATUS_SUCCESS && ntsRes != STATUS_PENDING){
wsprintf(lpTxt,
"Can"t send data to device! Eror code: %d\n",
ntsRes);
printf(lpTxt);
pNtClose(hBeep);
hBeep = NULL;
return FALSE;
}
return TRUE;
}
Думаю если кому полностью нужен исходник - в инете найти не проблема.
← →
Anatoly Podgoretsky © (2012-01-13 12:03) [19]A Cool пробовал перевести?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.05.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c