sample_player.hsp

sample\iron\sample_player.hsp » Plain Format

;============================================================
;  簡易メディアプレイヤー (HSP 標準 mci 命令のみ)
;
;  音楽 (mp3/wav) 動画 (mp4/avi/wmv) を再生できる GUI プレイヤー。
;  iron_* モジュール不要、HSP 標準機能だけで構築。
;
;  機能:
;    - ファイルパス入力 → Open
;    - Play / Pause / Stop
;    - 10 秒早送り (>>) / 巻き戻し (<<)
;    - シークバー (クリックで任意位置にジャンプ)
;    - 現在時刻 / 全長 表示 (mm:ss)
;    - 音量スライダ (0-1000)
;
;  Open Video ボタンで動画を内部ウィンドウに貼り付けて再生可能。
;============================================================

#include "hsp3_net_64.as"

	title "HSP 簡易メディアプレイヤー"
	screen 0, 600, 440
	font "MS Gothic", 14

	sdim filepath, 1024
	filepath = "C:\\Windows\\Media\\Alarm01.wav"
	sdim alias_name, 32
	alias_name = "media"
	opened = 0
	is_video = 0
	vol = 800

	; ------------ UI 配置 ------------
	pos 10, 10
	mes "ファイルパス:"
	pos 10, 30
	objsize 480, 24
	input filepath, 1023, 1, 24
	pos 500, 30
	objsize 80, 24
	button gosub "Open", *do_open

	; 動画表示領域 (背景)
	color 32, 32, 32 : boxf 10, 70, 590, 270 : color 0, 0, 0
	pos 240, 165
	color 200, 200, 200
	mes "(動画はここに表示)"
	color 0, 0, 0

	; コントロールボタン
	pos 10, 285
	objsize 60, 28
	button gosub "<<", *do_rewind
	pos 75, 285
	objsize 60, 28
	button gosub "Play", *do_play
	pos 140, 285
	objsize 60, 28
	button gosub "Pause", *do_pause
	pos 205, 285
	objsize 60, 28
	button gosub "Stop", *do_stop
	pos 270, 285
	objsize 60, 28
	button gosub ">>", *do_ff
	pos 340, 285
	objsize 100, 28
	button gosub "Open Video", *do_open_video

	pos 450, 287
	mes "Vol:"
	pos 480, 285
	objsize 80, 24
	input vol, 4, 4, 24

	gosub *redraw_seek

*main_loop
	; マウス左クリックでシーク
	getkey k_lb, 1
	if k_lb {
		mx = mousex
		my = mousey
		if (my >= 325) & (my <= 350) & (mx >= 10) & (mx <= 590) {
			if opened {
				mci "status " + alias_name + " length"
				len_ms = stat
				if len_ms > 0 {
					new_pos = (mx - 10) * len_ms / 580
					mci "seek " + alias_name + " to " + new_pos
					mci "play " + alias_name
				}
			}
			; クリック連打抑止
			repeat 5 : await 20 : loop
		}
	}

	; 音量を毎フレ反映 (簡易)
	if opened {
		mci "setaudio " + alias_name + " volume to " + vol
	}

	gosub *redraw_seek
	await 100
	goto *main_loop

;------------------------------------------------------------
*redraw_seek
	; シークバー描画
	color 200, 200, 200 : boxf 10, 325, 590, 350
	color 100, 100, 100
	line 10, 325, 590, 325
	line 10, 350, 590, 350

	cur_p = 0 : tot_p = 0
	if opened {
		mci "status " + alias_name + " position"
		cur_p = stat
		mci "status " + alias_name + " length"
		tot_p = stat
	}
	if tot_p > 0 {
		bar_w = (590 - 10) * cur_p / tot_p
		color 80, 160, 240 : boxf 10, 327, 10 + bar_w, 348
	}
	color 0, 0, 0

	; 時刻 + 状態表示
	color 255, 255, 255 : boxf 10, 360, 590, 410 : color 0, 0, 0
	pos 10, 360
	cur_sec = cur_p / 1000
	tot_sec = tot_p / 1000
	mes strf("時刻: %02d:%02d / %02d:%02d", cur_sec / 60, cur_sec \ 60, tot_sec / 60, tot_sec \ 60)
	pos 10, 380
	if opened {
		if is_video {
			mes "ファイル: " + filepath + "  [動画モード]"
		} else {
			mes "ファイル: " + filepath
		}
	} else {
		mes "ファイル未オープン"
	}
	return

;------------------------------------------------------------
*do_open
	if opened : mci "close " + alias_name
	mci "open \"" + filepath + "\" alias " + alias_name
	if stat = 0 {
		opened = 1
		is_video = 0
		mci "set " + alias_name + " time format milliseconds"
	}
	return

*do_open_video
	if opened : mci "close " + alias_name
	; 動画は親ウィンドウ指定で内部に貼り付け
	mci "open \"" + filepath + "\" alias " + alias_name + " parent " + hwnd + " style child"
	if stat = 0 {
		opened = 1
		is_video = 1
		mci "set " + alias_name + " time format milliseconds"
		; 動画表示位置を指定
		mci "put " + alias_name + " window at 10 70 580 200"
	}
	return

*do_play
	if opened : mci "play " + alias_name
	return

*do_pause
	if opened : mci "pause " + alias_name
	return

*do_stop
	if opened : mci "stop " + alias_name
	return

*do_rewind
	if opened = 0 : return
	mci "status " + alias_name + " position"
	cur_p = stat
	new_p = cur_p - 10000
	if new_p < 0 : new_p = 0
	mci "seek " + alias_name + " to " + new_p
	mci "play " + alias_name
	return

*do_ff
	if opened = 0 : return
	mci "status " + alias_name + " position"
	cur_p = stat
	mci "status " + alias_name + " length"
	tot_p = stat
	new_p = cur_p + 10000
	if new_p > tot_p : new_p = tot_p
	mci "seek " + alias_name + " to " + new_p
	mci "play " + alias_name
	return