|
|
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
|
|
2020/8/1(Sat) 13:31:34|NO.91106
回答ありがとうございます。
沢渡さんの代替コードは私の環境でも正常に動いたので、
これを採用することにします。
|
|
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
| |
|
2020/8/2(Sun) 23:14:51|NO.91116
沢渡さん、修正ありがとうございます。
正常な動作を確認したほか、
cnvstoaを用いたコードで発生していたファイルの字数制限もなくなりました。
本当にありがとうございました。
|
|