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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0801
U-TO9488MCIのバグ?5解決


U-TO9488

リンク

2020/8/1(Sat) 08:12:08|NO.91104

開発中のソフトで音楽を再生する際にMCIを使用していたのですが、
再生時間を調べるのがうまくいかなかったので検証したところ、
hsp3utfをランタイムにすると
MCIにstatusコマンドを送った際に異常な値のstatやrefstrがかえってくることが分かりました。
検証に使用したソース↓

#include "hsp3utf.as" mci "open test.wav alias a" mci "play a" repeat mci "status a length" lst=stat lre=refstr mci "status a position" pst=stat pre=refstr title ""+lst+","+lre+","+pst+","+pre await 10 loop
自分の環境(HSP3.5)では、ウィンドウのタイトルは常に「0,i,0,i」でした。
#include "hsp3utf.as" を外すと、正常な値が表示されました。
これはバグなのでしょうか。それとも仕様なのでしょうか。
回答よろしくお願いします。



この記事に返信する


沢渡

リンク

2020/8/1(Sat) 10:29:14|NO.91105

私が実行したところタイトルに意味不明な文字列が出てきました。
文字コードの変換が上手くいっていないバグでしょうか?
とりあえず代替の手段として、文字列をUTF-16に変換した上で
WinAPIのmciSendStringWを呼ぶ方法でやってみました。

#include "hsp3utf.as" #include "winmm.as" #include "kernel32.as" #module #ifdef __hsp3utf__ #const code 65001 //UTF-8 #else #const code 932 //Shift_JIS #endif #deffunc cnvstow2 var csv,str css //バッファの自動確保を行うcnvstow sdim bufs,strlen(css)+1 bufs=css MultiByteToWideChar code,0,varptr(bufs),-1,0,0 if stat=0 : sdim csv,64 : return r=stat sdim csv,r*2 MultiByteToWideChar code,0,varptr(bufs),-1,varptr(csv),r return #deffunc mci2 str mc sdim res16,256*2 //結果用バッファ(UTF-16) cnvstow2 buf16,mc //通常文字列をUTF-16に変換 mciSendStringW varptr(buf16),varptr(res16),256,0 if stat : return -1 //エラーの場合 res=cnvwtos(res16) //結果を通常文字列に変換 mref refs,65 //refstr refs=res return int(res) #global mci2 "open test.wav alias a" mci2 "play a" repeat mci2 "status a length" lst=stat lre=refstr mci2 "status a position" pst=stat pre=refstr title ""+lst+","+lre+","+pst+","+pre await 10 loop



U-TO9488

リンク

2020/8/1(Sat) 13:31:34|NO.91106

回答ありがとうございます。
沢渡さんの代替コードは私の環境でも正常に動いたので、
これを採用することにします。



U-TO9488

リンク

2020/8/2(Sun) 19:36:45|NO.91114

後で調べたところ、沢渡さんの代替コードでは
2バイト文字(日本語など)を正常に認識できないことが分かりましたが、
ファイル名をcnvstoaでシフトJISに変換したものをmci2に載せることで正常に機能しました。
このため、#ifdefの部分を消去し、ランタイムにかかわらずcodeが932になるようにしました。
#include "hsp3utf.as"
#include "winmm.as" #include "kernel32.as" #module #const code 932 //Shift_JIS #deffunc cnvstow2 var csv,str css //バッファの自動確保を行うcnvstow sdim bufs,strlen(css)+1 bufs=css MultiByteToWideChar code,0,varptr(bufs),-1,0,0 if stat=0 : sdim csv,64 : return r=stat sdim csv,r*2 MultiByteToWideChar code,0,varptr(bufs),-1,varptr(csv),r return #deffunc mci2 str mc sdim res16,256*2 //結果用バッファ(UTF-16) cnvstow2 buf16,mc //通常文字列をUTF-16に変換 mciSendStringW varptr(buf16),varptr(res16),256,0 if stat : return -1 //エラーの場合 res=cnvwtos(res16) //結果を通常文字列に変換 mref refs,65 //refstr refs=res return int(res) #global file="テスト.mp3" filej="" cnvstoa filej,file mci2 "open "+filej+" type mpegvideo alias a" mci2 "play a" repeat mci2 "status a length" lst=stat lre=refstr mci2 "status a position" pst=stat pre=refstr title ""+lst+","+lre+","+pst+","+pre await 10 loop



沢渡

リンク

2020/8/2(Sun) 19:50:18|NO.91115

そんな筈は、と思って確かめてみましたが、どうやらモジュール内では__hsp3utf__が
定義されているかどうかを確かめられず、有無をいわさずcodeがShift_JISになっていたようです。
以下のコードならUTF-8をShift_JISに変換しなくても大丈夫だと思います。
お手数かけて申し訳ありませんでした。

#include "hsp3utf.as" #include "winmm.as" #include "kernel32.as" #ifdef __hsp3utf__ #const global code 65001 //UTF-8 #else #const global code 932 //Shift_JIS #endif #module #deffunc cnvstow2 var csv,str css //バッファの自動確保を行うcnvstow sdim bufs,strlen(css)+1 bufs=css MultiByteToWideChar code,0,varptr(bufs),-1,0,0 if stat=0 : sdim csv,64 : return r=stat sdim csv,r*2 MultiByteToWideChar code,0,varptr(bufs),-1,varptr(csv),r return #deffunc mci2 str mc sdim res16,256*2 //結果用バッファ(UTF-16) cnvstow2 buf16,mc //通常文字列をUTF-16に変換 mciSendStringW varptr(buf16),varptr(res16),256,0 if stat : return -1 //エラーの場合 res=cnvwtos(res16) //結果を通常文字列に変換 mref refs,65 //refstr refs=res return int(res) #global mci2 "open テスト.wav alias a" mci2 "play a" repeat mci2 "status a length" lst=stat lre=refstr mci2 "status a position" pst=stat pre=refstr title ""+lst+","+lre+","+pst+","+pre await 10 loop



U-TO9488

リンク

2020/8/2(Sun) 23:14:51|NO.91116

沢渡さん、修正ありがとうございます。
正常な動作を確認したほか、
cnvstoaを用いたコードで発生していたファイルの字数制限もなくなりました。
本当にありがとうございました。



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