#include // winmm.lib をリンクする #pragma comment(lib,"winmm") #define SRATE 8000 //標本化周波数(1秒間のサンプル数) #define F 400 //周波数(1秒間の波形数) LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { WAVEFORMATEX wfe; static HWAVEOUT hWaveOut; static WAVEHDR whdr[2]; static LPBYTE lpWave[2]; int i,len,k; static int buf_num; HDC hdc; PAINTSTRUCT ps; char str[32]; switch(uMsg){ case WM_CREATE: wfe.wFormatTag=WAVE_FORMAT_PCM; wfe.nChannels=1; //モノラル wfe.wBitsPerSample=8; //量子化ビット数 wfe.nBlockAlign=wfe.nChannels * wfe.wBitsPerSample/8; wfe.nSamplesPerSec=SRATE; //標本化周波数 wfe.nAvgBytesPerSec=wfe.nSamplesPerSec * wfe.nBlockAlign; waveOutOpen(&hWaveOut,WAVE_MAPPER,&wfe,(DWORD)hWnd,0,CALLBACK_WINDOW); len=SRATE/F; //波長 for(k=0;k<2;k++){ lpWave[k]=(LPBYTE)calloc(wfe.nAvgBytesPerSec,2); //2秒分 for(i=0;idwUser){ //waveOutReset関数で停止した buf_num=0; //初期値に戻す }else{ //最後まで再生した waveOutWrite((HWAVEOUT)wParam,(LPWAVEHDR)lParam,sizeof(WAVEHDR)); for(k=0;k<2;k++){ if((LPWAVEHDR)lParam==&whdr[k]){ buf_num=k; //再生を終了したバッファ break; } } buf_num=(buf_num+1)%2; //再生中のバッファ } InvalidateRect(hWnd,NULL,TRUE); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); wsprintf(str,"再生中のバッファ = %d",buf_num); TextOut(hdc,0,0,str,lstrlen(str)); EndPaint(hWnd,&ps); return 0; case WM_DESTROY: waveOutReset(hWaveOut); for(k=0;k<2;k++){ waveOutUnprepareHeader(hWaveOut,&whdr[k],sizeof(WAVEHDR)); } waveOutClose(hWaveOut); for(k=0;k<2;k++){ free(lpWave[k]); } PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__,"WAVEのマルチバッファリング", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } return (int)msg.wParam; }