Update WavSplit

Par Administrateur, le 27 décembre 2011

Un utilisateur de XCFA m'a écrit dans un Mail que l'application WavSplit (Tobias Weihmann) n'est plus maintenue !

Une visite chez Debian me confirme hélas l'affaire ... :/
Ici aussi ... :/
Un Mail à Tobias Weihmann m'est revenu avec l'état d'erreur !

Le temps d'aller chercher la dernière version (1.2.1) pour tests : récupération du tar.gz, extraction, binarisation (Ôh, un nouveau mot) et tests sur plusieurs fichiers de type WAV.

WavSplit m'expédie quelques phrases de mécontentement sur le moniteur et libère le prompt de mon shell !

Très curieux, j'ouvre les fichiers wavsplit.c et wavsplit.h.
Les Devs ayant une façons très spécifique de voir et de mettre en valeur les choses, je redoute le pire ... Le code de Tobias Weihmann correspond t-il a ce que je suis capable de comprendre ?
Les définitions des structures WAVEFORMAT et WAVE_HEADER du fichier wavsplit.h m'indiquent apparemment que les définitions byte et word sont mal dimensionnées.
typedef struct {
	u_long	dwSize;
	u_short wFormatTag;
	u_short wChannels;
	u_long	dwSamplesPerSec;
	u_long	dwAvgBytesPerSec;
	u_short wBlockAlign;
	u_short wBitsPerSample;
} WAVEFORMAT;

typedef struct {
	char	RiffID[4];
	u_long	RiffSize;
	char	WaveID[4];
	char	FmtID[4];
	u_long	FmtSize;
	u_short wFormatTag;
	u_short nChannels;
	u_long	nSamplesPerSec;
	u_long	nAvgBytesPerSec;
	u_short nBlockAlign;
	u_short wBitsPerSample;
	char	DataID[4];
	u_long	nDataBytes;
} WAVE_HEADER;
Un très simple morceau de code me le confirme:
printf( "sizeof(u_short)   = %lu\n", sizeof(u_short));
printf( "sizeof(u_long)    = %lu\n", sizeof(u_long));
printf( "sizeof(short int) = %lu\n", sizeof(short int));
printf( "sizeof(int)       = %lu\n", sizeof(int));
Ce qui donne:
sizeof(u_short)   = 2
sizeof(u_long)    = 8
sizeof(short int) = 2
sizeof(int)       = 4
Et puis, et puis ... après une analyse du code, je pense également que ces deux structures font double emploi (réflexion très personnelle) et que pour finir (faut quand même bien que mes critiques 'constructives' cesses un jour: non mais !), il serait tout de même interessant d'avoir un emballage plus sympa. du style autotools avec des options du genre:
$ ./configure --prefix=/usr
$ make
$ make distcheck
# make install
# make uninstall
etc, etc ...
D'autant plus que ce tout nouveau et tout beau paquet tar.gz pourrait être transformé très facilement en un paquet DEB, GZ, RPM, etc ...

  • Hop, hop, quelques rectifications de code ...
    Il me semble avoir lu quelque part qu'un bug concerne les fichiers supèrieurs en taille à 2 Go !
    Il y à déjà de quoi faire mais cette coquille si elle existe pourrait (peut être !) être palliée avec une lecture séquentielle ... Une analyse plus en profondeur du code est donc souhaitable ...
    Après vérification du code, la lecture est séquentielle ... houfffffffff !
  • Fabrication d'un paquet tar.gz avec BaseBuild
Et donc, après ces minis modifications, les tests sont ok chez moi:
$ ./src/wavsplit --help

!================================================================================
! WAVSPLIT version 1.2.2 (http://www.fomalhaut.de)
! Licensed under GPL by author Tobias Weihmann
!--------------------------------------------------------------------------------
! Hour patch by Sacha Bartok (sacha@myrealbox.com)
! Modified for frames, hours, seconds, decimal seconds by Alan Fitch
! Modified for individual track lengths (non-cumulative splits) by Derek Schuff
! Update by Claude BULIN in version 1.2.2
!      bytes struct WAVE_HEADER
!      packaging with autotools
!      http://www.xcfa.tuxfamily.org/article14/wavsplit
!================================================================================

Usage: wavsplit [options] wavfile split split split...

Options:
	-q	--quiet		Quiet mode (no messages)
	-H	--Hours		Use Hours
				wavsplit [options] wavfile hr:min:sec [hr:min:sec]...
	-f	--frames FPS	use Frames
				FPS (frames per second) must be either 12, 24, 25, 30, or 75
				wavsplit [options] wavfile min:sec:fr [min:sec:fr]...
	-s	--seconds	Use Seconds
				wavsplit [options] wavfile sec [sec]...
	-t	--tracktimes	Use individual track times (instead of cumulative split times)  
	-h	--help		This info

You can combine both Hours and frames options

Examples:
	wavsplit --frames 30 file.wav 32:21:15 45:10:0
	wavsplit --Hours file.wav 1:32:21:59.2 1:45:10:0.3
	wavsplit --seconds file.wav 300.1 500.2
Une découpe d'une minute :
$ ./src/wavsplit ./01.wav -H 0:0:0:0.0 0:1:0:0.0

!================================================================================ 
! WAVSPLIT version 1.2.2 (http://www.fomalhaut.de)
! Licensed under GPL by author Tobias Weihmann
!--------------------------------------------------------------------------------
! Hour patch by Sacha Bartok (sacha@myrealbox.com)
! Modified for frames, hours, seconds, decimal seconds by Alan Fitch
! Modified for individual track lengths (non-cumulative splits) by Derek Schuff
! Update by Claude BULIN in version 1.2.2
!      bytes struct WAVE_HEADER
!      packaging with autotools
!      http://www.xcfa.tuxfamily.org/article14/wavsplit
!================================================================================

INFO: Hours:mins:sec format selected
-------------------------------
./01.wav
-------------------------------
RiffID       : RIFF
RiffSize     : 21872676
WaveID       : WAVE
FmtID        : fmt 
FmtSize      : 16
FormatTag    : 1
Channels     : 2
SamplesPerSec: 44100 Hz
gBytesPerSec : 176400
BlockAlign   : 4
BitsPerSample: 16
DataID       : data
DataBytes    : 21872640
-------------------------------
Split         Hours  Mins   Seconds         Bytes         %
[01]	until     0     0     0.000             0    0.00%
[02]	until     0     1     0.000      10584000    48.39%
[03]	until the end                    21872640   100.00%
Success.
Bref, si cette mise à jour d'application bien utile intéresse une Linuxienne ou un Linuxien, les paquets sont ici ...

La phase de transformation en binaire depuis le code source reste très simple:
$ tar xvfz ./wavsplit-1.2.2.tar.gz
$ cd wavsplit-1.2.2/
$ ./configure --prefix=/usr
$ make
Puis en mode adminitrateur:
# make install
Et à vous les joies du 'Split' avec par exemple depuis un dossier contenant des WAV:
$ wavsplit ./musique.wav -H 0:0:0:0.0 0:1:0:0.0


S i l'auteur initial de WavSplit passe dans le coin, qu'il s'arrête pour discuter autour d"un café ou d'une bière puis il pourra, si il le souhaite et si il est satisfait de mes modifications de code pour cette excellente application, repartir avec ce nouveau paquet sous le bras ;-)

Mots clés : aucun
Classé dans : Programmation