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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| /* sound_gen.c */
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include <math.h>
#include <limits.h>
#include <stdlib.h>
#define WAV_2_PI 6.283185307179586476925286766559 /* 2 * PI */
double sin_1000(double t);
char * echantillonner(double (*x)(double), unsigned fe, unsigned T, unsigned * pCount, char ** pBuffer);
MMRESULT wav_open_device(u_int device_id, unsigned fe, HWAVEOUT * ptr);
MMRESULT wav_write(HWAVEOUT hWaveOut, WAVEHDR * pwhdr, char * buffer, DWORD buf_size, u_int nLoops);
MMRESULT wav_cleanup(HWAVEOUT hWaveOut, WAVEHDR * pwhdr);
MMRESULT wav_close_device(HWAVEOUT hWaveOut);
int main()
{
unsigned fe = 44100; /* Frequence d'echantillonnage en Hz */
HWAVEOUT hWaveOut;
if (wav_open_device(WAVE_MAPPER, fe, &hWaveOut) != MMSYSERR_NOERROR)
fprintf(stderr, "La fonction wav_open_device a echoue.\n");
else
{
double (*x)(double) = sin_1000; /* Le signal a traiter (x(t)) */
unsigned T = 2000; /* duree de l'observation en ms (t0 = 0 ms) */
unsigned N; /* Nombre d'echantillons */
char * buffer;
if ((echantillonner(x, fe, T, &N, &buffer)) == NULL)
fprintf(stderr, "La fonction echantillonner a echoue.\n");
else
{
WAVEHDR whdr; /* Requis par wav_write et wav_cleanup */
wav_write(hWaveOut, &whdr, buffer, N, 1);
printf("Press ENTER to stop.\n");
getchar();
wav_cleanup(hWaveOut, &whdr);
free(buffer);
}
wav_close_device(hWaveOut);
}
return 0;
}
double sin_1000(double t) /* signal sinusoidal de frequence 1kHz */
{
/* t en ms (=> t / 1000 en s) */
return sin(WAV_2_PI * 1000 * (t / 1000));
}
char * echantillonner(double (*x)(double), unsigned fe, unsigned T, unsigned * pCount, char ** pBuffer)
{
/* fe : Frequence d'echantillonnage en Hz (=> 1 / fe en s)*/
/* T : duree de l'observation en ms */
unsigned N; /* Nombre d'echantillons */
double Te = 1000.0 / fe; /* Periode d'echantillonnage en ms */
char * buffer;
N = (unsigned)(T / Te);
if ((buffer = malloc(N)) != NULL)
{
unsigned k;
/* Le signal x(t) doit etre / -1 <= x(t) <= 1 */
/* Un echantillon xk = x(k * Te) doit etre tel que 0 <= xk <= UCHAR_MAX */
for(k = 0; k < N; k++)
buffer[k] = (char)((1 + x(k * Te)) * (UCHAR_MAX / 2));
}
*pCount = N;
*pBuffer = buffer;
return *pBuffer;
}
MMRESULT wav_open_device(u_int device_id, unsigned fe, HWAVEOUT * ptr)
{
WAVEFORMATEX wfex;
wfex.wFormatTag = WAVE_FORMAT_PCM;
wfex.cbSize = 0;
wfex.nChannels = 1; /* Mono. 2 = Stereo */
wfex.wBitsPerSample = CHAR_BIT; /* Nombre de bits par echantillon */
wfex.nBlockAlign = (wfex.nChannels * wfex.wBitsPerSample) / CHAR_BIT;
wfex.nSamplesPerSec = fe;
wfex.nAvgBytesPerSec = fe * wfex.nBlockAlign;
return waveOutOpen(ptr, device_id, &wfex, 0, 0, 0);
}
MMRESULT wav_write(HWAVEOUT hWaveOut, WAVEHDR * pwhdr, char * buffer, DWORD cbBuffer, u_int nLoops)
{
ZeroMemory(pwhdr, sizeof(*pwhdr));
pwhdr->lpData = buffer;
pwhdr->dwBufferLength = cbBuffer;
pwhdr->dwLoops = nLoops;
waveOutPrepareHeader(hWaveOut, pwhdr, sizeof(*pwhdr));
return waveOutWrite(hWaveOut, pwhdr, sizeof(*pwhdr));
}
MMRESULT wav_cleanup(HWAVEOUT hWaveOut, WAVEHDR * pwhdr)
{
waveOutUnprepareHeader(hWaveOut, pwhdr, sizeof(*pwhdr));
return waveOutReset(hWaveOut);
}
MMRESULT wav_close_device(HWAVEOUT hWaveOut)
{
return waveOutClose(hWaveOut);
} |
Partager