Reproducir música cuando se ejecuta el programa C en Linux
/**?
*test.c?
*?
*Nota: Este ejemplo está en Ubuntu?12.04. 1 El entorno se compila y ejecuta correctamente.
?
*?
*/?
#include?
#include?
#include?
int?main(int?argc,?char?*argv[])?
{?
int?i;?
int?ret;?
int?buf[128];?
sin firmar ?int?val;?
int?dir=0;?
char?*buffer;?
int?size;?
snd_pcm_uframes_t?frames;?
snd_pcm_uframes_t?periodsize;?
snd_pcm_t?*playback_handle;//Identificador del dispositivo PCM pcm.h?
snd_pcm_hw_params_t?* hw_params;//¿Información de hardware y configuración de transmisión PCM?
if?(argc?!=?2)?{?
printf("error:?alsa_play_test?[music?name ]\n");?
salir(1);?
}?
printf("reproducir?canción?%s?by?wolf\ n",?argv[1]);?
ARCHIVO?*fp?=?fopen(argv[1],?"rb");?
if(fp? ==?NULL)?
return?0;?
fseek(fp,?100,?SEEK_SET);?
//1.?Open PCM, el último parámetro es 0, ¿significa configuración estándar?
ret?=?snd_pcm_open(&playback_handle,?"default",?SND_PCM_STREAM_PLAYBACK,?0);?
if?( ret ?0)?{?
error("snd_pcm_open");?
salir(1);?
}
//2.?Asignar estructura snd_pcm_hw_params_t?
ret?=?snd_pcm_hw_params_malloc(&hw_params);?
if?(ret?0)?{?
error("snd_pcm_hw_params_malloc");?
exit(1);?
}?
//3.?Inicializar hw_params ?
ret?=?snd_pcm_hw_params_any(playback_handle,?hw_params);?
if?(ret?0)?{?
perror(" snd_pcm_hw_params_any" );?
exit(1);?
}?
//4.?¿Inicializar permisos de acceso?
ret? =?snd_pcm_hw_params_set_access(playback_handle,?hw_params,?SND_PCM_ACCESS_RW_INTERLEAVED);?
if?(ret?0)?{?
perror("snd_pcm_hw_params_set
_access");?
exit(1);?
}?
//5.?¿Inicializar el formato de muestreo SND_PCM_FORMAT_U8, 8 bits?
ret?=?snd_pcm_hw_params_set_format(playback_handle,?hw_params,?SND_PCM_FORMAT_U8);?
if?(ret?0)?{?
perror("snd_pcm_hw_params_set_format ");?
exit(1);?
}?
///6.?Establezca la frecuencia de muestreo, si el hardware no es compatible Según la frecuencia de muestreo que establezcamos, se utilizará la ?
//val?=?44100 más cercana. Algunas frecuencias de muestreo de grabación se fijan en 8KHz?
val?=?8000;?
ret?=?snd_pcm_hw_params_set_rate_near(playback_handle,?hw_params,?&val,?&dir);?
if?(ret?0)?{?
perror(" snd_pcm_hw_params_set_rate_near");?
exit(1);?
}?
//7.?¿Establecer el número de canales?
ret?=?snd_pcm_hw_params_set_channels(playback_handle,?hw_params,?2);?
if?(ret?0)?{?
error ("snd_pcm_hw_params_set_channels");?
salir(1);?
}
/*?Establecer?período?tamaño?a?32?cuadros .?*/? p>
frames?=?32;?
periodsize?=?frames?*?2;?
ret?=?snd_pcm_hw_params_set_buffer_size_near( playback_handle,?hw_params,?&periodsize );?
if?(ret?0)
{? printf("¿No se puede?establecer?buffer?size?%li ?:?%s\n ",?frames?*?2,?snd_strerror(ret));?
}? periodsize?/=?2;?
ret? =?snd_pcm_hw_params_set_period_size_near(playback_handle,? hw_params,?&periodsize,?0);?
if?(ret?0)
{?
printf ("¿No se puede?establecer ?period?size?%li?:?%s\n",?periodsize,?snd_strerror(ret));?
}?
//8.?Establecer hw_params ?
ret?=?snd_pcm_hw_params(playback_handle,?hw_params);?
if?(ret?0)?{?
error(" snd_pcm_hw_params");?
salir(1);?
}? /*?Usar?a?
¿buffer?grande?suficientemente?para?contener?un?periodo?*/?
snd_pcm_hw_params_get_period_size(hw_params,?&frames,?&dir);
size?=?frames?* ?2;?/*?2?bytes/muestra,?2?canales?*/?
búfer?=?(char?*)?malloc(tamaño);?
fprintf(stderr,?
"tamaño?=?%d\n",?
tamaño);?
mientras?(1) p>
{?
ret?=?fread(búfer,?1,?tamaño,?fp);?
if(ret?==?0)
{? fprintf(stderr,?"fin?de?archivo?en?entrada\n");? descanso;?
}
else?if ?(ret?=?size)
{?
}?
//9.?¿Escribir datos de audio en el dispositivo PCM?
while(ret?=?snd_pcm_writei(playback_handle,?buffer,?frames)<0)?
{?
usleep(2000);?
if?(ret?==?-EPIPE)?
{? /*?EPIPE?means?underrun?*/? fprintf(stderr,?"underrun?ocurrió\n"); /¿Completar la configuración de los parámetros de hardware para que el dispositivo esté listo snd_pcm_prepare(playback_handle);?
}
else?if?(ret?0)
{? fprintf(stderr,? "error?from?writei:?%s\n",? snd_strerror(ret));?
}
}
}?
//10.?¿Cerrar el identificador del dispositivo PCM?
snd_pcm_close(playback_handle);
return?0;?< / p>
}?
//Nota: El formato de "gcc?-o?test?test.c?-L.?-lasound" debe mantenerse al compilar y debe ser se mantiene al ejecutar el formato "./test?//clip2.wav".