summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmad/libmadplugin.cpp
authorharlekin <harlekin>2002-04-22 21:47:09 (UTC)
committer harlekin <harlekin>2002-04-22 21:47:09 (UTC)
commitf77f012023dbe7582a4b4297f61c6521ad8a3aa5 (patch) (side-by-side diff)
tree3d41a0320169e8b2749e7cee98f14e0435fe05e3 /core/multimedia/opieplayer/libmad/libmadplugin.cpp
parentcca7f8ae4f60ae9b6c704d200ab015233abdd4d7 (diff)
downloadopie-f77f012023dbe7582a4b4297f61c6521ad8a3aa5.zip
opie-f77f012023dbe7582a4b4297f61c6521ad8a3aa5.tar.gz
opie-f77f012023dbe7582a4b4297f61c6521ad8a3aa5.tar.bz2
get shoutcast support better, now all stream information are shown in the mediaplayer
Diffstat (limited to 'core/multimedia/opieplayer/libmad/libmadplugin.cpp') (more/less context) (show whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmad/libmadplugin.cpp159
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;