une ancienne version

This commit is contained in:
tTh 2023-11-29 21:28:26 +01:00
parent 04544e9500
commit 1584115e8b
19 changed files with 1825 additions and 0 deletions

3
Ecoute/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
ecoute

60
Ecoute/Makefile Normal file
View File

@ -0,0 +1,60 @@
#----------------------------------------------------------------
#
# abominable sound console player
# by Thierry 'tth' Boudet - build on Slackware.
#
# Recent versions: http://tontonth.free.fr/
# complains go to "tontonth O free o fr".
#
#----------------------------------------------------------------
VERSION=0.0036
TEKFLAG= -DDEBUG_LEVEL=1 -g
CFLAGS=-Wall -Wextra -ansi $(TEKFLAG) -DVERSION=\"$(VERSION)\"
BIBS=-lncurses -lao -lsndfile -logg
#---------------------------------------------------------
all: ecoute
#---------------------------------------------------------
main.o: main.c ecoute.h Makefile
ecran.o: ecran.c ecoute.h Makefile
dump.o: dump.c ecoute.h Makefile
magic.o: magic.c ecoute.h Makefile
interactive.o: interactive.c ecoute.h Makefile
fonctions.o: fonctions.c ecoute.h Makefile
ifao.o: ifao.c ecoute.h Makefile
playwav.o: playwav.c ecoute.h Makefile
playnote.o: playnote.c ecoute.h Makefile
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
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
ecoute: $(OBJ)
gcc $(TEKFLAG) $(OBJ) $(BIBS) -o ecoute
#---------------------------------------------------------
# services targets
FILES=*.c *.h *.txt Makefile *.man *.html
install: ecoute
cp ./ecoute /usr/local/bin
lines:
wc $(FILES) | sort -n
tarball: $(FILES)
ls $^ > MANIFEST ; \
( cd .. ; \
tar zcvf ecoute-$(VERSION).tar.gz `sed 's/^/Ecoute\//' Ecoute/MANIFEST` )
date >> tarball
#---------------------------------------------------------

21
Ecoute/README.txt Normal file
View File

@ -0,0 +1,21 @@
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 -

88
Ecoute/dump.c Normal file
View File

@ -0,0 +1,88 @@
/*
* dump.c
* ====== debug module for 'Ecoute' - 2005.03.06
*
* Warning: gruik coding inside.
*/
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <ctype.h>
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
#define T_BUFF_HEX (16*16)
int hexadump(char *fname, WINDOW *w)
{
int fd;
unsigned char buffer[T_BUFF_HEX];
int lig, col, idx;
char chaine[10], lettre;
#if DEBUG_LEVEL
fprintf(stderr, "hexadump of %s\n", fname);
#endif
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) )
{
mvwaddstr(w, 2, 2, "err read"); wrefresh(w);
getch();
}
close(fd);
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);
if (isprint(buffer[idx]))
lettre = buffer[idx];
else
lettre = '.';
mvwaddch(w, lig+1, col+50, lettre);
}
}
wrefresh(w);
return 0;
}
/*==------------------------------------------------------------------==*/
/*
* public entry point.
*/
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);
#endif
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), " }}");
wrefresh(popup);
foo = hexadump(fname, popup);
wrefresh(popup);
getch();
delwin(popup);
touchwin(stdscr); refresh();
return -1;
}
/*==------------------------------------------------------------------==*/

100
Ecoute/ecoute.h Normal file
View File

@ -0,0 +1,100 @@
/*
* ecoute.h
* -------- Fevrier 2005 a Frontignan-Plage
*
*/
#include <ncurses.h>
#define T_BUFFER 8192
/*==------------------------------------------------------------------==*/
void about(void);
void help(void);
/*==------------------------------------------------------------------==*/
/*
* ecran.c - ncurses related functions and global vars.
*/
#define L_POPUP 5
#define C_POPUP 9
void bordure(WINDOW * w, int flag);
int progress_bar(WINDOW *win, long val, long maxval, int type);
void prepare_ecran(void);
void say_goodbye(void);
extern int couleur;
/*==------------------------------------------------------------------==*/
/*
* interactive.c - choice a file to play
*/
#define SORT_NAME_A 1
#define SORT_NAME_B 2
int fileselector(void);
/*==------------------------------------------------------------------==*/
/*
* sound file types
*/
#define SON_UNKNOW 0
#define SON_NOTE 42
#define SON_WAV 95
#define SON_OGG 20
#define SON_SPEEX 21
#define SON_FLAC 22
#define SON_AU 128
/*
* players functions
*/
int note_player(char *fname, WINDOW *popup);
int wav_player(char *fname, WINDOW *popup);
int au_player(char *fname, WINDOW *popup);
int ogg_player(char *fname, WINDOW *popup);
int speex_player(char *fname, WINDOW *popup);
int flac_player(char *fname, WINDOW *popup);
/*==------------------------------------------------------------------==*/
/*
* _magic.c_ check if the file is a sound file.
*/
int magic_detect(char *filename, long *pb);
void magic_plop(int type);
/*==------------------------------------------------------------------==*/
/*
* 'fonctions.c'
*/
long taille_fichier(int fd);
int type_du_fichier(char *nom);
char *type2ext(int type);
char *type2descr(int type);
/*
* Flags is a bitfield
*/
int play_this_file(char *nom, int type, int flags);
/*
* new, 18 Avril 2005, proto may change.
*/
int info_about_this_file(char *nom, int type);
/*==------------------------------------------------------------------==*/
/*
* hexadecimal dumper.
*/
int dump_this_file(char *fname, int flag);
/*
* libao technical interface
*/
int init_sound_output(char *dev, int k);
int setup_sound_output(int splr, int nbch);
int start_sound_output(int k);
int stop_sound_output(int k);
int infos_sound_output(char *title);
void infos_driver_son(void);
/*==------------------------------------------------------------------==*/

