CD Player

返信する


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

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

トピックのレビュー
   

展開ビュー トピックのレビュー: CD Player

by M.S. » 2005年9月04日(日) 15:14

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

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

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

by M.S. » 2005年9月04日(日) 14:55

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
お願いします。

by M.S. » 2005年9月02日(金) 21:58

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

教えていただき、ありがとうございます。
早速試してみます。

by Toshi » 2005年8月31日(水) 21:24

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の詳細なことについては検索するといろいろ出てくると思います。

Re: CD Player

by M.S. » 2005年8月31日(水) 18:17

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

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

ちなみに、どのへんを弄ればいいか教えて下さい。

Re: CD Player

by Mario2 » 2005年8月30日(火) 14:21

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

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

CD Player

by M.S. » 2005年8月30日(火) 14:14

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

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

お願いします。

ページトップ