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