Change from 16 bit to 32 bit implementation of waveInAddBuffer()

Hello,

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:

declarations:

 static HWAVEIN Wave = NULL;
 static HWAVEOUT WaveOut = NULL;
 PCMWAVEFORMAT Format;
 WAVEINCAPSA Caps;
 WAVEOUTCAPSA OutCaps;
 MMRESULT Error;
 unsigned int num;
 static WAVEHDR Header;
 static WAVEHDR Next;
 static HGLOBAL HBuffer;
 static HGLOBAL HNext_Buffer;
 static LPSTR Next_Buffer;
 static LPSTR Buffer;

code:

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);
      EndDialog(hDlg,FALSE);
      return FALSE;
      }
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.

Best regards,

Jean Yves
JYCAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

mannfaiCommented:
Hi Jean,

I got this problem b4.  I suspect u are using an old Win95 Soundblaster driver.  U can download the new drivers at Creative's site (www.creativelabs.com) and then try out your code again.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Development

From novice to tech pro — start learning today.