Click to See Complete Forum and Search --> : problem for the WaveOutOpen()


dingo_kasper
March 5th, 2008, 07:28 AM
hello to all
i am making the MIDI palyer if Windows mobile. i am refering this

http://www.ifihadadollarforeverytimesomeonesaidthatiwouldhavemyownwebsite.com/Midi/

i managed to get it compiled . however it return MMSYSERR_ERROR

does any body encontered the same problem! here is the code

bool CMIDIDlg::playMidi(CString name)
{
AfxMessageBox(name);
#ifdef PLAY_MIDI
struct miditrack seq[MAXTRKS];
CFile f;
f.Open(name.GetBuffer(), CFile::modeRead | CFile::shareDenyWrite);
unsigned char * p = new unsigned char[f.GetLength()+1];
f.Read(p, f.GetLength());

int tracks = readmidi(p, f.GetLength(), seq);

WAVEFORMAT_MIDI wfm; // WAVEFORMATEX
memset(&wfm,0,sizeof(wfm));
wfm.USecPerQuarterNote=263157;
// wfm.USecPerQuarterNote=1000000;
wfm.TicksPerQuarterNote=(p[12]<<8) | p[13];//480
// wfm.TicksPerQuarterNote= 100;

int j = parseMidiData(0, &wfm.USecPerQuarterNote, &wfm.TicksPerQuarterNote, 0, seq);

wfm.USecPerQuarterNote=263157;
// wfm.USecPerQuarterNote=1000000;
wfm.TicksPerQuarterNote=480;
// wfm.TicksPerQuarterNote=100;

if (j < 48)
{
MMRESULT Result;
HWAVEOUT hWaveOut;
HANDLE hEvent;

hEvent=CreateEvent( NULL,TRUE,FALSE,NULL);
wfm.wfx.wFormatTag=WAVE_FORMAT_MIDI;
wfm.wfx.nChannels=1;
wfm.wfx.nSamplesPerSec=32;
wfm.wfx.nAvgBytesPerSec=32;
wfm.wfx.nBlockAlign=sizeof(WAVEFORMAT_MIDI_MESSAGE);
wfm.wfx.wBitsPerSample=16;
wfm.wfx.cbSize=WAVEFORMAT_MIDI_EXTRASIZE;



Result = waveOutOpen(&hWaveOut, WAVE_MAPPER, (LPWAVEFORMATEX)&wfm, (DWORD)waveOutProc, (DWORD)hEvent, CALLBACK_FUNCTION);



if (Result!=MMSYSERR_NOERROR)
{
DWORD i = GetLastError();
return false;
}

waveOutSetVolume(hWaveOut, 0x7777 );

WAVEFORMAT_MIDI_MESSAGE MidiMessage[48];
/*
WAVEFORMAT_MIDI_MESSAGE * MidiMessage;
MidiMessage = new WAVEFORMAT_MIDI_MESSAGE[48];
//*/

parseMidiData(MidiMessage, 0, 0, 0, seq);

MidiMessage[j].DeltaTicks=0;
MidiMessage[j].MidiMsg=0;
j++;

f.Close();

delete [] p;

//s.Format(L"created %d midi messages", j);
//MessageBox(s);

WAVEHDR WaveHdr;
WaveHdr.lpData = (LPSTR)&MidiMessage;
WaveHdr.dwBufferLength = sizeof(WAVEFORMAT_MIDI_MESSAGE) * j;
WaveHdr.dwFlags = 0;
WaveHdr.dwLoops = 1;
Result = waveOutPrepareHeader(hWaveOut,&WaveHdr,sizeof(WaveHdr));
if (Result != MMSYSERR_NOERROR)
MessageBox(L"waveOutPrepareHeader failed");
else {
Result = waveOutWrite(hWaveOut,&WaveHdr,sizeof(WaveHdr));
if (Result != MMSYSERR_NOERROR)
MessageBox(L"waveOutWrite failed");
else {
WaitForSingleObject(hEvent,10000);
}
Result = waveOutUnprepareHeader(hWaveOut,&WaveHdr,sizeof(WaveHdr));
}
waveOutReset(hWaveOut);
Result = waveOutClose(hWaveOut);
//delete [] MidiMessage;

return true;
} else {
f.Close();
delete [] p;
return false;
}
#else
return false;
#endif
}


with regards