49
Ecoute/ecoute.html Normal file
View File

@ -0,0 +1,49 @@
<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>

30
Ecoute/ecoute.man Normal file
View File

@ -0,0 +1,30 @@
.TH Ecoute 1 "2005 September" "various OS" "Tonton Th"
.SH NAME
ecoute \- ncurses based note,wav,ogg,au player.
.SH SYNOPSYS
\fBecoute\fP
.SH OPTIONS
No command-line available.
.SH INTERACTIVE
This player is a real ncurses based interactive software.
Full of bugs, a lot of to_be_done functions. You can try
the '?' key at main screen.
.SH CONFIG FILE
All your config files are belong to us.
.SH WHAT IS A .note FILE ?
This a raw, monophonic, 16 bits, 24000 smpl/s binary file.
You can seek the web for a 'ziktth' software if you need more informations.
.SH AUTHOR(S)
Thierry (aka tth) Boudet. http://tboudet.free.fr/
.SH DEDICACE
This software is dedicated to DEC, who build the pdp11.

119
Ecoute/ecran.c Normal file
View File

@ -0,0 +1,119 @@
/*
* ecran.c
* -------
*
* Maybe, one day, we can have colors...
*
*/
#include <stdlib.h>
#include <unistd.h>
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
/*
* global variables
*/
int couleur = 0;
/*==------------------------------------------------------------------==*/
void bordure(WINDOW * w, int flag)
{
if (flag)
box(w, 0, 0);
else
wborder(w, '|', '|', '-', '-', '+', '+', '+', '+');
}
/*==------------------------------------------------------------------==*/
int alerte(char *texte, int flag)
{
/*
* this func is a stub. real implementation for the next release.
*/
return -1;
}
/*==------------------------------------------------------------------==*/
#define T_MAX_PB 90
int progress_bar(WINDOW *win, long val, long maxval, int type)
{
int foo, largeur;
int larg_win, haut_win;
int curseur;
char chaine[T_MAX_PB+1];
/*
* premier defi, retrouver largeur et hauteur de la fenetre
*/
larg_win = getmaxx(win);
haut_win = getmaxy(win);
largeur = (T_MAX_PB<larg_win ? T_MAX_PB : larg_win) - 6;
#if DEBUG_LEVEL > 1
sprintf(chaine, "> x %-4d y %-4d l %-4d <", larg_win, haut_win, largeur);
mvwaddstr(win, 1, 1, chaine);
wrefresh(win);
#endif
curseur = (val*largeur) / maxval;
#if DEBUG_LEVEL > 1
fprintf(stderr, "maxval %ld val %ld largeur %d curseur %d\n",
maxval, val, largeur, curseur);
#endif
chaine[0] = '[', chaine[largeur] = ']', chaine[largeur+1] = '\0';
for (foo=1; foo<largeur; foo++)
{
if (foo<curseur)
chaine[foo] = 'o';
else
chaine[foo] = '-';
}
mvwaddstr(win, haut_win-3, 2, chaine);
wrefresh(win);
foo = 42;
return foo;
}
/*==------------------------------------------------------------------==*/
void termine_ecran(void)
{
endwin(); exit(0);
}
/*==------------------------------------------------------------------==*/
void prepare_ecran(void)
{
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( )\n", __func__);
#endif
initscr();
if (has_colors())
{
use_default_colors();
couleur = 1;
}
nonl(); cbreak(); noecho();
keypad(stdscr, TRUE); /* acces aux touches 'curseur' */
bordure(stdscr, 1);
standout();
mvaddstr(0, 5, "{ Ecoute v " VERSION " - by tTh }");
mvaddstr(LINES-1, 5, "{ hit '?' for help, 'Q' for quit }");
standend();
refresh();
atexit(termine_ecran);
}
/*==------------------------------------------------------------------==*/
void say_goodbye(void)
{
bordure(stdscr, 0);
wrefresh(stdscr);
}
/*==------------------------------------------------------------------==*/

223
Ecoute/fonctions.c Normal file
View File

