/*************************************************************************************/ /*************************************************************************************/ /** **/ /** V2 module player (.v2m) **/ /** (c) Tammo 'kb' Hinrichs 2000-2008 **/ /** This file is under the Artistic License 2.0, see LICENSE.txt for details **/ /** **/ /*************************************************************************************/ /*************************************************************************************/ #include "v2mplayer.h" #include "libv2.h" #define GETDELTA(p, w) ((p)[0]+((p)[w]<<8)+((p)[2*w]<<16)) #define UPDATENT(n, v, p, w) if ((n)<(w)) { (v)=m_state.time+GETDELTA((p), (w)); if ((v)16384 || size<0) return sFALSE; d+=4; m_base.globals=d; d+=size; size=*((sU32*)d); if (size>1048576 || size<0) return sFALSE; d+=4; m_base.patchmap=d; d+=size; sU32 spsize=*((sU32*)d); d+=4; if (!spsize || spsize>=8192) { for (sU32 i=0; i<256; i++) m_base.speechptrs[i]=" "; } else { m_base.speechdata=(const char *)d; d+=spsize; const sU32 *p32=(const sU32*)m_base.speechdata; sU32 n=*(p32++); for (sU32 i=0; i=m_base.timediv) { m_state.tick-=m_base.timediv; m_state.beat++; } sU32 qpb=(m_state.num*4/m_state.den); while (m_state.beat>=qpb) { m_state.beat-=qpb; m_state.bar++; } m_state.time=m_state.nexttime; m_state.nexttime=(sU32)-1; sU8 *mptr=m_midibuf; sU32 laststat=-1; if (m_state.gnrm_state.smpldelta)?m_state.smpldelta:todo; if (torender) { synthRender(m_synth,a_buffer,torender,0,a_add); a_buffer+=2*torender; todo-=torender; m_state.smpldelta-=torender; m_state.cursmpl+=torender; } if (!m_state.smpldelta) { Tick(); if (m_state.state==PlayerState::PLAYING) UpdateSampleDelta(m_state.nexttime,m_state.time,m_state.usecs,m_base.timediv2,&m_state.smplrem,&m_state.smpldelta); else m_state.smpldelta=-1; } } } else if (m_state.state==PlayerState::OFF || !m_base.valid) { if (!a_add) { __asm { mov edi, [a_buffer] mov ecx, [a_len] shl ecx, 1 xor eax, eax rep stosd } } } else { synthRender(m_synth,a_buffer,a_len,0,a_add); m_state.cursmpl+=a_len; } if (m_fadedelta) { for (sU32 i=0; i=ttime) { pb32=gp[7*m_base.gdnum+gnr]*32/gp[8*m_base.gdnum+gnr]; usecs=*(sU32 *)(gp+3*m_base.gdnum+4*gnr); gnr++; lastevtime=ttime; } } dp[2*pn]=(sU32)curtimer; dp[2*pn+1]=(curbar<<16)|(cur32th<<8)|(pb32); cur32th++; if (cur32th==pb32) { cur32th=0; curbar++; } curtimer+=m_tpc*usecs/8000000.0; } return pn; } #endif