音楽再生

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

音楽再生

#1 投稿記事 by C1000 »

次のコードで音楽を再生することはできるのですが停止ができません。どこに問題があるのでしょうか?
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 音楽再生

#2 投稿記事 by NoWest »

C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

#3 投稿記事 by C1000 »

> NoWestさん
試してみましたが停止できません。
また、最初のコードでのエラー情報では、「指定されたコマンドを自動的に開かれたデバイスで実行することはできません。」となっています。
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

原因

#4 投稿記事 by C1000 »

別スレッドでの実行でなくそのまま呼び出したら、うまく動きました。ですが、別スレッドで実行したいので、別スレッドでの実行はどのようすれば良いのでしょうか?
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 原因

#5 投稿記事 by NoWest »

> 別スレッドでの実行でなくそのまま呼び出したら、うまく動きました。ですが、別スレッドで実行したいので、別スレッドでの実行はどのようすれば良いのでしょうか?
ほぉ、あなたもこの妙なWindowsの仕様にはまっていましたか。

実は9X系のWindowsではあるスレッドで開かれたMCIデバイスを別のスレッドから操作可能なのですが、NT系のWindowsの場合、あるスレッドで開かれたMCIデバイスを別のスレッドから操作することはできない仕様になっています。

ですから、この問題を回避するためにはMCIデバイスを予め使いたいスレッド上で開く必要があります。

要するに、例えばMCI_STATUSなんぞで現在の再生位置リアルタイムに取得するスレッドを作成した場合、そのスレッドで内でMCIデバイスを開いておく必要があります。
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

#6 投稿記事 by C1000 »

デバイスは使いたいスレッドで開いてあるので問題はないのですが、停止のときに同じスレッドで停止用関数を呼び出す方法がわかりません。教えていただけないでしょうか。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#7 投稿記事 by NoWest »

> デバイスは使いたいスレッドで開いてあるので問題はないのですが、停止のときに同じスレッドで停止用関数を呼び出す方法がわかりません。教えていただけないでしょうか。
色々な実装法があると思いますが、
私の場合は、スレッドの別を考えなくてもよいスレッドセーフなmciSendCommandを作って使っています。

よかったら使ってください。 ~使い方~
グローバル領域にでも

コード: 全て選択

Dim mci As MciSafetySendCommand
として

コード: 全て選択

Dim mop As MCI_OPEN_PARMS
mop.dwCallback=hMainWnd As DWord
mop.lpstrElementName="sound1.wav"
mci.SendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop)
ってな感じで普段通りのmciSendCommandとして使えます。

仕組みは簡単で全てのMCIコマンドが同一スレッド上で実行されるようにカプセル化しているだけです。
最後に編集したユーザー NoWest [ 2006年7月09日(日) 21:21 ], 累計 2 回
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

#8 投稿記事 by C1000 »

mciSendCommandをmci.SendCommmandに変えたところエラーはでなくなりましたが、今度は再生ができません。ボタンを押しても音がでずMciNotifyイベントが起こりません。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#9 投稿記事 by NoWest »

まず、最初にソースに記述ミスがあったことを謝ります。

SendCommmand → SendCommandと直してください。

あと、ついでにSendCommandで戻り値を取得できるように改良しました。
> mciSendCommandをmci.SendCommmandに変えたところエラーはでなくなりましたが、今度は再生ができません。ボタンを押しても音がでずMciNotifyイベントが起こりません。
MciNotifyイベントを発生するにはMCIコマンドにMCI_NOTIFYが追加されていなければなりませんよ。

コード: 全て選択

Dim mpp As MCI_PLAY_PARMS
mpp.dwCallback=hMainWnd
mci.SendCommand(mop.dwDeviceID,MCI_PLAY,MCI_NOTIFY,mpp)
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

#10 投稿記事 by C1000 »

できました。ちなみに再生されない原因はただIDの指定を忘れただけでした。NoWestさんありがとうございました。
返信する