HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1028
CEOVBMP3のコールバックについて5解決


CEO

リンク

2010/10/28(Thu) 21:42:31|NO.35512

現在、MP3再生ソフトウェアを作成しており、再生にVBMP3を使用しています。
コールバック関数を使って、VBMP3のステータスを取得したいのですが、うまくいきません。
どのようにすればよいでしょうか。よろしくお願いします


// 実行には、VBMP3とhspcallbk.dllが必要です #uselib "VBMP3.DLL" #func global vbmp3_init "vbmp3_init" #func global vbmp3_free "vbmp3_free" #func global vbmp3_open "vbmp3_open" int,int #func global vbmp3_close "vbmp3_close" #func global vbmp3_getState "vbmp3_getState" int #func global vbmp3_play "vbmp3_play" #func global vbmp3_stop "vbmp3_stop" #func global vbmp3_callback "vbmp3_callback" int #define global TRUE 1 #define global FALSE 0 #define global ERROR -1 #module "VBMP3" // 初期化 #deffunc INIT_VB // 入力構造体 sdim InputInfo,272 vbmp3_init return stat // ロード #deffunc LOAD_VB str filename ,local filename_ vbmp3_close : filename_ = filename vbmp3_open varptr(filename_),varptr(InputInfo) return stat // 再生 #deffunc PLAY_VB vbmp3_play return stat // 開放 #deffunc CLOSE_VB vbmp3_close vbmp3_free return stat // 停止 #deffunc STOP_VB vbmp3_stop return stat // 再生時間 #defcfunc GET_TIME_VB int Playing , int strf_ , local time_ if Playing == FALSE { time_ = wpeek(InputInfo,268) } else { vbmp3_getState varptr(time_) } if strf_ == TRUE { time_.1 = time_ / 60 : time_ = time_ \ 60 : return ""+strf ( "%02d : %02d",time_.1,time_ ) } return time_ // 再生状態取得 #defcfunc GET_STATUS_VB local time_ ; status(ret) ; stat=0 : 停止中 (STOP) ; stat=1 : 再生中 (PLAY) ; stat=2 : 一時停止中 (PAUSE) vbmp3_getState varptr(time_) return stat #global #include "hscallbk.as" screen 0 , 320 , 120 , 2+1 #uselib "" #func VB_CALL "" int // コールバック登録 setcallbk Proc, VB_CALL, *VB_PROC vbmp3_callback varptr ( Proc ) // ここでTrueなら成功 *MAIN // 初期化 INIT_VB : onexit gosub*exit // セレクト dialog "mp3" , 16 : if stat == FALSE { goto*exit } // ロード LOAD_VB refstr : PLAY_VB pos 5 , 55 : button gosub "PLAY" , *PLAY_ pos 105 , 55 : button gosub "STOP" , *STOP_ gsel 0 , 1 repeat redraw 0 : color : boxf : color 255 , 255 , 255 pos 3 , 5 : mes "[再生時間 "+ GET_TIME_VB ( TRUE , TRUE ) +" / 総時間 "+ GET_TIME_VB ( FALSE , TRUE ) +"]" pos 3 , ginfo (23) : mes "[再生状態: "+ GET_STATUS_VB() +"]" redraw 1 await 16 loop stop *PLAY_ PLAY_VB return *STOP_ STOP_VB return *exit CLOSE_VB end *VB_PROC title "こーるばっく受信しました" return



この記事に返信する


KA

リンク

2010/10/29(Fri) 03:42:39|NO.35522

>>うまくいきません。
>>どのようにすればよいでしょうか。よろしくお願いします

 ・・・ うまくいくようにしてください。
 ・・・ そうすればよいとおもいます。がんばって下さい。

 この質問内容での回答は、これで精一杯です。
 まず、具体的な質問のしかたから、勉強してください。
 今後のためでもあり、貴方のためでもあります。



SYAM

リンク

2010/10/29(Fri) 11:12:50|NO.35526

必要なライブラリがどこにあるのか、というかどこにあったものなのか分からないので試しようがないですのだ。
質問もそのライブラリの扱いに関するところのようなので、同じもので試してみないと、回答できませんのだ。



CEO

リンク

2010/10/29(Fri) 17:53:11|NO.35531

すみません、遅くなりました。

KA様
申し訳ございません、質問の内容が曖昧でした。以後気を付けます
ここにて訂正させてもらいます

現在、MP3再生ソフトウェアを作成しており、再生にVBMP3を使用しています。
ステータスを取得するために、コールバック関数を使ったのですが、
再生状態を変更しても、指定したラベルに通知が来ません。
VBMP3の関数である「vbmp3_callback」でアドレスを指定すると、
成功しているようです。
指定したラベルに通知が来るように、どこを修正したらよいか、ご指摘をお願いします
使用しているOS : Windows XP SP3

