videojuegos usar sonidos retro para musica juegos gratis audios c windows linux audio cross-platform

usar - ¿Qué es una biblioteca de juegos WAV liviana de plataforma cruzada?



sonidos juegos gratis (7)

Estoy buscando una forma liviana de hacer que mi programa (escrito en C) pueda reproducir archivos de audio en Windows o Linux. Actualmente estoy usando llamadas nativas de Windows, que es básicamente una sola llamada a la que se le pasa un nombre de archivo. Me gustaría algo similar que funcione en Linux.

Los archivos de audio son Microsoft PCM, Un solo canal, 22Khz

¿Alguna sugerencia?


Puedes probar con este: libao


SDL_Mixer , aunque no es muy liviano, tiene una interfaz simple para reproducir archivos WAV. Creo que, al igual que SDL , SDL_Mixer también es LGPL.

OpenAL es otra biblioteca de audio multiplataforma que está más orientada al audio 3D.

Sin embargo, otra biblioteca de audio de código abierto que es posible que desee comprobar es PortAudio


He usado OpenAL para reproducir archivos wav como alertas / advertencias en un sistema de control de tráfico aéreo

Las ventajas que he encontrado son

  1. es plataforma cruzada
  2. funciona con C (y otros, pero tu pregunta es sobre C)
  3. peso liviano
  4. buena documentación disponible en la web
  5. la licencia es LGPL por lo que llama a la API sin problemas de licencia

Me gusta FMOD . La licencia es gratuita para uso personal y muy razonable para pequeños shareware o proyectos comerciales


Como también estoy buscando una respuesta para la pregunta, investigué un poco y no encontré ninguna forma simple (simple como llamar a una función) para reproducir un archivo de audio. Pero con algunas líneas de código, es posible incluso de forma portátil utilizando el ya mencionado portaudio y libsndfile (LGPL).

Aquí hay un pequeño caso de prueba que he escrito para probar ambas librerías:

#include <portaudio.h> #include <sndfile.h> static int output_cb(const void * input, void * output, unsigned long frames_per_buffer, const PaStreamCallbackTimeInfo *time_info, PaStreamCallbackFlags flags, void * data) { SNDFILE * file = data; /* this should not actually be done inside of the stream callback * but in an own working thread * * Note although I haven''t tested it for stereo I think you have * to multiply frames_per_buffer with the channel count i.e. 2 for * stereo */ sf_read_short(file, output, frames_per_buffer); return paContinue; } static void end_cb(void * data) { printf("end!/n"); } #define error_check(err) / do {/ if (err) { / fprintf(stderr, "line %d ", __LINE__); / fprintf(stderr, "error number: %d/n", err); / fprintf(stderr, "/n/t%s/n/n", Pa_GetErrorText(err)); / return err; / } / } while (0) int main(int argc, char ** argv) { PaStreamParameters out_param; PaStream * stream; PaError err; SNDFILE * file; SF_INFO sfinfo; if (argc < 2) { fprintf(stderr, "Usage %s /n", argv[0]); return 1; } file = sf_open(argv[1], SFM_READ, &sfinfo); printf("%d frames %d samplerate %d channels/n", (int)sfinfo.frames, sfinfo.samplerate, sfinfo.channels); /* init portaudio */ err = Pa_Initialize(); error_check(err); /* we are using the default device */ out_param.device = Pa_GetDefaultOutputDevice(); if (out_param.device == paNoDevice) { fprintf(stderr, "Haven''t found an audio device!/n"); return -1; } /* stero or mono */ out_param.channelCount = sfinfo.channels; out_param.sampleFormat = paInt16; out_param.suggestedLatency = Pa_GetDeviceInfo(out_param.device)->defaultLowOutputLatency; out_param.hostApiSpecificStreamInfo = NULL; err = Pa_OpenStream(&stream, NULL, &out_param, sfinfo.samplerate, paFramesPerBufferUnspecified, paClipOff, output_cb, file); error_check(err); err = Pa_SetStreamFinishedCallback(stream, &end_cb); error_check(err); err = Pa_StartStream(stream); error_check(err); printf("Play for 5 seconds./n"); Pa_Sleep(5000); err = Pa_StopStream(stream); error_check(err); err = Pa_CloseStream(stream); error_check(err); sf_close(file); Pa_Terminate(); return 0; }

Algunas notas al ejemplo. No es una buena práctica hacer la carga de datos dentro de la devolución de llamada de secuencia, sino dentro de una cadena de carga propia. Si necesita reproducir varios archivos de audio, se vuelve aún más difícil, porque no todos los servidores back-end soportan múltiples flujos para un dispositivo, por ejemplo, el backend OSS no, pero el backend ALSA sí. No sé cómo está la situación en Windows. Como todos sus archivos de entrada son del mismo tipo, podría mezclarlos usted mismo, lo que complica un poco más el código, pero también tendría soporte para OSS. Si también tuviera diferentes frecuencias de muestreo o número de canales, se volvería muy difícil.

Entonces, si no quieres jugar varios archivos al mismo tiempo, esta podría ser una solución o al menos un comienzo para ti.


También puedes probar Audiere . La última versión tiene fecha de 2006, pero es de código abierto y está licenciada por la LGPL.