Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <alsa/asoundlib.h>
unsigned char buffer[ 32000 * 4 ]; /* some random data */
/*double __sq( double x )
{
return x - floor( x / ( 2.0 * M_PI ) ) * ( 2.0 * M_PI );
}*/
int main( int argc, char *argv[] )
{
int err;
unsigned int i;
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
/*for ( i = 0; i < sizeof( buffer ); i++ )
buffer[ i ] = random() & 0x03 +
( random() & 0x40 ) * ( ( random() & 0xf0 ) > 0x80 ) * ( ( i % 512 ) == 0 );*/
for ( i = 0; i < sizeof( buffer ); i++ )
buffer[ i ] += ( unsigned char ) ( sin( ( double ) i * ( 2.0 * M_PI / 320.0 ) ) * 64.0 ) + 120;
if ((err = snd_pcm_open( &handle, "default", SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
printf("Playback open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
if ((err = snd_pcm_set_params(handle,
SND_PCM_FORMAT_U8,
SND_PCM_ACCESS_RW_INTERLEAVED,
1,
32000,
1,
0)) < 0) {
printf("Playback open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
for (i = 0; i < 1; i++) {
frames = snd_pcm_writei(handle, buffer, sizeof(buffer));
if (frames < 0)
frames = snd_pcm_recover(handle, frames, 0);
if (frames < 0) {
printf("snd_pcm_writei failed: %s\n", snd_strerror(err));
break;
}
if (frames > 0 && frames < (long)sizeof(buffer))
printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames);
}
snd_pcm_close(handle);
return 0;
}
проблема в том, что к генерируемой синусоиде ( и не только, от формы сигнала почти не зависит ) добавляется какоето периодический треск непонятного происхождения. ну и доки, что то не сильно понятные.
2. как правильно искать тот, что нужно?
пример: функции получения времени ( какойнть счетчик милисекундный всмысле )
пример: как выводить в консоль не добавля новых строк, поверх уже выведенного ( для показания постоянно обновляющихся значения )
спасибо, что прочитали до конца ;^)