Riporto di seguito un semplice codice, da me scritto in linguaggio C, per eseguire file di formato WAV con le risorse delle librerie "Libaudio" ed "Alsa":
#include <stdio.h>
#include <audio/wave.h>
#include "alsa/asoundlib.h"
#define BUFFER 32
int main(int argc, char *argv[]) {
WaveInfo *info;
int rit;
char *buf; /* buf contiene i soli dati audio grezzi */
static int obr, i;
info = WaveOpenFileForReading(argv[1]);
if (!info) {
fprintf(stderr, "Impossibile leggere il file wave !\n");
return -1;
}
buf = malloc(BUFFER);
if (!buf) {
perror("malloc");
return -1;
}
printf("Numero canali: %d\n", info->channels);
printf("Risoluzione bit: %d bit\n", info->bitsPerSample);
printf("Frequenza: Hz %d\n", info->sampleRate);
obr = info->channels*info->bitsPerSample*info->sampleRate;
printf("Overall BitRate: %d bps\n", obr);
printf("Durata: sec. %.2lf\n", (float) (info->dataSize * 8) / obr);
int err, bit, n;
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
if ((err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
printf("Impossibile inizializzare il dispositivo PCM di ALSA: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
if (info->bitsPerSample==16) {
bit = SND_PCM_FORMAT_S16_LE;
}else{
bit = SND_PCM_FORMAT_U8;
}
if ((err = snd_pcm_set_params(handle,
bit,
SND_PCM_ACCESS_RW_INTERLEAVED,
info->channels,
info->sampleRate,
1,
500000)) < 0) { /* 0.5sec */
printf("Errore nell'impostazione dei parametri: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
i = info->bitsPerSample / (8 / info->channels);
while (n < info->dataSize) {
rit = WaveSeekFile(n, info);
if (rit) {
fprintf(stderr, "Impossibile posizionarsi nel file wave !\n");
return -1;
}
WaveReadFile(buf, BUFFER, info);
frames = snd_pcm_writei(handle, buf, BUFFER / i);
if (frames < 0) {
printf("Errore nella funzione 'snd_pcm_writei()': %s\n", snd_strerror(err));
}else{
printf("sec. %.3lf\r", (float) (n * 8) / obr);
}
n += BUFFER;
}
/* Va in chiusura: */
snd_pcm_close(handle);
WaveCloseFile(info);
free(buf);
return (0);
}