Libsndfile library

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Introducció

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

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines