Звук определенной частоты в течении неограниченного времени

Тема в разделе "WASM.AUDIO", создана пользователем nerezus, 6 июн 2007.

  1. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    Собственно надо по нажатию на кнопку запускать звук, а при повторном - прекращать.

    Собственно вопрос: как

    MessageBeep тут явно не хватает =\
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Создаешь отдельный тред с Beep,x,x. Когда второй раз нажали кнопку, приостанавливаешь его.
     
  3. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    Спасибо, но.... бипы складываются =\

    Просто не хочется заводить кучу потоков с разными бипами. Мне надо чтобы частота звука зависела от кода клавиши.
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а в бипе частоту звука разве нельзя задать? первый параметр

    и нафига куча потоков? 1 единственный доп. поток.
     
  5. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    если я сделаю 2 бипа подряд, то второй будет только после выполнения первого.

    А если для каждого бипа делать поток - то как-то накладно.
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    так ты музыку генерить хочешь? тогда извиняйте
     
  7. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    нет, мне надо просто при нажатии на кнопку начинать пищать и при отпускании заканчивать. Но частота зависит от кода кнопки.
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    тогда, кроме как тредами с бипами и частотой в качестве параметра к треду, я не представляю, как это сделать
     
  9. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    А если заюзать какой-нить движок типа OpenAl, bass, fmod....
    Может они позволяют это сделать?
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    nerezus

    Я балдею, синтезатор на бипах -).
    Обязательно нужно использовать глобальный хук, чтобы бипало всегда?
     
  11. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    > Обязательно нужно использовать глобальный хук, чтобы бипало всегда?
    А были еще варианты? ) Мне просто надо окно его будет спрятать полностью ) Типа чтобы ВСЕГДА пикало, даже когда я ща мессаги набираю )
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    nerezus

    Тогда советую обратить внимание на DirectInput.
    Он реактивнее чем виндовые мессаги, фокус у окна не обязан быть, и проблем с потоками будет меньше, так это дело поудобнее будет.
     
  13. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    поздно, уже закодил хук =\

    теперь бы со звуком разобраться =\
     
  14. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    мм, все движки слишком высокоуровневые... смотрел bass, fmod, SDL

    Ну как-то все же они делают же!
     
  15. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    nerezus
    Не туда смотрели. Надо смотреть WINMM, DirectSound, OpenAL, ASIO, ...

    В общем, надо открыть девайс на запись, задать все параметры (частота дискретизации, моно/стерео и т.д.), создать тред, который будет генерировать синусоид заданной частоты и пихать его в буфер аудио-драйвера.

    Для 16-битного моно канала это может выглядеть так:

    for(i = 0; i < buf_size; i++){ buf = (int)(32767.0 * sin(i * freq)); }

    Нечто подобное я когда-то писал, но для линукса. Исходник пропал :dntknw: Но там не больше 2х листов кода было.
     
  16. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Ага, помнится тож балдел курсе эдак на 2м :) Даж сорц вроде завалялся.
     
  17. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    Итаг, потоки.
    При повторной нажатии клавиши поток не закрывается. ХЗ почему.

    Код (Text):
    1.     BeepProc proc
    2.         invoke Beep, freq, len
    3.         ret
    4.     BeepProc endp
    5.    
    6.  
    7.     KeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    8.         .if nCode == HC_ACTION
    9.             mov eax, 40000000h
    10.             and eax, lParam
    11.             .if eax ; pressed
    12.                 mov eax, wParam
    13.                 .if key == eax ; повторное нажатие
    14.                     push 0
    15.                     pop key
    16.                     invoke TerminateThread, hThread, 0
    17.                     invoke MessageBox, 0, 0, 0, 0
    18.                 .else
    19.                     push wParam
    20.                     pop key
    21.                     mov eax, wParam ; получаем частоту
    22.                     mov edx, 6
    23.                     mul edx
    24.                     push eax
    25.                     ;push 6000
    26.                     pop freq
    27.                     push 6000
    28.                     pop len
    29.                     invoke TerminateThread, hThread, 0
    30.                     invoke CreateThread, 0, 100, BeepProc, 0, 0, 0
    31.                     mov hThread, eax
    32.                     ;invoke TerminateThread, hThread, 0
    33.                 .endif
    34.             .endif
    35.         .endif
    36.         invoke CallNextHookEx, hHook, nCode, wParam, lParam
    37.         ret
    38.    KeyboardProc endp
    в данных есть:
    len dd ?
    freq dd ?
    key dd ?
    hThread dd ?
     
  18. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    Короче создаю новый Beep бесконечный длины и частоты 0. Но естественно ввиду того, что у меня не закрываются потоки, течет память. Медленно, но течет.
     
  19. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    CreateThread
    lpStartAddress
    The starting address of the new thread. This is typically the address of a function declared with the WINAPI calling convention that accepts a single 32-bit pointer as an argument and returns a 32-bit exit code. Its prototype is:
    DWORD WINAPI ThreadFunc( LPVOID );
    т.е.
    Код (Text):
    1.     BeepProc proc lParam:DWORD
    2.         invoke Beep, freq, len
    3.         ret
    4.     BeepProc endp