@ -0,0 +1,223 @@
/*
* fonctions.c Ecoute: a sound player.
* ----------- 23 Fev 2005 - dans le froid de Frontignan
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
long taille_fichier(int fd)
{
struct stat st;
int foo;
foo = fstat(fd, &st);
if (foo) {
perror("fonctions.c:18 fstat");
return -1;
}
return st.st_size;
}
/*==------------------------------------------------------------------==*/
struct un_type_de_fichier {
char *extension;
int numtype;
char *descr;
} 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" },
};
#define NBR_TYPES \
(sizeof(types_de_fichiers)/sizeof(struct un_type_de_fichier))
/*==------------------------------------------------------------------==*/
/*
* this function is based on the .extension of the filename.
* this is a very crude system, because we run on Unix, where
* file extensions are not a hard law.
*
* see also 'magic.c' for a more advanced function...
*/
int type_du_fichier(char *nom)
{
int foo, len_nom, len_ext;
#if DEBUG_LEVEL > 1
fprintf(stderr, "type_du_fichier(%s)\n", nom);
#endif
len_nom = strlen(nom);
for (foo=0; foo<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) )
{
#if DEBUG_LEVEL > 1
fprintf(stderr, " found %s\n", types_de_fichiers[foo].descr);
#endif
return(types_de_fichiers[foo].numtype);
}
}
#if DEBUG_LEVEL > 1
fprintf(stderr, " fail...\n");
#endif
return -1;
}
/*==------------------------------------------------------------------==*/
char *type2ext(int type)
{
int foo;
if (type == SON_UNKNOW)
return "unknow";
for (foo=0; foo<NBR_TYPES; foo++)
{
if (type==types_de_fichiers[foo].numtype)
return (types_de_fichiers[foo].extension)+1;
}
return "???";
}
/*==------------------------------------------------------------------==*/
char *type2descr(int type)
{
int foo;
if (type == SON_UNKNOW)
return "unknow";
for (foo=0; foo<NBR_TYPES; foo++)
{
if (type==types_de_fichiers[foo].numtype)
return (types_de_fichiers[foo].descr);
}
return "lp0 on fire";
}
/*==------------------------------------------------------------------==*/
int play_this_file(char *nom, int type, int flags)
{
int foo;
WINDOW *popup;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' %d 0x%x )\n", __func__, nom, type, flags);
#endif
/*
* ncurses initial stuff
*/
popup = newwin(12, 60, L_POPUP, C_POPUP);
bordure(popup, 1);
/* wstandout(popup); */
mvwaddstr(popup, 0, 2, "{ playing ");
mvwaddstr(popup, 0, 12, nom);
mvwaddstr(popup, 0, 12+strlen(nom), " }");
/*wstandend(popup); */
wrefresh(popup);
foo = start_sound_output(0);
switch (type)
{
case SON_NOTE:
foo = note_player(nom, popup);
break;
case SON_WAV:
foo = wav_player(nom, popup);
break;
case SON_OGG:
foo = ogg_player(nom, popup);
break;
case SON_AU:
foo = au_player(nom, popup);
break;
case SON_SPEEX:
foo = speex_player(nom, popup);
break;
case SON_FLAC:
foo = flac_player(nom, popup);
break;
}
foo = stop_sound_output(0);
/*
* screen washing.
*/
delwin(popup);
touchwin(stdscr); refresh();
#if DEBUG_LEVEL
fprintf(stderr, " end of %s\n", __func__);
#endif
return foo;
}
/*==------------------------------------------------------------------==*/
int info_about_this_file(char *nom, int type)
{
int foo;
WINDOW *popup;
char chaine[100];
struct stat st;
long magicbits;
/*
* ncurses initial stuff
*/
popup = newwin(12, 64, L_POPUP, C_POPUP);
bordure(popup, 1);
wstandout(popup);
mvwaddstr(popup, 0, 2, "{ infos about ");
mvwaddstr(popup, 0, 16, nom);
mvwaddstr(popup, 0, 16+strlen(nom), " }");
wstandend(popup);
wrefresh(popup);
/*
* filesystem infos
*/
foo = stat(nom, &st);
if (foo != 0)
{
mvwaddstr(popup, 3, 2, "hu ho, stat failed ?");
}
else
{
sprintf(chaine, "owned by: user id %d, group id %d",
st.st_uid, st.st_gid);
mvwaddstr(popup, 3, 2, chaine);
sprintf(chaine, "size: %ld bytes ", st.st_size);
mvwaddstr(popup, 4, 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));
wrefresh(popup);
getch();
/*
* screen cleanup.
*/
delwin(popup);
touchwin(stdscr); refresh();
return foo;
}
/*==------------------------------------------------------------------==*/

141
Ecoute/ifao.c Normal file
View File

@ -0,0 +1,141 @@
/*
* ifao.c (libao interface)
* ------
*/
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ao/ao.h>
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
/*
* privates variables of this module. MUST be static !
*/
#define TBUF 100
static int isactive;
static char devname[TBUF+1];
static ao_sample_format AOSF;
/*==------------------------------------------------------------------==*/
/*
*/
int setup_sound_output(int splr, int nbch)
{
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %d %d )\n", __func__, splr, nbch);
#endif
if (splr) AOSF.rate = splr;
if (nbch) AOSF.channels = nbch;
return 0;
}
/*==------------------------------------------------------------------==*/
/*
* initialisation of this module who MUST be called
* before any use of this module !
*/
int init_sound_output(char *device, int k)
{
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' %d )\n", __func__, device, k);
#endif
/* some default values */
AOSF.rate = 44100;
AOSF.channels = 2;
AOSF.bits = 16;
AOSF.byte_format = AO_FMT_LITTLE; /* XXX ??? */
/* XXX see the libao documentation for exact syntax */
if (TBUF < strlen(device)) {
fprintf(stderr, "buffer overflow in %s\n", __func__);
exit(1);
}
strcpy(devname, device);
return 0;
}
/*==------------------------------------------------------------------==*/
int start_sound_output(int k)
{
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %d )\n", __func__, k);
#endif
return -1;
}
/*==------------------------------------------------------------------==*/
int stop_sound_output(int k)
{
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %d )\n", __func__, k);
#endif
return -1;
}
/*==------------------------------------------------------------------==*/
int infos_sound_output(char *title)
{
if (NULL==title) {
abort();
}
fprintf(stderr, " +------ snd out infos (%s)\n", title);
fprintf(stderr, " | device name '%s'\n", devname);
fprintf(stderr, " | sample rate %d\n", AOSF.rate);
fprintf(stderr, " | channels %d\n", AOSF.channels );
fprintf(stderr, " | bits/smpl %d\n", AOSF.bits );
fprintf(stderr, " | is active ? %s\n", isactive ? "yes" : "no");
return -1;
}
/*==------------------------------------------------------------------==*/
void infos_driver_son(void)
{
int foo;
WINDOW *popup;
#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);
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);
}
mvwaddstr(popup, 4, 9, "* function not implemented *");
mvwaddstr(popup, 11, 2, "{{ hit any key to reboot }}");
wrefresh(popup);
getch();
delwin(popup);
touchwin(stdscr); refresh();
}
/*==------------------------------------------------------------------==*/

301
Ecoute/interactive.c Normal file
View File

