🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: borland.public.cppbuilder.multimedia
Article #600

Re: microphone signal level

#600
From: Mark Jacobs
Date: Fri, 02 Apr 2004 20:30
104 lines
4411 bytes
In the public section of your form, add the following :-

public:  // User declarations
  char erst[199];
  unsigned char wvbfr[99];
  HWAVEIN phwo;
  WAVEFORMATEX pwfx;
  MMRESULT wh;
  WAVEHDR wvhd;
  void __fastcall ProcessInput();

then on the form's paint event put this :-

//--------------------------------------------------------------------------
-
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  static bool clld=false;
  if (clld) return;
  clld=true;
  pwfx.cbSize=0;
  pwfx.wFormatTag=WAVE_FORMAT_PCM;
  pwfx.nChannels=2;
  pwfx.nSamplesPerSec=44100;
  pwfx.wBitsPerSample=16;
  pwfx.nAvgBytesPerSec=44100*2*16/8;
  pwfx.nBlockAlign=2*16/8;
  wh=waveInOpen(&phwo,WAVE_MAPPER,&pwfx,(DWORD)WaveInProc,
                             (DWORD)this,CALLBACK_FUNCTION);
  if (wh!=MMSYSERR_NOERROR)
  {
    waveOutGetErrorText(wh,erst,190); Edit3->Text="Error="+AnsiString(erst);
    zcMMTimer1->Enabled=false;
  }
  else zcMMTimer1->Enabled=true;
}
//--------------------------------------------------------------------------
-

Somewhere in the form module declare the following callback functions :-

void CALLBACK WaveInProc(HWAVEIN waveIn,UINT uMsg,
                                                  DWORD dwInstance,
                                                  DWORD dwParam1,DWORD
dwParam2)
{
  if (uMsg==MM_WIM_DATA) Form1->ProcessInput();
}
//--------------------------------------------------------------------------
-
void __fastcall TForm1::ProcessInput()
{
  short *mybf=(short *)wvbfr;
  waveInStop(phwo);
  wh=waveInUnprepareHeader(phwo,&wvhd,sizeof(WAVEHDR));
  if (wh!=MMSYSERR_NOERROR) return;
  zcDinMeter1->Value=(int)mybf[0]*100*zSlideBar1->Value/32768;
  zcDinMeter2->Value=(int)mybf[1]*100*zSlideBar1->Value/32768;
  zcMMTimer1->Enabled=true;
}
//--------------------------------------------------------------------------
-

Add a timer to the form. It should be set to an interval of 50ms or less to
be useful, but 100ms seems to be adequate. I use Ziegler's Multimedia Timer
so I can get good results from 20ms resolution. In the timer's OnTimer
event, put the following :-

//--------------------------------------------------------------------------
-
void __fastcall TForm1::zcMMTimer1Timer(TObject *Sender)
{
  unsigned int vl; int mcierr,ii,jj;
  zcMMTimer1->Enabled=false;
  wvbfr[0]='\0'; wvbfr[1]='\0'; wvbfr[2]='\0'; wvbfr[3]='\0';
  wvhd.lpData=wvbfr; wvhd.dwBufferLength=4;
  wvhd.dwLoops=0; wvhd.dwFlags=0; waveInStop(phwo);
  if (waveInPrepareHeader(phwo,&wvhd,sizeof(WAVEHDR))==MMSYSERR_NOERROR)
  {
    waveInAddBuffer(phwo,&wvhd,sizeof(WAVEHDR));
    waveInStart(phwo);
  }
}
//--------------------------------------------------------------------------
-

Hey presto, the values in ProcessInput()'s mybf buffer are :-
Left Channel = mybf[0]
Right Channel=mybf[1]
with a range of -32767 to 32767 in each case.

I verified my results on a Soundblaster Live card. I have noticed that the
Realtek AC97 Soundcard on another PC did not work properly. It could be
indicative of faulty sound drivers. I'll try other PCs and report back.
However, the code above has been arrived at painstakingly. Thankyou
Microsoft!
-- 
Mark Jacobs

"iim" <imamsiswanto@yahoo.com.sg> wrote in message
news:40622392$1@newsgroups.borland.com...
>
> I need a small program to measure the signal level from microphone via
sound card. Anybody can help ?
Technical Details
Message-ID: <406dcd6d@newsgroups.borland.com>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!news.glorb.com!in.100proofnews.com!in.100proofnews.com!newsfeeds.ihug.co.nz!ihug.co.nz!newsgroups.borland.com!not-for-mail
References: <40622392$1@newsgroups.borland.com>

Show Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII-7-bit
X-Google-Thread: 10d0fc,69ad54c752dc4e15
X-Google-Attributes: gid10d0fc,public
X-Google-ArrivalTime: 2004-04-02 12:39:53 PST
From: "Mark Jacobs" <mark@losethisbitjacobsm.com>
Newsgroups: borland.public.cppbuilder.multimedia
References: <40622392$1@newsgroups.borland.com>
Subject: Re: microphone signal level
Date: Fri, 2 Apr 2004 21:30:27 +0100
Lines: 106
Organization: DK Computing
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
NNTP-Posting-Host: 81.86.186.94
Message-ID: <406dcd6d@newsgroups.borland.com>
X-Trace: newsgroups.borland.com 1080937837 81.86.186.94 (2 Apr 2004 12:30:37 -0800)
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!news.glorb.com!in.100proofnews.com!in.100proofnews.com!newsfeeds.ihug.co.nz!ihug.co.nz!newsgroups.borland.com!not-for-mail