Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1325536203
Юрий
2012-01-03 00:30
2012.05.13
С днем рождения ! 3 января 2012 вторник


2-1326282778
kudatsky
2012-01-11 15:52
2012.05.13
Поиск в Registry


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


3-1275468246
Miau
2010-06-02 12:44
2012.05.13
Кто подключен к серверу?


2-1326376310
Cobalt
2012-01-12 17:51
2012.05.13
Delphi 2010 - размер exe при компиляции с bpl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский