CD Player

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

CD Player

#1 投稿記事 by M.S. »

お久しぶりです、M.S. です。

今、CD Player を作っているのですが、次のトラックが勝手に再生されるようにしたいのですが、できますか?
もしできるのであれば、何を使えばできるのか教えて下さい。

お願いします。
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

Re: CD Player

#2 投稿記事 by Mario2 »

> 今、CD Player を作っているのですが、次のトラックが勝手に再生されるようにしたいのですが、できますか?
> もしできるのであれば、何を使えばできるのか教えて下さい。

ABをインストールしたフォルダの「Samples」内の「CDPlayer」フォルダ内の中のファイル(プロジェクト)を参考にがんばってみてはどうでしょう?
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

Re: CD Player

#3 投稿記事 by M.S. »

> ABをインストールしたフォルダの「Samples」内の「CDPlayer」フォルダ内の中のファイル(プロジェクト)を参考にがんばってみてはどうでしょう?

サンプルでは、勝手に次のトラックを再生しません。

ちなみに、どのへんを弄ればいいか教えて下さい。
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

#4 投稿記事 by Toshi »

mciSendString というAPIがありますのでそれを使用すると次々と再生することが出来ます。

コード: 全て選択



Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (lpstrCommand As BytePtr,lpstrReturnString As BytePtr,uReturnLength As DWord,hwndCallback As DWord) As DWord

Dim ReturnString[1024] As Byte

mciSendString("open cdaudio alias cda",ReturnString,1024,NULL)
mciSendString("set cda time format tmsf",ReturnString,1024,NULL)
mciSendString("play cda from 1 to 3",ReturnString,1024,NULL)

これでCDをトラック1の始まりからトラック3の始まりまで再生することが出来ます。
また、終了するときは必ず

コード: 全て選択



mciSendString("stop cda",ReturnString,1024,NULL)
mciSendString("close cda",ReturnString,1024,NULL)

としてください。
このAPIの詳細なことについては検索するといろいろ出てくると思います。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

#5 投稿記事 by M.S. »

返信遅れちゃってすいません。

教えていただき、ありがとうございます。
早速試してみます。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

#6 投稿記事 by M.S. »

Toshi さんが教えて下さった「mciSendString」をやってみたのですが、どうやってもうまくいきません。
コードを貼り付けておきますので、「何処がいけないか」もしくは「どうすればよくなる」などを教えていただければ幸いです。

コード: 全て選択


Sub MainWnd_CDPlayButton_Click()
    Dim dwError As DWord
    Dim buffer[255] As Byte
    Dim msep As MCI_SET_PARMS
    Dim mpp As MCI_PLAY_PARMS
    Dim dwParms As DWord

    If mop.wDeviceID=0 Then
        '-----------------------------
        ' 新たにMCIデバイスをオープン
        '-----------------------------

        'リストボックスで選択されているトラックを取得
        TrackNum=SendDlgItemMessage(hMainWnd,TrackList,LB_GETCURSEL,0,0)
        If TrackNum=LB_ERR Then Exit Sub
        TrackNum=TrackNum+1    '(0,1,2...)を、(1,2,3...)に修正

        'MCIデバイスをオープン
        If OpenMciDevice()=0 Then Exit Sub


        '--------------------------
        ' トラックバーの範囲を設定
        '--------------------------

        '時刻形式にMSFを指定
        msep.dwTimeFormat = MCI_FORMAT_MSF
        mciSendCommand(mop.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,msep)

        'サウンドの長さを取得
        Dim msp As MCI_STATUS_PARMS
        msp.dwItem=MCI_STATUS_LENGTH
        msp.dwTrack=TrackNum
        mciSendCommand(mop.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM or MCI_TRACK,msp)

        'トラックバーの範囲を設定
        Dim nMax As Integer
        Dim hTrackBar As DWord
        hTrackBar=GetDlgItem(hMainWnd,TrackBar1)
        nMax=(MCI_MSF_MINUTE(msp.dwReturn)*60 + MCI_MSF_SECOND(msp.dwReturn)) * 10
        SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,nMax))
        SendMessage(hTrackBar,TBM_SETPOS,1,0)


        '------------
        ' 演奏を開始
        '------------

        '時刻形式にTMSFを指定
        msep.dwTimeFormat = MCI_FORMAT_TMSF
        mciSendCommand(mop.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,msep)

        'mciSendString----------------------------------------------
        dim ReturnString[1024] As Byte

        mciSendString("open cdaudio alias cda",ReturnString,1024,NULL)
        mciSendString("set cda time format tmsf",ReturnString,1024,NULL)
        mciSendString("play cda from 1 to 99",ReturnString,1024,NULL)
        '-----------------------------------------------------------

        dwError=mciSendCommand(mop.wDeviceID,MCI_PLAY,dwParms,mpp)
    Else
        '-------------------------------------------
        ' 演奏を再開(一時停止からの復帰、シーク時)
        '-------------------------------------------

        '再生
        mpp.dwCallback=hMainWnd
        If TrackNum=SendDlgItemMessage(hMainWnd,TrackList,LB_GETCOUNT,0,0) Then
            dwParms=MCI_NOTIFY
        Else
            mpp.dwTo=MCI_MAKE_TMSF(TrackNum+1,0,0,0)
            dwParms=MCI_TO or MCI_NOTIFY
        End If
        dwError=mciSendCommand(mop.wDeviceID,MCI_PLAY,dwParms,mpp)

        'mciSendString(終了)---------------------------------------
        mciSendString("stop cda",ReturnString,1024,NULL)
        mciSendString("close cda",ReturnString,1024,NULL)
        '----------------------------------------------------------

    End If

    If dwError Then
        'MCI_PLAYでエラーが出たとき
        mciGetErrorString(dwError,buffer,255)
        MessageBox(hMainWnd,buffer,"Missed to play of device.",MB_OK)

        'MCIデバイスを閉じる
        CloseMciDevice()
        Exit Sub
    End If

    '再生ボタンを無効化し、一時停止・停止ボタンを有効化する
    EnableWindow(GetDlgItem(hMainWnd,CDPlayButton),0)
    EnableWindow(GetDlgItem(hMainWnd,CDPauseButton),1)
    EnableWindow(GetDlgItem(hMainWnd,CDStopButton),1)

    'タイマー処理を開始する
    SetTimer(hMainWnd,ID_TIMER,100,0)
End Sub
お願いします。
M.S.
記事: 212
登録日時: 2005年6月01日(水) 21:51
お住まい: 奈良県北西部

#7 投稿記事 by M.S. »

Windows XP SP2 では、上のコードでちゃんと連続で再生されたのですが、Windows 95 では再生されません(CD-ROM ドライブが古すぎてうまく読めないので、もしかするとできるのかもしれませんが…)。

それから、WinXP SP2 では正確にシークされないのですが、Win95 ではうまくシークされます(Win95 では最初のトラックしかシークされません)。

これらの問題はどうすれば解決できるのでしょうか?
返信する