eps_r

不思議の謎を解かねばならぬ

GSPlayerをイヤホンマイクから操作するMortScript

携帯電話の類で音楽を聴いている時は、電話なんかいちいち触らなくても再生停止くらいは出来た方が便利というものです。

Bluetooth(AVRCP)ヘッドセットを買え、という話を脇に置いてからWWWを調べてみると、Advanced/W-ZERO3[es]ことWS011SH向けには、AC-Promenade / Windows MobileTCPMP・サポートというMortScriptを見つけることができます。イヤホンマイクのボタンを再生停止に割り当ててしまうわけですね。

わたしがGSPlayerを主に使っているのと、入れている常駐ソフトの関係でこちらをそのまま導入するのはしんどく感じたので、機能を減らして簡単にしたスクリプトを書きました。

動作確認機種はWS011SHですが保証は一切ありません。

6月9日追記:停止のコマンドIDが間違っていたのを直したついでに、通話終了後に再生ボタンを1回押すようにしました。再生状態を確認しないため厳密にはレジュームではありません。

# GSPlayerを操作する

# AC-Promenade(http://www.ac-promenade.net/)に公開されている、
# TCPMP・サポート(TCPMP_Sp.mscr)を参考に作成した簡易版です。
# キーロック中での音楽視聴中に、イヤホンマイク側の通話ボタンを
# 再生/一時停止の切り替えに割り当てます。

# 使いかた
#  ・設定セクションに必要事項を記入します。
#    初期設定はGSPlayerK Ver2に合わせています。
#  ・mscrを起動します。
#    プレーヤソフトも一緒に立ち上がります。
#  ・キーロックしながらのイヤホンマイク操作で
#    再生制御ができるといいですね。
#  ・着信があると勝手に曲を止めます。
#    通話が終わると勝手に曲を再生します。
#  ・プレーヤソフトの終了に対応して自身も終了します。
#    インタプリタの残留が心配な場合は
#    各自ダイアログを入れるなどしてください。

# オリジナルとの差異は以下の通りです。
# ・コマンドを座標クリックではなく
#   ウィンドウメッセージの送信で行うため、
#   比較的確実かつ高速に動作する可能性があります。
# ・スクリプトは常駐します。通知には対応しないため
#   比較的低速に動作する可能性があります。
# ・少々のカスタマイズでTCPMP向けにも動作します。

# 本スクリプトの実装しない機能は以下の通りです。
# ・キー操作音は発行しません。
# ・画面の点灯消灯制御は行いません。
# ・お気に入り管理機能はありません。
# ・GLOCKfやxclkcfgと連動しません。

# http://d.hatena.ne.jp/appalerm/


#------------------------------------------------------------
#環境設定
# ウィンドウタイトル
WndTitle = "GSPlayerK"

# アプリケーションのフルパス
PlayerExe = "\Program Files\GSPlayerK\GSPlayerK2.exe"

# 状態監視の間隔(ミリ秒)
Interval = 500

# ウィンドウメッセージにセットするコマンドID(トグル再生)
CmdToggle = 40091 # GSPlayer
# CmdToggle = 370 # TCPMP

# ウィンドウメッセージにセットするコマンドID(停止)
CmdStop = 40036 # GSPlayer
# CmdStop = 372 # TCPMP


#------------------------------------------------------------
# 処理開始
Call("checkStatus")
# プレーヤソフトが居ない場合は起動
If(ExistsPlayer = 0)
	Run(PlayerExe)
	WaitForActive(WndTitle, 10000)
EndIf

# メインループ
While(1)
	Call("checkStatus")
	# プレーヤソフトが終了している場合はスクリプト終了
	If(ExistsPlayer = 0)
		Exit
	EndIf

	# イヤホンマイクのボタン押し判定
	# キーロック中で、発着信してなくて、電話がアクティブ
	If((ValueKeyLock = 1) && (ValueLockPhone < 4097) && (WndActive("電話 ") = 1))
		# 再生
		Call("toggleMedia")
	EndIf

	# 発着信判定
	# キーロックは関係なく、発着信状態である
	If((ValueLockPhone >= 4097) || (ValueActiveComm > 0))
		# 停止の後、通話終了を待ち、再度再生
		Call("stopMedia")
		While((ValueLockPhone >= 4097) || (ValueActiveComm > 0))
			Call("checkStatus")
			Sleep(Interval)
		EndWhile
		Call("toggleMedia")
	EndIf

	Sleep(Interval)
EndWhile

Sub checkStatus
	ExistsPlayer = ProcExists (PlayerExe)
	ValueKeyLock = RegRead (HKCU, "Software\Sharp\PhoneStatus", "Status0")
	ValueLockPhone = RegRead (HKCU, "Software\Sharp\PhoneApp", "LockPhone")
	ValueActiveComm=RegRead (HKCU, "Software\Sharp\ShPhoneLib", "WrapperActiveComm")
EndSub

Sub toggleMedia
	SendCommand(WndTitle, CmdToggle)
	While(WndActive("電話 ") = 1)
		Minimize("電話 ")
		Sleep(100)
	EndWhile
EndSub

Sub stopMedia
	SendCommand(WndTitle, CmdStop)
EndSub