Hola gente, escribo al foro para ver si alguien me puede sacar algunas dudas acerca de la programación en linux.
En una web encontré este programa:
/*
This example reads from the default PCM device
and writes to standard output for 5 seconds of data.
*/
//NO USAR PRINTF SINO ESCRIBO EN EL ARCHIBO DONDE DEBERIA HABER DATOS!
/* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API
//uso ./sonido > archivo
#include <alsa/asoundlib.h>
int main() {
long loops;
int rc;
int size;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val;
int dir;
snd_pcm_uframes_t frames;
char *buffer;
/* Open PCM device for recording (capture). */
rc = snd_pcm_open(&handle, "default",
SND_PCM_STREAM_CAPTURE, 0);
if (rc < 0) {
fprintf(stderr,
"unable to open pcm device: %s\n",
snd_strerror(rc));
exit(1);
}
/* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(¶ms);
/* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params);
/* Set the desired hardware parameters. */
/* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED);
/* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE);
/* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, 2);
/* 44100 bits/second sampling rate (CD quality) */
val = 44100;
snd_pcm_hw_params_set_rate_near(handle, params,
&val, &dir);
/* Set period size to 32 frames. */
frames = 32;
snd_pcm_hw_params_set_period_size_near(handle,
params, &frames, &dir);
/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < 0) {
fprintf(stderr,
"unable to set hw parameters: %s\n",
snd_strerror(rc));
exit(1);
}
/* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params,
&frames, &dir);
size = frames * 4; /* 2 bytes/sample, 2 channels */
buffer = (char *) malloc(size);
/* We want to loop for 5 seconds */
snd_pcm_hw_params_get_period_time(params,
&val, &dir);
loops = 5000000 / val;
while (loops > 0) {
loops--;
rc = snd_pcm_readi(handle, buffer, frames);
if (rc == -EPIPE) {
/* EPIPE means overrun */
fprintf(stderr, "overrun occurred\n");
snd_pcm_prepare(handle);
} else if (rc < 0) {
fprintf(stderr,
"error from read: %s\n",
snd_strerror(rc));
} else if (rc != (int)frames) {
fprintf(stderr, "short read, read %d frames\n", rc);
}
rc = write(1, buffer, size);
if (rc != size)
fprintf(stderr,
"short write: wrote %d bytes\n", rc);
}
snd_pcm_drain(handle);
snd_pcm_close(handle);
free(buffer);
return 0;
}
Que se usa ./sonido > archivo
El problema mío es que desearía guardar la salida a un archivo bienario, y para eso debería entender donde es que pasa el parámetro para almacenarlo en archivo, ya que si por ejemplo agrego una línea que diga printf("fadsfj"); lo que hace es guardarlo en archivo, Donde está la línea que envía datos al archivo especificado anteriormente? Bueno como ven no estoy muy bien parado con la programación en linux y estoy intentando muestrear datos del dispositivo de sonido mientras los muestro en tiempo real y me mareo eso un poco...
Cualquier ayuda con programación en sonido (tutorial, etc) va a ser muy bienvenida =)
Gracias
Saludos!

escribir en un archivo
Hola.
Tal como está el programa, lo que hace es leer del dispositivo de sonido:
Y sacarlo por pantalla:
Si lo que quieres es que esa salida vaya a un fichero, tendrás que abrir el fichero y pasarle su descriptor en la línea anterior. Por ejemplo:
... fd = open("mifichero",O_WRONLY); ... rc = write(fd, buffer, size); ... close(fd);Saludos.
Saludos.
0000 start out (+FD),A ld BC, +7FFF jp 03CB, RAM-CHECKhttp://www.injiniero.es