Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.13;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.007 c
15-1325583474
Цукор5
2012-01-03 13:37
2012.05.13
USB-RS232. Присоединенное к системе устройство не работает


15-1325536203
Юрий
2012-01-03 00:30
2012.05.13
С днем рождения ! 3 января 2012 вторник


4-1256828409
Ткачев А.Н.
2009-10-29 18:00
2012.05.13
Изменение имени пользователя


2-1326300960
Gu
2012-01-11 20:56
2012.05.13
константы


2-1325889921
Gu
2012-01-07 02:45
2012.05.13
beep