〜 メディア 〜
再生の一時停止・再開・指定位置に移動

MCIを利用してメディアの一時停止・再開・指定した位置からの再生について説明します。
一時停止は「pause」、再開は「resume」コマンドを渡すことで実現可能ですが、
どこのページか忘れましたが、一時停止は問題ないものの再開できないと書かれていた記憶があります。
また、「stop」直後に「play」を行うことでも、停止位置から再生できました。
自分の環境ではこれらで問題ありませんが、皆さんはどうなのでしょうか?
もしかすると、パソコンによってはその方法でも無理なのかもしれませんので、使用には注意しましょう。

指定位置に移動するには「seek」コマンドを使います。
「mci "seek デバイス名 to 位置"」と書くことで指定位置から、
「mci "seek デバイス名 to start"」または「mci "seek デバイス名 to 0"」とすると先頭に、
「mci "seek デバイス名 to end"」とすることで最後から再生させることが出来ます。
指定位置からの再生を行う、と言うよりどっちかというと再生位置を変更すると言う方が似合いますね。
指定位置から再生させるのは「play」コマンドの「from」パラメータ十分でしょう。
「play」だと「to」パラメータで終了位置もできますので、AからBまでを再生させることが可能です。
書き方は「mci "play デバイス名 from 開始位置 to 終了位置"」としてあげましょう。
開始位置を省略すると初めから、終了位置を省略すると最後まで、と自動的に解釈されます。

さて、「seek」コマンドのパラメータ「to 位置」の「位置」は、先頭からのミリ秒を指定してあげます。
ミリ秒と言われても、特定箇所が何ミリ秒になるのか分かりにくいと思うので、
ココでは同時に、「status」コマンドの「position」パラメータも併用してみます。
下記にサンプルとして置いておきますので、試してみてください。 
尚、MCIモジュールを統一するため、複数読込に対応しているコチラの定義を流用しています。
	

mciload ファイルパス, 番号
ファイルパス再生するファイルパスを指定する。
尚、"1"ならA、"2"ならB、"26"ならZドライブとしたCDオーディオ形式でロードする。
番号割り当てるバッファ番号を指定する。
尚、当命令を実行すると、自動的に指定番号が操作対象バッファとなる。

mciplay 開始位置, 終了位置, 繰り返し
開始位置省略可能(省略時は空文字""を指定すること)。再生開始位置を指定する。
尚、指定は数値文字列、現在のフォーマット(初期はMSF"mm:ss:ff")で行う。
終了位置省略可能(省略時は空文字""を指定すること)。再生終了位置を指定する。
尚、指定は数値文字列、現在のフォーマット(初期はMSF"mm:ss:ff")で行う。
繰り返し最後まで再生したら自動的に初めから再生する(=1)か否(=0)かを指定する。

mcistop
[パラメータなし]現在の操作対象バッファの再生を停止するだけである為、パラメータは必要ない。

mciexit
[パラメータなし]全デバイスを解放するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

mcimove 移動先
移動先ミリ秒単位の移動先位置を指定する。
尚、この命令はポジションを変えるだけで、移動先からの再開は行わない。

mcicurrent
[パラメータなし]位置を取得するだけの為、パラメータは必要ない。
尚、取得値はstatに返る。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#module
#deffunc mcisel int
	mref no, 0
	cntno = no
	return

#deffunc mciload str, int
	mref file, 32 : mref no, 1
	cntno = no
	mci "close _" + cntno
	strmid i, file, , 2 : int i
	if i {
		file = "cdaudio!?"
		poke file, 8, i + 64
	}
	mci "open \"" + file + "\" alias _" + cntno
	return

#deffunc mciplay str, str, int
	mref start, 32 : mref finish, 33 : mref re, 2
	if start ! "" : s = " from " + start : else : s = ""
	if finish ! "" : s += " to " + finish
	if re : s += " repeat"
	mci "play _" + cntno + s
	return

#deffunc mcistop
	mci "stop _" + cntno
	return

#deffunc mciend onexit
	mci "stop all"
	mci "close all"
	return

#deffunc mcimove int
	mref position, 1
	mci "seek _" + cntno + " to " + position
	return

#deffunc mcicurrent
	mci "status _" + cntno + " position"
	return
#global

	button "OPEN", *open
	button "PLAY", *play
	button "STOP", *suspend
	button "MARK", *mark
	button "MOVE", *seek
	pos 100, 0
	stop

*open
	dialog "", 16, "再生するファイル"
	if stat {
		mciload refstr
		mes "読み込みました"
	}
	stop

*play
	mciplay "", ""
	stop

*suspend
	mcistop
	stop

*mark
	mcicurrent
	position = stat
	mes "マークしました[" + position + "ms]"
	stop

*seek
	mcimove position
	mciplay "", ""
	mes "移動しました"
	stop

mciload ファイルパス, 番号
ファイルパス再生するファイルパスを指定する。
尚、"1"ならA、"2"ならB、"26"ならZドライブとしたCDオーディオ形式でロードする。
番号割り当てるバッファ番号を指定する。

mciplay 開始位置, 終了位置, 繰り返し
開始位置省略可能(省略時は空文字""を指定すること)。再生開始位置を指定する。
尚、指定は数値文字列、現在のフォーマット(初期はMSF"mm:ss:ff")で行う。
終了位置省略可能(省略時は空文字""を指定すること)。再生終了位置を指定する。
尚、指定は数値文字列、現在のフォーマット(初期はMSF"mm:ss:ff")で行う。
繰り返し最後まで再生したら自動的に初めから再生する(=1)か否(=0)かを指定する。

mcistop
[パラメータなし]現在の操作対象バッファの再生を停止するだけである為、パラメータは必要ない。

mciexit
[パラメータなし]全デバイスを解放するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

mcimove 移動先
移動先ミリ秒単位の移動先位置を指定する。
尚、この命令はポジションを変えるだけで、移動先からの再開は行わない。

現在位置 = mcicurrent()
現在位置再取得した現在位置の格納先を指定する。
[パラメータなし]位置を取得するだけの為、パラメータは必要ない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#module
#deffunc mcisel int no
	cntno = no
	return

#deffunc mciload str file, int no, local s
	cntno = no
	mci "close _" + cntno
	if int(file) {
		s = "cdaudio!?"
		poke s, 8, int(file) + 64
	} else {
		s = file
	}
	mci "open \"" + s + "\" alias _" + cntno
	return

#deffunc mciplay str start, str finish, int re, local s
	if start ! "" : s = " from " + start : else : s = ""
	if finish ! "" : s += " to " + finish
	if re : s += " repeat"
	mci "play _" + cntno + s
	return

#deffunc mcistop
	mci "stop _" + cntno
	return

#deffunc mciend onexit
	mci "stop all"
	mci "close all"
	return

#deffunc mcimove int position
	mci "seek _" + cntno + " to " + position
	return

#defcfunc mcicurrent
	mci "status _" + cntno + " position"
	return stat
#global

	button gosub "OPEN", *open
	button gosub "PLAY", *play
	button gosub "STOP", *suspend
	button gosub "MARK", *mark
	button gosub "MOVE", *seek
	pos 100, 0
	stop

*open
	dialog "", 16, "再生するファイル"
	if stat {
		mciload refstr
		mes "読み込みました"
	}
	return

*play
	mciplay "", ""
	return

*suspend
	mcistop
	return

*mark
	position = mcicurrent()
	mes "マークしました[" + position + "ms]"
	return

*seek
	mcimove position
	mciplay "", ""
	mes "移動しました"
	return