開発環境 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