@ -0,0 +1,301 @@
/*
* fileselector.c
* -------------- 18 Fevrier 2005.
*
* some code borrowed from 'Visual Hexdiff' :-)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include "ecoute.h"
extern char *strdup(const char *); /* WTF? */
/*==------------------------------------------------------------------==*/
typedef struct {
long smplrate;
short channels;
short type;
} FICH_SON;
typedef struct {
long taille;
char *nom;
int idx;
time_t epochtime;
FICH_SON son;
} FICH;
static FICH *liste;
static int taille; /* taille de la liste */
static int nombre; /* nbre d'entrées dans la liste */
#define TCHONK 42
/*==------------------------------------------------------------------==*/
/*
* return 1 if we can safely read the file
*/
int teste_fichier(char *nom, struct stat *stb, int flag)
{
int foo;
foo = stat(nom, stb);
if (foo) {
fprintf(stderr, "in %s stat -> %d\n", __func__, errno);
}
if (S_ISDIR(stb->st_mode)) return 0;
/* XXX
* check if the file is readable
*/
return 1;
}
/*==------------------------------------------------------------------==*/
/*
* dedicated comparaison functions for sorting in the file selector.
*
*/
static int cmp_name_asc(const void *a, const void *b)
{ return strcmp( ((FICH *)a)->nom, ((FICH *)b)->nom); }
static int cmp_name_dsc(const void *a, const void *b)
{ return strcmp( ((FICH *)b)->nom, ((FICH *)a)->nom); }
static int cmp_idx_asc(const void *a, const void *b)
{ return ((FICH *)a)->idx - ((FICH *)b)->idx; }
static int cmp_idx_dsc(const void *a, const void *b)
{ return ((FICH *)b)->idx - ((FICH *)a)->idx; }
static int cmp_size_asc(const void *a, const void *b)
{ return ((FICH *)a)->taille - ((FICH *)b)->taille; }
static int cmp_size_dsc(const void *a, const void *b)
{ return ((FICH *)b)->taille - ((FICH *)a)->taille; }
/* and sorting by date ? */
/*==------------------------------------------------------------------==*/
int trier_la_liste(int mode)
{
#if DEBUG_LEVEL
fprintf(stderr, "tri de la liste, mode=%d\n", mode);
#endif
switch(mode)
{
case 1:
qsort(liste, nombre, sizeof(FICH), cmp_name_asc);
break;
case 2:
qsort(liste, nombre, sizeof(FICH), cmp_name_dsc);
break;
case 3:
qsort(liste, nombre, sizeof(FICH), cmp_size_asc);
break;
case 4:
qsort(liste, nombre, sizeof(FICH), cmp_size_dsc);
break;
case 10:
qsort(liste, nombre, sizeof(FICH), cmp_idx_asc);
break;
case 11:
qsort(liste, nombre, sizeof(FICH), cmp_idx_dsc);
break;
}
return -1;
}
/*==------------------------------------------------------------------==*/
int faire_la_liste(void)
{
DIR *dir;
struct dirent *de;
struct stat statbuf;
int foo, type;
int devine;
long magicbits;
if ( NULL == (liste = malloc(TCHONK*sizeof(FICH))) )
{
fprintf(stderr, "\nno memory in file-listing\n");
abort();
}
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) )
{
continue;
}
type = type_du_fichier(de->d_name);
if (type < 0)
{
continue;
}
/* use the magic system (new 13 mai, may be bugged) */
devine = magic_detect(de->d_name, &magicbits);
fprintf(stderr, "%s %s %d\n", __func__, de->d_name, devine);
/* strdup is a 'non-portable' function ? */
liste[nombre].nom = strdup(de->d_name);
liste[nombre].taille = statbuf.st_size;
liste[nombre].idx = nombre;
liste[nombre].son.type = type;
liste[nombre].epochtime = 15000;
#if DEBUG_LEVEL > 1
fprintf(stderr, "%4d: %-20s %8ld %4d\n",
nombre, liste[nombre].nom, liste[nombre].taille, type);
#endif
nombre++;
/* if needed, increase the size of the list */
if (nombre >= taille)
{
liste = realloc(liste, sizeof(FICH)*(taille+TCHONK));
taille += TCHONK;
}
}
foo = closedir(dir);
return nombre; /* ??? */
}
/*==------------------------------------------------------------------==*/
int print_entry(WINDOW *w, int number, int line)
{
int ln;
ln = strlen(liste[number].nom);
mvwprintw(w, line, 2, "%3d %-40s %9d ",
liste[number].idx,
liste[number].nom,
liste[number].taille);
return 0;
}
/*==------------------------------------------------------------------==*/
int fileselector(void)
{
int foo;
WINDOW *wfs;
int first, curseur, idx, affh;
int key, flag_exit;
char chaine[100];
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( )\n", __func__);
#endif
foo = faire_la_liste();
affh = LINES-7;
/*
* create a subwindow for list of files
*/
wfs = derwin(stdscr, affh, COLS-2, 2, 1);
#if DEBUG_LEVEL > 1
bordure(wfs, 0);
#endif
wrefresh(wfs);
first = curseur = 0;
flag_exit = 0;
#if DEBUG_LEVEL
fprintf(stderr, " %s enter interactive\n", __func__);
#endif
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++)
{
idx = foo+first;
if (idx >= nombre) break;
if (curseur==foo) wstandout(wfs);
/*
* display the entry, need more work :(
*/
print_entry(wfs, idx, foo);
if (curseur==foo) wstandend(wfs);
}
wrefresh(wfs);
key = getch();
/*
* ici il faudrait effacer le curseur ?
*/
switch (key)
{
case KEY_UP:
if (curseur) curseur--;
else if (first>0) first--;
break;
case KEY_DOWN:
if ((curseur+first) >= (nombre-1)) break;
if (curseur < affh-1) curseur++;
else if (first<(nombre-affh)) first++;
break;
case KEY_HOME:
curseur = first = 0;
break;
/* the show must go on */
case '\r': case 'p':
idx = curseur+first; /* ??? */
play_this_file(liste[idx].nom, liste[idx].son.type, 0);
break;
case 'D': case 'd':
idx = curseur+first; /* ??? FIXME */
dump_this_file(liste[idx].nom, 0);
break;
case 'I': case 'i':
idx = curseur+first; /* ??? FIXME */
info_about_this_file(liste[idx].nom,
liste[idx].son.type);
break;
case 'A': case 'a': about(); break;
case 'H': case 'h': case '?': help(); break;
case 'n': trier_la_liste(1); break;
case 'N': trier_la_liste(2); break;
case 's': trier_la_liste(3); break;
case 'S': trier_la_liste(4); break;
case 'u': trier_la_liste(10); break;
case 'U': trier_la_liste(11); break;
case '$': infos_driver_son(); break;
case 'Q': case 'q':
flag_exit = 1;
break;
}
} while ( ! flag_exit );
#if DEBUG_LEVEL
fprintf(stderr, " %s exit interactive\n", __func__);
#endif
return -1;
}
/*==------------------------------------------------------------------==*/

72
Ecoute/magic.c Normal file
View File

