author | harlekin <harlekin> | 2002-04-22 21:47:09 (UTC) |
---|---|---|
committer | harlekin <harlekin> | 2002-04-22 21:47:09 (UTC) |
commit | f77f012023dbe7582a4b4297f61c6521ad8a3aa5 (patch) (side-by-side diff) | |
tree | 3d41a0320169e8b2749e7cee98f14e0435fe05e3 | |
parent | cca7f8ae4f60ae9b6c704d200ab015233abdd4d7 (diff) | |
download | opie-f77f012023dbe7582a4b4297f61c6521ad8a3aa5.zip opie-f77f012023dbe7582a4b4297f61c6521ad8a3aa5.tar.gz opie-f77f012023dbe7582a4b4297f61c6521ad8a3aa5.tar.bz2 |
get shoutcast support better, now all stream information are shown in the mediaplayer
-rw-r--r-- | core/multimedia/opieplayer/libmad/libmadplugin.cpp | 449 |
1 files changed, 228 insertions, 221 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"); @@ -336,4 +346,4 @@ int LibMadPlugin::http_open(const QString& path ) { snprintf(http_request, sizeof(http_request), "GET /%s HTTP/1.0\r\n" -/* "User-Agent: Mozilla/2.0 (Win95; I)\r\n" */ - "Pragma: no-cache\r\n" "Host: %s\r\n" "Accept: */*\r\n" "\r\n", filename, host); + /* "User-Agent: Mozilla/2.0 (Win95; I)\r\n" */ + "Pragma: no-cache\r\n" "Host: %s\r\n" "Accept: */*\r\n" "\r\n", filename, host); @@ -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" ) { - d->input.fd = http_open(path); - + // 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,11 +460,11 @@ 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; } 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; + 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; } @@ -450,7 +474,7 @@ bool LibMadPlugin::open( const QString& path ) { 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; + if (d->input.data == 0) { + qDebug("error allocating input buffer"); + return FALSE; + } + d->input.length = 0; } @@ -478,8 +502,8 @@ bool LibMadPlugin::close() { if (d->input.fdm) { - if (unmap_file(d->input.fdm, d->input.length) == -1) { - qDebug("error munmapping file"); - result = FALSE; - } - d->input.fdm = 0; - d->input.data = 0; + if (unmap_file(d->input.fdm, d->input.length) == -1) { + qDebug("error munmapping file"); + result = FALSE; + } + d->input.fdm = 0; + d->input.data = 0; } @@ -489,3 +513,3 @@ bool LibMadPlugin::close() { free(d->input.data); - d->input.data = 0; + d->input.data = 0; } @@ -494,3 +518,3 @@ bool LibMadPlugin::close() { qDebug("error closing file %s", d->input.path); - result = FALSE; + result = FALSE; } @@ -518,5 +542,5 @@ int LibMadPlugin::audioChannels( int ) { /* - 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; + 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; */ @@ -559,4 +583,4 @@ long LibMadPlugin::audioGetSample( int ) { bool LibMadPlugin::audioReadSamples( short *, int, long, int ) { - debugMsg( "LibMadPlugin::audioReadSamples" ); - return FALSE; +debugMsg( "LibMadPlugin::audioReadSamples" ); +return FALSE; } @@ -565,5 +589,5 @@ bool LibMadPlugin::audioReadSamples( short *, int, long, int ) { bool LibMadPlugin::audioReReadSamples( short *, int, long, int ) { - debugMsg( "LibMadPlugin::audioReReadSamples" ); +debugMsg( "LibMadPlugin::audioReReadSamples" ); return FALSE; -} + } */ @@ -579,34 +603,34 @@ bool LibMadPlugin::read() { if (d->input.fdm) { - unsigned long skip = 0; + unsigned long skip = 0; - if (d->stream.next_frame) { - struct stat stat; + if (d->stream.next_frame) { + struct stat stat; - if (fstat(d->input.fd, &stat) == -1) - return FALSE; + if (fstat(d->input.fd, &stat) == -1) + return FALSE; - if (stat.st_size + MAD_BUFFER_GUARD <= (signed)d->input.length) - return FALSE; + if (stat.st_size + MAD_BUFFER_GUARD <= (signed)d->input.length) + return FALSE; - // file size changed; update memory map - skip = d->stream.next_frame - d->input.data; + // file size changed; update memory map + skip = d->stream.next_frame - d->input.data; - if (unmap_file(d->input.fdm, d->input.length) == -1) { - d->input.fdm = 0; - d->input.data = 0; - return FALSE; - } + if (unmap_file(d->input.fdm, d->input.length) == -1) { + d->input.fdm = 0; + d->input.data = 0; + return FALSE; + } - d->input.length = stat.st_size; + d->input.length = stat.st_size; - d->input.fdm = map_file(d->input.fd, &d->input.length); - if (d->input.fdm == 0) { - d->input.data = 0; - return FALSE; - } + d->input.fdm = map_file(d->input.fd, &d->input.length); + if (d->input.fdm == 0) { + d->input.data = 0; + return FALSE; + } - d->input.data = (unsigned char *)d->input.fdm; - } + d->input.data = (unsigned char *)d->input.fdm; + } - mad_stream_buffer(&d->stream, d->input.data + skip, d->input.length - skip); + mad_stream_buffer(&d->stream, d->input.data + skip, d->input.length - skip); @@ -615,29 +639,29 @@ bool LibMadPlugin::read() { { - if (d->stream.next_frame) { - memmove(d->input.data, d->stream.next_frame, - d->input.length = &d->input.data[d->input.length] - d->stream.next_frame); - } - - do { - len = ::read(d->input.fd, d->input.data + d->input.length, bufferSize /* MPEG_BUFFER_SIZE*/ - d->input.length); - } - while (len == -1 && errno == EINTR); - - if (len == -1) { - qDebug("error reading audio"); - return FALSE; - } - else if (len == 0) { - d->input.eof = 1; - - assert(bufferSize /*MPEG_BUFFER_SIZE*/ - d->input.length >= MAD_BUFFER_GUARD); - - while (len < MAD_BUFFER_GUARD) - d->input.data[d->input.length + len++] = 0; - } - - mad_stream_buffer(&d->stream, d->input.data, d->input.length += len); + if (d->stream.next_frame) { + memmove(d->input.data, d->stream.next_frame, + d->input.length = &d->input.data[d->input.length] - d->stream.next_frame); + } + + do { + len = ::read(d->input.fd, d->input.data + d->input.length, bufferSize /* MPEG_BUFFER_SIZE*/ - d->input.length); + } + while (len == -1 && errno == EINTR); + + if (len == -1) { + qDebug("error reading audio"); + return FALSE; + } + else if (len == 0) { + d->input.eof = 1; + + assert(bufferSize /*MPEG_BUFFER_SIZE*/ - d->input.length >= MAD_BUFFER_GUARD); + + while (len < MAD_BUFFER_GUARD) + d->input.data[d->input.length + len++] = 0; + } + + mad_stream_buffer(&d->stream, d->input.data, d->input.length += len); } - return TRUE; + return TRUE; } @@ -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,15 +683,14 @@ 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 ) { - while (nsamples--) { - data[0] = audio_linear_dither( *left++, left_err ); - data[1] = audio_linear_dither( *right++, right_err ); - data += 2; - } + while (nsamples--) { + data[0] = audio_linear_dither( *left++, left_err ); + data[1] = audio_linear_dither( *right++, right_err ); + data += 2; + } } else { - while (nsamples--) { - data[0] = data[1] = audio_linear_dither( *left++, left_err ); - data += 2; - } + while (nsamples--) { + data[0] = data[1] = audio_linear_dither( *left++, left_err ); + data += 2; + } } @@ -687,9 +709,10 @@ bool LibMadPlugin::decode( short *output, long samples, long& samplesMade ) { - if ( samples > maxBuffered ) - samples = maxBuffered; + if ( samples > maxBuffered ) { + samples = maxBuffered; + } if ( d->flush ) { - buffered = 0; - offset = 0; - d->flush = FALSE; + buffered = 0; + offset = 0; + d->flush = FALSE; } @@ -698,21 +721,22 @@ bool LibMadPlugin::decode( short *output, long samples, long& samplesMade ) { - while (mad_frame_decode(&d->frame, &d->stream) == -1) { - if (!MAD_RECOVERABLE(d->stream.error)) { - debugMsg( "feed me" ); - return FALSE; // Feed me - } - if ( d->stream.error == MAD_ERROR_BADCRC ) { - mad_frame_mute(&d->frame); - qDebug( "error decoding, bad crc" ); - } - } + while (mad_frame_decode(&d->frame, &d->stream) == -1) { + if (!MAD_RECOVERABLE(d->stream.error)) { + debugMsg( "feed me" ); + return FALSE; // Feed me + } + if ( d->stream.error == MAD_ERROR_BADCRC ) { + mad_frame_mute(&d->frame); + qDebug( "error decoding, bad crc" ); + } + } - mad_synth_frame(&d->synth, &d->frame); - int decodedSamples = d->synth.pcm.length; - memcpy( &(buffer[0][offset]), d->synth.pcm.samples[0], decodedSamples * sizeof(mad_fixed_t) ); - if ( d->synth.pcm.channels == 2 ) - memcpy( &(buffer[1][offset]), d->synth.pcm.samples[1], decodedSamples * sizeof(mad_fixed_t) ); - offset += decodedSamples; - buffered += decodedSamples; + mad_synth_frame(&d->synth, &d->frame); + int decodedSamples = d->synth.pcm.length; + memcpy( &(buffer[0][offset]), d->synth.pcm.samples[0], decodedSamples * sizeof(mad_fixed_t) ); + if ( d->synth.pcm.channels == 2 ) + memcpy( &(buffer[1][offset]), d->synth.pcm.samples[1], decodedSamples * sizeof(mad_fixed_t) ); + offset += decodedSamples; + buffered += decodedSamples; } + //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 ) { */ @@ -745,31 +763,20 @@ bool LibMadPlugin::audioReadSamples( short *output, int /*channels*/, long sampl if ( samples == 0 ) - return FALSE; + return FALSE; do { - if ( needInput ) - if ( !read() ) { -// if ( d->input.eof ) -// needInput = FALSE; -// else - return FALSE; - } + if ( needInput ) + if ( !read() ) { + return FALSE; + } - needInput = FALSE; + needInput = FALSE; - if ( decode( output, samples, samplesMade ) ) - return TRUE; - else - needInput = TRUE; + if ( decode( output, samples, samplesMade ) ) + return TRUE; + else + needInput = TRUE; } while ( ( samplesMade < samples ) && ( !d->input.eof ) ); -/* - static bool firstTimeThru = TRUE; - if ( firstTimeThru ) { - firstTimeThru = FALSE; - decode( output, samples, samplesMade ); - return FALSE; - } else -*/ - return FALSE; + return FALSE; } @@ -789,4 +796,4 @@ void LibMadPlugin::printID3Tags() { if ( ::lseek( d->input.fd, -128, SEEK_END ) == -1 ) { - qDebug( "error seeking to id3 tags" ); - return; + qDebug( "error seeking to id3 tags" ); + return; } @@ -794,4 +801,4 @@ void LibMadPlugin::printID3Tags() { if ( ::read( d->input.fd, id3v1, 128 ) != 128 ) { - qDebug( "error reading in id3 tags" ); - return; + qDebug( "error reading in id3 tags" ); + return; } @@ -799,23 +806,23 @@ void LibMadPlugin::printID3Tags() { if ( ::strncmp( (const char *)id3v1, "TAG", 3 ) != 0 ) { - debugMsg( "sorry, no id3 tags" ); + debugMsg( "sorry, no id3 tags" ); } else { - int len[5] = { 30, 30, 30, 4, 30 }; - QString label[5] = { tr( "Title" ), tr( "Artist" ), tr( "Album" ), tr( "Year" ), tr( "Comment" ) }; - char *ptr = id3v1 + 3, *ptr2 = ptr + len[0]; - qDebug( "ID3 tags in file:" ); - info = ""; - for ( int i = 0; i < 5; ptr += len[i], i++, ptr2 += len[i] ) { - char push = *ptr2; - *ptr2 = '\0'; - char *ptr3 = ptr2; - while ( ptr3-1 >= ptr && isspace(ptr3[-1]) ) ptr3--; - char push2 = *ptr3; *ptr3 = '\0'; - if ( strcmp( ptr, "" ) ) - info += ( i != 0 ? ", " : "" ) + label[i] + ": " + ptr; - //qDebug( info.latin1() ); - *ptr3 = push2; - *ptr2 = push; - } - if (id3v1[126] == 0 && id3v1[127] != 0) - info += tr( ", Track: " ) + id3v1[127]; + int len[5] = { 30, 30, 30, 4, 30 }; + QString label[5] = { tr( "Title" ), tr( "Artist" ), tr( "Album" ), tr( "Year" ), tr( "Comment" ) }; + char *ptr = id3v1 + 3, *ptr2 = ptr + len[0]; + qDebug( "ID3 tags in file:" ); + info = ""; + for ( int i = 0; i < 5; ptr += len[i], i++, ptr2 += len[i] ) { + char push = *ptr2; + *ptr2 = '\0'; + char *ptr3 = ptr2; + while ( ptr3-1 >= ptr && isspace(ptr3[-1]) ) ptr3--; + char push2 = *ptr3; *ptr3 = '\0'; + if ( strcmp( ptr, "" ) ) + info += ( i != 0 ? ", " : "" ) + label[i] + ": " + ptr; + //qDebug( info.latin1() ); + *ptr3 = push2; + *ptr2 = push; + } + if (id3v1[126] == 0 && id3v1[127] != 0) + info += tr( ", Track: " ) + id3v1[127]; } @@ -823,3 +830,3 @@ void LibMadPlugin::printID3Tags() { if ( ::lseek(d->input.fd, 0, SEEK_SET) == -1 ) { - qDebug( "error seeking back to beginning" ); + qDebug( "error seeking back to beginning" ); return; |