by NoWest » 2005年12月09日(金) 13:25
久しぶりにWAVE関連のプログラムを弄っていたら
私の書き込んだソースに
欠陥を発見しました。
このソースを使ってプログラムを作っていた方は修正してください。
修正済みコード [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Const MAXPNAMELEN = 32
Const MAXERRORLENGTH = 256
Const MAX_JOYSTICKOEMVXDNAME = 260
Const MMSYSERR_NOERROR = 0
Const MM_WOM_OPEN = &H3BB
Const MM_WOM_CLOSE = &H3BC
Const MM_WOM_DONE = &H3BD
Const MM_WIM_OPEN = &H3BE
Const MM_WIM_CLOSE = &H3BF
Const MM_WIM_DATA = &H3C0
Const CALLBACK_WINDOW = &H00010000
TypeDef HWAVEIN = DWord
TypeDef HWAVEOUT = DWord
Const WAVE_MAPPER = -1
Type WAVEINCAPS
wMid As Word
wPid As Word
vDriverVersion As DWord
szPname[ELM(MAXPNAMELEN)] As Byte
dwFormats As DWord
wChannels As Word
wReserved1 As Word
End Type
Const WAVE_INVALIDFORMAT = &H00000000
Const WAVE_FORMAT_1M08 = &H00000001
Const WAVE_FORMAT_1S08 = &H00000002
Const WAVE_FORMAT_1M16 = &H00000004
Const WAVE_FORMAT_1S16 = &H00000008
Const WAVE_FORMAT_2M08 = &H00000010
Const WAVE_FORMAT_2S08 = &H00000020
Const WAVE_FORMAT_2M16 = &H00000040
Const WAVE_FORMAT_2S16 = &H00000080
Const WAVE_FORMAT_4M08 = &H00000100
Const WAVE_FORMAT_4S08 = &H00000200
Const WAVE_FORMAT_4M16 = &H00000400
Const WAVE_FORMAT_4S16 = &H00000800
Const WAVE_FORMAT_PCM = 1
Type WAVEHDR
lpData As *Byte
dwBufferLength As DWord
dwBytesRecorded As DWord
dwUser As DWord
dwFlags As DWord
dwLoops As DWord
lpNext As VoidPtr
reserved As DWord
End Type
Type WAVEFORMAT
wFormatTag As Word
nChannels As Word
nSamplesPerSec As DWord
nAvgBytesPerSec As DWord
nBlockAlign As Word
End Type
Type PCMWAVEFORMAT
wf As WAVEFORMAT
wBitsPerSample As Word
End Type
Type WAVEFORMATEX
wFormatTag As Word
nChannels As Word
nSamplesPerSec As DWord
nAvgBytesPerSec As DWord
nBlockAlign As Word
wBitsPerSample As Word
cbSize As Word
End Type
Declare Function waveOutOpen Lib "WINMM" (ByRef phwo As HWAVEOUT, uDeviceID As DWord, ByRef pwfx As WAVEFORMATEX, dwCallback As DWord, dwInstance As DWord, fdwOpen As DWord) As DWord
Declare Function waveOutClose Lib "WINMM" (hwo As HWAVEOUT) As DWord
Declare Function waveOutPrepareHeader Lib "WINMM" (hwo As HWAVEOUT, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveOutUnprepareHeader Lib "WINMM" (hwo As HWAVEOUT, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveOutWrite Lib "WINMM" (hwo As HWAVEOUT, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveOutReset Lib "WINMM" (hwo As HWAVEOUT) As DWord
Declare Function waveInGetDevCaps Lib "WINMM" Alias "waveInGetDevCapsA" (uDeviceID As DWord, ByRef pwic As WAVEINCAPS, cbwic As DWord) As DWord
Declare Function waveInOpen Lib "WINMM" (ByRef phwi As HWAVEIN, uDeviceID As DWord, ByRef pwfx As WAVEFORMATEX, dwCallback As DWord, dwInstance As DWord, fdwOpen As DWord) As DWord
Declare Function waveInClose Lib "WINMM" (hwi As HWAVEIN) As DWord
Declare Function waveInPrepareHeader Lib "WINMM" (hwi As HWAVEIN, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveInUnprepareHeader Lib "WINMM" (hwi As HWAVEIN, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveInAddBuffer Lib "WINMM" (hwi As HWAVEIN, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveInStart Lib "WINMM" (hwi As HWAVEIN) As DWord
Declare Function waveInReset Lib "WINMM" (hwi As HWAVEIN) As DWord
TypeDef HMMIO = DWord
Const MMIO_RWMODE = &H00000003
Const MMIO_SHAREMODE = &H00000070
Const MMIO_CREATE = &H00001000
Const MMIO_PARSE = &H00000100
Const MMIO_DELETE = &H00000200
Const MMIO_EXIST = &H00004000
Const MMIO_ALLOCBUF = &H00010000
Const MMIO_GETTEMP = &H00020000
Const MMIO_DIRTY = &H10000000
Const MMIO_READ = &H00000000
Const MMIO_WRITE = &H00000001
Const MMIO_READWRITE = &H00000002
Const MMIO_COMPAT = &H00000000
Const MMIO_EXCLUSIVE = &H00000010
Const MMIO_DENYWRITE = &H00000020
Const MMIO_DENYREAD = &H00000030
Const MMIO_DENYNONE = &H00000040
Const MMIO_FHOPEN = &H0010
Const MMIO_EMPTYBUF = &H0010
Const MMIO_TOUPPER = &H0010
Const MMIO_INSTALLPROC = &H00010000
Const MMIO_GLOBALPROC = &H10000000
Const MMIO_REMOVEPROC = &H00020000
Const MMIO_UNICODEPROC = &H01000000
Const MMIO_FINDPROC = &H00040000
Const MMIO_FINDCHUNK = &H0010
Const MMIO_FINDRIFF = &H0020
Const MMIO_FINDLIST = &H0040
Const MMIO_CREATERIFF = &H0020
Const MMIO_CREATELIST = &H0040
TypeDef HMMIO = DWord
TypeDef HTASK = DWord
Type MMIOINFO
dwFlags As DWord
fccIOProc As DWord
pIOProc As DWord
wErrorRet As DWord
htask As HTASK
cchBuffer As Long
pchBuffer As BytePtr
pchNext As BytePtr
pchEndRead As BytePtr
pchEndWrite As BytePtr
lBufOffset As Long
lDiskOffset As Long
adwInfo[ELM(3)] As DWord
dwReserved1 As DWord
dwReserved2 As DWord
hmmio As HMMIO
End Type
Type MMCKINFO
ckid As DWord
cksize As DWord
fccType As DWord
dwDataOffset As DWord
dwFlags As DWord
End Type
Declare Function mmioStringToFOURCC Lib "WINMM" Alias "mmioStringToFOURCCA" (sz As BytePtr, uFlags As DWord) As DWord
Declare Function mmioOpen Lib "WINMM" Alias "mmioOpenA" (pszFileName As BytePtr, ByRef pmmioinfo As MMIOINFO, fdwOpen As DWord) As HMMIO
Declare Function mmioClose Lib "WINMM" (hmmio As HMMIO, fuClose As DWord) As DWord
Declare Function mmioRead Lib "WINMM" (hmmio As HMMIO, pch As BytePtr, cch As Long) As Long
Declare Function mmioWrite Lib "WINMM" (hmmio As HMMIO, pch As BytePtr, cch As Long) As Long
Declare Function mmioDescend Lib "WINMM" (hmmio As HMMIO, ByRef pmmcki As MMCKINFO, ByRef pmmckiParent As MMCKINFO, fuDescend As DWord) As DWord
Declare Function mmioAscend Lib "WINMM" (hmmio As HMMIO, ByRef pmmcki As MMCKINFO, fuAscend As DWord) As DWord
Declare Function mmioCreateChunk Lib "WINMM" (hmmio As HMMIO, ByRef pmmcki As MMCKINFO, fuCreate As DWord) As DWord
'=================================================================================================================
Dim Play_Flag As DWord
Dim Record_Flag As DWord
Dim Stop_Flag As DWord
Const NumOfBuffers = 5 'バッファ数
Const BufferLength = 1*1024 'バッファ長
Dim hWaveIn As HWAVEIN
Dim hWaveOut As HWAVEOUT
Dim WaveHdr[ELM(NumOfBuffers)] As WAVEHDR
Dim WaveOutFormatEx As WAVEFORMATEX
Dim WaveInFormatEx As WAVEFORMATEX
Dim hMmio As HMMIO
Dim MmioInfo As MMIOINFO
Dim MmioCkInfo As MMCKINFO
Dim MmioCkInfoSub As MMCKINFO
Dim WaveData[ELM(NumOfBuffers)] As *Byte
/*************メニューID**************/
Const IDM_1M08 = 100
Const IDM_1S08 = 101
Const IDM_1M16 = 102
Const IDM_1S16 = 103
Const IDM_2M08 = 104
Const IDM_2S08 = 105
Const IDM_2M16 = 106
Const IDM_2S16 = 107
Const IDM_4M08 = 108
Const IDM_4S08 = 109
Const IDM_4M16 = 110
Const IDM_4S16 = 111
/*******WAVE入力デバイスの性能を取得する。********/
Dim WaveInCaps As WAVEINCAPS
waveInGetDevCaps(WAVE_MAPPER,WaveInCaps,SizeOf(WAVEINCAPS))
Dim hMenuSub1 As HMENU
hMenuSub1 = CreatePopupMenu()
If WaveInCaps.dwFormats And WAVE_FORMAT_4S16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"44100Hz 16bit Stereo",IDM_4S16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_4M16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"44100Hz 16bit Mono",IDM_4M16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_4S08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"44100Hz 8bit Stereo",IDM_4S08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_4M08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"44100Hz 8bit Mono",IDM_4M08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_2S16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"22050Hz 16bit Stereo",IDM_2S16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_2M16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"22050Hz 16bit Mono",IDM_2M16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_2S08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"22050Hz 8bit Stereo",IDM_2S08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_2M08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"22050Hz 8bit Mono",IDM_2M08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_1S16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"11025Hz 16bit Stereo",IDM_1S16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_1M16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"11025Hz 16bit Mono",IDM_1M16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_1S08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"11025Hz 8bit Stereo",IDM_1S08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_1M08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"11025Hz 8bit Mono",IDM_1M08,0,0
Dim hMenu As HMENU
hMenu = CreateMenu()
InsMenu hMenu,0,MF_BYPOSITION,"Quality(&Q)",0,hMenuSub1,0
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Dim cnt As Long
Dim ret As Long
Dim pwh As *WAVEHDR
Select Case dwMsg
Case MM_WOM_OPEN /******WAVE出力デバイスが開かれた時に呼ばれる******/
/******dataチャンクにアクセス******/
MmioCkInfoSub.ckid = mmioStringToFOURCC("data",0)
mmioDescend(hMmio,MmioCkInfoSub,MmioCkInfo,MMIO_FINDCHUNK)
For cnt=0 To NumOfBuffers-1
ret = mmioRead(hMmio,WaveData[cnt],BufferLength)
If ret = 0 or ret = -1 Then
WaveHdr[cnt].dwBufferLength = 0
WaveHdr[cnt].dwUser = TRUE
Else
WaveHdr[cnt].dwBufferLength = ret
WaveHdr[cnt].dwUser = FALSE
End If
waveOutPrepareHeader(hWaveOut,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
For cnt=0 To NumOfBuffers-1
waveOutWrite(hWaveOut,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),FALSE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton2),FALSE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton3),TRUE)
Case MM_WOM_CLOSE /******WAVE出力デバイスが閉じられる時に呼ばれる******/
For cnt=0 To NumOfBuffers-1
waveOutUnprepareHeader(hWaveOut,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),TRUE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton2),TRUE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton3),FALSE)
Play_Flag = FALSE
Case MM_WOM_DONE /******WAVE出力デバイスのバッファの再生終了時に呼ばれる******/
pwh=lParam
If pwh->dwUser = TRUE or Stop_Flag = TRUE Then
mmioAscend(hMmio,MmioCkInfoSub,0)
mmioClose(hMmio,0)
waveOutClose(hWaveOut)
Stop_Flag = FALSE
Else
/******dataデータを読み込み******/
FillMemory(pwh->lpData,BufferLength,127)
ret = mmioRead(hMmio,pwh->lpData,BufferLength)
If ret = 0 or ret = -1 Then
pwh->dwUser = TRUE
pwh->dwBufferLength = 0
Else
pwh->dwUser = FALSE
pwh->dwBufferLength = ret
End If
waveOutWrite(hWaveOut,ByVal pwh,SizeOf(WAVEHDR))
End If
Case MM_WIM_OPEN /******WAVE入力デバイスが開かれた時に呼ばれる******/
/******dataチャンクを作成******/
MmioCkInfoSub.ckid = mmioStringToFOURCC("data",0)
mmioCreateChunk(hMmio,MmioCkInfoSub,0)
For cnt=0 To NumOfBuffers-1
WaveHdr[cnt].dwUser = FALSE
WaveHdr[cnt].dwBufferLength = BufferLength
waveInPrepareHeader(hWaveIn,WaveHdr[cnt],SizeOf(WAVEHDR))
waveInAddBuffer(hWaveIn,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
waveInStart(hWaveIn)
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),FALSE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton2),FALSE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton3),TRUE)
Case MM_WIM_CLOSE /******WAVE入力デバイスが閉じられる時に呼ばれる******/
For cnt=0 To NumOfBuffers-1
waveInUnprepareHeader(hWaveIn,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),TRUE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton2),TRUE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton3),FALSE)
Record_Flag = FALSE
Case MM_WIM_DATA /******WAVE入力デバイスのバッファが一杯になった時に呼ばれる******/
pwh=lParam
If Stop_Flag = TRUE Then
mmioWrite(hMmio,pwh->lpData,pwh->dwBytesRecorded)
mmioAscend(hMmio,MmioCkInfoSub,0)
mmioAscend(hMmio,MmioCkInfo,0)
mmioClose(hMmio,0)
waveInClose(hWaveIn)
Stop_Flag = FALSE
Else
/******dataデータを書き込み******/
mmioWrite(hMmio,pwh->lpData,pwh->dwBytesRecorded)
FillMemory(pwh->lpData,BufferLength,127)
waveInAddBuffer(hWaveIn,ByVal pwh,SizeOf(WAVEHDR))
End If
Case WM_COMMAND
Select Case LOWORD(wParam)
Case IDM_1M08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1M08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_1S08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1S08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_1M16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1M16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_1S16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1S16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_2M08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_2M08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 22050
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_2S08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_2S08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 22050
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_2M16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_2M16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 22050
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_2S16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_2S16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 22050
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_4M08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_4M08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 44100
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_4S08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_4S08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 44100
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_4M16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_4M16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 44100
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_4S16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_4S16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 44100
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
End Select
End Select
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
Dim cnt As Long
If Record_Flag = TRUE Then
Stop_Flag = TRUE
waveInReset(hWaveIn)
ElseIf Play_Flag = TRUE Then
Stop_Flag = TRUE
waveOutReset(hWaveOut)
End If
Dim msg As MSG /*** 修正箇所 ***/
While 1
If PeekMessage(msg,0,0,0,PM_REMOVE) Then
TranslateMessage(msg)
DispatchMessage(msg)
If Play_Flag=FALSE And Record_Flag=FALSE Then Exit While
End If
Wend /*** ******** ***/
For cnt=0 To NumOfBuffers-1
free(WaveData[cnt])
Next
DestroyMenu(hMenu)
DestroyMenu(hMenuSub1)
wave_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim cnt As Long
For cnt=0 To NumOfBuffers-1
WaveData[cnt] = malloc(BufferLength)
WaveHdr[cnt].lpData=WaveData[cnt]
FillMemory(WaveData[cnt],BufferLength,127)
Next
SetDlgItemText(hMainWnd,CommandButton1,"Record")
SetDlgItemText(hMainWnd,CommandButton2,"Play")
SetDlgItemText(hMainWnd,CommandButton3,"Stop")
SetMenu(hMainWnd,hMenu)
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1M08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign*WaveInFormatEx.nSamplesPerSec
End Sub
Sub MainWnd_CommandButton1_Click()
/******WAVEファイルを作成******/
hMmio = mmioOpen("temp.wav",ByVal 0,MMIO_CREATE or MMIO_WRITE or MMIO_EXCLUSIVE)
/******WAVEチャンクを作成******/
MmioCkInfo.fccType = mmioStringToFOURCC("WAVE",0)
mmioCreateChunk(hMmio,MmioCkInfo,MMIO_CREATERIFF)
/******fmt チャンクを作成******/
MmioCkInfoSub.ckid = mmioStringToFOURCC("fmt ",0)
mmioCreateChunk(hMmio,MmioCkInfoSub,0)
/******fmt データを書き込み******/
mmioWrite(hMmio,VarPtr(WaveInFormatEx),SizeOf(PCMWAVEFORMAT))
mmioAscend(hMmio,MmioCkInfoSub,0)
/******WAVE入力デバイスを開く******/
waveInOpen(hWaveIn,WAVE_MAPPER,WaveInFormatEx,hMainWnd,0,CALLBACK_WINDOW)
Record_Flag = TRUE
End Sub
Sub MainWnd_CommandButton2_Click()
/******WAVEファイルを開く******/
hMmio = mmioOpen("temp.wav",MmioInfo,MMIO_READ)
/******WAVEチャンクにアクセス******/
MmioCkInfo.fccType = mmioStringToFOURCC("WAVE",0)
mmioDescend(hMmio,MmioCkInfo,ByVal 0,MMIO_FINDRIFF)
/******fmt データを読み込み******/
MmioCkInfoSub.ckid = mmioStringToFOURCC("fmt ",0)
mmioDescend(hMmio,MmioCkInfoSub,MmioCkInfo,MMIO_FINDCHUNK)
mmioRead(hMmio,VarPtr(WaveOutFormatEx),MmioCkInfoSub.cksize)
mmioAscend(hMmio,MmioCkInfoSub,0)
/******WAVE出力デバイスを開く******/
waveOutOpen(hWaveOut,WAVE_MAPPER,WaveOutFormatEx,hMainWnd,0,CALLBACK_WINDOW)
Play_Flag = TRUE
End Sub
Sub MainWnd_CommandButton3_Click()
Stop_Flag = TRUE
waveInReset(hWaveIn)
waveOutReset(hWaveOut)
Play_Flag = FALSE
Record_Flag = FALSE
End Sub
修正箇所はウィンドウのDESTROYイベント内にあります。
久しぶりにWAVE関連のプログラムを弄っていたら
私の書き込んだソースに[b]欠陥[/b]を発見しました。
このソースを使ってプログラムを作っていた方は修正してください。
[hide=修正済みコード]
[code]'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Const MAXPNAMELEN = 32
Const MAXERRORLENGTH = 256
Const MAX_JOYSTICKOEMVXDNAME = 260
Const MMSYSERR_NOERROR = 0
Const MM_WOM_OPEN = &H3BB
Const MM_WOM_CLOSE = &H3BC
Const MM_WOM_DONE = &H3BD
Const MM_WIM_OPEN = &H3BE
Const MM_WIM_CLOSE = &H3BF
Const MM_WIM_DATA = &H3C0
Const CALLBACK_WINDOW = &H00010000
TypeDef HWAVEIN = DWord
TypeDef HWAVEOUT = DWord
Const WAVE_MAPPER = -1
Type WAVEINCAPS
wMid As Word
wPid As Word
vDriverVersion As DWord
szPname[ELM(MAXPNAMELEN)] As Byte
dwFormats As DWord
wChannels As Word
wReserved1 As Word
End Type
Const WAVE_INVALIDFORMAT = &H00000000
Const WAVE_FORMAT_1M08 = &H00000001
Const WAVE_FORMAT_1S08 = &H00000002
Const WAVE_FORMAT_1M16 = &H00000004
Const WAVE_FORMAT_1S16 = &H00000008
Const WAVE_FORMAT_2M08 = &H00000010
Const WAVE_FORMAT_2S08 = &H00000020
Const WAVE_FORMAT_2M16 = &H00000040
Const WAVE_FORMAT_2S16 = &H00000080
Const WAVE_FORMAT_4M08 = &H00000100
Const WAVE_FORMAT_4S08 = &H00000200
Const WAVE_FORMAT_4M16 = &H00000400
Const WAVE_FORMAT_4S16 = &H00000800
Const WAVE_FORMAT_PCM = 1
Type WAVEHDR
lpData As *Byte
dwBufferLength As DWord
dwBytesRecorded As DWord
dwUser As DWord
dwFlags As DWord
dwLoops As DWord
lpNext As VoidPtr
reserved As DWord
End Type
Type WAVEFORMAT
wFormatTag As Word
nChannels As Word
nSamplesPerSec As DWord
nAvgBytesPerSec As DWord
nBlockAlign As Word
End Type
Type PCMWAVEFORMAT
wf As WAVEFORMAT
wBitsPerSample As Word
End Type
Type WAVEFORMATEX
wFormatTag As Word
nChannels As Word
nSamplesPerSec As DWord
nAvgBytesPerSec As DWord
nBlockAlign As Word
wBitsPerSample As Word
cbSize As Word
End Type
Declare Function waveOutOpen Lib "WINMM" (ByRef phwo As HWAVEOUT, uDeviceID As DWord, ByRef pwfx As WAVEFORMATEX, dwCallback As DWord, dwInstance As DWord, fdwOpen As DWord) As DWord
Declare Function waveOutClose Lib "WINMM" (hwo As HWAVEOUT) As DWord
Declare Function waveOutPrepareHeader Lib "WINMM" (hwo As HWAVEOUT, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveOutUnprepareHeader Lib "WINMM" (hwo As HWAVEOUT, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveOutWrite Lib "WINMM" (hwo As HWAVEOUT, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveOutReset Lib "WINMM" (hwo As HWAVEOUT) As DWord
Declare Function waveInGetDevCaps Lib "WINMM" Alias "waveInGetDevCapsA" (uDeviceID As DWord, ByRef pwic As WAVEINCAPS, cbwic As DWord) As DWord
Declare Function waveInOpen Lib "WINMM" (ByRef phwi As HWAVEIN, uDeviceID As DWord, ByRef pwfx As WAVEFORMATEX, dwCallback As DWord, dwInstance As DWord, fdwOpen As DWord) As DWord
Declare Function waveInClose Lib "WINMM" (hwi As HWAVEIN) As DWord
Declare Function waveInPrepareHeader Lib "WINMM" (hwi As HWAVEIN, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveInUnprepareHeader Lib "WINMM" (hwi As HWAVEIN, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveInAddBuffer Lib "WINMM" (hwi As HWAVEIN, ByRef pwh As WAVEHDR, cbwh As DWord) As DWord
Declare Function waveInStart Lib "WINMM" (hwi As HWAVEIN) As DWord
Declare Function waveInReset Lib "WINMM" (hwi As HWAVEIN) As DWord
TypeDef HMMIO = DWord
Const MMIO_RWMODE = &H00000003
Const MMIO_SHAREMODE = &H00000070
Const MMIO_CREATE = &H00001000
Const MMIO_PARSE = &H00000100
Const MMIO_DELETE = &H00000200
Const MMIO_EXIST = &H00004000
Const MMIO_ALLOCBUF = &H00010000
Const MMIO_GETTEMP = &H00020000
Const MMIO_DIRTY = &H10000000
Const MMIO_READ = &H00000000
Const MMIO_WRITE = &H00000001
Const MMIO_READWRITE = &H00000002
Const MMIO_COMPAT = &H00000000
Const MMIO_EXCLUSIVE = &H00000010
Const MMIO_DENYWRITE = &H00000020
Const MMIO_DENYREAD = &H00000030
Const MMIO_DENYNONE = &H00000040
Const MMIO_FHOPEN = &H0010
Const MMIO_EMPTYBUF = &H0010
Const MMIO_TOUPPER = &H0010
Const MMIO_INSTALLPROC = &H00010000
Const MMIO_GLOBALPROC = &H10000000
Const MMIO_REMOVEPROC = &H00020000
Const MMIO_UNICODEPROC = &H01000000
Const MMIO_FINDPROC = &H00040000
Const MMIO_FINDCHUNK = &H0010
Const MMIO_FINDRIFF = &H0020
Const MMIO_FINDLIST = &H0040
Const MMIO_CREATERIFF = &H0020
Const MMIO_CREATELIST = &H0040
TypeDef HMMIO = DWord
TypeDef HTASK = DWord
Type MMIOINFO
dwFlags As DWord
fccIOProc As DWord
pIOProc As DWord
wErrorRet As DWord
htask As HTASK
cchBuffer As Long
pchBuffer As BytePtr
pchNext As BytePtr
pchEndRead As BytePtr
pchEndWrite As BytePtr
lBufOffset As Long
lDiskOffset As Long
adwInfo[ELM(3)] As DWord
dwReserved1 As DWord
dwReserved2 As DWord
hmmio As HMMIO
End Type
Type MMCKINFO
ckid As DWord
cksize As DWord
fccType As DWord
dwDataOffset As DWord
dwFlags As DWord
End Type
Declare Function mmioStringToFOURCC Lib "WINMM" Alias "mmioStringToFOURCCA" (sz As BytePtr, uFlags As DWord) As DWord
Declare Function mmioOpen Lib "WINMM" Alias "mmioOpenA" (pszFileName As BytePtr, ByRef pmmioinfo As MMIOINFO, fdwOpen As DWord) As HMMIO
Declare Function mmioClose Lib "WINMM" (hmmio As HMMIO, fuClose As DWord) As DWord
Declare Function mmioRead Lib "WINMM" (hmmio As HMMIO, pch As BytePtr, cch As Long) As Long
Declare Function mmioWrite Lib "WINMM" (hmmio As HMMIO, pch As BytePtr, cch As Long) As Long
Declare Function mmioDescend Lib "WINMM" (hmmio As HMMIO, ByRef pmmcki As MMCKINFO, ByRef pmmckiParent As MMCKINFO, fuDescend As DWord) As DWord
Declare Function mmioAscend Lib "WINMM" (hmmio As HMMIO, ByRef pmmcki As MMCKINFO, fuAscend As DWord) As DWord
Declare Function mmioCreateChunk Lib "WINMM" (hmmio As HMMIO, ByRef pmmcki As MMCKINFO, fuCreate As DWord) As DWord
'=================================================================================================================
Dim Play_Flag As DWord
Dim Record_Flag As DWord
Dim Stop_Flag As DWord
Const NumOfBuffers = 5 'バッファ数
Const BufferLength = 1*1024 'バッファ長
Dim hWaveIn As HWAVEIN
Dim hWaveOut As HWAVEOUT
Dim WaveHdr[ELM(NumOfBuffers)] As WAVEHDR
Dim WaveOutFormatEx As WAVEFORMATEX
Dim WaveInFormatEx As WAVEFORMATEX
Dim hMmio As HMMIO
Dim MmioInfo As MMIOINFO
Dim MmioCkInfo As MMCKINFO
Dim MmioCkInfoSub As MMCKINFO
Dim WaveData[ELM(NumOfBuffers)] As *Byte
/*************メニューID**************/
Const IDM_1M08 = 100
Const IDM_1S08 = 101
Const IDM_1M16 = 102
Const IDM_1S16 = 103
Const IDM_2M08 = 104
Const IDM_2S08 = 105
Const IDM_2M16 = 106
Const IDM_2S16 = 107
Const IDM_4M08 = 108
Const IDM_4S08 = 109
Const IDM_4M16 = 110
Const IDM_4S16 = 111
/*******WAVE入力デバイスの性能を取得する。********/
Dim WaveInCaps As WAVEINCAPS
waveInGetDevCaps(WAVE_MAPPER,WaveInCaps,SizeOf(WAVEINCAPS))
Dim hMenuSub1 As HMENU
hMenuSub1 = CreatePopupMenu()
If WaveInCaps.dwFormats And WAVE_FORMAT_4S16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"44100Hz 16bit Stereo",IDM_4S16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_4M16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"44100Hz 16bit Mono",IDM_4M16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_4S08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"44100Hz 8bit Stereo",IDM_4S08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_4M08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"44100Hz 8bit Mono",IDM_4M08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_2S16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"22050Hz 16bit Stereo",IDM_2S16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_2M16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"22050Hz 16bit Mono",IDM_2M16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_2S08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"22050Hz 8bit Stereo",IDM_2S08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_2M08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"22050Hz 8bit Mono",IDM_2M08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_1S16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"11025Hz 16bit Stereo",IDM_1S16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_1M16 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"11025Hz 16bit Mono",IDM_1M16,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_1S08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"11025Hz 8bit Stereo",IDM_1S08,0,0
If WaveInCaps.dwFormats And WAVE_FORMAT_1M08 Then InsMenu hMenuSub1,0,MF_BYPOSITION,"11025Hz 8bit Mono",IDM_1M08,0,0
Dim hMenu As HMENU
hMenu = CreateMenu()
InsMenu hMenu,0,MF_BYPOSITION,"Quality(&Q)",0,hMenuSub1,0
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Dim cnt As Long
Dim ret As Long
Dim pwh As *WAVEHDR
Select Case dwMsg
Case MM_WOM_OPEN /******WAVE出力デバイスが開かれた時に呼ばれる******/
/******dataチャンクにアクセス******/
MmioCkInfoSub.ckid = mmioStringToFOURCC("data",0)
mmioDescend(hMmio,MmioCkInfoSub,MmioCkInfo,MMIO_FINDCHUNK)
For cnt=0 To NumOfBuffers-1
ret = mmioRead(hMmio,WaveData[cnt],BufferLength)
If ret = 0 or ret = -1 Then
WaveHdr[cnt].dwBufferLength = 0
WaveHdr[cnt].dwUser = TRUE
Else
WaveHdr[cnt].dwBufferLength = ret
WaveHdr[cnt].dwUser = FALSE
End If
waveOutPrepareHeader(hWaveOut,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
For cnt=0 To NumOfBuffers-1
waveOutWrite(hWaveOut,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),FALSE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton2),FALSE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton3),TRUE)
Case MM_WOM_CLOSE /******WAVE出力デバイスが閉じられる時に呼ばれる******/
For cnt=0 To NumOfBuffers-1
waveOutUnprepareHeader(hWaveOut,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),TRUE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton2),TRUE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton3),FALSE)
Play_Flag = FALSE
Case MM_WOM_DONE /******WAVE出力デバイスのバッファの再生終了時に呼ばれる******/
pwh=lParam
If pwh->dwUser = TRUE or Stop_Flag = TRUE Then
mmioAscend(hMmio,MmioCkInfoSub,0)
mmioClose(hMmio,0)
waveOutClose(hWaveOut)
Stop_Flag = FALSE
Else
/******dataデータを読み込み******/
FillMemory(pwh->lpData,BufferLength,127)
ret = mmioRead(hMmio,pwh->lpData,BufferLength)
If ret = 0 or ret = -1 Then
pwh->dwUser = TRUE
pwh->dwBufferLength = 0
Else
pwh->dwUser = FALSE
pwh->dwBufferLength = ret
End If
waveOutWrite(hWaveOut,ByVal pwh,SizeOf(WAVEHDR))
End If
Case MM_WIM_OPEN /******WAVE入力デバイスが開かれた時に呼ばれる******/
/******dataチャンクを作成******/
MmioCkInfoSub.ckid = mmioStringToFOURCC("data",0)
mmioCreateChunk(hMmio,MmioCkInfoSub,0)
For cnt=0 To NumOfBuffers-1
WaveHdr[cnt].dwUser = FALSE
WaveHdr[cnt].dwBufferLength = BufferLength
waveInPrepareHeader(hWaveIn,WaveHdr[cnt],SizeOf(WAVEHDR))
waveInAddBuffer(hWaveIn,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
waveInStart(hWaveIn)
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),FALSE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton2),FALSE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton3),TRUE)
Case MM_WIM_CLOSE /******WAVE入力デバイスが閉じられる時に呼ばれる******/
For cnt=0 To NumOfBuffers-1
waveInUnprepareHeader(hWaveIn,WaveHdr[cnt],SizeOf(WAVEHDR))
Next
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),TRUE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton2),TRUE)
EnableWindow(GetDlgItem(hMainWnd,CommandButton3),FALSE)
Record_Flag = FALSE
Case MM_WIM_DATA /******WAVE入力デバイスのバッファが一杯になった時に呼ばれる******/
pwh=lParam
If Stop_Flag = TRUE Then
mmioWrite(hMmio,pwh->lpData,pwh->dwBytesRecorded)
mmioAscend(hMmio,MmioCkInfoSub,0)
mmioAscend(hMmio,MmioCkInfo,0)
mmioClose(hMmio,0)
waveInClose(hWaveIn)
Stop_Flag = FALSE
Else
/******dataデータを書き込み******/
mmioWrite(hMmio,pwh->lpData,pwh->dwBytesRecorded)
FillMemory(pwh->lpData,BufferLength,127)
waveInAddBuffer(hWaveIn,ByVal pwh,SizeOf(WAVEHDR))
End If
Case WM_COMMAND
Select Case LOWORD(wParam)
Case IDM_1M08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1M08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_1S08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1S08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_1M16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1M16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_1S16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1S16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_2M08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_2M08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 22050
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_2S08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_2S08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 22050
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_2M16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_2M16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 22050
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_2S16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_2S16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 22050
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_4M08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_4M08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 44100
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_4S08
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_4S08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 44100
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_4M16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_4M16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 44100
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
Case IDM_4S16
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_4S16,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 2
WaveInFormatEx.nSamplesPerSec = 44100
WaveInFormatEx.wBitsPerSample = 16
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign * WaveInFormatEx.nSamplesPerSec
End Select
End Select
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
Dim cnt As Long
If Record_Flag = TRUE Then
Stop_Flag = TRUE
waveInReset(hWaveIn)
ElseIf Play_Flag = TRUE Then
Stop_Flag = TRUE
waveOutReset(hWaveOut)
End If
Dim msg As MSG /*** 修正箇所 ***/
While 1
If PeekMessage(msg,0,0,0,PM_REMOVE) Then
TranslateMessage(msg)
DispatchMessage(msg)
If Play_Flag=FALSE And Record_Flag=FALSE Then Exit While
End If
Wend /*** ******** ***/
For cnt=0 To NumOfBuffers-1
free(WaveData[cnt])
Next
DestroyMenu(hMenu)
DestroyMenu(hMenuSub1)
wave_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim cnt As Long
For cnt=0 To NumOfBuffers-1
WaveData[cnt] = malloc(BufferLength)
WaveHdr[cnt].lpData=WaveData[cnt]
FillMemory(WaveData[cnt],BufferLength,127)
Next
SetDlgItemText(hMainWnd,CommandButton1,"Record")
SetDlgItemText(hMainWnd,CommandButton2,"Play")
SetDlgItemText(hMainWnd,CommandButton3,"Stop")
SetMenu(hMainWnd,hMenu)
CheckMenuRadioItem(hMenu,IDM_1M08,IDM_4S16,IDM_1M08,MF_BYCOMMAND)
WaveInFormatEx.cbSize = SizeOf(WAVEFORMATEX)
WaveInFormatEx.wFormatTag = WAVE_FORMAT_PCM
WaveInFormatEx.nChannels = 1
WaveInFormatEx.nSamplesPerSec = 11025
WaveInFormatEx.wBitsPerSample = 8
WaveInFormatEx.nBlockAlign = WaveInFormatEx.nChannels*WaveInFormatEx.wBitsPerSample/8
WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign*WaveInFormatEx.nSamplesPerSec
End Sub
Sub MainWnd_CommandButton1_Click()
/******WAVEファイルを作成******/
hMmio = mmioOpen("temp.wav",ByVal 0,MMIO_CREATE or MMIO_WRITE or MMIO_EXCLUSIVE)
/******WAVEチャンクを作成******/
MmioCkInfo.fccType = mmioStringToFOURCC("WAVE",0)
mmioCreateChunk(hMmio,MmioCkInfo,MMIO_CREATERIFF)
/******fmt チャンクを作成******/
MmioCkInfoSub.ckid = mmioStringToFOURCC("fmt ",0)
mmioCreateChunk(hMmio,MmioCkInfoSub,0)
/******fmt データを書き込み******/
mmioWrite(hMmio,VarPtr(WaveInFormatEx),SizeOf(PCMWAVEFORMAT))
mmioAscend(hMmio,MmioCkInfoSub,0)
/******WAVE入力デバイスを開く******/
waveInOpen(hWaveIn,WAVE_MAPPER,WaveInFormatEx,hMainWnd,0,CALLBACK_WINDOW)
Record_Flag = TRUE
End Sub
Sub MainWnd_CommandButton2_Click()
/******WAVEファイルを開く******/
hMmio = mmioOpen("temp.wav",MmioInfo,MMIO_READ)
/******WAVEチャンクにアクセス******/
MmioCkInfo.fccType = mmioStringToFOURCC("WAVE",0)
mmioDescend(hMmio,MmioCkInfo,ByVal 0,MMIO_FINDRIFF)
/******fmt データを読み込み******/
MmioCkInfoSub.ckid = mmioStringToFOURCC("fmt ",0)
mmioDescend(hMmio,MmioCkInfoSub,MmioCkInfo,MMIO_FINDCHUNK)
mmioRead(hMmio,VarPtr(WaveOutFormatEx),MmioCkInfoSub.cksize)
mmioAscend(hMmio,MmioCkInfoSub,0)
/******WAVE出力デバイスを開く******/
waveOutOpen(hWaveOut,WAVE_MAPPER,WaveOutFormatEx,hMainWnd,0,CALLBACK_WINDOW)
Play_Flag = TRUE
End Sub
Sub MainWnd_CommandButton3_Click()
Stop_Flag = TRUE
waveInReset(hWaveIn)
waveOutReset(hWaveOut)
Play_Flag = FALSE
Record_Flag = FALSE
End Sub
[/code][/hide]
修正箇所はウィンドウのDESTROYイベント内にあります。