#cmdline "-gen gcc -O 2 -s gui"

#include "pl_mpeg.bi"
#include "crt.bi"

#include "MyTDT\GfxResize.bas"
#include "MyTDT\MiniSnd.bas"

var sFile = command(1)
var pVid = plm_create_with_filename( sFile )
if pVid=0 then screen 18 : print "failed to load MPEG video":sleep:system 
'plm_set_audio_enabled( pVid , false )

var iPos = instrrev(sFile,"\"), iPos2=instrrev(sFile,"/")
if iPos2 > iPos then iPos = iPos2
sFile = mid(sFile,iPos+1)

var iWid = plm_get_width( pVid ) , iHei = plm_get_height( pVid )
var iSoundRate = plm_get_samplerate( pVid )
var dRate = plm_get_framerate( pVid ) , dDur = plm_get_duration( pVid )

dim as long ScrX,ScrY,iScale=1
screeninfo ScrX,ScrY
while (iHei*iScale+iHei) < ScrY: iScale += 1: wend

Gfx.PreResize()
screenres iWid,iHei,32
Gfx.Resize(iWid*iScale,iHei*iScale,,1)

var hSnd = iif( plm_get_audio_enabled(pVid) andalso iSoundRate , AudioOpen( iSoundRate , 16 , 2 , 8 ) , 0 )
var iSamplesPerFrame = cint(int(iSoundRate/dRate))
var iReadPos = 0, iReadAvail = 0

dim as ulong pcm16(iSamplesPerFrame)
dim as plm_samples_t ptr pAudio
dim as double dMovie = timer

do  
  var pFrame = plm_decode_video( pVid )
  if pFrame = 0 then exit do
  
  var iSampleCnt = 0
  while iSampleCnt < iSamplesPerFrame  
    'puts(iSampleCnt & " - " & iSamplesPerFrame & " ? " & iReadPos & ":" & iReadAvail )
    if iReadPos >= iReadAvail then
      iReadPos = 0 : pAudio = plm_decode_audio( pVid )
      if pAudio=0 then exit while
      iReadAvail = pAudio->count*2      
    end if
    var SamL = pAudio->interleaved(iReadPos)  : if SamL < -1 then SamL = -1 else if SamL > 1 then SamL = 1
    var SamR = pAudio->interleaved(iReadPos+1): if SamR < -1 then SamR = -1 else if SamR > 1 then SamR = 1        
    pcm16(iSampleCnt) = (cushort(cshort(SamR*32767)) shl 16)+cushort(cshort(SamL*32767))
    iReadPos += 2 : iSampleCnt += 1
  wend  
  
  screenlock
    plm_frame_to_bgra( pFrame , screenptr , iWid*4 )    
  screenunlock
  if hSnd andalso iSampleCnt then
    if multikey(fb.SC_SPACE)=0 then
      while AudioWrite( hSnd , @pcm16(0) , sizeof(ulong)*iSampleCnt ) < 4      
        sleep 1,1      
      wend  
    end if
  else
    while (timer-dMovie) < pFrame->time      
      sleep 1,1      
    wend
  end if
  
  dim as zstring*256 zTitle = any
  var fPct = (plm_get_time( pVid )*100)/dDur
  if fPct > 100 then fPct = 100
  sprintf(zTitle,!"%s: %1.2f%%\r",sFile,fPct)
  windowtitle zTitle
  
  do
    var sKey = inkey
    if len(sKey)=0 then exit do
    dim as long iKey = sKey[0]
    if iKey=255 then iKey = -sKey[1]
    select case iKey
    case asc("0") to asc("9")
      var iMul = iif(iKey=asc("0"),iScale,iKey-asc("0"))
      Gfx.Resize(iWid*iMul,iHei*iMul,1,1)
    case -asc("k"): exit do,do
    end select    
  loop
  
loop

plm_destroy( pVid )

while multikey(fb.SC_SPACE)
  sleep 1,1
wend




