summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmad/libmadplugin.cpp52
1 files changed, 43 insertions, 9 deletions
diff --git a/core/multimedia/opieplayer/libmad/libmadplugin.cpp b/core/multimedia/opieplayer/libmad/libmadplugin.cpp
index 9a1ab2a..9d1ff8c 100644
--- a/core/multimedia/opieplayer/libmad/libmadplugin.cpp
+++ b/core/multimedia/opieplayer/libmad/libmadplugin.cpp
@@ -54,49 +54,50 @@
#if defined(HAVE_MMAP)
# include <sys/mman.h>
#endif
#include "libmadplugin.h"
extern "C" {
#include "mad.h"
}
#define MPEG_BUFFER_SIZE 65536
//#define MPEG_BUFFER_SIZE 32768 //16384 // 8192
//#define debugMsg(a) qDebug(a)
#define debugMsg(a)
class Input {
public:
char const *path;
int fd;
#if defined(HAVE_MMAP)
void *fdm;
#endif
- unsigned char *data;
+ unsigned long fileLength;
+ unsigned char *data;
unsigned long length;
int eof;
};
class Output {
public:
mad_fixed_t attenuate;
struct filter *filters;
unsigned int channels_in;
unsigned int channels_out;
unsigned int speed_in;
unsigned int speed_out;
const char *path;
};
# if defined(HAVE_MMAP)
static void *map_file(int fd, unsigned long *length)
{
void *fdm;
*length += MAD_BUFFER_GUARD;
@@ -432,53 +433,58 @@ bool LibMadPlugin::open( const QString& path ) {
d->bad_last_frame = 0;
d->flush = TRUE;
info = QString( "" );
//qDebug( "Opening %s", path.latin1() );
if (path.left( 4 ) == "http" ) {
// in case of any error we get 0 here
if ( !(http_open(path) == 0) ) {
d->input.fd = http_open(path);
} else {
return FALSE;
}
} else {
d->input.path = path.latin1();
d->input.fd = ::open( d->input.path, O_RDONLY );
// thats a better place, since it should only seek for ID3 tags on mp3 files, not streams
printID3Tags();
}
if (d->input.fd == -1) {
qDebug("error opening %s", d->input.path );
return FALSE;
}
-#if defined(HAVE_MMAP)
struct stat stat;
if (fstat(d->input.fd, &stat) == -1) {
- //qDebug("error calling fstat"); return FALSE;
+ qDebug("error calling fstat"); return FALSE;
}
+ if (S_ISREG(stat.st_mode) && stat.st_size > 0)
+ d->input.fileLength = stat.st_size;
+ else
+ d->input.fileLength = 0;
+
+#if defined(HAVE_MMAP)
if (S_ISREG(stat.st_mode) && stat.st_size > 0) {
d->input.length = stat.st_size;
d->input.fdm = map_file(d->input.fd, &d->input.length);
if (d->input.fdm == 0) {
qDebug("error mmapping file"); return FALSE;
}
d->input.data = (unsigned char *)d->input.fdm;
}
#endif
if (d->input.data == 0) {
d->input.data = (unsigned char *)malloc( bufferSize /*MPEG_BUFFER_SIZE*/);
if (d->input.data == 0) {
qDebug("error allocating input buffer");
return FALSE;
}
d->input.length = 0;
}
d->input.eof = 0;
mad_stream_init(&d->stream);
mad_frame_init(&d->frame);
mad_synth_init(&d->synth);
@@ -534,61 +540,89 @@ int LibMadPlugin::audioStreams() {
return 1;
}
int LibMadPlugin::audioChannels( int ) {
debugMsg( "LibMadPlugin::audioChannels" );
/*
long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 );
qDebug( "LibMadPlugin::audioChannels: %i", d->frame.header.mode > 0 ? 2 : 1 );
return d->frame.header.mode > 0 ? 2 : 1;
*/
return 2;
}
int LibMadPlugin::audioFrequency( int ) {
debugMsg( "LibMadPlugin::audioFrequency" );
long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 );
qDebug( "LibMadPlugin::audioFrequency: %i", d->frame.header.samplerate );
return d->frame.header.samplerate;
}
int LibMadPlugin::audioSamples( int ) {
- debugMsg( "LibMadPlugin::audioSamples" );
+ debugMsg( "LibMadPlugin::audioSamples" );
+
+ long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 );
+ mad_header_decode( (struct mad_header *)&d->frame.header, &d->stream );
+/*
+ qDebug( "LibMadPlugin::audioSamples: %i*%i", d->frame.header.duration.seconds,
+ d->frame.header.samplerate );
+ return d->frame.header.duration.seconds * d->frame.header.samplerate;
+*/
+ if ( d->frame.header.bitrate == 0 )
+ return 0;
+ int samples = (d->input.fileLength / (d->frame.header.bitrate/8)) * d->frame.header.samplerate;
+
+ qDebug( "LibMadPlugin::audioSamples: %i * %i * 8 / %i", (int)d->input.fileLength,
+ (int)d->frame.header.samplerate, (int)d->frame.header.bitrate );
+ qDebug( "LibMadPlugin::audioSamples: %i", samples );
- // long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 );
-// mad_header_decode( (struct mad_header *)&d->frame.header, &d->stream );
-// qDebug( "LibMadPlugin::audioSamples: %i*%i", d->frame.header.duration.seconds, d->frame.header.samplerate );
-// return d->frame.header.duration.seconds * d->frame.header.samplerate;
+ return samples;
- return 10000000;
+// return 10000000;
}
bool LibMadPlugin::audioSetSample( long, int ) {
debugMsg( "LibMadPlugin::audioSetSample" );
+
+// long totalSamples = audioSamples(0);
+// if ( totalSamples <= 1 )
+// return FALSE;
+
+// // Seek to requested position
+// qDebug( "seek pos: %i", (int)((double)pos * d->input.fileLength / totalSamples) );
+// ::lseek( d->input.fd, (long)((double)pos * d->input.fileLength / totalSamples), SEEK_SET );
+// mad_stream_sync(&d->stream);
+
+// mad_stream_init(&d->stream);
+// mad_frame_init(&d->frame);
+// mad_synth_init(&d->synth);
+
+// return TRUE;
+ debugMsg( "LibMadPlugin::audioSetSample" );
return FALSE;
}
long LibMadPlugin::audioGetSample( int ) {
debugMsg( "LibMadPlugin::audioGetSample" );
return 0;
}
/*
bool LibMadPlugin::audioReadSamples( short *, int, long, int ) {
debugMsg( "LibMadPlugin::audioReadSamples" );
return FALSE;
}
bool LibMadPlugin::audioReReadSamples( short *, int, long, int ) {
debugMsg( "LibMadPlugin::audioReReadSamples" );
return FALSE;
}
*/
bool LibMadPlugin::read() {
debugMsg( "LibMadPlugin::read" );