@ -0,0 +1,72 @@
/*
* magic.c
* ======= 26 Avril 2005
*
* reconnaissance heuristique des fichiers sons.
* Gruik coding inside.
*/
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
#define T_BUFF_MAGIC 222
int magic_detect(char *fname, long *pbits)
{
int fd;
char buffer[T_BUFF_MAGIC];
if ( (fd=open(fname, O_RDONLY)) < 0 )
{
perror(fname);
return -1;
}
if ( T_BUFF_MAGIC != read(fd, buffer, T_BUFF_MAGIC) )
{
close(fd);
return -2;
}
close(fd);
/* now, we have the first bytes of the file in the buffer, so we can
try the divination process... */
*pbits = 0L;
if (0 == strncmp(buffer, "RIFF", 4))
{
if (0 == strncmp(buffer+8, "WAVE", 4))
{
return SON_WAV;
}
}
if (0 == strncmp(buffer, ".snd", 4))
{
return SON_AU;
}
if (0 == strncmp(buffer, "OggS", 4))
{
if (0 == strncmp(buffer+28, "\x01vorbis", 7))
{
return SON_OGG;
}
if (0 == strncmp(buffer+28, "Speex ", 7))
{
return SON_SPEEX;
}
}
/* please add FLAC magic here XXX */
/* really don't know, baylout */
return SON_UNKNOW;
}
/*==------------------------------------------------------------------==*/
/*==------------------------------------------------------------------==*/

151
Ecoute/main.c Normal file
View File

@ -0,0 +1,151 @@
/*
* ------
* Ecoute
* ------ an ogg/note/wav player from tth
*
* 15 juillet 2007: ogg palying don(t work, sorry...
*
*/
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <getopt.h>
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
static char *about_texte[] =
{
"{{ About... }}",
"Ecoute, a sound player - version " VERSION,
"Another ugly software made by tontonTh",
"",
"Send bugs reports: tontonth(O)free(o)fr",
"",
"Binary build: " __DATE__ " / " __TIME__,
NULL
};
static char *help_texte[] =
{
"{{ Help me }}",
"<enter> Play the selected file",
"A About this software...",
"D Dump begin of file in hexadecimal",
"R Play a randomly selected file",
"nN Sort by name",
"sS Sort by file size",
"tT Sort by file time",
"uU Sort by order (unsort)",
"I Infos about this file",
"$ What is the sound driver ?",
"",
"Q Quit",
NULL
};
void popup_texte(char *lignes[])
{
WINDOW * popup;
int nblignes;
int foo, largmax;
char **ptr;
nblignes = largmax = 0;
ptr = lignes+1;
while ( *ptr != NULL )
{
#if DEBUG_LEVEL > 1
fprintf(stderr, "%p %s\n", ptr, *ptr);
#endif
foo = strlen(*ptr);
if (largmax < foo) largmax = foo;
nblignes++;
ptr++;
}
popup = newwin((nblignes)+5, largmax+6, L_POPUP, C_POPUP);
bordure(popup, 1);
wrefresh(popup);
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]);
#endif
}
mvwaddstr(popup, 0, 5, *lignes); /* window title */
wmove(popup, 0, 0);
wrefresh(popup);
getch();
delwin(popup);
/* pourquoi, quand je fait le 'delwin', ncurses
ne rafraichit pas la zone qui était masquée ? */
touchwin(stdscr); refresh();
}
/*==------------------------------------------------------------------==*/
void about(void)
{
#if DEBUG_LEVEL > 1
fprintf(stderr, "------------ about\n");
#endif
popup_texte(about_texte);
}
void help(void)
{
#if DEBUG_LEVEL > 1
fprintf(stderr, "------------ help\n");
#endif
popup_texte(help_texte);
}
/*==------------------------------------------------------------------==*/
void help_cli(char *command)
{
printf("Usage: %s <options>\n", command);
puts("Options:");
puts("\t-d\taudio device");
puts("\t-h\tthis help");
puts("\t-x\tenable crash");
exit(0);
}
/*==------------------------------------------------------------------==*/
/* */
int main(int argc, char * argv[])
{
int opt = 0;
int foo;
char *audiodevice = "none";
while ((opt = getopt(argc, argv, "d:hx")) != -1) {
switch (opt) {
case 'd':
audiodevice = optarg;
break;
case 'h':
help_cli(argv[0]); break;
default:
fprintf(stderr, "gni %c ?\n", opt);
break;
}
}
fprintf(stderr, "audio device = %s\n", audiodevice);
foo = init_sound_output(audiodevice, 0);
if (foo) {
fprintf(stderr, "init sound output -> %d\n", foo);
exit(1);
}
infos_sound_output("dans main");
prepare_ecran();
fileselector();
say_goodbye();
return 0;
}
/*==------------------------------------------------------------------==*/

138
Ecoute/playau.c Normal file
View File

