開発環境 |
Microsoft Visual Studio Community 2017 |
実行環境 |
Microsoft Windows 10 Home (64-bit) |
プロジェクトの種類 |
Visual C++ / 空のプロジェクト |
プロジェクト名 |
waveloop |
waveloop.cpp
// プロジェクトのプロパティ
// Unicode文字セット
#pragma comment(lib, "winmm")
#include <Windows.h>
#include <wchar.h>
#include "Resource.h"
#define SAMPLE_RATE 44100
#define BUF_LEN 22050
// 関数プロトタイプ宣言
void Trace(LPCWSTR format, ...);
INT_PTR CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void Play(HWND hDlg);
void Stop(HWND hDlg);
void GenerateWaveForm();
// グローバル変数
HWAVEOUT hwo = NULL;
WAVEHDR wh;
BYTE waveform[BUF_LEN];
int phase;
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, MainDlg);
return 0;
}
void Trace(LPCWSTR format, ...)
{
va_list arg_ptr;
WCHAR buffer[256];
va_start(arg_ptr, format);
int size = _vsnwprintf_s(buffer, _TRUNCATE, format, arg_ptr);
va_end(arg_ptr);
OutputDebugString(buffer);
}
INT_PTR CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
INT_PTR ret = TRUE; // メッセージを処理した
switch (message) {
case MM_WOM_DONE:
GenerateWaveForm();
break;
case MM_WOM_OPEN:
Trace(L"MM_WOM_OPEN:\n");
break;
case MM_WOM_CLOSE:
Trace(L"MM_WOM_CLOSE:\n");
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_PLAY:
Play(hDlg);
break;
case IDC_STOP:
Stop(hDlg);
break;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
break;
}
break;
case WM_INITDIALOG:
ret = TRUE; // SetFocusでフォーカスを設定した場合はFALSE
break;
case WM_CLOSE:
Stop(hDlg);
ret = FALSE;
break;
default:
ret = FALSE; // メッセージを処理しなかった
}
return ret;
}
void Play(HWND hDlg)
{
MMRESULT mmr;
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 1;
wfx.nSamplesPerSec = SAMPLE_RATE;
wfx.nAvgBytesPerSec = SAMPLE_RATE;
wfx.nBlockAlign = 1;
wfx.wBitsPerSample = 8;
wfx.cbSize = 0;
mmr = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (DWORD_PTR)hDlg, NULL, CALLBACK_WINDOW);
Trace(L"waveOutOpen: %u\n", mmr);
wh.lpData = (LPSTR)waveform;
wh.dwBufferLength = BUF_LEN;
wh.dwFlags = 0;
mmr = waveOutPrepareHeader(hwo, &wh, sizeof wh);
Trace(L"waveOutPrepareHeader: %u\n", mmr);
phase = 0;
GenerateWaveForm();
EnableWindow(GetDlgItem(hDlg, IDC_PLAY), FALSE);
}
void Stop(HWND hDlg)
{
Trace(L"Stop()\n");
if (hwo) {
MMRESULT mmr;
mmr = waveOutReset(hwo);
Trace(L"waveOutReset: %u\n", mmr);
mmr = waveOutUnprepareHeader(hwo, &wh, sizeof wh);
Trace(L"waveOutUnprepareHeader: %u\n", mmr);
mmr = waveOutClose(hwo);
Trace(L"waveOutClose: %u\n", mmr);
hwo = NULL;
}
EnableWindow(GetDlgItem(hDlg, IDC_PLAY), TRUE);
}
void GenerateWaveForm()
{
for (int i = 0; i < BUF_LEN; i++) {
phase += 440;
if (SAMPLE_RATE <= phase) phase -= SAMPLE_RATE;
double t = phase / (double)SAMPLE_RATE;
waveform[i] = 128 + (t < 0.5 ? 1 : -1) * 10;
}
waveOutWrite(hwo, &wh, sizeof wh);
}
Resource.h
#define IDD_MAINDLG 100
#define IDC_STATIC -1
#define IDC_PLAY 1000
#define IDC_STOP 1001
waveloop.rc
// resource script
#include <windows.h>
#include "resource.h"
IDD_MAINDLG DIALOGEX 100, 100, 320, 200
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "waveloop"
FONT 9, "MS UI Gothic"
BEGIN
PUSHBUTTON "Play(&P)",IDC_PLAY, 10, 10, 50, 15
PUSHBUTTON "Stop(&S)",IDC_STOP, 70, 10, 50, 15
END
最終更新:2018年05月21日 17:10