- //generation de bits aléatoires avec une carte son
- //par philippe pasty 2007
-
- #include <windows.h>
- #include <stdio.h>
- #include <mmsystem.h>
- #include <math.h>
- #include <stdlib.h>
-
- #define BUFSIZE 2000
- short int *buffer;
- HWAVEIN wavein;
- WAVEHDR headerIn;
-
- int fini;
-
- void CALLBACK AudioProcIn(
- HWAVE hWave, // handle of waveform device
- UINT uMsg, // sent message
- DWORD dwInstance, // instance data
- DWORD dwParam1, // application-defined parameter
- DWORD dwParam2 // application-defined parameter
- )
- {
- if(uMsg==WIM_DATA)
- {
- fini=1;
- }
- }
-
- //prépare l'enregistrement PCM
- int init()
- {
- MMRESULT err;
- WAVEFORMATEX pwfx;
- int resolution=2; //16 bits
- int fechant=44100;//frequence d'echantillonage
-
- pwfx.wFormatTag =WAVE_FORMAT_PCM;
- pwfx.nChannels =1;
- pwfx.nSamplesPerSec = fechant;
- pwfx.nAvgBytesPerSec = fechant*resolution;
- pwfx.nBlockAlign =resolution;
- pwfx.wBitsPerSample = resolution<<3;
- pwfx.cbSize = 0;
-
- err = waveInOpen(&wavein,0,&pwfx,(DWORD)AudioProcIn,0,CALLBACK_FUNCTION);
- if (err==MMSYSERR_NOERROR)
- {
- headerIn.lpData =(LPSTR) buffer;
- headerIn.dwBytesRecorded = 0;
- headerIn.dwUser = 0;
- headerIn.dwFlags = 0;
- headerIn.dwLoops =1;
- headerIn.dwBufferLength = BUFSIZE*resolution;
- waveInPrepareHeader(wavein,&headerIn,sizeof(headerIn));
-
- waveInStart(wavein);
- return 1;
- }
- return 0;
- }
-
- //renvoie 0 ou 1 avec une probabilité 1/2
- int aleatoire()
- {
- static int pos=BUFSIZE-1;
- int dif;
-
- do{
- pos++;
- if(pos==BUFSIZE)
- {
- fini=0;
- waveInAddBuffer(wavein,&headerIn,sizeof(headerIn));
- while(!fini);
- pos=1;
- }
- dif= buffer[pos] - buffer[pos-1];
- if(dif<0) return 1;
- if(dif>0) return 0;
- }while(1);
- }
-
- int main()
- {
- int n,s=0,bit;
- buffer =(short int*) malloc(BUFSIZE*2);
-
- if(!init()){printf("erreur sur la carte son\n"); return 0;}
-
- for (n=0;n<10000;n++)
- {if (!(n%50)) printf("\n%4d ",n);
- bit=aleatoire();s+=bit;
- printf("%d",bit);
- }
- printf("\nnombre de 1: %d\n",s);
- waveInUnprepareHeader(wavein,&headerIn,sizeof(headerIn));
- waveInClose(wavein);
-
- return 1;
- }
//generation de bits aléatoires avec une carte son
//par philippe pasty 2007
#include <windows.h>
#include <stdio.h>
#include <mmsystem.h>
#include <math.h>
#include <stdlib.h>
#define BUFSIZE 2000
short int *buffer;
HWAVEIN wavein;
WAVEHDR headerIn;
int fini;
void CALLBACK AudioProcIn(
HWAVE hWave, // handle of waveform device
UINT uMsg, // sent message
DWORD dwInstance, // instance data
DWORD dwParam1, // application-defined parameter
DWORD dwParam2 // application-defined parameter
)
{
if(uMsg==WIM_DATA)
{
fini=1;
}
}
//prépare l'enregistrement PCM
int init()
{
MMRESULT err;
WAVEFORMATEX pwfx;
int resolution=2; //16 bits
int fechant=44100;//frequence d'echantillonage
pwfx.wFormatTag =WAVE_FORMAT_PCM;
pwfx.nChannels =1;
pwfx.nSamplesPerSec = fechant;
pwfx.nAvgBytesPerSec = fechant*resolution;
pwfx.nBlockAlign =resolution;
pwfx.wBitsPerSample = resolution<<3;
pwfx.cbSize = 0;
err = waveInOpen(&wavein,0,&pwfx,(DWORD)AudioProcIn,0,CALLBACK_FUNCTION);
if (err==MMSYSERR_NOERROR)
{
headerIn.lpData =(LPSTR) buffer;
headerIn.dwBytesRecorded = 0;
headerIn.dwUser = 0;
headerIn.dwFlags = 0;
headerIn.dwLoops =1;
headerIn.dwBufferLength = BUFSIZE*resolution;
waveInPrepareHeader(wavein,&headerIn,sizeof(headerIn));
waveInStart(wavein);
return 1;
}
return 0;
}
//renvoie 0 ou 1 avec une probabilité 1/2
int aleatoire()
{
static int pos=BUFSIZE-1;
int dif;
do{
pos++;
if(pos==BUFSIZE)
{
fini=0;
waveInAddBuffer(wavein,&headerIn,sizeof(headerIn));
while(!fini);
pos=1;
}
dif= buffer[pos] - buffer[pos-1];
if(dif<0) return 1;
if(dif>0) return 0;
}while(1);
}
int main()
{
int n,s=0,bit;
buffer =(short int*) malloc(BUFSIZE*2);
if(!init()){printf("erreur sur la carte son\n"); return 0;}
for (n=0;n<10000;n++)
{if (!(n%50)) printf("\n%4d ",n);
bit=aleatoire();s+=bit;
printf("%d",bit);
}
printf("\nnombre de 1: %d\n",s);
waveInUnprepareHeader(wavein,&headerIn,sizeof(headerIn));
waveInClose(wavein);
return 1;
}