AB424サンプルのCDPlayerのTrackBarの設定について

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: AB424サンプルのCDPlayerのTrackBarの設定について

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by MUGI » 2006年8月04日(金) 15:12

色々とやってみた結果です。

1.「Sub MainWnd_PlayButton_Click」のなか、
nMax = (MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10
SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,nMax))

SendMessage(hTrackBar, TBM_SETRANGE, 0, MAKELONG(0,(MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10))
とし、nMaxを使用しないように変更。

2.「Sub MainWnd_HScroll」のなか、
Dim dwWk As Dword '動作安定化の為のダミー追加
bErr = mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_TO, mciSeekParms)の前に
mciSendCommand(mop.wDeviceID, MCI_STOP, MCI_NOTIFY, dwWk) '停止コマンド追加

上記2点の追加・変更で想定される動きになります。

また、TrackBar1が無意味な状態でも操作できるので、
再生中または一時停止中の時以外は、
EnableWindow(GetDlgItem(hMainWnd, TrackBar1), 0)
で無効化。
再生中または一時停止中の時は、
EnableWindow(GetDlgItem(hMainWnd, TrackBar1), 1)
で有効化したほうがいいかもしれません。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by ゲスト » 2006年7月25日(火) 16:37

> 演奏中にTrackBar上の任意の1点をクリックしても最初からしか演奏されない件について
は、メッセージボックスをつかっていたせいでした。
メッセージボックスをはずすとOKでした。
上のメッセージのコードを入れると、TrackBarをスライドさせると正しくなりました。
(入れないと、TrackBarの位置と曲の位置があいません)
ただし、まだ2回連続して、この部分が動いてるかもしれません。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by MUGI » 2006年7月25日(火) 15:25

演奏中にTrackBar上の任意の1点をクリックしても最初からしか演奏されない件について
mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_NOTIFY,dwWk) '停止コマンド追加

bErr=mciSendCommand(mop.wDeviceID,MCI_SEEK,MCI_TO,mciSeekParms)
の前に挿入。一度停止させる事で、途中から演奏が続くようになりました。
Dim dwWk as Dwordで定義しています。
ただ、この方法が正しいのかは、
If IsWindowEnabled(GetDlgItem(hMainWnd,PlayButton))=0 Then
'再生中のときは一時停止
SendMessage(hMainWnd,WM_COMMAND,PauseButton,0)
とゆうコードが前方にあるのでどうなのかな?とは思いますが。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by MUGI » 2006年7月23日(日) 21:26

計算の前後を入れ換えると結果が異なる件ですが、バグ報告のほうに
KICOさんが投稿されました、題名: リテラル値同士の演算結果があります。
バグと言うことですが、今回の件も同じと考えていいのでしょうか?
そうだとすると、一応目処が立ったと考えますが。
でも、バーをクリックした時の動作がおかしいのがまだ解決した訳ではないのですが。
よろしくお願いします。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by MUGI » 2006年7月21日(金) 15:16

お忙しい中調べていただいてありがとうございます。
> 下記のようにすれば問題はたぶん、起きないはずです。
>

コード: 全て選択

nMax = (60 * MCI_MSF_MINUTE(msp.dwReturn) + MCI_MSF_SECOND(msp.dwReturn)) * 10
確かに、上記の様にしますと、すぐに終わりにいく現象は直りました。
あほみたいな素朴な疑問なんですが、
SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,nMax)) を
SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,(MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10))
の様にかくことでも、不具合が起きなくなりました。
計算途中の型の問題だとすると、nMaxのかわりに直接算式を書いても、おかしくなる気がするのですが、正常のようです。
代入の場合のみ発生するのでしょうか。
MessageBox(hMainWnd,Str$(MCI_MSF_MINUTE(msp.dwReturn)*60),"分*60 時間",MB_OK)
と書いても、正常値が表示されます。
お時間取れるときにでも、ご教授いただけたらと思います。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by NoWest » 2006年7月19日(水) 18:45

> nMax = (MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10
> SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,nMax))
> で設定しています。
> MessageBoxを使って調べてみると、nMaxの値が変な値になっています。
シークがうまくできない理由までは突き止められていませんが、このnMaxの問題は分かりましたのでご報告しておきます。


これは単純にキャストの問題でした。

コード: 全て選択

