開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 コンソール アプリケーション |
プロジェクト名 |
wave |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト |
wave.c
#pragma comment(lib, "winmm.lib")
#define _USE_MATH_DEFINES
#include <math.h>
#include <stdio.h>
#include <Windows.h>
#define VOLUME 64
#define FREQ 440
#define SAMPLE_RATE 11025
#define TONE_MSEC 1000
#define DATA_LEN (SAMPLE_RATE * TONE_MSEC / 1000)
int main()
{
WAVEFORMATEX wfx;
MMRESULT mmr;
HWAVEOUT hwo;
WAVEHDR wh;
char acData[DATA_LEN];
double dWave;
int i;
// 波形データの作成
for (i = 0; i < DATA_LEN; i++) {
dWave = sin(i * FREQ * 2 * M_PI / SAMPLE_RATE);
acData[i] = (char)(dWave * VOLUME) + 128;
// acData[i] = rand() * 2 * VOLUME / RAND_MAX + 128 - VOLUME; // ホワイトノイズ
}
// Play
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, 0, 0, CALLBACK_NULL);
if (mmr != MMSYSERR_NOERROR) {
fprintf(stderr, "error: waveOutOpen\n");
return 1;
}
ZeroMemory(&wh, sizeof wh);
wh.lpData = acData;
wh.dwBufferLength = DATA_LEN;
mmr = waveOutPrepareHeader(hwo, &wh, sizeof wh);
if (mmr != MMSYSERR_NOERROR) {
fprintf(stderr, "error: waveOutPrepareHeader\n");
return 1;
}
mmr = waveOutWrite(hwo, &wh, sizeof wh);
if (mmr != MMSYSERR_NOERROR) {
fprintf(stderr, "error: waveOutWrite\n");
return 1;
}
// Wait
Sleep(TONE_MSEC);
// Stop
mmr = waveOutReset(hwo);
if (mmr != MMSYSERR_NOERROR) {
fprintf(stderr, "error: waveOutReset\n");
return 1;
}
mmr = waveOutUnprepareHeader(hwo, &wh, sizeof wh);
if (mmr != MMSYSERR_NOERROR) {
fprintf(stderr, "error: waveOutUnprepareHeader\n");
return 1;
}
mmr = waveOutClose(hwo);
if (mmr != MMSYSERR_NOERROR) {
fprintf(stderr, "error: waveOutClose\n");
return 1;
}
return 0;
}
最終更新:2012年09月01日 16:42