Change from 16 bit to 32 bit implementation of waveInAddBuffer()
Posted on 1997-02-12
I've got a really strange problem porting a 16 bit wav record routine into a 32 bit application.
I'm using low level Wave functions to read from my soundblaster line input in order to store data into my program. Here is a sample of the code:
static HWAVEIN Wave = NULL;
static HWAVEOUT WaveOut = NULL;
unsigned int num;
static WAVEHDR Header;
static WAVEHDR Next;
static HGLOBAL HBuffer;
static HGLOBAL HNext_Buffer;
static LPSTR Next_Buffer;
static LPSTR Buffer;
HNext_Buffer = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,Granularity+10);
HBuffer = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, Granularity+10);
if ((HBuffer == NULL) | (HNext_Buffer == NULL))
MessageBox(hDlg,"Memory Allocation Error","Arghh",MB_OK);
Buffer = (LPSTR) GlobalLock(HBuffer);
Next_Buffer = (LPSTR) GlobalLock(HNext_Buffer);
Error = waveInOpen(&Wave,0,&Format,hDlg,NULL,CALLBACK_WINDOW | WAVE_ALLOWSYNC);
Header.lpData = Buffer;
Header.dwBufferLength = Granularity;
Header.dwBytesRecorded = Granularity;
Header.dwUser = 0x42424242;
Header.dwFlags = WHDR_INQUEUE;
Header.dwLoops = 0;
Next.lpData = Next_Buffer;
Next.dwBufferLength = Granularity;
Next.dwBytesRecorded = Granularity;
Next.dwUser = 0x26011972;
Next.dwFlags = WHDR_INQUEUE;
Next.dwLoops = 0;
Error |= waveInPrepareHeader(Wave,&Header,sizeof(WAVEHDR));
Error |= waveInPrepareHeader(Wave,&Next,sizeof(WAVEHDR));
// everything works fine up to here
Error |= waveInAddBuffer(Wave,&Header,sizeof(WAVEHDR));
// Error returns 33 which is WAVE_ERR_BASE (32) + 1 <- device still playing !!!
// I want it to be playing!!!!
// Wave has an incredible value of something like -20465865
// which seems odd for a simple handle
Error |= waveInAddBuffer(Wave,&Next,sizeof(WAVEHDR));
Error |= waveInStart(Wave);
This code worked perfectly fine in 16 bit mode (Borland C++ 4.0) and I'm trying to port it to 32 bit with EMX GNU C/C++ port and RSXNT WDK and also with BC4.0 32bit compilers for win32. They both failed.
for the EMX port, I've built a winmm.a library using 'makelib' from WINMM.DLL, and multimedia support seemed all right since function like sndPlaySoundA, waveInGetDevsCapsA and waveInOpen worked. Besides my callback window do receive the WIM_OPEN message, tending to prove that the wave device is working correctly.
That's fairly strange because everything else in my code works out just fine except this part!
Everything is done on a 486dx266 running win95 (08/95 release) 8 Mb ram + SoundBlaster 2.0 (8bit)
So if you've got a solution for that I'd be more than glad to hear from you.