From 1584115e8ba7a2a9a268777fae9f273cb8661bb8 Mon Sep 17 00:00:00 2001 From: tTh Date: Wed, 29 Nov 2023 21:28:26 +0100 Subject: [PATCH] une ancienne version --- Ecoute/.gitignore | 3 + Ecoute/Makefile | 60 +++++++++ Ecoute/README.txt | 21 +++ Ecoute/dump.c | 88 +++++++++++++ Ecoute/ecoute.h | 100 ++++++++++++++ Ecoute/ecoute.html | 49 +++++++ Ecoute/ecoute.man | 30 +++++ Ecoute/ecran.c | 119 +++++++++++++++++ Ecoute/fonctions.c | 223 ++++++++++++++++++++++++++++++++ Ecoute/ifao.c | 141 ++++++++++++++++++++ Ecoute/interactive.c | 301 +++++++++++++++++++++++++++++++++++++++++++ Ecoute/magic.c | 72 +++++++++++ Ecoute/main.c | 151 ++++++++++++++++++++++ Ecoute/playau.c | 138 ++++++++++++++++++++ Ecoute/playflac.c | 28 ++++ Ecoute/playnote.c | 91 +++++++++++++ Ecoute/playogg.c | 52 ++++++++ Ecoute/playspeex.c | 26 ++++ Ecoute/playwav.c | 132 +++++++++++++++++++ 19 files changed, 1825 insertions(+) create mode 100644 Ecoute/.gitignore create mode 100644 Ecoute/Makefile create mode 100644 Ecoute/README.txt create mode 100644 Ecoute/dump.c create mode 100644 Ecoute/ecoute.h create mode 100644 Ecoute/ecoute.html create mode 100644 Ecoute/ecoute.man create mode 100644 Ecoute/ecran.c create mode 100644 Ecoute/fonctions.c create mode 100644 Ecoute/ifao.c create mode 100644 Ecoute/interactive.c create mode 100644 Ecoute/magic.c create mode 100644 Ecoute/main.c create mode 100644 Ecoute/playau.c create mode 100644 Ecoute/playflac.c create mode 100644 Ecoute/playnote.c create mode 100644 Ecoute/playogg.c create mode 100644 Ecoute/playspeex.c create mode 100644 Ecoute/playwav.c diff --git a/Ecoute/.gitignore b/Ecoute/.gitignore new file mode 100644 index 0000000..4ac52f0 --- /dev/null +++ b/Ecoute/.gitignore @@ -0,0 +1,3 @@ + +ecoute + diff --git a/Ecoute/Makefile b/Ecoute/Makefile new file mode 100644 index 0000000..70d70d6 --- /dev/null +++ b/Ecoute/Makefile @@ -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 + +#--------------------------------------------------------- diff --git a/Ecoute/README.txt b/Ecoute/README.txt new file mode 100644 index 0000000..7479cd4 --- /dev/null +++ b/Ecoute/README.txt @@ -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 - diff --git a/Ecoute/dump.c b/Ecoute/dump.c new file mode 100644 index 0000000..2704cec --- /dev/null +++ b/Ecoute/dump.c @@ -0,0 +1,88 @@ +/* + * dump.c + * ====== debug module for 'Ecoute' - 2005.03.06 + * + * Warning: gruik coding inside. + */ + +#include +#include +#include +#include +#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; +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/ecoute.h b/Ecoute/ecoute.h new file mode 100644 index 0000000..c3e0abc --- /dev/null +++ b/Ecoute/ecoute.h @@ -0,0 +1,100 @@ +/* + * ecoute.h + * -------- Fevrier 2005 a Frontignan-Plage + * + */ +#include + +#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); + +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/ecoute.html b/Ecoute/ecoute.html new file mode 100644 index 0000000..490734f --- /dev/null +++ b/Ecoute/ecoute.html @@ -0,0 +1,49 @@ + + +Ecoute, c'est du Tonton Th + + + + +

Ecoute

+ +

+Le tinyware ecoute est un embryon de player de fichiers +son, destiné à un usage one-shoot: vous le lancez, il démarre +en moins d'une seconde, vous choisissez le fichier à écouter, et +voilà, c'est fini... +

+ +

+Pour le moment, il sait lire les .wav, les .au +et un format étrange que j'utilise pour mes diverses expériences +sonores. Vous êtes prévenus, c'est un bricolage. +

+ +

download

+ +

capture fenetre aide

+ + +

capture fenetre dump

+ +

+La prochaine étape sera la lecture des .ogg, suivie de peu +par les .speex. 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 one-shoot, +tout en conservant l'aspect glamour de l'interface ncurses. +

+ +

+C'est fait sur, et pour, du Linux. Il faut avoir les bibliothèques +libsndfile, libogg et libao 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... +

+ + + diff --git a/Ecoute/ecoute.man b/Ecoute/ecoute.man new file mode 100644 index 0000000..b6aa73c --- /dev/null +++ b/Ecoute/ecoute.man @@ -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. + diff --git a/Ecoute/ecran.c b/Ecoute/ecran.c new file mode 100644 index 0000000..93dd0b7 --- /dev/null +++ b/Ecoute/ecran.c @@ -0,0 +1,119 @@ +/* + * ecran.c + * ------- + * + * Maybe, one day, we can have colors... + * + */ + +#include +#include + +#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 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>> %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); +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/fonctions.c b/Ecoute/fonctions.c new file mode 100644 index 0000000..ac1ba03 --- /dev/null +++ b/Ecoute/fonctions.c @@ -0,0 +1,223 @@ +/* + * fonctions.c Ecoute: a sound player. + * ----------- 23 Fev 2005 - dans le froid de Frontignan + */ + +#include +#include +#include +#include + +#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 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>> %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; +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/ifao.c b/Ecoute/ifao.c new file mode 100644 index 0000000..b405efc --- /dev/null +++ b/Ecoute/ifao.c @@ -0,0 +1,141 @@ +/* + * ifao.c (libao interface) + * ------ + */ + +#include +#include +#include +#include + +#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(); + +} +/*==------------------------------------------------------------------==*/ + diff --git a/Ecoute/interactive.c b/Ecoute/interactive.c new file mode 100644 index 0000000..a6a484b --- /dev/null +++ b/Ecoute/interactive.c @@ -0,0 +1,301 @@ +/* + * fileselector.c + * -------------- 18 Fevrier 2005. + * + * some code borrowed from 'Visual Hexdiff' :-) + */ + +#include +#include +#include +#include +#include +#include +#include + +#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= 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; +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/magic.c b/Ecoute/magic.c new file mode 100644 index 0000000..bf81d49 --- /dev/null +++ b/Ecoute/magic.c @@ -0,0 +1,72 @@ +/* + * magic.c + * ======= 26 Avril 2005 + * + * reconnaissance heuristique des fichiers sons. + * Gruik coding inside. + */ + +#include +#include +#include +#include +#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; +} +/*==------------------------------------------------------------------==*/ +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/main.c b/Ecoute/main.c new file mode 100644 index 0000000..b140128 --- /dev/null +++ b/Ecoute/main.c @@ -0,0 +1,151 @@ +/* + * ------ + * Ecoute + * ------ an ogg/note/wav player from tth + * + * 15 juillet 2007: ogg palying don(t work, sorry... + * + */ + +#include +#include +#include +#include + +#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 }}", + " 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 \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; +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/playau.c b/Ecoute/playau.c new file mode 100644 index 0000000..24000ff --- /dev/null +++ b/Ecoute/playau.c @@ -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 +#include +#include +#include /* 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 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; +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/playflac.c b/Ecoute/playflac.c new file mode 100644 index 0000000..2901682 --- /dev/null +++ b/Ecoute/playflac.c @@ -0,0 +1,28 @@ +/* + * playflac.c + * ---------- 20 Janvier 2022 + */ + +#include +#include +#include /* 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 */ +} +/*==------------------------------------------------------------------==*/ + diff --git a/Ecoute/playnote.c b/Ecoute/playnote.c new file mode 100644 index 0000000..40dd3f8 --- /dev/null +++ b/Ecoute/playnote.c @@ -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 +#include +#include /* 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; +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/playogg.c b/Ecoute/playogg.c new file mode 100644 index 0000000..0218344 --- /dev/null +++ b/Ecoute/playogg.c @@ -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 +#include +#include +#include /* 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; +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/playspeex.c b/Ecoute/playspeex.c new file mode 100644 index 0000000..39244b0 --- /dev/null +++ b/Ecoute/playspeex.c @@ -0,0 +1,26 @@ +/* + * playspeex.c + * ----------- 12 Avril 2005 + * + */ + +#include +#include +#include +#include /* 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; +} +/*==------------------------------------------------------------------==*/ diff --git a/Ecoute/playwav.c b/Ecoute/playwav.c new file mode 100644 index 0000000..8d7b757 --- /dev/null +++ b/Ecoute/playwav.c @@ -0,0 +1,132 @@ +/* + * playwav.c + * --------- 23 Fevrier 2005 + */ + +#include +#include +#include +#include /* 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; +} +/*==------------------------------------------------------------------==*/