Libsndfile library
Contingut
Introducció
- http://www.labbookpages.co.uk/audio/wavFiles.html
- http://www.mega-nerd.com/libsndfile/tools/#jackplay
Per compilar un projecte que utilitza libsndfile:
$ gcc -lsndfile -o readWav readWav.c
Per què necessito aquesta libreria? Vull fer un petit projecte que faci sonar de forma realista el moviment del llapis en la wacom, tenint en compte la velocitat del llapis i la pressió. La idea és partir d'un fitxer d'audio que sigui realista, ficar totes les samples en un buffer, i quan escrigui a la wacom enviar el buffer a la sortida però modificant les samples tenint en compte la velocitat i la pressió. La idea és obtenir algun resultat similar al que fan a Mogees:
readWav.c
readWav.c:
// Andrew Greensted - Feb 2010
// http://www.labbookpages.co.uk
// Version 1
#include <stdio.h>
#include <malloc.h>
#include <sndfile.h>
int main(int argc, char *argv[])
{
printf("Wav Read Test\n");
if (argc != 2) {
fprintf(stderr, "Expecting wav file as argument\n");
return 1;
}
// Open sound file
SF_INFO sndInfo;
SNDFILE *sndFile = sf_open(argv[1], SFM_READ, &sndInfo);
if (sndFile == NULL) {
fprintf(stderr, "Error reading source file '%s': %s\n", argv[1], sf_strerror(sndFile));
return 1;
}
// Check format - 16bit PCM
if (sndInfo.format != (SF_FORMAT_WAV | SF_FORMAT_PCM_16)) {
fprintf(stderr, "Input should be 16bit Wav\n");
sf_close(sndFile);
return 1;
}
// Check channels - mono
if (sndInfo.channels != 1) {
fprintf(stderr, "Wrong number of channels\n");
sf_close(sndFile);
return 1;
}
// Allocate memory
float *buffer = malloc(sndInfo.frames * sizeof(float));
if (buffer == NULL) {
fprintf(stderr, "Could not allocate memory for file\n");
sf_close(sndFile);
return 1;
}
// Load data
long numFrames = sf_readf_float(sndFile, buffer, sndInfo.frames);
// Check correct number of samples loaded
if (numFrames != sndInfo.frames) {
fprintf(stderr, "Did not read enough frames for source\n");
sf_close(sndFile);
free(buffer);
return 1;
}
// Output Info
printf("Read %ld frames from %s, Sample rate: %d, Length: %fs\n",
numFrames, argv[1], sndInfo.samplerate, (float)numFrames/sndInfo.samplerate);
sf_close(sndFile);
free(buffer);
return 0;
}
$ gcc -lsndfile -o readWav readWav.c $ ./readWav hola.wav Wav Read Test Input should be 16bit Wav $ ./readWav file_1.wav Wav Read Test Read 58000 frames from file_1.wav, Sample rate: 16000, Length: 3.625000s
sndfile-jackplay
'sndfile-jackplay ja es troba instal.lat:
$ man sndfile-jackplay
SNDFILE-JACKPLAY(1) SNDFILE-JACKPLAY(1)
NAME
sndfile-jackplay - play a sound file via the JACK sound server
SYNOPSIS
sndfile-jackplay file
DESCRIPTION
sndfile-jackplay plays the specified sound file via the JACK sound
server. It uses libsndfile (http://www.mega-nerd.com/libsndfile/) to
read the file.
$ sndfile-jackplay prova.wav jack_client_new: deprecated Channels : 1 Sample rate : 44100 Hz Duration : 00:11.35 Cannot connect output port 0 (alsa_pcm:playback_1). -> 00:11.33
Descarrego el codi font (sndfile-tools-1.03.tar.gz) per tal de poder modificar el codi font de sndfile-jackplay (/home/joan/sndfile-tools-1.03/src/sndfile-jackplay.c)
El primer que he de fer és compilar el projecte:
$ cd /home/joan/sndfile-tools-1.03/src/ $ ./cofigure $ make
Reanomeno a sndfile-jackplay_v2.c i compilo: (l'únic canvi que faig en el codi font és
#include "src/config.h" per #include "config.h"
$ gcc -D jack -o sndfile-jackplay_v2 `pkg-config --cflags --libs jack` -lsndfile sndfile-jackplay_v2.c
o bé més curt:
$ gcc -o sndfile-jackplay_v2 -ljack -lsndfile sndfile-jackplay_v2.c
$ ./sndfile-jackplay_v2 ~/prova.wav
creat per Joan Quintana Compte, febrer 2012