void CALLBACK MidiProc( HMIDIIN hMidi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 ) { switch( uMsg ) { case MOM_DONE: if ((currentsong->MusicLoaded) && (dwParam1 == (DWORD_PTR)¤tsong->MidiStreamHdr[currentsong->CurrentHdr])) BlockOut(currentsong); break; case MOM_POSITIONCB: if ((currentsong->MusicLoaded) && (dwParam1 == (DWORD_PTR)¤tsong->MidiStreamHdr[currentsong->CurrentHdr])) { if (currentsong->Loops) { if (currentsong->Loops > 0) --currentsong->Loops; currentsong->NewPos=0; BlockOut(currentsong); } else { currentsong->MusicPlaying=0; } } break; default: break; } }
void native_midi_start(NativeMidiSong *song) { MMRESULT merr; MIDIPROPTIMEDIV mptd; native_midi_stop(); if (!hMidiStream) { merr=midiStreamOpen(&hMidiStream,&MidiDevice,1,(DWORD)&MidiProc,0,CALLBACK_FUNCTION); if (merr!=MMSYSERR_NOERROR) { hMidiStream=0; return; } //midiStreamStop(hMidiStream); currentsong=song; currentsong->NewPos=0; currentsong->MusicPlaying=1; mptd.cbStruct=sizeof(MIDIPROPTIMEDIV); mptd.dwTimeDiv=currentsong->ppqn; merr=midiStreamProperty(hMidiStream,(LPBYTE)&mptd,MIDIPROP_SET | MIDIPROP_TIMEDIV); BlockOut(song); merr=midiStreamRestart(hMidiStream); } }
void CALLBACK MidiProc( HMIDIIN hMidi, UINT uMsg, unsigned long dwInstance, unsigned long dwParam1, unsigned long dwParam2 ) { switch( uMsg ) { case MOM_DONE: if ((currentsong->MusicLoaded) && (dwParam1 == (unsigned long)¤tsong->MidiStreamHdr)) BlockOut(currentsong); break; case MOM_POSITIONCB: if ((currentsong->MusicLoaded) && (dwParam1 == (unsigned long)¤tsong->MidiStreamHdr)) currentsong->MusicPlaying=0; break; default: break; } }
void native_midi_start(NativeMidiSong *song) { MMRESULT merr; memset(&wfm,0,sizeof(wfm)); 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; wfm.USecPerQuarterNote=9600000; // Force each tick to be 1/10 sec //wfm.TicksPerQuarterNote = 96; wfm.USecPerQuarterNote=263157; //+- wfm.TicksPerQuarterNote=800;//480; /*wfm.USecPerQuarterNote=500000; //Wrong wfm.TicksPerQuarterNote=4;*/ native_midi_stop(); if (!hMidiStream) { merr = waveOutOpen(&hMidiStream, WAVE_MAPPER, (LPWAVEFORMATEX)&wfm, (DWORD)MidiProc, 0, CALLBACK_FUNCTION); if (merr!=MMSYSERR_NOERROR) { hMidiStream=0; return; } //midiStreamStop(hMidiStream); currentsong=song; currentsong->NewPos=0; currentsong->MusicPlaying=1; /*mptd.cbStruct=sizeof(MIDIPROPTIMEDIV); mptd.dwTimeDiv=currentsong->ppqn; merr=midiStreamProperty(hMidiStream,(LPBYTE)&mptd,MIDIPROP_SET | MIDIPROP_TIMEDIV);*/ BlockOut(song); merr=waveOutReset(hMidiStream); } }
void CALLBACK MidiProc( HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ) { switch( uMsg ) { case WOM_DONE: if ((currentsong->MusicLoaded) && ((DWORD)dwParam1 == (DWORD)¤tsong->MidiStreamHdr)) BlockOut(currentsong); break; /*case WOM_POSITIONCB: if ((currentsong->MusicLoaded) && ((DWORD)dwParam1 == (DWORD)¤tsong->MidiStreamHdr)) currentsong->MusicPlaying=0; break;*/ default: break; } return; }
void Compiler::AddFunction( const yy::location& location, int type, const std::string* pName, ArgList* pArgs, StateBlock* pBlock ) { std::auto_ptr < const std::string > name( pName ); std::auto_ptr < ArgList > args( pArgs ); std::auto_ptr < StateBlock > block( pBlock ); FunctionTag* pTag = m_Functions.Find( *pName ); if( pTag ){ if( pTag->IsDefinition() ){ error( location, "Function : " + *pName + " is already registered." ); return; } if( pTag->IsDeclaration() && !pTag->CheckArgList( pArgs ) ){ error( location, "Function : " + *pName + " has different argument type." ); return; } pTag->SetDefinition(); } else{ FunctionTag func( type ); func.SetArgs( pArgs ); func.SetDefinition(); func.SetIndex( MakeLabel() ); pTag = m_Functions.Add( *pName, func ); if( pTag == 0 ){ error( location, "Internal error : The function can not be registered." ); } } m_CurFunctionName = *pName; m_CurFunctionType = type; SetLabel( pTag->GetIndex() ); // Entry point of the function. BlockIn(); // Increase the stack for variables. // Register arguments. if( pArgs ){ pArgs->ForEachReverse( AddVal( this, m_Variables.back() ) ); } // Analyze block. if( pBlock ){ pBlock->Analyze( this ); } const VMCode& code = m_Statement.back(); if( type == TYPE_VOID ){ if( code.m_OP != VM_RETURN ){ OpReturn(); } } else{ if( code.m_OP != VM_RETURNV ){ error( location, "Function : " + *pName + " has no return." ); } } BlockOut(); m_CurFunctionName.clear(); }