SYAM様
申し訳ございません。使用しているライブラリは、以下の場所からダウンロードしたものです

コールバック関数実装プラグイン hscallbk.dll for HSP3
http://yokohama.cool.ne.jp/chokuto/download/index.html
VBMP3.dll(改
http://www1.odn.ne.jp/~keisakamoto/src/vbmp31615_fixed_20030921.lzh

ご迷惑をかけて申し訳ありません。よろしくお願いします。



inovia

リンク

2010/10/31(Sun) 01:01:14|NO.35586

それ以前に INIT_VB を呼び出してVBMP3.DLL を初期化する前に
vbmp3_callback を呼び出してしまっているのも問題だと思います。

同じく試していませんが。



CEO

リンク

2010/10/31(Sun) 02:02:54|NO.35589

AA様、inovia様

指摘の通り、
INIT_VBを呼び出した後にvbmp3_callbackを呼び出し、コールバック関数の引数を
変更したところ、無事にラベルに通知が来るようになりました。
本当に助かりました、有難うございます!

修正後のスクリプトを載せておきます。

// 実行には、VBMP3とhspcallbk.dllが必要です #uselib "VBMP3.DLL" #func global vbmp3_init "vbmp3_init" #func global vbmp3_free "vbmp3_free" #func global vbmp3_open "vbmp3_open" int,int #func global vbmp3_close "vbmp3_close" #func global vbmp3_getState "vbmp3_getState" int #func global vbmp3_play "vbmp3_play" #func global vbmp3_stop "vbmp3_stop" #func global vbmp3_callback "vbmp3_callback" int #define global TRUE 1 #define global FALSE 0 #define global ERROR -1 #module "VBMP3" // 初期化 #deffunc INIT_VB // 入力構造体 sdim InputInfo,272 vbmp3_init return stat // ロード #deffunc LOAD_VB str filename ,local filename_ vbmp3_close : filename_ = filename vbmp3_open varptr(filename_),varptr(InputInfo) return stat // 再生 #deffunc PLAY_VB vbmp3_play return stat // 開放 #deffunc CLOSE_VB vbmp3_close vbmp3_free return stat // 停止 #deffunc STOP_VB vbmp3_stop return // 再生時間 #defcfunc GET_TIME_VB int Playing , int strf_ , local time_ if Playing == FALSE { time_ = wpeek(InputInfo,268) } else { vbmp3_getState varptr(time_) } if strf_ == TRUE { time_.1 = time_ / 60 : time_ = time_ \ 60 : return ""+strf ( "%02d : %02d",time_.1,time_ ) } return time_ // 再生状態取得 #defcfunc GET_STATUS_VB local time_ ; status(ret) ; stat=0 : 停止中 (STOP) ; stat=1 : 再生中 (PLAY) ; stat=2 : 一時停止中 (PAUSE) vbmp3_getState varptr(time_) return stat #global #include "hscallbk.as" screen 0 , 320 , 120 , 2+1 // コールバック取得変数 dim call_info,2 #uselib "" #func VB_CALL "" int,int // コールバック登録 setcallbk Proc, VB_CALL, *VB_PROC INIT_VB : vbmp3_callback varptr ( Proc ) *MAIN // 初期化 onexit gosub*exit // セレクト dialog "mp3" , 16 : if stat == FALSE { goto*exit } // ロード LOAD_VB refstr : PLAY_VB pos 5 , 55 : button gosub "PLAY" , *PLAY_ pos 105 , 55 : button gosub "STOP" , *STOP_ gsel 0 , 1 repeat redraw 0 : color : boxf : color 255 , 255 , 255 pos 3 , 5 : mes "[再生時間 "+ GET_TIME_VB ( TRUE , TRUE ) +" / 総時間 "+ GET_TIME_VB ( FALSE , TRUE ) +"]" pos 3 , ginfo (23) : mes "[再生状態: "+ GET_STATUS_VB() +"]" redraw 1 await 16 // コールバックで取得したデータを反映 if call_info.1 != FALSE { title "コールバックから取得した再生状態 / "+call_info.0 : call_info.1 = FALSE } loop stop *PLAY_ PLAY_VB return *STOP_ STOP_VB return *exit CLOSE_VB end *VB_PROC // コールバック関数内で処理を行うと不安定になるので、 // フラグを立てて別のところで処理をする call_info = callbkarg(0) // 再生状態 ;call_info = callbkarg(1) // 演奏時間 call_info.1 = TRUE ; flg return 0



ONION software Copyright 1997-2023(c) All rights reserved.