[toc]

C语言在Windows中播放特定频率的声音

1.C语言在Windows中使用Beep播放特定频率的声音

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>
#include <stdio.h>

int main() {
// 播放432Hz的声音,持续0.5秒
Beep(432, 500);

// 播放440Hz的声音,持续0.5秒
Beep(440, 500);

// 播放1000Hz的声音,持续0.5秒
Beep(1000, 500);

// 播放2000Hz的声音,持续0.5秒
Beep(2000, 500);

return 0;
}

2.C语言在Windows中使用waveOut播放特定频率的声音

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <windows.h>
#include <math.h>
#include <stdio.h>

#pragma comment(lib, "winmm.lib")

// 定义 M_PI
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

#define SAMPLE_RATE 44100 // 采样率
#define DURATION 1 // 持续时间(秒)
#define FREQUENCY 432 // 频率(Hz)

void PlayTone(double frequency, int duration) {
// 计算样本数
int samples = SAMPLE_RATE * duration;
short* buffer = (short*)malloc(samples * sizeof(short));

// 生成正弦波
for (int i = 0; i < samples; i++) {
buffer[i] = (short)(32767 * sin(2 * M_PI * frequency * (i / (double)SAMPLE_RATE)));
}

// 设置WAVE格式
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 1; // 单声道
wfx.nSamplesPerSec = SAMPLE_RATE;
wfx.wBitsPerSample = 16; // 16位深
wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample) / 8;
wfx.nAvgBytesPerSec = SAMPLE_RATE * wfx.nBlockAlign;
wfx.cbSize = 0;

// 打开音频输出设备
HWAVEOUT hWaveOut;
if (waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR) {
printf("无法打开音频输出设备\n");
free(buffer);
return;
}

// 创建WAVEHDR结构
WAVEHDR waveHdr;
waveHdr.lpData = (LPSTR)buffer;
waveHdr.dwBufferLength = samples * sizeof(short);
waveHdr.dwFlags = 0;
waveHdr.dwLoops = 0;

// 准备并写入音频数据
waveOutPrepareHeader(hWaveOut, &waveHdr, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &waveHdr, sizeof(WAVEHDR));

// 等待音频播放完成
while (!(waveHdr.dwFlags & WHDR_DONE)) {
Sleep(10);
}

// 清理资源
waveOutUnprepareHeader(hWaveOut, &waveHdr, sizeof(WAVEHDR));
waveOutClose(hWaveOut);
free(buffer);
}

int main() {
PlayTone(FREQUENCY, DURATION); // 播放432Hz,持续1秒
return 0;
}