Текущий архив: 2004.03.28;
Скачать: CL | DM;
Вниз
Можно ли в DELPHI создать генератор звука Найти похожие ветки
← →
pupsik (2003-11-25 15:39) [0]Можно ли в DELPHI создать генератор звука с выводом его на колонки,через звуковую карту.
Просьба хотя бы ссылочку на образец кода!
Например частота-1000 гц, громкость (-10 дб) и т.п.
Спасибо.
← →
S@shka © (2003-11-25 15:57) [1]Можно :)
ПО факту ссылки на мыло отправлю исходники
← →
Crocodile (2003-11-25 17:09) [2]For me to, if you please
← →
Evgeny V © (2003-11-26 05:48) [3]
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <math.h>
#include <mmsystem.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWAVEOUT sound_out_handle;
WAVEHDR hdr[3];
WAVEFORMATEX wfx;
short int buff[3][4000];
bool st,ends;
void CALLBACK modem_callback(DWORD hw, UINT uMsg, DWORD dwinstance, DWORD dwParam1, DWORD dwParam2);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
st=false;
ends=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j,l;
double k;
MMRESULT p;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 1;
wfx.nSamplesPerSec = 8000;
wfx.wBitsPerSample = 16;
wfx.nBlockAlign = 2;
wfx.nAvgBytesPerSec = 8000*2;
wfx.cbSize = 0;
p=waveOutOpen((LPHWAVEOUT)&sound_out_handle,WAVE_MAPPER,(LPWAVEFORMATEX)&wfx.wFormatTag,(DWORD)&modem_callback,0,CALLBAC K_FUNCTION);
// делаю три буфера по пол секунды, которые заполняю сигналом
for (i=0;i<3;i++)
{
for (j=0;j<4000;j++)
{
k=sin(2.0*M_PI*(double)j*400.0/8000.0);// генерация синуса 400 Гц
l=(int)(k*32767.0);// делаем максимум амплитуды
buff[i][j]=(short int)l;
}
hdr[i].lpData = (char *)buff[i];
hdr[i].dwFlags = 0;
hdr[i].dwUser = i; // Save the identity
hdr[i].dwBufferLength = 8000;// 4000 short int
hdr[i].dwBytesRecorded = 0;
hdr[i].dwLoops = 0;
waveOutPrepareHeader(sound_out_handle,&hdr[i],sizeof(WAVEHDR));
waveOutWrite(sound_out_handle,&hdr[i],sizeof(WAVEHDR));
}
st=true;
ends=false;
waveOutRestart(sound_out_handle);
Button1->Enabled=false;
}
//---------------------------------------------------------------------------
void CALLBACK modem_callback(DWORD hw, UINT uMsg, DWORD dwinstance, DWORD dwParam1, DWORD dwParam2)
{
//TODO: Add your source code here
WAVEHDR *phdr;
phdr = (WAVEHDR *)dwParam1;
switch(uMsg)
{
case WOM_OPEN:
break;
case WOM_DONE:// буфер проигран,
//можно поставить в очередь следующий, если надо
//заполнить новыми данными, в примере этого не делаю,
//просто возвращаю его в очередь
if(phdr != NULL)
{
// Signal ready
waveOutUnprepareHeader (sound_out_handle, phdr, sizeof(WAVEHDR));
}
if(st==false)// признак того что
//надо завершить проигрыш
{
ends=true;
break;
}
else
{
waveOutPrepareHeader(sound_out_handle,phdr,sizeof(WAVEHDR));
waveOutWrite(sound_out_handle,phdr,sizeof(WAVEHDR));// ставлю буфер опять
//в очередь
}
break;
default:
break;
}
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
st=false;
while (!ends)
Application->ProcessMessages();
Sleep(1500);// разрешаю закончить проигрыш текущих
//буферов, делал по другому, но лень, точнее работы много,
//для примера пойдет и так, на самом деле для
//последнего буфера в dwUser можно положить признак того,
// что он последний, и по этому признаку в WOM_DONE
//делать Reset и закрывать устройство, или слать PostMessage
waveOutReset(sound_out_handle);
waveOutClose(sound_out_handle);
Button1->Enabled=true;
}
Страницы: 1 вся ветка
Текущий архив: 2004.03.28;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.045 c