-rw-r--r-- | core/multimedia/opieplayer/libmad/libmadplugin.cpp | 159 |
1 files changed, 83 insertions, 76 deletions
diff --git a/core/multimedia/opieplayer/libmad/libmadplugin.cpp b/core/multimedia/opieplayer/libmad/libmadplugin.cpp index 7de4282..0f952f4 100644 --- a/core/multimedia/opieplayer/libmad/libmadplugin.cpp +++ b/core/multimedia/opieplayer/libmad/libmadplugin.cpp @@ -19,2 +19,4 @@ **********************************************************************/ +// largly modified by Maximilian Reiss <max.reiss@gmx.de> + #include <stdio.h> @@ -33,3 +35,6 @@ #include <assert.h> + #include <qapplication.h> +#include <qmessagebox.h> + #include <qpe/config.h> @@ -200,4 +205,5 @@ int LibMadPlugin::udp_open(char *address, int port) { - if ((host = gethostbyname(address)) == NULL) + if ((host = gethostbyname(address)) == NULL) { return (0); + } @@ -206,12 +212,13 @@ int LibMadPlugin::udp_open(char *address, int port) { /* Create a UDP socket */ - if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { return (0); + } /* Allow multiple instance of the client to share the same address and port */ - if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&enable, sizeof(unsigned long int)) < 0) + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&enable, sizeof(unsigned long int)) < 0) { return (0); + } /* If the address is multicast, register to the multicast group */ - if (is_address_multicast(stAddr.sin_addr.s_addr)) - { + if (is_address_multicast(stAddr.sin_addr.s_addr)) { /* Bind the socket to port */ @@ -220,4 +227,5 @@ int LibMadPlugin::udp_open(char *address, int port) { stLclAddr.sin_port = stAddr.sin_port; - if (bind(sock, (struct sockaddr *)&stLclAddr, sizeof(stLclAddr)) < 0) + if (bind(sock, (struct sockaddr *)&stLclAddr, sizeof(stLclAddr)) < 0) { return (0); + } @@ -226,7 +234,6 @@ int LibMadPlugin::udp_open(char *address, int port) { stMreq.imr_interface.s_addr = INADDR_ANY; - if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&stMreq, sizeof(stMreq)) < 0) + if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&stMreq, sizeof(stMreq)) < 0) { return (0); } - else - { + } else { /* Bind the socket to port */ @@ -235,6 +242,6 @@ int LibMadPlugin::udp_open(char *address, int port) { stLclAddr.sin_port = htons(0); - if (bind(sock, (struct sockaddr *)&stLclAddr, sizeof(stLclAddr)) < 0) + if (bind(sock, (struct sockaddr *)&stLclAddr, sizeof(stLclAddr)) < 0) { return (0); } - + } return (sock); @@ -252,4 +259,5 @@ int LibMadPlugin::tcp_open(char *address, int port) { - if ((host = gethostbyname(address)) == NULL) + if ((host = gethostbyname(address)) == NULL) { return (0); + } @@ -257,4 +265,5 @@ int LibMadPlugin::tcp_open(char *address, int port) { - if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { return (0); + } @@ -262,7 +271,9 @@ int LibMadPlugin::tcp_open(char *address, int port) { l.l_linger = 5; - if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&l, sizeof(l)) < 0) + if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&l, sizeof(l)) < 0) { return (0); + } - if (connect(sock, (struct sockaddr *)&stAddr, sizeof(stAddr)) < 0) + if (connect(sock, (struct sockaddr *)&stAddr, sizeof(stAddr)) < 0) { return (0); + } @@ -283,4 +294,3 @@ int LibMadPlugin::http_read_line(int tcp_sock, char *buf, int size) { - do - { + do { if (std::read(tcp_sock, buf + offset, 1) < 0) @@ -289,4 +299,3 @@ int LibMadPlugin::http_read_line(int tcp_sock, char *buf, int size) { offset++; - } - while (offset < size - 1 && buf[offset - 1] != '\n'); + } while (offset < size - 1 && buf[offset - 1] != '\n'); @@ -307,4 +316,5 @@ int LibMadPlugin::http_open(const QString& path ) { /* Check for URL syntax */ - if (strncmp(arg, "http://", strlen("http://"))) + if (strncmp(arg, "http://", strlen("http://"))) { return (0); + } @@ -313,8 +323,9 @@ int LibMadPlugin::http_open(const QString& path ) { host = arg + strlen("http://"); - if ((request = strchr(host, '/')) == NULL) + if ((request = strchr(host, '/')) == NULL) { return (0); + } + *request++ = 0; - if (strchr(host, ':') != NULL) /* port is specified */ - { + if (strchr(host, ':') != NULL) { /* port is specified */ port = atoi(strchr(host, ':') + 1); @@ -324,4 +335,3 @@ int LibMadPlugin::http_open(const QString& path ) { /* Open a TCP socket */ - if (!(tcp_sock = tcp_open(host, port))) - { + if (!(tcp_sock = tcp_open(host, port))) { perror("http_open"); @@ -348,11 +358,8 @@ int LibMadPlugin::http_open(const QString& path ) { http_request[4] = 0; - if (strcmp(http_request, "200 ")) - { + if (strcmp(http_request, "200 ")) { fprintf(stderr, "http_open: "); - do - { + do { read(tcp_sock, &c, sizeof(char)); fprintf(stderr, "%c", c); - } - while (c != '\r'); + } while (c != '\r'); fprintf(stderr, "\n"); @@ -362,4 +369,10 @@ int LibMadPlugin::http_open(const QString& path ) { - do - { + QString name; + QString genre; + QString bitrate; + QString url; + QString message = tr("Info: "); + + do { + int len; @@ -368,4 +381,3 @@ int LibMadPlugin::http_open(const QString& path ) { - if (len == -1) - { + if (len == -1) { fprintf(stderr, "http_open: %s\n", strerror(errno)); @@ -374,4 +386,3 @@ int LibMadPlugin::http_open(const QString& path ) { - if (strncmp(http_request, "Location:", 9) == 0) - { + if (strncmp(http_request, "Location:", 9) == 0) { /* redirect */ @@ -384,7 +395,5 @@ int LibMadPlugin::http_open(const QString& path ) { - if (strncmp(http_request, "ICY ", 4) == 0) - { + if (strncmp(http_request, "ICY ", 4) == 0) { /* This is icecast streaming */ - if (strncmp(http_request + 4, "200 ", 4)) - { + if (strncmp(http_request + 4, "200 ", 4)) { fprintf(stderr, "http_open: %s\n", http_request); @@ -392,11 +401,21 @@ int LibMadPlugin::http_open(const QString& path ) { } - } - else if (strncmp(http_request, "icy-", 4) == 0) - { + } else if (strncmp(http_request, "icy-", 4) == 0) { /* we can have: icy-noticeX, icy-name, icy-genre, icy-url, icy-pub, icy-metaint, icy-br */ - /* Don't print these - mpg123 doesn't */ - /* fprintf(stderr,"%s\n",http_request); */ + if ( QString( http_request ).left( 8 ) == "icy-name" ) { + name = tr("Name: ") + QString(http_request).mid(9, (QString(http_request).length())- 9 ); + } else if ( QString( http_request ).left( 9 ) == "icy-genre" ) { + genre = tr("Genre: ") + QString(http_request).mid(10, (QString(http_request).length())-10 ); + } else if ( QString( http_request ).left( 6 ) == "icy-br" ) { + bitrate = tr("Bitrate: ") + QString(http_request).mid(7, (QString(http_request).length())- 7 ); + } else if ( QString( http_request ).left( 7 ) == "icy-url" ) { + url = tr("URL: ") + QString(http_request).mid(8, (QString(http_request).length())- 8 ); + } else if ( QString( http_request ).left( 10 ) == "icy-notice" ) { + message += QString(http_request).mid(11, QString(http_request).length()-11 ) ; } } - while (strcmp(http_request, "\n") != 0); + } while (strcmp(http_request, "\n") != 0); + + info = QString(name + genre + url + bitrate + message).replace( QRegExp("\n"), " : " ); + + qDebug("Stream info: " + info); @@ -406,2 +425,3 @@ int LibMadPlugin::http_open(const QString& path ) { + bool LibMadPlugin::open( const QString& path ) { @@ -420,4 +440,6 @@ bool LibMadPlugin::open( const QString& path ) { 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 { @@ -425,5 +447,7 @@ bool LibMadPlugin::open( const QString& path ) { 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 ); +// qDebug("error opening %s", d->input.path ); return FALSE; @@ -431,3 +455,3 @@ bool LibMadPlugin::open( const QString& path ) { - printID3Tags(); +// printID3Tags(); @@ -436,3 +460,3 @@ bool LibMadPlugin::open( const QString& path ) { if (fstat(d->input.fd, &stat) == -1) { - qDebug("error calling fstat"); return FALSE; + //qDebug("error calling fstat"); return FALSE; } @@ -650,4 +674,3 @@ static const int shift = MAD_F_FRACBITS + 1 - bits; -inline long audio_linear_dither( mad_fixed_t sample, mad_fixed_t& error ) -{ +inline long audio_linear_dither( mad_fixed_t sample, mad_fixed_t& error ) { sample += error; @@ -660,4 +683,3 @@ inline long audio_linear_dither( mad_fixed_t sample, mad_fixed_t& error ) -inline void audio_pcm( short *data, unsigned int nsamples, mad_fixed_t *left, mad_fixed_t *right ) -{ +inline void audio_pcm( short *data, unsigned int nsamples, mad_fixed_t *left, mad_fixed_t *right ) { if ( right ) { @@ -687,4 +709,5 @@ bool LibMadPlugin::decode( short *output, long samples, long& samplesMade ) { - if ( samples > maxBuffered ) + if ( samples > maxBuffered ) { samples = maxBuffered; + } @@ -717,2 +740,3 @@ bool LibMadPlugin::decode( short *output, long samples, long& samplesMade ) { } + //qApp->processEvents(); @@ -723,4 +747,5 @@ bool LibMadPlugin::decode( short *output, long samples, long& samplesMade ) { memmove( buffer[0], &(buffer[0][samples]), (buffered - samples) * sizeof(mad_fixed_t) ); - if ( d->synth.pcm.channels == 2 ) + if ( d->synth.pcm.channels == 2 ) { memmove( buffer[1], &(buffer[1][samples]), (buffered - samples) * sizeof(mad_fixed_t) ); + } buffered -= samples; @@ -730,10 +755,3 @@ bool LibMadPlugin::decode( short *output, long samples, long& samplesMade ) { -/* -bool LibMadPlugin::audioReadMonoSamples( short *, long, long&, int ) { - debugMsg( "LibMadPlugin::audioReadMonoSamples" ); - return FALSE; -} - - -bool LibMadPlugin::audioReadStereoSamples( short *output, long samples, long& samplesMade, int ) { +/*bool LibMadPlugin::audioReadStereoSamples( short *output, long samples, long& samplesMade, int ) { */ @@ -750,5 +768,2 @@ bool LibMadPlugin::audioReadSamples( short *output, int /*channels*/, long sampl if ( !read() ) { -// if ( d->input.eof ) -// needInput = FALSE; -// else return FALSE; @@ -764,11 +779,3 @@ bool LibMadPlugin::audioReadSamples( short *output, int /*channels*/, long sampl while ( ( samplesMade < samples ) && ( !d->input.eof ) ); -/* - static bool firstTimeThru = TRUE; - if ( firstTimeThru ) { - firstTimeThru = FALSE; - decode( output, samples, samplesMade ); - return FALSE; - } else -*/ return FALSE; |