@ -0,0 +1,138 @@
/*
* playau.c
* -------- 2 Mars 2005
*
* This code is almost a copy'n'past from "playwav.c", but
* it was slightly updated. May be I have introduced new bugs,
* who have to be backported :)
*
*/
#include <fcntl.h>
#include <string.h>
#include <sndfile.h>
#include <ao/ao.h> /* for the sound output */
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
int au_player(char *fname, WINDOW *popup)
{
SNDFILE * sndf;
SF_INFO sfinfo;
ao_sample_format format;
ao_device * device;
int driver;
char chaine[100];
short * samples;
long total_lu;
int lu;
int maxsample;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' %p )\n", __func__, fname, popup);
#endif
/*
* get help from 'sndfile' for getting datas
*/
memset(&sfinfo, 0, sizeof(sfinfo));
sndf = sf_open(fname, SFM_READ, &sfinfo);
if (sndf==NULL)
{
mvwaddstr(popup, 4, 4, "Invalid file ?");
wrefresh(popup);
getch();
delwin(popup);
touchwin(stdscr); refresh();
return -1;
}
sprintf(chaine, "frames %lu", (unsigned long)sfinfo.frames);
mvwaddstr(popup, 2, 5, chaine);
sprintf(chaine, "sample rate %d", sfinfo.samplerate);
mvwaddstr(popup, 3, 5, chaine);
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");
abort();
}
/*
* configuration of the sound output
*/
ao_initialize();
driver = ao_default_driver_id();
format.bits = 16; /* ? */
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)
{
fprintf(stderr, "\nEcoute: Error open device\n");
/*
* comment connaitre la cause de l'erreur ?
*/
abort();
}
/*
* Go! Read the samples, compute some numbers and...
* ...???
*/
total_lu = 0L;
maxsample = 0;
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);
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);
wrefresh(popup);
}
fprintf(stderr, "maxsample = %d\n", maxsample);
/*
* some cleanup...
*/
free(samples); /* kill buff */
sf_close(sndf);
ao_close(device); ao_shutdown();
return -1;
}
/*==------------------------------------------------------------------==*/

28
Ecoute/playflac.c Normal file
View File

@ -0,0 +1,28 @@
/*
* playflac.c
* ---------- 20 Janvier 2022
*/
#include <fcntl.h>
#include <unistd.h>
#include <ao/ao.h> /* for the sound output */
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
int flac_player(char *fname, WINDOW *popup)
{
int ret;
ret = 43;
mvwaddstr(popup, 1, 2, "Flac playing: work in progress...");
wrefresh(popup); sleep(1);
mvwaddstr(popup, 6, 6, "*** COREDUMPING ***");
wrefresh(popup); getch();
return ret; /* XXX */
}
/*==------------------------------------------------------------------==*/

91
Ecoute/playnote.c Normal file
View File

@ -0,0 +1,91 @@
/*
* playnote.c
* ---------- 23 Fevrier 2005
*
* this subplayer is a personnal subplayer. Far back in the past,
* I've made a lot of softwares around sound synteses. The unique
* file format was 16bits, 2400samples/seconds and Intel endianism.
*
* Here is the player.
*/
#include <unistd.h>
#include <fcntl.h>
#include <ao/ao.h> /* for the sound output */
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
int note_player(char *fname, WINDOW *popup)
{
int driver;
ao_sample_format format;
ao_device *device;
int lu, fd;
short *samples;
char chaine[100];
long taille, total;
/*
* file and memory stuff
*/
if ( NULL == (samples = malloc(T_BUFFER*sizeof(short))) )
{
perror("memory in note_player");
abort();
}
if ( 0 > (fd=open(fname, O_RDONLY)) )
{
perror(fname);
abort();
}
taille = taille_fichier(fd);
if (taille < 0) {
fprintf(stderr, "%s: size < 0 WTF?\n", __func__);
}
sprintf(chaine, "%10ld samples, %5ld seconds", taille/2, taille/(24000*2));
mvwaddstr(popup, 2, 2, chaine);
wrefresh(popup);
ao_initialize(); /* must be paired with ao_shutdown */
driver = ao_default_driver_id();
format.bits = 16;
format.channels = 1;
format.rate = 24000;
format.byte_format = AO_FMT_LITTLE; /* XXX ??? */
device = ao_open_live(driver, &format, NULL);
if (device == NULL)
{
fprintf(stderr, "\r\n%s: Error open device\n", __func__);
/* comment connaitre la cause de l'erreur ? */
abort();
}
/*
* +-------------------------------+
* | let's the show go on... |
* +-------------------------------+
*/
total = 0L;
while ( (lu=read(fd, samples, T_BUFFER)) > 0 )
{
#if DEBUG_LEVEL
sprintf(chaine, "%9ld Kb %-7d", total/1024, lu);
#else
sprintf(chaine, "%9ld Kb", total/1024);
#endif
mvwaddstr(popup, 5, 7, chaine); wrefresh(popup);
total += lu;
progress_bar(popup, total, taille, 0);
ao_play(device, (char *)samples, lu);
}
/*
* this is the end, my friends...
*/
ao_close(device);
ao_shutdown(); /* must be paired with ao_initialise */
return -1;
}
/*==------------------------------------------------------------------==*/

52
Ecoute/playogg.c Normal file
View File

