sample17.hsp

sample\hspdsp\sample17.hsp » Plain Format

// sample17.hsp 0.5秒毎にコマ送り再生(音声あり)

#include "hspdsp.as"

	dsp_Init
	
	dialog "*",16
	if stat=0:stop

	fname=refstr

	//MDet系命令呼び出し
	dsp_MDetOpen fname
	//ストリームの総数を取得
	Streams=dsp_MDetGetOutputStreams()

	repeat Streams
	
		dsp_MDetSetCurrentStream cnt
		Type=dsp_MDetGetStreamType()
		if Type=0{
			mes "VideoStream = "+cnt
			fps=(1.0*dsp_MDetGetFrameRate()/100)
			len=(1.0*dsp_MDetGetStreamLength()/100)
			
			mes "-> "+fps+" fps (フレームレート)"
			mes "-> "+len+" s (秒)"
			mes "-> "+int(fps*len)+" frames (フレーム数)"
			
			}
		if Type=1{
			mes "AudioStream = "+cnt
			
			}
	loop
	
	//使い終わったらお片づけ
	dsp_MDetClose

	dialog 

 	// システム標準のレンダラーで開く
 	dsp_Open refstr,OPEN_DEFAULT_RENDERER,0,0,0
 
 	//サイズを取得
 	x=dsp_info(0):y=dsp_info(1)

 	onexit *exit ; 終了時開放するため
 
 	dsp_Play hwnd,0,0,640,480  ; 0,0 座標に 640x480 の大きさで表示
	dsp_Stop	;一時停止

	dsp_SetEvHWND hwnd	;イベントがメッセージとして通知されます。
	oncmd gosub *change,WM_GRAPH_NOTIFY	;イベント通知

 	repeat 
 		s=dsp_CanFrameStep(int(fps))	//毎回実行させる(値は0でも実は問題なし。)
 		dsp_SetFrameStep int(fps)+1/2	//毎回実行させる

 		title "現在のフレーム "+cnt+": 目標フレーム数 "+int(2*len)+""

		//コマ送り操作完了までループさせる
 		repeat 
 			if stream_end=36:break	// コマ送り操作完了
 			if stream_end=1:break		// 再生終了
 			wait 12
 		loop

 		if stream_end=1:break			// 再生終了
 		stream_end=0

 		wait 1
	 	
 	loop

 	dialog "再生終了"
 	stop

*exit
 
 	dsp_Stop
 	dsp_Close ; メディアファイルを閉じる
 	dsp_Exit ; 開放
 	end
 
*change
	
	// 自前で処理する場合は dsp_GetStopped()を使ってイベントID をとります。
	// この際、- 値に変わるまでループしてください。(取りこぼしを防ぐため。)
	
	repeat
		tmp=dsp_GetStopped()	;tmp に イベントID が入ります。
		
		if tmp<0:break			;値が - を返すまでループ
		
		// 1 はグラフの再生が終了したときに返ります。
		sdim tt,128
		dupptr tt,dsp_getmediaevstr(tmp),128,2

		// 今回は1と36しか処理しないのでこれでOK
		// 1 = 再生完了		
		// 36 = コマ送り操作完了

		if tmp=36:stream_end=36
		if tmp=1:stream_end=1:break
		
	loop

	return