c # - Waveform Audio via tilbagekald, ingen data modtaget

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge WaveForm Audio-funktionerne i C # til at læse fra en mikrofon. Nu har jeg ingen tidligere erfaring med dette bibliotek, så det kan bare være, at jeg mangler noget indlysende.


Jeg kan med succes (ingen fejl returneres i det mindste) åbne en enhed, tilføj en buffer og start den enhed. Som følger:


short nChannels = 2;
uint nSamplesPerSec = 44100;
short nBitsPerSample = 16;
uint DeviceID = 0;

WAVEFORMATEX Format = new WAVEFORMATEX();
Format.wFormatTag = 0x0001;
Format.nChannels = nChannels;
Format.nSamplesPerSec = nSamplesPerSec;
Format.wBitsPerSample = nBitsPerSample;
Format.nAvgBytesPerSec = ((uint)nBitsPerSample / 8) * nSamplesPerSec;
Format.nBlockAlign = (short)((nChannels * nBitsPerSample) / 8);
Format.cbSize = 0;

WAVEHDR BufHeader = new WAVEHDR();
BufHeader.lpData = Marshal.AllocHGlobal((int)Format.nAvgBytesPerSec);
BufHeader.dwBufferLength = Format.nAvgBytesPerSec;
BufHeader.dwUser = 0;
BufHeader.dwFlags = 0;

uint err;
err = waveInOpen(ref HWI, DeviceID, ref Format, new waveInProc(waveInCbk), 0, 0x00030000);
err = waveInPrepareHeader(HWI, ref BufHeader, (uint)Marshal.SizeOf(typeof(WAVEHDR)));
err = waveInAddBuffer(HWI, ref BufHeader, (uint)Marshal.SizeOf(typeof(WAVEHDR)));
err = waveInStart(HWI);


Bemærk, at jeg har kontrolleret værdien af ​​fejl, via debuggeren, og det er altid 0. Desuden har jeg kigget i egenskaberne for enhed 0. Dets standard lydformat, når det deles, er 44,1 kHz, 2 kanals, 16 bps (som Jeg bruger). Den tilbagekaldede funktion er:


private void waveInCbk(IntPtr hwi, WAVEINCBKMSG uMsg, IntPtr dwInstance, IntPtr dwParam1, IntPtr dwParam2)
{
    switch(uMsg)
    {
        case WAVEINCBKMSG.WIM\_CLOSE:
            break;
        case WAVEINCBKMSG.WIM\_OPEN:
            break;
        case WAVEINCBKMSG.WIM\_DATA:
            System.Console.WriteLine("Received data!"); // Never Reached!
            break;
    }            
}


Også til notering kaldes tilbagekaldelsen succesfuldt en gang med WIM\_OPEN, efter mit opkald til waveinOpen. Hvis det er nødvendigt, kan jeg efterlade mine pinvoke s for bølgefunktionerne, men for det meste er de fra pinvoke.net.


Kan nogen opdage noget galt med ovenstående kode, der ville forklare, hvorfor jeg ikke får nogen data? Enhver input er meget værdsat. Tak skal du have.

Bedste reference


Nå synes jeg at have løst problemet. Jeg vil sende årsagen her til andre, der støder på det samme problem.


Jeg har blot tilføjet mere end 1 buffer. Ved at gøre dette modtager jeg nu data via tilbagekaldelsen!