Esempio n. 1
0
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)&currentsong->MidiStreamHdr[currentsong->CurrentHdr]))
        BlockOut(currentsong);
      break;
    case MOM_POSITIONCB:
      if ((currentsong->MusicLoaded) && (dwParam1 == (DWORD_PTR)&currentsong->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)&currentsong->MidiStreamHdr))
        BlockOut(currentsong);
      break;
    case MOM_POSITIONCB:
      if ((currentsong->MusicLoaded) && (dwParam1 == (unsigned long)&currentsong->MidiStreamHdr))
        currentsong->MusicPlaying=0;
      break;
    default:
      break;
    }
}
Esempio n. 4
0
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);
	}
}
Esempio n. 5
0
void CALLBACK MidiProc(
  HWAVEOUT hwo,
  UINT uMsg,
  DWORD dwInstance,
  DWORD dwParam1,
  DWORD dwParam2
)
{
	switch( uMsg )
    {
    case WOM_DONE:
		if ((currentsong->MusicLoaded) && ((DWORD)dwParam1 == (DWORD)&currentsong->MidiStreamHdr))
			BlockOut(currentsong);
		break;
    /*case WOM_POSITIONCB:
		if ((currentsong->MusicLoaded) && ((DWORD)dwParam1 == (DWORD)&currentsong->MidiStreamHdr))
			currentsong->MusicPlaying=0;
		break;*/
    default:
		break;
    }

    return;
}
Esempio n. 6
0
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();
}