Red de conocimiento informático - Aprendizaje de programación - Reproducir música cuando se ejecuta el programa C en Linux

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 ?

error("snd_pcm_open");?

salir(1);?

}

//2.?Asignar estructura snd_pcm_hw_params_t?

ret?=?snd_pcm_hw_params_malloc(&hw_params);?

if?(ret?

error("snd_pcm_hw_params_malloc");?

exit(1);?

}?

//3.?Inicializar hw_params ?

ret?=?snd_pcm_hw_params_any(playback_handle,?hw_params);?

if?(ret?

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?

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?

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?

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?

error ("snd_pcm_hw_params_set_channels");?

salir(1);?

}

/*?Establecer?período?tamaño?a?32?cuadros .?*/?

frames?=?32;?

periodsize?=?frames?*?2;?

ret?=?snd_pcm_hw_params_set_buffer_size_near( playback_handle,?hw_params,?&periodsize );?

if?(ret?

{? 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?

{?

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?

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)

{?

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?

{? 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".