07-01-2013, 20:24
Enunciado:
Escriba un programa que invoque a la función de lectura del dispositivo de audio y envíe las muestras leídas auna FIFO, luego que tome las muestras de ese FIFO y las envíe a la salida de audio correspondiente.
Bueno, yo logre leer el microfono y reproducirlo, funciono todo bien, pero cuando le agregue el mkfifo para leerlo desde ahi tuve problemas, se me cuelga el programa. Les comento con muchos asteriscos las lineas que agregue luego de hacer que el programa me funcione correctamente (solo que no guardaba lso datos en una fifo como pedian).
Son solo un par de lineas las que agregue que ahi las comente, si alguien me puede ayudar lo agradeceria mucho. Saludos!!
NOTA: Al compilar aca tira error creando la fifo, pero a mi no me lo tira en la pc. Se queda trabado en la funcion read y no sale nunca.
Escriba un programa que invoque a la función de lectura del dispositivo de audio y envíe las muestras leídas auna FIFO, luego que tome las muestras de ese FIFO y las envíe a la salida de audio correspondiente.
Bueno, yo logre leer el microfono y reproducirlo, funciono todo bien, pero cuando le agregue el mkfifo para leerlo desde ahi tuve problemas, se me cuelga el programa. Les comento con muchos asteriscos las lineas que agregue luego de hacer que el programa me funcione correctamente (solo que no guardaba lso datos en una fifo como pedian).
/*
*
*
* Ejecutar:
* 1) aoss ./tp (Si no ejecuta hacer: sudo apt-get install alsa-oss)
*
*/
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <linux/soundcard.h>
#include <sys/stat.h>
#define TIEMPO 10
#define VELOCIDAD 8000
#define TAMANIO 8
#define CANAL 1
#define FIFO_NAME "Mi_fifo"
void setear_parametros_audio(int);
int main(void)
{
int fd=0, estado=0;
char buf[TIEMPO*VELOCIDAD*TAMANIO*CANAL/8];
if((fd=mkfifo(FIFO_NAME, 0666))<0)//*****************************************************DESDE ACA*******************
{
printf("Error creando la FIFO %s\n",FIFO_NAME);
exit(0);
}//*****************************************************HASTA ACA*******************
fd = open(FIFO_NAME, O_RDWR);// ***************** ACA solo cambie el FIFO_NAME, en realidad iba"/dev/dsp"***
if(fd < 0)
{
printf("Error al abrir \"/dev/dsp\", Error: %s\n", strerror (fd));
exit(0);
}
setear_parametros_audio(fd);
printf("Hable por el microfono:\n");
estado = read(fd, buf, sizeof(buf));
if(estado != sizeof(buf))
{
fprintf(stderr,"Error en función read, Código de error: %s\n",strerror (estado));
exit(0);
}
printf("Se escucho:\n");
estado = write(fd, buf, sizeof(buf));
if (estado != sizeof(buf))
{
fprintf(stderr,"Error en función write, Código de error: %s\n",strerror (estado));
exit(0);
}
close(fd);//*****************************************************ACA*******************
return 0;
}
void setear_parametros_audio(int fd)
{
int argumento=TAMANIO, estado=0;
estado = ioctl(fd, SOUND_PCM_WRITE_BITS, &argumento);
if(estado < 0)
printf("Es probable que no se haya podido configurar todos lso parametros deseados.\n");
if(argumento != TAMANIO)
fprintf (stderr,"Tamaño de muestras no soportado. Se programó %d\n",argumento);
argumento = CANAL;
estado = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &argumento);
if(estado < 0)
printf("Es probable que no se haya podido configurar todos lso parametros deseados.\n");
if(argumento != CANAL)
fprintf (stderr,"Canal no soportado. Se programó %d\n",argumento);
argumento = VELOCIDAD;
estado = ioctl(fd, SOUND_PCM_WRITE_RATE, &argumento);
if(estado < 0)
printf("Es probable que no se haya podido configurar todos lso parametros deseados.\n");
if(argumento != VELOCIDAD)
fprintf (stderr,"Velocidad no soportada. Se programó %d\n",argumento);
}
Son solo un par de lineas las que agregue que ahi las comente, si alguien me puede ayudar lo agradeceria mucho. Saludos!!
NOTA: Al compilar aca tira error creando la fifo, pero a mi no me lo tira en la pc. Se queda trabado en la funcion read y no sale nunca.