[Alsa-user] Sine wave
Brought to you by:
perex
From: Mike M. <ma...@st...> - 2005-05-20 04:30:14
|
Hello! I=B4m playing around with ALSA and I want=20 to create a simple sine wave. The program compiles fine and a tone is played but the tone is around a# and not a. There are some things I dont=B4t understand: How do I choose the right buffer size, period size and periods and what is the difference between interleaved and non-interleaved? I have read several tutorials but they confuse me much more, because it seems that there are more ways to do this. I=B4m not a C geek, so help is appreciated!! #include <stdio.h> #include <math.h> #include <alsa/asoundlib.h> int main(int argc,char *argv[]){ =09 char *device =3D "hw:0,0";=20 =09 int samples,err,i,dir =3D 0; unsigned int samplerate =3D 44100; unsigned int channels =3D 1; double frequency =3D 440.0;=20 double buffer[4096]; =09 snd_pcm_format_t format =3D SND_PCM_FORMAT_S16_LE;=20 snd_pcm_access_t access =3D SND_PCM_ACCESS_RW_INTERLEAVED;=20 snd_pcm_stream_t stream =3D SND_PCM_STREAM_PLAYBACK; =09 snd_pcm_t *handle; snd_pcm_hw_params_t *hwparameter; =09 printf("ALSA Version: %s\n",SND_LIB_VERSION_STR); =09 snd_pcm_hw_params_alloca(&hwparameter); if((err =3D snd_pcm_open(&handle, device, stream,0))<0){ printf("Could not open soundcard %s: %s",device,snd_strerror(err));=20 exit(0); } if((err =3D snd_pcm_hw_params_any(handle,hwparameter))<0){ printf("Error: %s\n",snd_strerror(err)); } if((err =3D snd_pcm_hw_params_set_access(handle,hwparameter,access))<0){ printf("Could not set RW mode %s\n",snd_strerror(err)); exit(0); } if((err =3D snd_pcm_hw_params_set_format(handle,hwparameter,format))<0){ printf("Could not set bit format: %s\n",snd_strerror(err)); exit(0); } if((err =3D snd_pcm_hw_params_set_channels(handle,hwparameter,channels))<0= ){ printf("Could not set channels: %s\n",snd_strerror(err));=20 } if((err =3D snd_pcm_hw_params_set_rate_near(handle,hwparameter,&sam= plerate,&dir))<0){ printf("Could not set samplerate: %s\n",snd_strerror(err)); } if((err =3D snd_pcm_hw_params(handle,hwparameter))<0){ printf("Could not set HW params: %s\n",snd_strerror(err)); } /*create sine wave*/ samples =3D samplerate/frequency; =09 for(i=3D0;i<=3Dsamples;i++){ buffer[i] =3D sin((2 * M_PI * i)/samples); }=09 =09 while(1){ if((err =3D snd_pcm_writei(handle,&buffer,samples))<0){ printf("Could not play stream: %s\n",strerror(err)); } } snd_pcm_close(handle);=20 return 0; } Thanks a lot, Mike |