2023-11-30 07:28:26 +11:00
|
|
|
/*
|
|
|
|
* 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);
|
|
|
|
}
|
|
|
|
|
2023-12-05 13:13:32 +11:00
|
|
|
#if DEBUG_LEVEL
|
2023-11-30 07:28:26 +11:00
|
|
|
fprintf(stderr, "maxsample = %d\n", maxsample);
|
2023-12-05 13:13:32 +11:00
|
|
|
#endif
|
2023-11-30 07:28:26 +11:00
|
|
|
|
|
|
|
/*
|
|
|
|
* some cleanup...
|
|
|
|
*/
|
|
|
|
free(samples); /* kill buff */
|
|
|
|
sf_close(sndf);
|
|
|
|
ao_close(device); ao_shutdown();
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/*==------------------------------------------------------------------==*/
|