@ -0,0 +1,52 @@
/*
* playogg.c
* --------- 2 Mars 2005
*
*
* 2005, Apr 11: just downloaded some tarball from xiph.org, thinking
* about some code samples...
*/
#include <fcntl.h>
#include <unistd.h>
#include <ogg/ogg.h>
#include <ao/ao.h> /* for the sound output */
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
int ogg_player(char *fname, WINDOW *popup)
{
ogg_sync_state oy;
char *oggbuff;
int ret;
mvwaddstr(popup, 1, 2, "Ogg playing: work in progress...");
wrefresh(popup); sleep(1);
mvwaddstr(popup, 6, 6, "*** COREDUMPING ***");
wrefresh(popup); getch();
return -42; /* XXX */
/*
* preparation
*/
ret = ogg_sync_init(&oy);
mvwprintw(popup, 2, 2, "ogg_sync_init -> %d", ret);
oggbuff = ogg_sync_buffer(&oy, T_BUFFER);
mvwprintw(popup, 3, 2, "ogg_sync_buffer -> %p", oggbuff);
wrefresh(popup);
getch();
/*
* termination
*/
ogg_sync_clear(&oy);
ogg_sync_destroy(&oy);
getch();
return -1;
}
/*==------------------------------------------------------------------==*/

26
Ecoute/playspeex.c Normal file
View File

@ -0,0 +1,26 @@
/*
* playspeex.c
* ----------- 12 Avril 2005
*
*/
#include <fcntl.h>
#include <unistd.h>
#include <ogg/ogg.h>
#include <ao/ao.h> /* for the sound output */
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
int speex_player(char *fname, WINDOW *popup)
{
mvwaddstr(popup, 1, 2, fname);
mvwaddstr(popup, 1, 4, "Speex playing: work in progress...");
wrefresh(popup); sleep(1);
mvwaddstr(popup, 6, 6, "*** COREDUMPING ***");
wrefresh(popup); getch();
return -1;
}
/*==------------------------------------------------------------------==*/

132
Ecoute/playwav.c Normal file
View File

@ -0,0 +1,132 @@
/*
* playwav.c
* --------- 23 Fevrier 2005
*/
#include <fcntl.h>
#include <string.h>
#include <sndfile.h>
#include <ao/ao.h> /* for the sound output */
#include "ecoute.h"
/*==------------------------------------------------------------------==*/
int wav_player(char *fname, WINDOW *popup)
{
SNDFILE * sndf;
SF_INFO sfinfo;
int driver;
ao_sample_format format;
ao_device * device;
char chaine[120];
short * samples;
int lu;
long total_lu;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' %p )\n", __func__, fname, popup);
#endif
/*
* get help from 'sndfile' for getting datas
*/
memset(&sfinfo, 0, sizeof(sfinfo));
sndf = sf_open(fname, SFM_READ, &sfinfo);
if (sndf==NULL)
{
mvwaddstr(popup, 4, 4, "Invalid file ?");
wrefresh(popup);
getch();
delwin(popup);
touchwin(stdscr); refresh();
return -1;
}
sprintf(chaine, "frames %lu", (unsigned long)sfinfo.frames);
mvwaddstr(popup, 2, 5, chaine);
sprintf(chaine, "smplrate %d", sfinfo.samplerate);
mvwaddstr(popup, 3, 5, chaine);
sprintf(chaine, "channels %d", sfinfo.channels);
mvwaddstr(popup, 4, 5, chaine);
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
getch(); /* XXX */
#endif
/*
* memory allocation
* warning, we can get multiples channels.
*/
if ( NULL == (samples = malloc(T_BUFFER*sizeof(short))) )
{
perror("memory shortage in WAV player");
abort();
}
/*
* initialize the "Cabasse Sampan" output device (aka libao)
*/
ao_initialize();
driver = ao_default_driver_id();
/* XXX valeurs provisoires XXX */
memset(&format, 0, sizeof(ao_sample_format));
format.bits = 16;
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)
{
fprintf(stderr, "\nEcoute: Error open device\n");
/*
* comment connaitre la cause de l'erreur ?
*/
abort();
}
/*
* **********************
* * the playing loop *
* **********************
*/
total_lu = 0L;
while ( (lu=sf_read_short(sndf, samples, T_BUFFER)) > 0 )
{
ao_play(device, (char *)samples, lu*2);
total_lu += (long)lu;
progress_bar(popup, total_lu/sfinfo.channels, sfinfo.frames, 0);
wrefresh(popup);
/* HERE WE HAVE TO DETECT A 'STOP LISTEN' FUNCTION. */
}
/*
* shutdown "La voix du Theatre"
*/
ao_close(device); ao_shutdown();
/*
* memory release
*/
free(samples);
/*
* releasing 'sndfile' ressources
*/
sf_close(sndf);
#if DEBUG_LEVEL
fprintf(stderr, " end of %s\n", __func__);
#endif
return -1;
}
/*==------------------------------------------------------------------==*/