Utenti collegati: 23 
 
it.comp.lang.c
Il linguaggio di programmazione C

Indice messaggi | Invia un reply | Tutti i newsgroup | Cerca | Statistiche 



  Inviato da: Umberto Salsi  Mostra tutti i messaggi di 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 &amp;&amp; ./pitchchange.exe<br /> */<br /> <br /> #include &lt;stdlib.h&gt;<br /> #include &lt;assert.h&gt;<br /> #include &lt;alsa/asoundlib.h&gt;<br /> <br /> static void setRate(snd_pcm_t *pcm, int rate)<br /> {<br /> =09printf(&quot;now playing at %d Hz\n&quot;, 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 &lt; sizeof(wave); i++)<br /> =09=09wave[i] =3D (i &amp; 0x80) ? 128 + amplitude : 128 - amplitude;<br /> =09<br /> =09/* Open audio device: */<br /> =09snd_pcm_t *pcm;<br /> =09assert( snd_pcm_open(&amp;pcm, &quot;default&quot;, 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 &gt; 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 &gt;=3D 0 );<br /> =09=09=09if (wrote_frames &gt; 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 &gt; 8000 )<br /> =09=09=09rate =3D 6000;<br /> =09=09setRate(pcm, rate); // &lt;-- comment out this line to get rid of the cli=<br /> ck<br /> =09}<br /> }<br /> <br /> // The end.<br />  

Il thread:
da leggere Umberto Salsi 06/09 17:38
Come riprodurre suono a diverse frequenze con libreria ALSA su Linux
   da leggere jak 07/09 15:51
Re: Come riprodurre suono a diverse frequenze con libreria ALSA su Linux
   da leggere Umberto Salsi 07/09 17:55
Re: Re: Come riprodurre suono a diverse frequenze con libreria ALSA su Linux
      da leggere jak 08/09 10:28
Re: Come riprodurre suono a diverse frequenze con libreria ALSA su Linux
      da leggere Umberto Salsi 13/09 18:20
Re: Re: Come riprodurre suono a diverse frequenze con libreria ALSA su Linux
 

Invia una risposta:

Nome:

Email:

Titolo:

Testo:


Attenzione: l'invio del messaggio richiede diversi secondi.
Non premere pi� volte il tasto "Invia".

 © Sergio Simonetti 2001 Che cos'è Links