home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1996 November / VPR9611A.ISO / vpr_data / vb32 / source / wave.frm < prev    next >
Text File  |  1996-09-01  |  13KB  |  440 lines

  1. VERSION 4.00
  2. Begin VB.Form Form1 
  3.    BackColor       =   &H00404040&
  4.    BorderStyle     =   3  '固定ダイアログ
  5.    Caption         =   "低レウェーブプレーヤ"
  6.    ClientHeight    =   3000
  7.    ClientLeft      =   1740
  8.    ClientTop       =   2148
  9.    ClientWidth     =   3288
  10.    Height          =   3384
  11.    Left            =   1692
  12.    LinkTopic       =   "Form1"
  13.    MaxButton       =   0   'False
  14.    MinButton       =   0   'False
  15.    ScaleHeight     =   3000
  16.    ScaleWidth      =   3288
  17.    ShowInTaskbar   =   0   'False
  18.    Top             =   1812
  19.    Width           =   3384
  20.    Begin VB.Timer Timer1 
  21.       Enabled         =   0   'False
  22.       Interval        =   1
  23.       Left            =   1440
  24.       Top             =   2640
  25.    End
  26.    Begin VB.CommandButton Command2 
  27.       BackColor       =   &H00808080&
  28.       Caption         =   "再生"
  29.       Height          =   492
  30.       Left            =   240
  31.       TabIndex        =   1
  32.       Top             =   2400
  33.       Width           =   1092
  34.    End
  35.    Begin VB.CommandButton Command1 
  36.       Caption         =   "終了"
  37.       Height          =   492
  38.       Left            =   1920
  39.       TabIndex        =   0
  40.       Top             =   2400
  41.       Width           =   1092
  42.    End
  43.    Begin VB.Label Label1 
  44.       Alignment       =   2  '中央揃え
  45.       BackColor       =   &H00000000&
  46.       BorderStyle     =   1  '実線
  47.       Caption         =   "ファイルサイズ"
  48.       ForeColor       =   &H00FFFF00&
  49.       Height          =   372
  50.       Index           =   4
  51.       Left            =   120
  52.       TabIndex        =   6
  53.       Top             =   1920
  54.       Width           =   3012
  55.    End
  56.    Begin VB.Label Label1 
  57.       Alignment       =   2  '中央揃え
  58.       BackColor       =   &H00000000&
  59.       BorderStyle     =   1  '実線
  60.       Caption         =   "タイム"
  61.       ForeColor       =   &H00FFFF00&
  62.       Height          =   372
  63.       Index           =   3
  64.       Left            =   120
  65.       TabIndex        =   5
  66.       Top             =   1560
  67.       Width           =   3012
  68.    End
  69.    Begin VB.Label Label1 
  70.       Alignment       =   2  '中央揃え
  71.       BackColor       =   &H00000000&
  72.       BorderStyle     =   1  '実線
  73.       Caption         =   "ビットレート"
  74.       ForeColor       =   &H00FFFF00&
  75.       Height          =   372
  76.       Index           =   2
  77.       Left            =   120
  78.       TabIndex        =   4
  79.       Top             =   1200
  80.       Width           =   3012
  81.    End
  82.    Begin VB.Label Label1 
  83.       Alignment       =   2  '中央揃え
  84.       BackColor       =   &H00000000&
  85.       BorderStyle     =   1  '実線
  86.       Caption         =   "サンプリングレート"
  87.       ForeColor       =   &H00FFFF00&
  88.       Height          =   372
  89.       Index           =   1
  90.       Left            =   120
  91.       TabIndex        =   3
  92.       Top             =   840
  93.       Width           =   3012
  94.    End
  95.    Begin VB.Label Label1 
  96.       Alignment       =   2  '中央揃え
  97.       BackColor       =   &H00000000&
  98.       BorderStyle     =   1  '実線
  99.       Caption         =   "チャンネル"
  100.       ForeColor       =   &H00FFFF00&
  101.       Height          =   372
  102.       Index           =   0
  103.       Left            =   120
  104.       TabIndex        =   2
  105.       Top             =   480
  106.       Width           =   3012
  107.    End
  108.    Begin MSComDlg.CommonDialog CMD1 
  109.       Left            =   1440
  110.       Top             =   2280
  111.       _Version        =   65536
  112.       _ExtentX        =   677
  113.       _ExtentY        =   677
  114.       _StockProps     =   0
  115.    End
  116.    Begin VB.Label Label1 
  117.       Alignment       =   2  '中央揃え
  118.       BackColor       =   &H00000000&
  119.       BorderStyle     =   1  '実線
  120.       Caption         =   "ファイル"
  121.       ForeColor       =   &H00FFFF00&
  122.       Height          =   372
  123.       Index           =   5
  124.       Left            =   120
  125.       TabIndex        =   7
  126.       Top             =   120
  127.       Width           =   3012
  128.    End
  129. End
  130. Attribute VB_Name = "Form1"
  131. Attribute VB_Creatable = False
  132. Attribute VB_Exposed = False
  133. Option Explicit
  134.  
  135. Private Type MMCKINFO
  136.     ckid As Long
  137.     ckSize As Long
  138.     fccType As Long
  139.     dwDataOffset As Long
  140.     dwFlags As Long
  141. End Type
  142.  
  143. Private Type WAVEFORMAT
  144.         wFormatTag As Integer
  145.         nChannels As Integer
  146.         nSamplesPerSec As Long
  147.         nAvgBytesPerSec As Long
  148.         nBlockAlign As Integer
  149. End Type
  150.  
  151. Private Type PCMWAVEFORMAT
  152.         wf As WAVEFORMAT
  153.         wBitsPerSample As Integer
  154. End Type
  155.  
  156. Private pwfmt As PCMWAVEFORMAT
  157.  
  158. Private Type WAVEHDR
  159.         lpData As Long
  160.         dwBufferLength As Long
  161.         dwBytesRecorded As Long
  162.         dwUser As Long
  163.         dwFlags As Long
  164.         dwLoops As Long
  165.         lpNext As Long
  166.         Reserved As Long
  167. End Type
  168. Private whdr As WAVEHDR
  169.  
  170. Private Declare Function waveOutClose Lib "winmm.dll" (ByVal hWaveOut As Long) As Long
  171. Private Declare Function waveOutOpen Lib "winmm.dll" (lphWaveOut As Long, ByVal uDeviceID As Long, lpFormat As WAVEFORMAT, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
  172. Private Declare Function waveOutWrite Lib "winmm.dll" (ByVal hWaveOut As Long, lpWaveOutHdr As Any, ByVal uSize As Long) As Long
  173. Private Declare Function waveOutGetErrorText Lib "winmm.dll" Alias "waveOutGetErrorTextA" (ByVal err As Long, ByVal lpText As String, ByVal uSize As Long) As Long
  174. Private Declare Function waveOutReset Lib "winmm.dll" (ByVal hWaveOut As Long) As Long
  175. Private Declare Function waveOutPrepareHeader Lib "winmm.dll" (ByVal hWaveOut As Long, lpWaveOutHdr As Any, ByVal uSize As Long) As Long
  176. Private Declare Function waveOutUnprepareHeader Lib "winmm.dll" (ByVal hWaveOut As Long, lpWaveOutHdr As Any, ByVal uSize As Long) As Long
  177.  
  178. Private Declare Function mmioRead Lib "winmm.dll" (ByVal hmmio As Long, pch As Any, ByVal cch As Long) As Long
  179. Private Declare Function mmioClose Lib "winmm.dll" (ByVal hmmio As Long, ByVal uFlags As Long) As Long
  180. Private Declare Function mmioOpen Lib "winmm.dll" Alias "mmioOpenA" (ByVal szFileName As String, lpmmioinfo As Any, ByVal dwOpenFlags As Long) As Long
  181. Private Declare Function mmioAscend Lib "winmm.dll" (ByVal hmmio As Long, lpck As MMCKINFO, ByVal uFlags As Long) As Long
  182. Private Declare Function mmioDescend Lib "winmm.dll" (ByVal hmmio As Long, lpck As MMCKINFO, lpckParent As Any, ByVal uFlags As Long) As Long
  183. Private Declare Function mmioStringToFOURCC Lib "winmm.dll" Alias "mmioStringToFOURCCA" (ByVal sz As String, ByVal uFlags As Long) As Long
  184.  
  185. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dst As Any, src As Any, ByVal dwBytes As Long)
  186. Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
  187. Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
  188. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  189. Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
  190.  
  191. Private Const WAVE_MAPPER = -1&
  192. Private Const WAVE_FORMAT_PCM = 1
  193.  
  194. Private Const TIME_MS = &H1
  195.  
  196. Private Const GMEM_MOVEABLE = &H2
  197. Private Const GMEM_SHARE = &H2000
  198.  
  199. Private Const CALLBACK_WINDOW = &H10000
  200.  
  201. Private Const MMIO_READ = &H0
  202. Private Const MMIO_FINDCHUNK = &H10
  203. Private Const MMIO_FINDRIFF = &H20
  204.  
  205. Private hWave As Long
  206. Private hmmio As Long
  207. Private mmParent As MMCKINFO
  208. Private mmSub As MMCKINFO
  209. Private hWHdr As Long
  210. Private lpWHdr As Long
  211. Private hData As Long
  212. Private lpData As Long
  213. Private tsec, csec As Double
  214.  
  215. Private Sub WaveClose()
  216.     Dim r As Long
  217.     
  218.     r = GlobalUnlock(hData)
  219.     r = GlobalFree(hData)
  220.     r = waveOutUnprepareHeader(hWave, ByVal lpWHdr, Len(whdr))
  221.     r = GlobalUnlock(hWHdr)
  222.     r = GlobalFree(hWHdr)
  223.     
  224.     r = waveOutReset(hWave)
  225.     r = waveOutClose(hWave)
  226.  
  227. End Sub
  228.  
  229. Private Sub WavePlay(FileName As String)
  230.     
  231.     Dim r As Long
  232.     Dim s As String
  233.     Dim FmtSize As Long
  234.     Dim DataSize As Long
  235.     Dim ErrMsg As String * 256
  236.     Dim chan As String
  237.     Dim sample As Double
  238.     Dim bits As Double
  239.     Dim sec As Double
  240.     
  241.     
  242.     'ファイルを開く
  243.     hmmio = mmioOpen(FileName, ByVal 0&, MMIO_READ)
  244.     If hmmio = 0& Then
  245.         ErrMsg = "ファイルを開くことができません"
  246.         MsgBox ErrMsg
  247.         r = mmioClose(hmmio, 0)
  248.     End If
  249.  
  250.     'WAVファイルであることを確認する
  251.     mmParent.fccType = mmioStringToFOURCC("WAVE", 0)
  252.     r = mmioDescend(hmmio, mmParent, ByVal 0&, MMIO_FINDRIFF)
  253.     If r <> 0 Then
  254.         ErrMsg = "WAVファイルではありません"
  255.         MsgBox ErrMsg
  256.         r = mmioClose(hmmio, 0)
  257.         Exit Sub
  258.     End If
  259.  
  260.     'fmtチャンクを検索
  261.     mmSub.ckid = mmioStringToFOURCC("fmt ", 0)
  262.     r = mmioDescend(hmmio, mmSub, mmParent, MMIO_FINDCHUNK)
  263.     If r <> 0 Then
  264.         ErrMsg = "WAVファイルにfmtチャンクがありません"
  265.         MsgBox ErrMsg
  266.         r = mmioClose(hmmio, 0)
  267.         Exit Sub
  268.     End If
  269.  
  270.     'fmtチャンクのサイズを取得
  271.     FmtSize = mmSub.ckSize
  272.     
  273.     'fmtチャンクの読み取り
  274.     s = String(Len(pwfmt), 0)
  275.     r = mmioRead(hmmio, ByVal s, FmtSize)
  276.     CopyMemory pwfmt, ByVal s, FmtSize
  277.     If r <> FmtSize Then
  278.         ErrMsg = "fmtチャンクの読取りに失敗しました"
  279.         MsgBox ErrMsg
  280.         r = mmioClose(hmmio, 0)
  281.         Exit Sub
  282.     End If
  283.     
  284.     'fmtチャンクから退出
  285.     r = mmioAscend(hmmio, mmSub, 0)
  286.     
  287.     'dataチャンクを検索
  288.     mmSub.ckid = mmioStringToFOURCC("data", 0)
  289.     r = mmioDescend(hmmio, mmSub, mmParent, MMIO_FINDCHUNK)
  290.     If r <> 0 Then
  291.         ErrMsg = "WAVファイルにdataチャンクがありません"
  292.         MsgBox ErrMsg
  293.         r = mmioClose(hmmio, 0)
  294.         Exit Sub
  295.     End If
  296.     
  297.     'dataチャンクのサイズを取得
  298.     DataSize = mmSub.ckSize
  299.     If DataSize = 0 Then
  300.         ErrMsg = "dataチャンクにdataが格納されていません"
  301.         MsgBox ErrMsg
  302.         r = mmioClose(hmmio, 0)
  303.         Exit Sub
  304.     End If
  305.     
  306.     'データのメモリを割り当てロックする
  307.     hData = GlobalAlloc(GMEM_MOVEABLE Or GMEM_SHARE, DataSize)
  308.     lpData = GlobalLock(hData)
  309.  
  310.     'データの読み取り
  311.     r = mmioRead(hmmio, ByVal lpData, DataSize)
  312.     If r <> DataSize Then
  313.         ErrMsg = "dataチャンクの読取りに失敗しました"
  314.         MsgBox ErrMsg
  315.         r = mmioClose(hmmio, 0)
  316.         Exit Sub
  317.     End If
  318.     
  319.     'ロックを解除
  320.     r = GlobalUnlock(hData)
  321.  
  322.     'ファイルを閉じる
  323.     r = mmioClose(hmmio, 0)
  324.  
  325.     '情報を表示
  326.     If pwfmt.wf.nChannels = 1 Then
  327.         chan = "モノラル"
  328.     Else
  329.         chan = "ステレオ"
  330.     End If
  331.     sample = pwfmt.wf.nSamplesPerSec / 1000
  332.     bits = pwfmt.wBitsPerSample
  333.     sec = DataSize / sample / 1000
  334.     
  335.     Label1(0) = "チャンネル:  " + chan
  336.     Label1(1) = "サンプリングレート:  " + Format(sample, "###0.00") + " kHz"
  337.     Label1(2) = "ビットレート:  " + Format$(bits) + " bits"
  338.     Label1(3) = "タイム:  " + Format(sec, "###0.00") + " sec."
  339.     Label1(4) = "データサイズ: " + Format$(DataSize) + " bytes"
  340.     Label1(5) = "ファイル: " + FileName
  341.  
  342.     'デバイスを開く
  343.     r = waveOutOpen(hWave, WAVE_MAPPER, pwfmt.wf, Form1.hWnd, 0&, CALLBACK_WINDOW)
  344.     If r <> 0 Then
  345.         r = waveOutGetErrorText(r, ErrMsg, LenB(ErrMsg))
  346.         MsgBox ErrMsg
  347.         Exit Sub
  348.     End If
  349.  
  350.     'ヘッダの設定
  351.     whdr.lpData = lpData
  352.     whdr.dwBufferLength = DataSize
  353.     whdr.dwFlags = 0
  354.     whdr.dwLoops = 0
  355.     
  356.     'ヘッダ用のメモリを割り当てロックする
  357.     hWHdr = GlobalAlloc(GMEM_MOVEABLE Or GMEM_SHARE, LenB(whdr))
  358.     lpWHdr = GlobalLock(hWHdr)
  359.     CopyMemory ByVal lpWHdr, whdr, Len(whdr)
  360.         
  361.     r = waveOutPrepareHeader(hWave, ByVal lpWHdr, LenB(whdr))
  362.  
  363.     
  364.     'データを出力する
  365.     r = waveOutWrite(hWave, ByVal lpWHdr, LenB(whdr))
  366.     If r <> 0 Then
  367.         ErrMsg = "出力に失敗しました"
  368.         MsgBox ErrMsg
  369.         Call WaveClose
  370.         Exit Sub
  371.     End If
  372.  
  373.     'タイマをセット
  374.     Timer1.Enabled = True
  375.     Command2.Enabled = False
  376.     tsec = sec
  377.     csec = MinToSec(Time)
  378.     
  379. End Sub
  380. Function MinToSec(M As String) As Long
  381.     Dim s As Integer
  382.     Dim s0 As String
  383.     Dim s1 As String
  384.     Dim s2 As String
  385.  
  386.     s0 = Right(M, 2)
  387.     s1 = Left(M, 2)
  388.     s2 = Mid(M, 4, 2)
  389.  
  390.     s = 360 * Val(s1) + 60 * Val(s2) + Val(s0)
  391.  
  392.     MinToSec = s
  393.  
  394. End Function
  395.  
  396. Private Sub Command1_Click()
  397.     Call WaveClose
  398.     End
  399.  
  400.  
  401. End Sub
  402.  
  403. Private Sub Command2_Click()
  404.     Dim WaveFileName As String
  405.     
  406.     CMD1.DefaultExt = "wav"
  407.     CMD1.Filter = "Waveform Audio(*.wav)|*.wav"
  408.     CMD1.FileName = ""
  409.     CMD1.ShowOpen
  410.     
  411.     If CMD1.FileName = "" Then Exit Sub
  412.  
  413.     WaveFileName = CMD1.FileName
  414.          
  415.     WavePlay (WaveFileName)
  416.     
  417. End Sub
  418.  
  419. Private Sub Form_Unload(Cancel As Integer)
  420.     
  421.     Call WaveClose
  422. End Sub
  423.  
  424.  
  425. Private Sub Timer1_Timer()
  426.     Dim r As Long
  427.     Static s As Long
  428.     
  429.     s = (MinToSec(Time) - csec)
  430.     If s > tsec Then
  431.         Timer1.Enabled = False
  432.         Command2.Enabled = True
  433.         Call WaveClose
  434.         s = 0
  435.     End If
  436.     
  437. End Sub
  438.  
  439.  
  440.