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

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

beep


Gu ©   (2012-01-07 02:45:00) 

ща есть аналог windows.beep какой (как в паскале sound - играть частоту без пауз, как beep)? пример был, но на новых Ос он не фурычит: http://www.kansoftware.ru/?tid=3364, а на Xe2 x64 вообще асм отменили


Anatoly Podgoretsky   (2012-01-13 12:03:00) [1]

A Cool пробовал перевести?


Alex_C   (2012-01-13 10:56:00) [2]


> А так пищать им не сложно


Сложно если нужно пищать допустим мелодию без пауз меняя частоту.
Автор программы -

/*
*
*                 Пример использования спикера из-под 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;
}



Думаю если кому полностью нужен исходник - в инете найти не проблема.


Inovet   (2012-01-12 20:10:00) [3]

> [16] Alex_C   (12.01.12 19:19)
> Кстати нашел исходники как пишать в динамик,

Под NT? А так пищать им не сложно: или таймером или посылом бита. Вторым способом можно не только пищать, а вообще воспроизвести что угодно в пределах физических ограничений.


Alex_C   (2012-01-12 19:19:00) [4]


> На внутренний динамик уже так просто не попищишь.


Так я и написал, что это весьма не просто.  :)
В свое время интересовался, как это сделать.
Кстати нашел исходники как пишать в динамик, но они на cpp - хотя перевести на дельфи не проблема, если кому надо.


DVM   (2012-01-12 16:13:00) [5]


> Alex_C   (12.01.12 12:21) [14]

На внутренний динамик уже так просто не попищишь. Сейчас у многих компьютеров вообще нет такого динамика (у ноутов в частности) и все звуки все равно идут на колонки через звуковую карту.


Alex_C   (2012-01-12 12:21:00) [6]

Не все так просто. Паскалевкий бип пищал во внутренний динамик компа, DirectSound etc - издает звук на колонки через ЗВУКОВУЮ плату.
Если есть необходимость издать звук именно на внутренний динамик компа советую порыться в статьях на этом сайте - есть достаточно подробная статься тут (сейчас так вот ее не нашел, но была точно).
Но предупреждаю - если ожидаете увидеть одну комманду типа beep - не надейтесь :) Там все не так уж просто - разбираться прийдется.


DVM   (2012-01-12 10:20:00) [7]


> han_malign   (12.01.12 10:19) [12]


> - это пила

Да можно любую форму соорудить сигнала.


> и она синхронная...

в поток ее


han_malign   (2012-01-12 10:19:00) [8]


> эта штука может частоту указанную проигрывать? 0,0?

- вам таки дать описание функции Sin?
Рассказать как связать частоту дискретизации и частоту требуемой гармоники с необходимым количеством сэмплов в 2Pi, а [-1.0,1.0] растянуть на -32767..32767?

> DVM ©   (12.01.12 00:00) [11]

- это пила и она синхронная...
Тогда уж по полной аналогии с пищалкой надо было меандр выводить(АЧХ пищалки можно проигнорировать)...


DVM   (2012-01-12 00:00:00) [9]


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;


Псарь   (2012-01-11 22:28:00) [10]


> han_malign   (11.01.12 17:51) [7]
> Описывать как работает DX мне лень, но могу описать функцию
> sin...
>


Да, вылаживайте.


Псарь   (2012-01-11 22:25:00) [11]

Используй waveOutXXX.


Gu   (2012-01-11 20:33:00) [12]

>> IDirectSoundBuffer.Play

эта штука может частоту указанную проигрывать? 0,0?


han_malign   (2012-01-11 17:51:00) [13]

для этого есть DirectSound.
А IDirectSoundBuffer.Play(0,0,DSBPLAY_LOOPING) будет крутиться до морковкиного заговения.
Описывать как работает DX мне лень, но могу описать функцию sin...


> но на новых Ос он не фурычит

- кто ж тебе даст таймер перенастраивать, на котором вся мультизадачность крутится...
И не факт, что на современных MB остался прямой провод с таймера на пищалку...


Сергей М.   (2012-01-11 16:33:00) [14]


> на Xe2 x64 вообще асм отменили


Это по какому же постановлению партии и правительства ?


Андреевич   (2012-01-07 09:31:00) [15]


> а и еще он синхронно выполнялся, а бип виндовский прогу
> вешает на время пика.

в поток его :)


Gu   (2012-01-07 06:28:00) [16]

а и еще он синхронно выполнялся, а бип виндовский прогу вешает на время пика.


Gu   (2012-01-07 06:22:00) [17]

beep с паузами пикает. если 2 бипа подряд написать даже с маленькой задержкой - между ними будет пауза гдето в 0.5-1 сек. а sound паскалевский начинал пищать и мог менять частоту, пока nosound не встретит. написал же.


Юрий Зотов   (2012-01-07 03:48:00) [18]

А разве Windows.Beep отменили? Или, может, MessageBeep подойдет?


Германн   (2012-01-07 02:58:00) [19]


> Gu   (07.01.12 02:45)
>
> ща есть аналог windows.beep какой (как в паскале sound -
>  играть частоту без пауз, как beep)? пример был, но на новых
> Ос он не фурычит: http://www.kansoftware.ru/?tid=3364,
> а на Xe2 x64 вообще асм отменили

Нет.


Наверх

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