nMax = (MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10
MCI_MSF_MINUTE()関数の返す値はBYTE形式であるため*60の結果が0~256の範囲に自動的に丸められていただけです。

下記のようにすれば問題はたぶん、起きないはずです。

コード: 全て選択

nMax = (60 * MCI_MSF_MINUTE(msp.dwReturn) + MCI_MSF_SECOND(msp.dwReturn)) * 10

今は、忙しいのでここまででご勘弁を(笑

Re: 確かに

by MUGI » 2006年7月18日(火) 15:33

> あと、AB4.24のサンプルに付属のEXEを実行すると、まともな動作をします。
> ただ、トラックバーを動かすと、バグりますけど。
情報ありがとうございます。
確かに、TrackBarの最大値の問題をクリアしても、TrackBarクリックでもおかしいですね。
一番最初から再生にしかなりませんね。
どうも、Sub MainWnd_HScrollの処理が2回連続で実行されるようです。
pos=SendMessage(GetDlgItem(hMainWnd,TrackBar1),TBM_GETPOS,0,0)\10
MessageBox(hMainWnd,Str$(pos),"pos",MB_OK)
mciSeekParms.dwTo=MCI_MAKE_TMSF(TrackNum, pos\60, pos mod 60,0)
上記の様に、途中にMessageBoxを挿入するだけで、途中からの再生ができるようになります。
まだ、それでも、TrackBarのクリックした位置と、TrackBarのカーソルの位置があっていないです。
このサンプルは、現在のABの学習用サンプルとしては、まずいと言うか
単なる代入さえ処理できない言語なのかと思ってしまいます。

確かに

by BASIC32 » 2006年7月17日(月) 17:33

私も、その問題で困っていたことがあり、結局、あきらめました。
確かに、すぐに終わってしまいます。
環境は、以下の通りです。
OS:Windows98SE/Me
ABのバージョン:4.2X
曲の長さ:約4:25
トラックバーの終了までの時間:約16秒(OSによってバラバラみたい)
CDライター:WinCD-R v6.5
CDリーダーのメーカー:バッファロー(型はわかりません)
ちなみに、ActiveBasicオフィシャルユーザーズガイドに付いている、
CDのサンプルのEXEを実行すると、正常に動作するのですが。。。
あと、AB4.24のサンプルに付属のEXEを実行すると、まともな動作をします。
ただ、トラックバーを動かすと、バグりますけど。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by MUGI » 2006年7月17日(月) 15:46

> わたしは現在AudioCDを持っていないのでテストできないのですが、
> MUGIさんがテストで再生しようとしているオーディオデータの長さはどれくらいでしょうか?
ありがとうございます。
再生している音楽CDは、1曲5分8秒とか大体5分前後の曲です。
音楽の再生自体は、全く問題ありません。
単に、TrackBar の最大値が変なので、曲はまだ演奏開始したばかりなのに
終了まで移動してしまい、役に立たないのです。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by NoWest » 2006年7月16日(日) 15:42

> > バグだバグだと失敗を押し付けてしまうことは簡単なことです。すぐに諦めずもっとアガいてみましょう(^_^;)
>
> 失敗なら、このAB最新版についてくるサンプル作られた人の失敗ですよ。
> 私は、ソースに変更を加えず、単にコンパイルして動かそうとしてるだけですから。
> なのに正しく動いてくれない。
> 念のため、別の回線と別のPCを使って、ABをダウンロードし直して追試しましたが、
> 現象は同じです。
> よって、ダウンロード時のファイルの破損等は考えられません。


わたしは現在AudioCDを持っていないのでテストできないのですが、
MUGIさんがテストで再生しようとしているオーディオデータの長さはどれくらいでしょうか?

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by MUGI » 2006年7月16日(日) 14:23

> バグだバグだと失敗を押し付けてしまうことは簡単なことです。すぐに諦めずもっとアガいてみましょう(^_^;)

失敗なら、このAB最新版についてくるサンプル作られた人の失敗ですよ。
私は、ソースに変更を加えず、単にコンパイルして動かそうとしてるだけですから。
なのに正しく動いてくれない。
念のため、別の回線と別のPCを使って、ABをダウンロードし直して追試しましたが、
現象は同じです。
よって、ダウンロード時のファイルの破損等は考えられません。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by ゲスト » 2006年7月16日(日) 14:06

質問に書いているように
>MessageBoxを使って調べてみると、nMaxの値が変な値になっています。
値は、本当は3080とかになるはずなのに、8とかになります。
型をおおきなものにしても、かわりはありません。
nMaxへの代入時に、おかしくなっているか、nMaxの参照アドレスがおかしいなどでしょうかね。

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by 7 » 2006年7月14日(金) 15:07

> サンプルは元々、Dim nMax As Integer になっています。
> wordにしても、まったく変わりません。
じゃあ逆に、Long型やDWord型にしてみてください。
(MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10 の値がいくつになるか分からないんですけど、Integer型やWord型では収まりきらないのかもしれません。

バグだバグだと失敗を押し付けてしまうことは簡単なことです。すぐに諦めずもっとアガいてみましょう(^_^;)

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by MUGI » 2006年7月14日(金) 14:34

ありがとうございます。
> MAKELONG関数に渡すのは16ビット整数値なので、Integer型やWord型にしてみては如何でしょう?
サンプルは元々、Dim nMax As Integer になっています。
wordにしても、まったく変わりません。
ということは、AB424のバグと言うことでしょうか?

Re: AB424サンプルのCDPlayerのTrackBarの設定について

by 7 » 2006年7月13日(木) 18:29

> 文法的にも、nMaxに関しておかしいところは無いみたいです。
> なぜ、nMaxを使うとおかしくなるのか、わかられるかたいらしゃいましたら教えていただけないでしょうか。
想像のお話ですけど、変数nMaxの型に問題があるんじゃないでしょうか?
Dim nMax As Longだとダメだけど、Dim nMax As DWordにするとオーケーなどなど。
MAKELONG関数に渡すのは16ビット整数値なので、Integer型やWord型にしてみては如何でしょう?

ページトップ