Compare commits
19 Commits
fe1de97f37
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ffbc4a13d4 | ||
|
|
b372e0428d | ||
|
|
4a3408633d | ||
|
|
4ed0ab33b9 | ||
|
|
c9154c923b | ||
|
|
9defba34c6 | ||
|
|
298c6e1d1e | ||
|
|
86f3f2e3e7 | ||
|
|
09453280b5 | ||
|
|
e7a76a8687 | ||
|
|
46fd99a74a | ||
|
|
a12010fcd8 | ||
|
|
b3ee8a0ccd | ||
|
|
7ac8a917a4 | ||
|
|
00fc91a451 | ||
|
|
d61fff9b4d | ||
|
|
5ebc44a9be | ||
|
|
eb74809d59 | ||
|
|
7e38e55e3a |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -43,6 +43,8 @@
|
||||
*.idb
|
||||
*.pdb
|
||||
|
||||
core
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
|
||||
8
Ecoute/.gitignore
vendored
8
Ecoute/.gitignore
vendored
@@ -1,3 +1,11 @@
|
||||
|
||||
ecoute
|
||||
|
||||
*.wav
|
||||
*.ogg
|
||||
*.flac
|
||||
*.mp3
|
||||
*.au
|
||||
*.opus
|
||||
|
||||
toto
|
||||
|
||||
@@ -9,7 +9,9 @@ de disque ne sont pas là.
|
||||
En fait, j'ai commencé à écrire ce logiciel il y a très
|
||||
longtemps pour découvrir
|
||||
[libsndfile](https://en.wikipedia.org/wiki/Libsndfile).
|
||||
Ensuite, je l'ai un peu oublié dans son coin. Mais je
|
||||
Ensuite, je l'ai un peu oublié dans son coin.
|
||||
Il manque même pas mal de formats de base (ex, le .ogg) dans
|
||||
ce qu'il connait. Mais je
|
||||
viens de lui trouver une nouvelle utilité, il va m'aider
|
||||
à trier les fichiers de mon [Tascam](https://www.thomann.de/intl/tascam_dr_05x.htm). Il faut juste rajouter les fonctions
|
||||
qui manquent.
|
||||
@@ -18,24 +20,55 @@ qui manquent.
|
||||
## Compilation
|
||||
|
||||
Il faut installer les paquets
|
||||
`libao-dev` et `libsndfile-dev` avoir de pouvoir
|
||||
générer le moindre exécutable. Ensuite, un tout simple
|
||||
`libao-dev`, `libogg-dev`, et `libsndfile-dev` avoir de
|
||||
pouvoir générer le moindre exécutable.
|
||||
Les machins *ncurses* sont censé être là, sinon
|
||||
c'est `ncurses-dev` qui manque.
|
||||
|
||||
Ensuite, un tout simple
|
||||
run de `make` fera le travail.
|
||||
Dans le [Makefile](Makefile), vous avez quelques options à
|
||||
régler, genre le `DEBUG_LEVEL` si vous ne voulez pas
|
||||
submerger votre stderr.
|
||||
Mais si vous avez activé cette friture, vous
|
||||
lancer le logiciel par `./ecoute 2> tracelog` dans un xterm,
|
||||
puis vous lancez `tail -f tracelog` dans un autre xterm
|
||||
pour le voir raconter sa vie. *Astuce !*
|
||||
|
||||
## Utilisation
|
||||
|
||||
Une fois lancé, le logiciel vous affiche la liste des
|
||||
fichiers sons dans le répertoire courant. Parfois il
|
||||
en manque.
|
||||
|
||||
La touche **`?`** affiche une petite fenêtre d'aide.
|
||||
La touche **`Q`** (*:q!*) sort de ce machin.
|
||||
La touche **`Q`** (*:q!*) sort de ce machin.
|
||||
|
||||
Il y a des fonctions de tri (nom, taille, ...) par
|
||||
les touches dédiées (voir l'aide).
|
||||
En pressant **`I`** des informations diverses et
|
||||
souvent inutiles sur le fichier pointé.
|
||||
Le **`D`** propose un dump hexadécimal et ascii qui
|
||||
va être grandement amélioré dans les jours qui viennent.
|
||||
Et enfin avec **`$`**, vous aurez quelques informations techniques
|
||||
sur les trucs techniques.
|
||||
|
||||
|
||||
## Pour la suite ?
|
||||
|
||||
Première étape : Prévoir la possibilité de faire un *abort*
|
||||
pendant la lecture d'un fichier son.
|
||||
pendant la lecture d'un fichier son. Ça ne va pas être simple, il
|
||||
faut d'abord factoriser la fonction de scrutation du clavier
|
||||
pendant la lecture du son, et ensuite la brancher dans les
|
||||
différents modules.
|
||||
|
||||
Deuxième étape : Implémenter une fonction bien *molly-guarded* pour pouvoir effacer un fichier.
|
||||
Deuxième étape : Implémenter une fonction bien *molly-guarded* pour pouvoir
|
||||
effacer un fichier sans le moindre risque d'erreur.
|
||||
|
||||
Troisième étape : Ajouter un controle du volume sonore, ce qui implique
|
||||
de replonger dans `alsa` ou la doc de la libao...
|
||||
|
||||
tTh.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
|
||||
4 Feb 2005 : this is a new project. I want a console player for ogg/wav
|
||||
audiofiles, and may be ogg & speex.
|
||||
who suit my needs: standalone, lowcost, easytouse.
|
||||
|
||||
You need libsndfile and libao installed.
|
||||
|
||||
I DON'T know the technic for playing .ogg files :(
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
TODO:
|
||||
- build the ogg player *now*
|
||||
- rename some files, because the 'info displayer' go in the
|
||||
same file as the player.
|
||||
- write a better english.
|
||||
- build a function for detecting sound file with a bad .EXT
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
|
||||
- Thierry 'tTh' Boudet -
|
||||
@@ -1,49 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Ecoute, c'est du Tonton Th</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1 align=center>Ecoute</h1>
|
||||
|
||||
<p>
|
||||
Le tinyware <tt>ecoute</tt> est un embryon de <i>player</i> de fichiers
|
||||
son, destiné à un usage <i>one-shoot</i>: vous le lancez, il démarre
|
||||
en moins d'une seconde, vous choisissez le fichier à écouter, et
|
||||
voilà, c'est fini...
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Pour le moment, il sait lire les <tt>.wav</tt>, les <tt>.au</tt>
|
||||
et un format étrange que j'utilise pour mes diverses expériences
|
||||
sonores. Vous êtes prévenus, c'est un bricolage.
|
||||
</p>
|
||||
|
||||
<h2 align=center><a href="ecoute.tar.gz">download</a></h2>
|
||||
|
||||
<p align="center"><img src="ecoute-help.gif" alt="capture fenetre aide"></p>
|
||||
|
||||
|
||||
<p align="center"><img src="ecoute-dump.gif" alt="capture fenetre dump"></p>
|
||||
|
||||
<p>
|
||||
La prochaine étape sera la lecture des <tt>.ogg</tt>, suivie de peu
|
||||
par les <tt>.speex</tt>. Quand ces deux formats seront assimilés,
|
||||
je me pencherais volontiers sur des améliorations de l'interface
|
||||
utilisateur, afin d'en faire un truc encore plus <i>one-shoot</i>,
|
||||
tout en conservant l'aspect glamour de l'interface ncurses.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
C'est fait sur, et pour, du Linux. Il faut avoir les bibliothèques
|
||||
<tt>libsndfile</tt>, <tt>libogg</tt> et <tt>libao</tt> installées.
|
||||
A priori, c'est
|
||||
portable vers d'autres variantes d'Unix. D'ailleurs, je vais
|
||||
essayer de le faire tourner dans OpenBSD un de ces soirs, parce
|
||||
que bon, ya pas de raisons que ça ne marche pas.
|
||||
Enfin, si il y en a, on va bientôt savoir lesquelles...
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -7,7 +7,7 @@ ecoute \- ncurses based note,wav,ogg,au player.
|
||||
\fBecoute\fP
|
||||
|
||||
.SH OPTIONS
|
||||
No command-line available.
|
||||
-s <newdir> : change working directory to <newdir>.
|
||||
|
||||
.SH INTERACTIVE
|
||||
This player is a real ncurses based interactive software.
|
||||
|
||||
@@ -8,11 +8,12 @@
|
||||
#
|
||||
#----------------------------------------------------------------
|
||||
|
||||
VERSION=0.0036
|
||||
VERSION=0.0040
|
||||
|
||||
TEKFLAG= -DDEBUG_LEVEL=1 -g
|
||||
CFLAGS=-Wall -Wextra -ansi $(TEKFLAG) -DVERSION=\"$(VERSION)\"
|
||||
BIBS=-lncurses -lao -lsndfile -logg
|
||||
TEKFLAG = -DDEBUG_LEVEL=1 -g
|
||||
CFLAGS = -std=c11 -Wall -Wextra -ansi -Wlogical-op \
|
||||
$(TEKFLAG) -DVERSION=\"$(VERSION)\"
|
||||
BIBS = -lncurses -lao -lsndfile -logg
|
||||
|
||||
#---------------------------------------------------------
|
||||
|
||||
@@ -33,12 +34,13 @@ playau.o: playau.c ecoute.h Makefile
|
||||
playogg.o: playogg.c ecoute.h Makefile
|
||||
playspeex.o: playspeex.c ecoute.h Makefile
|
||||
playflac.o: playflac.c ecoute.h Makefile
|
||||
rmfile.o: rmfile.c ecoute.h Makefile
|
||||
|
||||
OBJ=main.o ecran.o playnote.o playwav.o playogg.o fonctions.o interactive.o \
|
||||
dump.o playau.o playspeex.o playflac.o magic.o ifao.o
|
||||
dump.o playau.o playspeex.o playflac.o magic.o ifao.o rmfile.o
|
||||
|
||||
ecoute: $(OBJ)
|
||||
gcc $(TEKFLAG) $(OBJ) $(BIBS) -o ecoute
|
||||
gcc $(CFLAGS) $(OBJ) $(BIBS) -o ecoute
|
||||
|
||||
#---------------------------------------------------------
|
||||
# services targets
|
||||
13
Ecoute/src/README.md
Normal file
13
Ecoute/src/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
## dump.c
|
||||
## ecran.c
|
||||
## fonctions.c
|
||||
## ifao.c
|
||||
## interactive.c
|
||||
## magic.c
|
||||
## main.c
|
||||
## playau.c
|
||||
## playflac.c
|
||||
## playnote.c
|
||||
## playogg.c
|
||||
## playspeex.c
|
||||
## playwav.c
|
||||
@@ -14,7 +14,7 @@
|
||||
/*==------------------------------------------------------------------==*/
|
||||
#define T_BUFF_HEX (16*16)
|
||||
|
||||
int hexadump(char *fname, WINDOW *w)
|
||||
static int hexadump(char *fname, WINDOW *w)
|
||||
{
|
||||
int fd;
|
||||
unsigned char buffer[T_BUFF_HEX];
|
||||
@@ -25,24 +25,20 @@ char chaine[10], lettre;
|
||||
fprintf(stderr, "hexadump of %s\n", fname);
|
||||
#endif
|
||||
|
||||
if ( (fd=open(fname, O_RDONLY)) < 0 )
|
||||
{
|
||||
if ( (fd=open(fname, O_RDONLY)) < 0 ) {
|
||||
mvwaddstr(w, 2, 2, "err open"); wrefresh(w);
|
||||
getch();
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( T_BUFF_HEX != read(fd, buffer, T_BUFF_HEX) )
|
||||
{
|
||||
if ( T_BUFF_HEX != read(fd, buffer, T_BUFF_HEX) ) {
|
||||
mvwaddstr(w, 2, 2, "err read"); wrefresh(w);
|
||||
getch();
|
||||
}
|
||||
close(fd);
|
||||
|
||||
for (lig=0; lig<16; lig++)
|
||||
{
|
||||
for (col=0; col<16; col++)
|
||||
{
|
||||
for (lig=0; lig<16; lig++) {
|
||||
for (col=0; col<16; col++) {
|
||||
idx = (lig*16) + col;
|
||||
sprintf(chaine, "%02x", buffer[idx]);
|
||||
mvwaddstr(w, lig+1, (col*3)+1, chaine);
|
||||
@@ -64,7 +60,6 @@ return 0;
|
||||
int dump_this_file(char *fname, int flag)
|
||||
{
|
||||
WINDOW *popup;
|
||||
int foo;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">> dump_this_file ( '%s' %d )\n", fname, flag);
|
||||
@@ -73,11 +68,11 @@ fprintf(stderr, ">> dump_this_file ( '%s' %d )\n", fname, flag);
|
||||
popup = newwin(18, 68, L_POPUP, C_POPUP);
|
||||
bordure(popup, 1);
|
||||
mvwaddstr(popup, 0, 2, "{ dump of ");
|
||||
mvwaddstr(popup, 0, 13, fname);
|
||||
mvwaddstr(popup, 0, 13+strlen(fname), " }");
|
||||
mvwaddstr(popup, 0, 12, fname);
|
||||
mvwaddstr(popup, 0, 12+strlen(fname), " }");
|
||||
wrefresh(popup);
|
||||
|
||||
foo = hexadump(fname, popup);
|
||||
(void)hexadump(fname, popup);
|
||||
|
||||
wrefresh(popup);
|
||||
getch();
|
||||
@@ -43,6 +43,8 @@ int fileselector(void);
|
||||
#define SON_OGG 20
|
||||
#define SON_SPEEX 21
|
||||
#define SON_FLAC 22
|
||||
#define SON_OPUS 23
|
||||
#define SON_MP3 24
|
||||
#define SON_AU 128
|
||||
|
||||
/*
|
||||
@@ -95,6 +97,6 @@ int start_sound_output(int k);
|
||||
int stop_sound_output(int k);
|
||||
int infos_sound_output(char *title);
|
||||
|
||||
void infos_driver_son(void);
|
||||
void infos_techniques(void);
|
||||
|
||||
/*==------------------------------------------------------------------==*/
|
||||
@@ -6,9 +6,14 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define _POSIX_C_SOURCE 600L /* for fileno(3) */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/select.h>
|
||||
|
||||
#include "ecoute.h"
|
||||
|
||||
/*==------------------------------------------------------------------==*/
|
||||
@@ -19,10 +24,8 @@ int couleur = 0;
|
||||
/*==------------------------------------------------------------------==*/
|
||||
void bordure(WINDOW * w, int flag)
|
||||
{
|
||||
if (flag)
|
||||
box(w, 0, 0);
|
||||
else
|
||||
wborder(w, '|', '|', '-', '-', '+', '+', '+', '+');
|
||||
if (flag) box(w, 0, 0);
|
||||
else wborder(w, '|', '|', '-', '-', '+', '+', '+', '+');
|
||||
}
|
||||
/*==------------------------------------------------------------------==*/
|
||||
int alerte(char *texte, int flag)
|
||||
@@ -63,12 +66,16 @@ fprintf(stderr, "maxval %ld val %ld largeur %d curseur %d\n",
|
||||
#endif
|
||||
|
||||
chaine[0] = '[', chaine[largeur] = ']', chaine[largeur+1] = '\0';
|
||||
for (foo=1; foo<largeur; foo++)
|
||||
{
|
||||
if (foo<curseur)
|
||||
chaine[foo] = 'o';
|
||||
else
|
||||
chaine[foo] = '-';
|
||||
for (foo=1; foo<largeur; foo++) {
|
||||
if (type) {
|
||||
if (foo<curseur) chaine[foo] = 'o';
|
||||
else chaine[foo] = '-';
|
||||
}
|
||||
else {
|
||||
if (foo<curseur) chaine[foo] = '*';
|
||||
else chaine[foo] = '.';
|
||||
}
|
||||
|
||||
}
|
||||
mvwaddstr(win, haut_win-3, 2, chaine);
|
||||
wrefresh(win);
|
||||
@@ -77,6 +84,42 @@ foo = 42;
|
||||
return foo;
|
||||
}
|
||||
/*==------------------------------------------------------------------==*/
|
||||
/*
|
||||
* detection de la frappe d'une touche clavier -- remember kbhit() ?
|
||||
*/
|
||||
int is_a_key_hitted(void)
|
||||
{
|
||||
int fd,retv;
|
||||
fd_set in_fds;
|
||||
struct timeval tv;
|
||||
|
||||
fd = fileno(stdin);
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s: fileno -> %d\n", __func__, fd);
|
||||
#endif
|
||||
|
||||
FD_ZERO(&in_fds); FD_SET(fd, &in_fds);
|
||||
tv.tv_sec = tv.tv_usec = 0;
|
||||
|
||||
retv = select(1, &in_fds, NULL, NULL, &tv);
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s: select -> %d\n", __func__, retv);
|
||||
#endif
|
||||
|
||||
if (-1 == retv) {
|
||||
perror("select()");
|
||||
}
|
||||
else if (0 == retv) {
|
||||
/* no key hit */
|
||||
}
|
||||
else {
|
||||
/* got a keypress */
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*==------------------------------------------------------------------==*/
|
||||
void termine_ecran(void)
|
||||
{
|
||||
endwin(); exit(0);
|
||||
@@ -91,8 +134,7 @@ fprintf(stderr, ">>> %s ( )\n", __func__);
|
||||
|
||||
initscr();
|
||||
|
||||
if (has_colors())
|
||||
{
|
||||
if (has_colors()) {
|
||||
use_default_colors();
|
||||
couleur = 1;
|
||||
}
|
||||
@@ -15,6 +15,7 @@ long taille_fichier(int fd)
|
||||
{
|
||||
struct stat st;
|
||||
int foo;
|
||||
|
||||
foo = fstat(fd, &st);
|
||||
if (foo) {
|
||||
perror("fonctions.c:18 fstat");
|
||||
@@ -27,14 +28,15 @@ struct un_type_de_fichier {
|
||||
char *extension;
|
||||
int numtype;
|
||||
char *descr;
|
||||
} types_de_fichiers[] =
|
||||
{
|
||||
} types_de_fichiers[] = {
|
||||
{ ".note", SON_NOTE, "tTh .note files" },
|
||||
{ ".wav", SON_WAV, "Microsoft Wave" },
|
||||
{ ".ogg", SON_OGG, "Xiph Ogg/Vorbis" },
|
||||
{ ".speex", SON_SPEEX, "Xiph Compressed speach" },
|
||||
{ ".au", SON_AU, "Sun/NeXT audio data" },
|
||||
{ ".flac", SON_FLAC, "Free Lossless Audio Codec" },
|
||||
{ ".opus", SON_OPUS, "OPUS" },
|
||||
{ ".mp3", SON_MP3, "mp3" },
|
||||
};
|
||||
#define NBR_TYPES \
|
||||
(sizeof(types_de_fichiers)/sizeof(struct un_type_de_fichier))
|
||||
@@ -55,12 +57,10 @@ int foo, len_nom, len_ext;
|
||||
fprintf(stderr, "type_du_fichier(%s)\n", nom);
|
||||
#endif
|
||||
len_nom = strlen(nom);
|
||||
for (foo=0; foo<NBR_TYPES; foo++)
|
||||
{
|
||||
for (foo=0; foo<(int)NBR_TYPES; foo++) {
|
||||
len_ext = strlen(types_de_fichiers[foo].extension);
|
||||
if ( (len_nom > len_ext) &&
|
||||
!strcmp(nom+(len_nom-len_ext), types_de_fichiers[foo].extension) )
|
||||
{
|
||||
!strcmp(nom+(len_nom-len_ext), types_de_fichiers[foo].extension) ) {
|
||||
#if DEBUG_LEVEL > 1
|
||||
fprintf(stderr, " found %s\n", types_de_fichiers[foo].descr);
|
||||
#endif
|
||||
@@ -78,11 +78,9 @@ char *type2ext(int type)
|
||||
{
|
||||
int foo;
|
||||
|
||||
if (type == SON_UNKNOW)
|
||||
return "unknow";
|
||||
if (type == SON_UNKNOW) return "unknow";
|
||||
|
||||
for (foo=0; foo<NBR_TYPES; foo++)
|
||||
{
|
||||
for (foo=0; foo<(int)NBR_TYPES; foo++) {
|
||||
if (type==types_de_fichiers[foo].numtype)
|
||||
return (types_de_fichiers[foo].extension)+1;
|
||||
}
|
||||
@@ -93,11 +91,9 @@ char *type2descr(int type)
|
||||
{
|
||||
int foo;
|
||||
|
||||
if (type == SON_UNKNOW)
|
||||
return "unknow";
|
||||
if (type == SON_UNKNOW) return "unknow";
|
||||
|
||||
for (foo=0; foo<NBR_TYPES; foo++)
|
||||
{
|
||||
for (foo=0; foo<(int)NBR_TYPES; foo++) {
|
||||
if (type==types_de_fichiers[foo].numtype)
|
||||
return (types_de_fichiers[foo].descr);
|
||||
}
|
||||
@@ -113,6 +109,11 @@ WINDOW *popup;
|
||||
fprintf(stderr, ">>> %s ( '%s' %d 0x%x )\n", __func__, nom, type, flags);
|
||||
#endif
|
||||
|
||||
if (NULL==nom) {
|
||||
/* molly-guard */
|
||||
fprintf(stderr, "%s:%s called with a NULL name\n", __FILE__, __func__);
|
||||
return -1;
|
||||
}
|
||||
/*
|
||||
* ncurses initial stuff
|
||||
*/
|
||||
@@ -149,7 +150,7 @@ switch (type)
|
||||
break;
|
||||
}
|
||||
|
||||
foo = stop_sound_output(0);
|
||||
(void)stop_sound_output(0);
|
||||
|
||||
/*
|
||||
* screen washing.
|
||||
@@ -164,13 +165,16 @@ fprintf(stderr, " end of %s\n", __func__);
|
||||
return foo;
|
||||
}
|
||||
/*==------------------------------------------------------------------==*/
|
||||
/*
|
||||
* mey be, here, we can use the internals functions
|
||||
* of libsndfile ?
|
||||
*/
|
||||
int info_about_this_file(char *nom, int type)
|
||||
{
|
||||
int foo;
|
||||
WINDOW *popup;
|
||||
char chaine[100];
|
||||
struct stat st;
|
||||
long magicbits;
|
||||
|
||||
/*
|
||||
* ncurses initial stuff
|
||||
@@ -188,29 +192,25 @@ wrefresh(popup);
|
||||
* filesystem infos
|
||||
*/
|
||||
foo = stat(nom, &st);
|
||||
if (foo != 0)
|
||||
{
|
||||
mvwaddstr(popup, 3, 2, "hu ho, stat failed ?");
|
||||
if (foo != 0) {
|
||||
mvwaddstr(popup, 2, 2, "hu ho, stat failed ?");
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
sprintf(chaine, "owned by: user id %d, group id %d",
|
||||
st.st_uid, st.st_gid);
|
||||
mvwaddstr(popup, 3, 2, chaine);
|
||||
mvwaddstr(popup, 2, 2, chaine);
|
||||
sprintf(chaine, "size: %ld bytes or %ld MB.",
|
||||
st.st_size,
|
||||
1 + (st.st_size / (1024*1024)) );
|
||||
mvwaddstr(popup, 4, 2, chaine);
|
||||
mvwaddstr(popup, 3, 2, chaine);
|
||||
}
|
||||
|
||||
/*
|
||||
* internals infos
|
||||
*/
|
||||
foo = magic_detect(nom, &magicbits);
|
||||
sprintf(chaine, "magic_detect: %4d", foo);
|
||||
mvwaddstr(popup, 8, 2, chaine);
|
||||
mvwaddstr(popup, 8, 25, type2descr(foo));
|
||||
|
||||
sprintf(chaine, "magic_detect: %4d / ", type);
|
||||
mvwaddstr(popup, 6, 2, chaine);
|
||||
mvwaddstr(popup, 6, 25, type2descr(type));
|
||||
wrefresh(popup);
|
||||
getch();
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <ao/ao.h>
|
||||
|
||||
#include <sndfile.h>
|
||||
#include "ecoute.h"
|
||||
|
||||
/*==------------------------------------------------------------------==*/
|
||||
@@ -98,39 +98,24 @@ fprintf(stderr, " | is active ? %s\n", isactive ? "yes" : "no");
|
||||
return -1;
|
||||
}
|
||||
/*==------------------------------------------------------------------==*/
|
||||
void infos_driver_son(void)
|
||||
void infos_techniques(void)
|
||||
{
|
||||
int foo;
|
||||
WINDOW *popup;
|
||||
char *cptr;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( )\n", __func__);
|
||||
#endif
|
||||
|
||||
#define VID_INV 0
|
||||
|
||||
popup = newwin(12, 60, L_POPUP, C_POPUP);
|
||||
bordure(popup, 1);
|
||||
#if VID_INV
|
||||
wstandout(popup);
|
||||
#endif
|
||||
mvwaddstr(popup, 0, 2, "{{ sound driver }}");
|
||||
#if VID_INV
|
||||
wstandend(popup);
|
||||
#endif
|
||||
wrefresh(popup);
|
||||
mvwaddstr(popup, 0, 2, "{ Technical infos }");
|
||||
|
||||
foo = start_sound_output(0);
|
||||
if (foo) {
|
||||
fprintf(stderr, " %s: start_sound_output -> %d\n", __func__, foo);
|
||||
}
|
||||
foo = stop_sound_output(0);
|
||||
if (foo) {
|
||||
fprintf(stderr, " %s: stop_sound_output -> %d\n", __func__, foo);
|
||||
}
|
||||
cptr = sf_version_string();
|
||||
mvwaddstr(popup, 2, 3, cptr);
|
||||
|
||||
mvwaddstr(popup, 4, 9, "* function not implemented *");
|
||||
mvwaddstr(popup, 11, 2, "{{ hit any key to reboot }}");
|
||||
/* mvwaddstr(popup, 11, 2, "* hit any key to reboot *"); */
|
||||
wrefresh(popup);
|
||||
getch();
|
||||
delwin(popup);
|
||||
@@ -44,6 +44,11 @@ static int nombre; /* nbre d'entr
|
||||
int teste_fichier(char *nom, struct stat *stb, int flag)
|
||||
{
|
||||
int foo;
|
||||
|
||||
if (flag) {
|
||||
fprintf(stderr, "in %s, flag must be 0, was %d\n", __func__, flag);
|
||||
}
|
||||
|
||||
foo = stat(nom, stb);
|
||||
if (foo) {
|
||||
fprintf(stderr, "in %s stat -> %d\n", __func__, errno);
|
||||
@@ -83,8 +88,7 @@ int trier_la_liste(int mode)
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "tri de la liste, mode=%d\n", mode);
|
||||
#endif
|
||||
switch(mode)
|
||||
{
|
||||
switch(mode) {
|
||||
case 1:
|
||||
qsort(liste, nombre, sizeof(FICH), cmp_name_asc);
|
||||
break;
|
||||
@@ -117,8 +121,7 @@ int foo, type;
|
||||
int devine;
|
||||
long magicbits;
|
||||
|
||||
if ( NULL == (liste = malloc(TCHONK*sizeof(FICH))) )
|
||||
{
|
||||
if ( NULL == (liste = malloc(TCHONK*sizeof(FICH))) ) {
|
||||
fprintf(stderr, "\nno memory in file-listing\n");
|
||||
abort();
|
||||
}
|
||||
@@ -127,23 +130,20 @@ dir = opendir(".");
|
||||
if (dir == NULL) { abort(); } /* XXX hard failure */
|
||||
|
||||
nombre = 0;
|
||||
while ( (de=readdir(dir)) != NULL)
|
||||
{
|
||||
#if DEBUG_LEVEL
|
||||
#endif
|
||||
if ( ! teste_fichier(de->d_name, &statbuf, 0) )
|
||||
{
|
||||
while ( (de=readdir(dir)) != NULL) {
|
||||
if ( ! teste_fichier(de->d_name, &statbuf, 0) ) {
|
||||
continue;
|
||||
}
|
||||
type = type_du_fichier(de->d_name);
|
||||
if (type < 0)
|
||||
{
|
||||
if (type < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* use the magic system (new 13 mai, may be bugged) */
|
||||
devine = magic_detect(de->d_name, &magicbits);
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s %s %d\n", __func__, de->d_name, devine);
|
||||
#endif
|
||||
|
||||
/* strdup is a 'non-portable' function ? */
|
||||
liste[nombre].nom = strdup(de->d_name);
|
||||
@@ -157,8 +157,7 @@ while ( (de=readdir(dir)) != NULL)
|
||||
#endif
|
||||
nombre++;
|
||||
/* if needed, increase the size of the list */
|
||||
if (nombre >= taille)
|
||||
{
|
||||
if (nombre >= taille) {
|
||||
liste = realloc(liste, sizeof(FICH)*(taille+TCHONK));
|
||||
taille += TCHONK;
|
||||
}
|
||||
@@ -175,7 +174,7 @@ int ln;
|
||||
|
||||
ln = strlen(liste[number].nom);
|
||||
|
||||
mvwprintw(w, line, 2, "%3d %-40s %9d ",
|
||||
mvwprintw(w, line, 2, " %3d %-50s %9d ",
|
||||
liste[number].idx,
|
||||
liste[number].nom,
|
||||
liste[number].taille);
|
||||
@@ -195,7 +194,9 @@ fprintf(stderr, ">>> %s ( )\n", __func__);
|
||||
#endif
|
||||
|
||||
foo = faire_la_liste();
|
||||
|
||||
if (0 == foo) {
|
||||
/* XXX ERROR MESSAGE AND QUIT ? */
|
||||
}
|
||||
affh = LINES-7;
|
||||
/*
|
||||
* create a subwindow for list of files
|
||||
@@ -213,16 +214,14 @@ flag_exit = 0;
|
||||
fprintf(stderr, " %s enter interactive\n", __func__);
|
||||
#endif
|
||||
|
||||
do
|
||||
{
|
||||
do {
|
||||
#if DEBUG_LEVEL > 1
|
||||
sprintf(chaine, "nombre:%3d first:%3d curseur:%3d",
|
||||
nombre, first, curseur);
|
||||
mvwaddstr(wfs, 0, 50, chaine);
|
||||
#endif
|
||||
|
||||
for (foo=0; foo<affh; foo++)
|
||||
{
|
||||
for (foo=0; foo<affh; foo++) {
|
||||
idx = foo+first;
|
||||
if (idx >= nombre) break;
|
||||
|
||||
@@ -239,8 +238,7 @@ do
|
||||
/*
|
||||
* ici il faudrait effacer le curseur ?
|
||||
*/
|
||||
switch (key)
|
||||
{
|
||||
switch (key) {
|
||||
case KEY_UP:
|
||||
if (curseur) curseur--;
|
||||
else if (first>0) first--;
|
||||
@@ -259,21 +257,25 @@ do
|
||||
/* the show must go on */
|
||||
case '\r': case 'p':
|
||||
idx = curseur+first; /* ??? */
|
||||
play_this_file(liste[idx].nom, liste[idx].son.type, 0);
|
||||
foo = play_this_file(liste[idx].nom, liste[idx].son.type, 0);
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "play '%s' => %d\n",liste[idx].nom, foo);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 'D': case 'd':
|
||||
idx = curseur+first; /* ??? FIXME */
|
||||
idx = curseur+first;
|
||||
/* second parameter is ignored */
|
||||
dump_this_file(liste[idx].nom, 0);
|
||||
break;
|
||||
|
||||
case 'I': case 'i':
|
||||
idx = curseur+first; /* ??? FIXME */
|
||||
idx = curseur+first;
|
||||
info_about_this_file(liste[idx].nom,
|
||||
liste[idx].son.type);
|
||||
break;
|
||||
|
||||
case 'A': case 'a': about(); break;
|
||||
case 'A': case 'a': about(); break;
|
||||
case 'H': case 'h': case '?': help(); break;
|
||||
|
||||
case 'n': trier_la_liste(1); break;
|
||||
@@ -283,9 +285,9 @@ do
|
||||
case 'u': trier_la_liste(10); break;
|
||||
case 'U': trier_la_liste(11); break;
|
||||
|
||||
case '$': infos_driver_son(); break;
|
||||
case '$': infos_techniques(); break;
|
||||
|
||||
case 'Q': case 'q':
|
||||
case 'Q':
|
||||
flag_exit = 1;
|
||||
break;
|
||||
}
|
||||
@@ -20,13 +20,11 @@ int magic_detect(char *fname, long *pbits)
|
||||
int fd;
|
||||
char buffer[T_BUFF_MAGIC];
|
||||
|
||||
if ( (fd=open(fname, O_RDONLY)) < 0 )
|
||||
{
|
||||
if ( (fd=open(fname, O_RDONLY)) < 0 ) {
|
||||
perror(fname);
|
||||
return -1;
|
||||
}
|
||||
if ( T_BUFF_MAGIC != read(fd, buffer, T_BUFF_MAGIC) )
|
||||
{
|
||||
if ( T_BUFF_MAGIC != read(fd, buffer, T_BUFF_MAGIC) ) {
|
||||
close(fd);
|
||||
return -2;
|
||||
}
|
||||
@@ -69,4 +67,3 @@ if (0 == strncmp(buffer, "OggS", 4))
|
||||
return SON_UNKNOW;
|
||||
}
|
||||
/*==------------------------------------------------------------------==*/
|
||||
/*==------------------------------------------------------------------==*/
|
||||
@@ -17,7 +17,7 @@
|
||||
/*==------------------------------------------------------------------==*/
|
||||
static char *about_texte[] =
|
||||
{
|
||||
"{{ About... }}",
|
||||
"{ About... }",
|
||||
"Ecoute, a sound player - version " VERSION,
|
||||
"Another ugly software made by tontonTh",
|
||||
"",
|
||||
@@ -28,7 +28,7 @@ static char *about_texte[] =
|
||||
};
|
||||
static char *help_texte[] =
|
||||
{
|
||||
"{{ Help me }}",
|
||||
"{ Help me }",
|
||||
"<enter> Play the selected file",
|
||||
"A About this software...",
|
||||
"D Dump begin of file in hexadecimal",
|
||||
@@ -38,7 +38,7 @@ static char *help_texte[] =
|
||||
"tT Sort by file time",
|
||||
"uU Sort by order (unsort)",
|
||||
"I Infos about this file",
|
||||
"$ What is the sound driver ?",
|
||||
"$ Technical infos",
|
||||
"",
|
||||
"Q Quit",
|
||||
NULL
|
||||
@@ -52,8 +52,7 @@ char **ptr;
|
||||
|
||||
nblignes = largmax = 0;
|
||||
ptr = lignes+1;
|
||||
while ( *ptr != NULL )
|
||||
{
|
||||
while ( *ptr != NULL ) {
|
||||
#if DEBUG_LEVEL > 1
|
||||
fprintf(stderr, "%p %s\n", ptr, *ptr);
|
||||
#endif
|
||||
@@ -63,12 +62,11 @@ while ( *ptr != NULL )
|
||||
ptr++;
|
||||
}
|
||||
|
||||
popup = newwin((nblignes)+5, largmax+6, L_POPUP, C_POPUP);
|
||||
popup = newwin((nblignes)+4, largmax+7, L_POPUP, C_POPUP);
|
||||
bordure(popup, 1);
|
||||
wrefresh(popup);
|
||||
|
||||
for (foo=1; foo<=nblignes; foo++)
|
||||
{
|
||||
for (foo=1; foo<=nblignes; foo++) {
|
||||
mvwaddstr(popup, (foo)+1, 3, lignes[foo]);
|
||||
#if DEBUG_LEVEL > 1
|
||||
fprintf(stderr, "%4d %s\n", foo, lignes[foo]);
|
||||
@@ -116,21 +114,41 @@ int main(int argc, char * argv[])
|
||||
int opt = 0;
|
||||
int foo;
|
||||
char *audiodevice = "none";
|
||||
char *newdir = NULL;
|
||||
|
||||
while ((opt = getopt(argc, argv, "d:hx")) != -1) {
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "\n\tE C O U T E %d\n\n", getpid());
|
||||
#endif
|
||||
|
||||
while ((opt = getopt(argc, argv, "d:hs:x")) != -1) {
|
||||
switch (opt) {
|
||||
case 'd':
|
||||
audiodevice = optarg;
|
||||
break;
|
||||
case 'h':
|
||||
help_cli(argv[0]); break;
|
||||
case 's':
|
||||
newdir = optarg;
|
||||
break;
|
||||
case 'x':
|
||||
fprintf(stderr, "no crash available\n");
|
||||
exit(0);
|
||||
default:
|
||||
fprintf(stderr, "gni %c ?\n", opt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "audio device = %s\n", audiodevice);
|
||||
#endif
|
||||
|
||||
if (NULL != newdir) {
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "newdir = '%s'\n", newdir);
|
||||
#endif
|
||||
foo = chdir(newdir);
|
||||
}
|
||||
|
||||
foo = init_sound_output(audiodevice, 0);
|
||||
if (foo) {
|
||||
@@ -138,7 +156,9 @@ if (foo) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
infos_sound_output("dans main");
|
||||
#endif
|
||||
|
||||
prepare_ecran();
|
||||
|
||||
@@ -27,7 +27,7 @@ int driver;
|
||||
char chaine[100];
|
||||
short * samples;
|
||||
long total_lu;
|
||||
int lu;
|
||||
int foo, bar, lu;
|
||||
int maxsample;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
@@ -40,8 +40,7 @@ fprintf(stderr, ">>> %s ( '%s' %p )\n", __func__, fname, popup);
|
||||
memset(&sfinfo, 0, sizeof(sfinfo));
|
||||
|
||||
sndf = sf_open(fname, SFM_READ, &sfinfo);
|
||||
if (sndf==NULL)
|
||||
{
|
||||
if (NULL == sndf) {
|
||||
mvwaddstr(popup, 4, 4, "Invalid file ?");
|
||||
wrefresh(popup);
|
||||
getch();
|
||||
@@ -58,34 +57,41 @@ sprintf(chaine, "channels %d", sfinfo.channels);
|
||||
mvwaddstr(popup, 4, 5, chaine);
|
||||
sprintf(chaine, "format %x", sfinfo.format);
|
||||
mvwaddstr(popup, 5, 5, chaine);
|
||||
|
||||
wrefresh(popup);
|
||||
#if DEBUG_LEVEL
|
||||
getch();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* memory allocation
|
||||
* warning, we can get multiples channels.
|
||||
*/
|
||||
if ( NULL == (samples = malloc(T_BUFFER*sizeof(short))) )
|
||||
{
|
||||
perror("\n no memory in AU player");
|
||||
if ( NULL == (samples = malloc(T_BUFFER*sizeof(short)))) {
|
||||
perror("no memory in AU player\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
/*
|
||||
* configuration of the sound output
|
||||
*/
|
||||
ao_initialize();
|
||||
ao_initialize();
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s: ao ititialised\n", __func__);
|
||||
#endif
|
||||
|
||||
driver = ao_default_driver_id();
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s: ao default driver = %d\n", __func__, driver);
|
||||
#endif
|
||||
|
||||
memset(&format, 0, sizeof(format));
|
||||
format.bits = 16; /* ? */
|
||||
format.channels = sfinfo.channels;
|
||||
format.rate = sfinfo.samplerate;
|
||||
format.byte_format = AO_FMT_LITTLE; /* XXX ??? */
|
||||
|
||||
fprintf(stderr, "%s: going to open ao\n", __func__);
|
||||
|
||||
device = ao_open_live(driver, &format, NULL);
|
||||
if (device == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: open live -> %p\n", __func__, device);
|
||||
if (NULL == device) {
|
||||
fprintf(stderr, "\nEcoute: Error open device\n");
|
||||
/*
|
||||
* comment connaitre la cause de l'erreur ?
|
||||
@@ -99,32 +105,31 @@ if (device == NULL)
|
||||
*/
|
||||
total_lu = 0L;
|
||||
maxsample = 0;
|
||||
while ( (lu=sf_read_short(sndf, samples, T_BUFFER)) > 0 )
|
||||
{
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s: enter loop\n", __func__);
|
||||
#endif
|
||||
while ( (lu=sf_read_short(sndf, samples, T_BUFFER)) > 0 ) {
|
||||
ao_play(device, (char *)samples, lu*2);
|
||||
|
||||
/* WHY IS THIS CODE COMMENTED-OUT ?
|
||||
|
||||
for (foo=0; foo<lu; foo++)
|
||||
{
|
||||
bar = samples[foo];
|
||||
if (bar > maxsample)
|
||||
{
|
||||
sprintf(chaine, "%9ld %6d", total_lu, bar);
|
||||
for (foo=0; foo<lu; foo++) {
|
||||
bar = abs(samples[foo]);
|
||||
if (bar > maxsample) {
|
||||
sprintf(chaine, "%9ld max %6d", total_lu, bar);
|
||||
mvwaddstr(popup, 7, 1, chaine);
|
||||
wrefresh(popup);
|
||||
maxsample = bar;
|
||||
}
|
||||
}
|
||||
maxsample = 0;
|
||||
*/
|
||||
|
||||
total_lu += (long)lu;
|
||||
progress_bar(popup, total_lu/sfinfo.channels, sfinfo.frames, 0);
|
||||
progress_bar(popup, total_lu/sfinfo.channels, sfinfo.frames, 1);
|
||||
wrefresh(popup);
|
||||
}
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "maxsample = %d\n", maxsample);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* some cleanup...
|
||||
@@ -83,6 +83,7 @@ while ( (lu=read(fd, samples, T_BUFFER)) > 0 )
|
||||
/*
|
||||
* this is the end, my friends...
|
||||
*/
|
||||
free(samples);
|
||||
ao_close(device);
|
||||
ao_shutdown(); /* must be paired with ao_initialise */
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include <ao/ao.h> /* for the sound output */
|
||||
|
||||
@@ -21,10 +22,11 @@ ogg_sync_state oy;
|
||||
char *oggbuff;
|
||||
int ret;
|
||||
|
||||
mvwaddstr(popup, 1, 2, "Ogg playing: work in progress...");
|
||||
mvwaddstr(popup, 5, 2, fname);
|
||||
mvwaddstr(popup, 3, 2, "Ogg playing: work in progress...");
|
||||
wrefresh(popup); sleep(1);
|
||||
|
||||
mvwaddstr(popup, 6, 6, "*** COREDUMPING ***");
|
||||
/* mvwaddstr(popup, 6, 6, "*** COREDUMPING ***"); */
|
||||
wrefresh(popup); getch();
|
||||
|
||||
return -42; /* XXX */
|
||||
@@ -32,6 +34,7 @@ return -42; /* XXX */
|
||||
/*
|
||||
* preparation
|
||||
*/
|
||||
memset(&oy, 0, sizeof(oy));
|
||||
ret = ogg_sync_init(&oy);
|
||||
mvwprintw(popup, 2, 2, "ogg_sync_init -> %d", ret);
|
||||
|
||||
@@ -40,6 +43,10 @@ mvwprintw(popup, 3, 2, "ogg_sync_buffer -> %p", oggbuff);
|
||||
wrefresh(popup);
|
||||
getch();
|
||||
|
||||
/*
|
||||
* action !
|
||||
*/
|
||||
|
||||
/*
|
||||
* termination
|
||||
*/
|
||||
@@ -20,7 +20,7 @@ ao_sample_format format;
|
||||
ao_device * device;
|
||||
char chaine[120];
|
||||
short * samples;
|
||||
int lu;
|
||||
int lu, key;
|
||||
long total_lu;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
@@ -31,9 +31,8 @@ fprintf(stderr, ">>> %s ( '%s' %p )\n", __func__, fname, popup);
|
||||
* get help from 'sndfile' for getting datas
|
||||
*/
|
||||
memset(&sfinfo, 0, sizeof(sfinfo));
|
||||
|
||||
sndf = sf_open(fname, SFM_READ, &sfinfo);
|
||||
if (sndf==NULL)
|
||||
if (NULL==sndf)
|
||||
{
|
||||
mvwaddstr(popup, 4, 4, "Invalid file ?");
|
||||
wrefresh(popup);
|
||||
@@ -53,7 +52,6 @@ sprintf(chaine, "format 0x%x", sfinfo.format);
|
||||
mvwaddstr(popup, 5, 5, chaine);
|
||||
sprintf(chaine, "sections %d", sfinfo.sections);
|
||||
mvwaddstr(popup, 6, 5, chaine);
|
||||
|
||||
wrefresh(popup);
|
||||
|
||||
#if DEBUG_LEVEL > 1
|
||||
@@ -82,7 +80,7 @@ format.channels = sfinfo.channels;
|
||||
format.rate = sfinfo.samplerate;
|
||||
format.byte_format = AO_FMT_LITTLE; /* XXX ??? */
|
||||
device = ao_open_live(driver, &format, NULL);
|
||||
if (device == NULL)
|
||||
if (NULL==device)
|
||||
{
|
||||
fprintf(stderr, "\nEcoute: Error open device\n");
|
||||
/*
|
||||
@@ -105,7 +103,13 @@ while ( (lu=sf_read_short(sndf, samples, T_BUFFER)) > 0 )
|
||||
wrefresh(popup);
|
||||
|
||||
/* HERE WE HAVE TO DETECT A 'STOP LISTEN' FUNCTION. */
|
||||
|
||||
if (is_a_key_hitted()) {
|
||||
key = getch();
|
||||
fprintf(stderr, "%s key pressed 0x%X\n", __func__, key);
|
||||
if ('X' == key) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -125,7 +125,7 @@ char buffer[200];
|
||||
|
||||
barre_inverse(' ', 0);
|
||||
standout();
|
||||
mvaddstr(0, 2, " Visuel HexDiff v " VERSION " by tTh 2023 ");
|
||||
mvaddstr(0, 2, " Visuel HexDiff v " VERSION " by tTh 2024 ");
|
||||
#if TRACE
|
||||
sprintf(buffer, " screen size %dx%d ", COLS, LINES);
|
||||
foo = strlen(buffer);
|
||||
@@ -211,7 +211,7 @@ delwin(popup);
|
||||
static char *about_texte[] =
|
||||
{
|
||||
"Visuel Hexdiff - version " VERSION,
|
||||
"(c) 2023 by Thierry [tTh] Boudet",
|
||||
"(c) 2024 by Thierry [tTh] Boudet",
|
||||
"http://tboudet.free.fr/hexdiff/",
|
||||
"https://git.tetalab.org/tTh/KlugyTools/",
|
||||
"send bugs reports: tontonth@free.fr",
|
||||
@@ -319,7 +319,7 @@ return -1;
|
||||
/*----------------------------------------------------------------*/
|
||||
void version(void)
|
||||
{
|
||||
fprintf(stderr, "\nThis is 'hexdiff' v "VERSION", made by tTh in 2023\n");
|
||||
fprintf(stderr, "\nThis is 'hexdiff' v "VERSION", made by tTh in 2024\n");
|
||||
/* fprintf(stderr, "homepage: http://tboudet.free.fr/hexdiff/\n"); */
|
||||
fprintf(stderr, "homepage: https://git.tetalab.org/tTh/KlugyTools/\n");
|
||||
#if TRACE
|
||||
|
||||
57
README.md
57
README.md
@@ -2,27 +2,66 @@
|
||||
|
||||
Divers outils pour faire des choses diverses...
|
||||
|
||||
Beaucoup de choses anciennes que je traine de systèmes en systèmes, et qui ont
|
||||
parfois une utilité limitée. Du code qui a presque vingt ans.
|
||||
Beaucoup de choses anciennes que je traine de systèmes en systèmes, et qui ont parfois une utilité limitée.
|
||||
Du code qui a parfois presque vingt ans, et qui
|
||||
nécessite donc un peu de nettoyage.
|
||||
|
||||
## DumpGDBM
|
||||
|
||||
Pour le debug des fichiers `key/data` géres par GDBM. Ligne de commande
|
||||
aver une interface _readline_.
|
||||
Pour le [debug](DumpGDBM) des fichiers `key/data` géres par GDBM.
|
||||
Ligne de commande avec une interface _readline_.
|
||||
|
||||
```
|
||||
tth@redlady:~/Devel/KlugyTools/DumpGDBM$ ./dumpgdbm -i exemple.gdbm
|
||||
working on [exemple.gdbm]
|
||||
dumpgdbm > ?
|
||||
----------------( Help me Obi Wan ! )---------------
|
||||
q ZZ :q :q! exit quit bye x hex hexa a ascii o octal h help ? f first
|
||||
m maxoctets maxbytes n next p print ks keysearch ds datasearch empty 7
|
||||
8 V version commands listcom sux
|
||||
-----------( use '? command' for details )----------
|
||||
dumpgdbm > p
|
||||
K: rtkit.
|
||||
D: RealtimeKit,,,.
|
||||
|
||||
dumpgdbm > n
|
||||
K: lightdm.
|
||||
D: Light Display Manager.
|
||||
|
||||
dumpgdbm > hex
|
||||
dumpgdbm > p
|
||||
K: 6c 69 67 68 74 64 6d 00
|
||||
D: 4c 69 67 68 74 20 44 69 73 70 6c 61 79 20 4d 61 6e 61 67 65 72 00
|
||||
```
|
||||
|
||||
## Hexdiff
|
||||
|
||||
Pour comparer visuellement deux fichiers binaires. Interface `ncurses` trop
|
||||
choupie. Devrait peut-être un jour (mais flemme) passer à la couleur.
|
||||
Pour comparer visuellement deux fichiers binaires.
|
||||
Interface `ncurses` trop choupie.
|
||||
Devrait peut-être un jour (mais flemme) passer à la couleur.
|
||||
|
||||

|
||||
|
||||
|
||||
## Checkresolv
|
||||
|
||||
Vieux truc rudimentaire pour fouiller dans la résolution de nom.
|
||||
Vieux truc rudimentaire pour [fouiller](CheckResolv) dans la résolution de nom.
|
||||
L'adaptation à `IPv6` est à l'étude.
|
||||
|
||||
|
||||
Contrairement à d'autres outils similaires, il utilise les
|
||||
fonctions de résolution de la `libc` au lieu de s'adresser directement
|
||||
au serveur de noms.
|
||||
|
||||
```
|
||||
tth@redlady:~/Devel/KlugyTools/CheckResolv$ ./checkresolv -r tetalab.org
|
||||
------------( tetalab.org
|
||||
h_name: tetalab.org
|
||||
ip: 89.234.156.223
|
||||
reverse 89.234.156.223 -> bobby.tetalab.org
|
||||
```
|
||||
|
||||
## Ecoute
|
||||
|
||||
Un [joueur](Ecoute) de fichiers musicaux surgi d'un lointain passé,
|
||||
qui va prendre un coup de jeune pour gérer les formats modernes.
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user