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")
#ifndef M_PI #define M_PI 3.14159265358979323846 #endif
#define SAMPLE_RATE 44100 #define DURATION 1 #define FREQUENCY 432
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))); }
WAVEFORMATEX wfx; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = 1; wfx.nSamplesPerSec = SAMPLE_RATE; wfx.wBitsPerSample = 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.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); return 0; }
|