it.comp.lang.c
Il linguaggio di programmazione C
Indice messaggi | Invia un reply | Tutti i newsgroup | Cerca | Statistiche
|
 |
|
|
Inviato da: Umberto Salsi 
Titolo: Come riprodurre suono a diverse frequenze con libreria ALSA su Linux
Newsgroup: it.comp.lang.c
Data: 06/09/2017
Ora: 17:38:49
Mostra headers
|
|
|
Per un simulatore di volo, devo cambiare la frequenza del suono di sfondo<br />
del motore. Per esempio, ho campionato il suono del motore a 8000 Hz full<br />
power, e per riprodurre il suono col motore al 50% RPM devo riprodurre<br />
il suono a 4000 Hz.<br />
<br />
Con la libreria ALSA su Linux (Salckware 14.2, 64 bits) uso la<br />
funzione snd_pcm_set_params(), ma introduce un fastidioso click ad ogni<br />
cambiamento, come prova il programmino qui sotto.<br />
<br />
C'=C3=A8 un altro modo per cambiare la frequenza senza dover ricorrere a un<br />
ricampionamento in software?<br />
<br />
Per la cronaca, il simulatore di volo in questione =C3=A8 acm-5.0-ico dispon=<br />
ibile<br />
nella home page del mio sito.<br />
<br />
Ciao,<br />
___ <br />
/_|_\ Umberto Salsi<br />
\/_\/ www.icosaedro.it<br />
<br />
<br />
<br />
/*<br />
* pitchchange.c - compile and execute with:<br />
* gcc pitchchange.c -o pitchchange.exe -lasound && ./pitchchange.exe<br />
*/<br />
<br />
#include <stdlib.h><br />
#include <assert.h><br />
#include <alsa/asoundlib.h><br />
<br />
static void setRate(snd_pcm_t *pcm, int rate)<br />
{<br />
=09printf("now playing at %d Hz\n", rate);<br />
=09assert( snd_pcm_set_params(pcm, SND_PCM_FORMAT_U8,<br />
=09=09=09SND_PCM_ACCESS_RW_INTERLEAVED,<br />
=09=09=091, /* channels */<br />
=09=09=09rate, /* Hz */<br />
=09=09=091, /* allow alsa-lib sw resampler (what is it, though?) */<br />
=09=09=09100000 /* latency (us) - ??? */<br />
=09=09) =3D=3D 0 );<br />
}<br />
<br />
int main(void)<br />
{<br />
=09/* Generate square wave, 1 B/frame, 256 frames/period, 16 periods total: =<br />
*/<br />
=09unsigned char wave[4*1024];<br />
=09int amplitude =3D 5;<br />
=09int i;<br />
=09for (i =3D 0; i < sizeof(wave); i++)<br />
=09=09wave[i] =3D (i & 0x80) ? 128 + amplitude : 128 - amplitude;<br />
=09<br />
=09/* Open audio device: */<br />
=09snd_pcm_t *pcm;<br />
=09assert( snd_pcm_open(&pcm, "default", SND_PCM_STREAM_PLAYBACK, 0) =3D=3D =<br />
0 );<br />
=09<br />
=09/* Play the square wave at increasing rates. */<br />
=09int rate =3D 6000;<br />
=09setRate(pcm, rate);<br />
=09while(1){<br />
=09=09<br />
=09=09/* Play the sample using current rate: */<br />
=09=09int avail_frames =3D sizeof(wave);<br />
=09=09while( avail_frames > 0 ){<br />
=09=09=09int wrote_frames =3D snd_pcm_writei(pcm,<br />
=09=09=09=09wave + sizeof(wave) - avail_frames, avail_frames);<br />
=09=09=09assert( wrote_frames >=3D 0 );<br />
=09=09=09if (wrote_frames > 0 )<br />
=09=09=09=09avail_frames -=3D wrote_frames;<br />
=09=09}<br />
=09=09<br />
=09=09/* Change the playback rate a bit: */<br />
=09=09rate +=3D 100;<br />
=09=09if( rate > 8000 )<br />
=09=09=09rate =3D 6000;<br />
=09=09setRate(pcm, rate); // <-- comment out this line to get rid of the cli=<br />
ck<br />
=09}<br />
}<br />
<br />
// The end.<br />
|
|
|
 |
|
 |
Il thread:
 |
Umberto Salsi |
06/09 17:38 |
Come riprodurre suono a diverse frequenze con libreria ALSA su Linux |
|
|
|
|
|
|
|
|
 |
|
Invia una risposta:
|
 |