Autore Topic: [C] Eseguire file Wav con le risorse delle librerie "Libaudio" ed "Alsa"  (Letto 918 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
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":

Codice: [Seleziona]
#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);

}

Compilare con:
~ $ gcc -o /percorso/del/programma/compilato /percorso/del/codice/sorgente.c -laudio -lasound





« Ultima modifica: 24 Ottobre 2015, 02:52:17 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »