Advertisement
AntonioVillanueva

Generador 2 tonos independientes en stereo usando ALSA

May 11th, 2023 (edited)
940
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.35 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4. #include <alsa/asoundlib.h>
  5. //compilar asi gcc 2tonos.c -o 2tonos -lasound
  6. //apt-get install libasound2-dev
  7. //sudo apt-get install alsa-utils
  8. //aplay -l
  9. //aplay -D plughw:X,Y audio.wav
  10.  
  11. // Definir las frecuencias de los tonos en Hz
  12. #define FREQUENCY1 800
  13. #define FREQUENCY2 2000
  14.  
  15. // Definir la duración de los tonos en segundos
  16. #define DURATION 1
  17.  
  18. int main() {
  19.     int sampleRate = 44100;  // Frecuencia de muestreo típica para audio
  20.     int numSamples = sampleRate * DURATION;
  21.  
  22.     // Abrir el dispositivo de audio
  23.     snd_pcm_t *pcmHandle;
  24.     snd_pcm_open(&pcmHandle, "default", SND_PCM_STREAM_PLAYBACK, 0);
  25.  
  26.     // Configurar los parámetros del dispositivo de audio
  27.     snd_pcm_set_params(pcmHandle,
  28.                        SND_PCM_FORMAT_S16_LE,
  29.                        SND_PCM_ACCESS_RW_INTERLEAVED,
  30.                        2,             // Dos canales para estéreo
  31.                        sampleRate,
  32.                        1,
  33.                        500000);       // Latencia deseada en microsegundos
  34.  
  35.     // Generar los datos de audio para el primer tono en el canal izquierdo
  36.     short buffer1[numSamples];
  37.     float samplePeriod1 = (float)sampleRate / FREQUENCY1;
  38.     int sampleCount;
  39.  
  40.     for (sampleCount = 0; sampleCount < numSamples; sampleCount++) {
  41.         buffer1[sampleCount] = (short)(sampleCount / samplePeriod1) % 2 ? SHRT_MAX : SHRT_MIN;
  42.     }
  43.  
  44.     // Generar los datos de audio para el segundo tono en el canal derecho
  45.     short buffer2[numSamples];
  46.     float samplePeriod2 = (float)sampleRate / FREQUENCY2;
  47.  
  48.     for (sampleCount = 0; sampleCount < numSamples; sampleCount++) {
  49.         buffer2[sampleCount] = (short)(sampleCount / samplePeriod2) % 2 ? SHRT_MAX : SHRT_MIN;
  50.     }
  51.  
  52.     // Combinar los buffers de los dos tonos en un buffer estéreo
  53.     short combinedBuffer[numSamples * 2];
  54.  
  55.     for (sampleCount = 0; sampleCount < numSamples; sampleCount++) {
  56.         combinedBuffer[sampleCount * 2] = buffer1[sampleCount];               // Canal izquierdo
  57.         combinedBuffer[sampleCount * 2 + 1] = buffer2[sampleCount];          // Canal derecho
  58.     }
  59.  
  60.     // Enviar los datos de audio al dispositivo de audio
  61.     snd_pcm_writei(pcmHandle, combinedBuffer, numSamples);
  62.  
  63.     // Cerrar el dispositivo de audio
  64.     snd_pcm_close(pcmHandle);
  65.  
  66.     return 0;
  67. }
  68.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement