-rw-r--r-- | core/multimedia/opieplayer/libmad/libmadplugin.cpp | 52 |
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 | |||
@@ -62,33 +62,34 @@ extern "C" { | |||
62 | } | 62 | } |
63 | 63 | ||
64 | 64 | ||
65 | #define MPEG_BUFFER_SIZE 65536 | 65 | #define MPEG_BUFFER_SIZE 65536 |
66 | //#define MPEG_BUFFER_SIZE 32768 //16384 // 8192 | 66 | //#define MPEG_BUFFER_SIZE 32768 //16384 // 8192 |
67 | //#define debugMsg(a) qDebug(a) | 67 | //#define debugMsg(a) qDebug(a) |
68 | #define debugMsg(a) | 68 | #define debugMsg(a) |
69 | 69 | ||
70 | 70 | ||
71 | class Input { | 71 | class Input { |
72 | public: | 72 | public: |
73 | char const *path; | 73 | char const *path; |
74 | int fd; | 74 | int fd; |
75 | #if defined(HAVE_MMAP) | 75 | #if defined(HAVE_MMAP) |
76 | void *fdm; | 76 | void *fdm; |
77 | #endif | 77 | #endif |
78 | unsigned char *data; | 78 | unsigned long fileLength; |
79 | unsigned char *data; | ||
79 | unsigned long length; | 80 | unsigned long length; |
80 | int eof; | 81 | int eof; |
81 | }; | 82 | }; |
82 | 83 | ||
83 | 84 | ||
84 | class Output { | 85 | class Output { |
85 | public: | 86 | public: |
86 | mad_fixed_t attenuate; | 87 | mad_fixed_t attenuate; |
87 | struct filter *filters; | 88 | struct filter *filters; |
88 | unsigned int channels_in; | 89 | unsigned int channels_in; |
89 | unsigned int channels_out; | 90 | unsigned int channels_out; |
90 | unsigned int speed_in; | 91 | unsigned int speed_in; |
91 | unsigned int speed_out; | 92 | unsigned int speed_out; |
92 | const char *path; | 93 | const char *path; |
93 | }; | 94 | }; |
94 | 95 | ||
@@ -440,37 +441,42 @@ bool LibMadPlugin::open( const QString& path ) { | |||
440 | if ( !(http_open(path) == 0) ) { | 441 | if ( !(http_open(path) == 0) ) { |
441 | d->input.fd = http_open(path); | 442 | d->input.fd = http_open(path); |
442 | } else { | 443 | } else { |
443 | return FALSE; | 444 | return FALSE; |
444 | } | 445 | } |
445 | } else { | 446 | } else { |
446 | d->input.path = path.latin1(); | 447 | d->input.path = path.latin1(); |
447 | d->input.fd = ::open( d->input.path, O_RDONLY ); | 448 | d->input.fd = ::open( d->input.path, O_RDONLY ); |
448 | // thats a better place, since it should only seek for ID3 tags on mp3 files, not streams | 449 | // thats a better place, since it should only seek for ID3 tags on mp3 files, not streams |
449 | printID3Tags(); | 450 | printID3Tags(); |
450 | } | 451 | } |
451 | if (d->input.fd == -1) { | 452 | if (d->input.fd == -1) { |
452 | qDebug("error opening %s", d->input.path ); | 453 | qDebug("error opening %s", d->input.path ); |
453 | return FALSE; | 454 | return FALSE; |
454 | } | 455 | } |
455 | 456 | ||
456 | #if defined(HAVE_MMAP) | ||
457 | struct stat stat; | 457 | struct stat stat; |
458 | if (fstat(d->input.fd, &stat) == -1) { | 458 | if (fstat(d->input.fd, &stat) == -1) { |
459 | //qDebug("error calling fstat"); return FALSE; | 459 | qDebug("error calling fstat"); return FALSE; |
460 | } | 460 | } |
461 | if (S_ISREG(stat.st_mode) && stat.st_size > 0) | ||
462 | d->input.fileLength = stat.st_size; | ||
463 | else | ||
464 | d->input.fileLength = 0; | ||
465 | |||
466 | #if defined(HAVE_MMAP) | ||
461 | if (S_ISREG(stat.st_mode) && stat.st_size > 0) { | 467 | if (S_ISREG(stat.st_mode) && stat.st_size > 0) { |
462 | d->input.length = stat.st_size; | 468 | d->input.length = stat.st_size; |
463 | d->input.fdm = map_file(d->input.fd, &d->input.length); | 469 | d->input.fdm = map_file(d->input.fd, &d->input.length); |
464 | if (d->input.fdm == 0) { | 470 | if (d->input.fdm == 0) { |
465 | qDebug("error mmapping file"); return FALSE; | 471 | qDebug("error mmapping file"); return FALSE; |
466 | } | 472 | } |
467 | d->input.data = (unsigned char *)d->input.fdm; | 473 | d->input.data = (unsigned char *)d->input.fdm; |
468 | } | 474 | } |
469 | #endif | 475 | #endif |
470 | 476 | ||
471 | if (d->input.data == 0) { | 477 | if (d->input.data == 0) { |
472 | d->input.data = (unsigned char *)malloc( bufferSize /*MPEG_BUFFER_SIZE*/); | 478 | d->input.data = (unsigned char *)malloc( bufferSize /*MPEG_BUFFER_SIZE*/); |
473 | if (d->input.data == 0) { | 479 | if (d->input.data == 0) { |
474 | qDebug("error allocating input buffer"); | 480 | qDebug("error allocating input buffer"); |
475 | return FALSE; | 481 | return FALSE; |
476 | } | 482 | } |
@@ -542,45 +548,73 @@ int LibMadPlugin::audioChannels( int ) { | |||
542 | qDebug( "LibMadPlugin::audioChannels: %i", d->frame.header.mode > 0 ? 2 : 1 ); | 548 | qDebug( "LibMadPlugin::audioChannels: %i", d->frame.header.mode > 0 ? 2 : 1 ); |
543 | return d->frame.header.mode > 0 ? 2 : 1; | 549 | return d->frame.header.mode > 0 ? 2 : 1; |
544 | */ | 550 | */ |
545 | return 2; | 551 | return 2; |
546 | } | 552 | } |
547 | 553 | ||
548 | 554 | ||
549 | int LibMadPlugin::audioFrequency( int ) { | 555 | int LibMadPlugin::audioFrequency( int ) { |
550 | debugMsg( "LibMadPlugin::audioFrequency" ); | 556 | debugMsg( "LibMadPlugin::audioFrequency" ); |
551 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); | 557 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); |
552 | qDebug( "LibMadPlugin::audioFrequency: %i", d->frame.header.samplerate ); | 558 | qDebug( "LibMadPlugin::audioFrequency: %i", d->frame.header.samplerate ); |
553 | return d->frame.header.samplerate; | 559 | return d->frame.header.samplerate; |
554 | } | 560 | } |
555 | 561 | ||
556 | 562 | ||
557 | int LibMadPlugin::audioSamples( int ) { | 563 | int LibMadPlugin::audioSamples( int ) { |
558 | debugMsg( "LibMadPlugin::audioSamples" ); | 564 | debugMsg( "LibMadPlugin::audioSamples" ); |
565 | |||
566 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); | ||
567 | mad_header_decode( (struct mad_header *)&d->frame.header, &d->stream ); | ||
568 | /* | ||
569 | qDebug( "LibMadPlugin::audioSamples: %i*%i", d->frame.header.duration.seconds, | ||
570 | d->frame.header.samplerate ); | ||
571 | return d->frame.header.duration.seconds * d->frame.header.samplerate; | ||
572 | */ | ||
573 | if ( d->frame.header.bitrate == 0 ) | ||
574 | return 0; | ||
575 | int samples = (d->input.fileLength / (d->frame.header.bitrate/8)) * d->frame.header.samplerate; | ||
576 | |||
577 | qDebug( "LibMadPlugin::audioSamples: %i * %i * 8 / %i", (int)d->input.fileLength, | ||
578 | (int)d->frame.header.samplerate, (int)d->frame.header.bitrate ); | ||
579 | qDebug( "LibMadPlugin::audioSamples: %i", samples ); | ||
559 | 580 | ||
560 | // long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); | 581 | return samples; |
561 | // mad_header_decode( (struct mad_header *)&d->frame.header, &d->stream ); | ||
562 | // qDebug( "LibMadPlugin::audioSamples: %i*%i", d->frame.header.duration.seconds, d->frame.header.samplerate ); | ||
563 | // return d->frame.header.duration.seconds * d->frame.header.samplerate; | ||
564 | 582 | ||
565 | return 10000000; | 583 | // return 10000000; |
566 | } | 584 | } |
567 | 585 | ||
568 | 586 | ||
569 | bool LibMadPlugin::audioSetSample( long, int ) { | 587 | bool LibMadPlugin::audioSetSample( long, int ) { |
570 | debugMsg( "LibMadPlugin::audioSetSample" ); | 588 | debugMsg( "LibMadPlugin::audioSetSample" ); |
589 | |||
590 | // long totalSamples = audioSamples(0); | ||
591 | // if ( totalSamples <= 1 ) | ||
592 | // return FALSE; | ||
593 | |||
594 | // // Seek to requested position | ||
595 | // qDebug( "seek pos: %i", (int)((double)pos * d->input.fileLength / totalSamples) ); | ||
596 | // ::lseek( d->input.fd, (long)((double)pos * d->input.fileLength / totalSamples), SEEK_SET ); | ||
597 | // mad_stream_sync(&d->stream); | ||
598 | |||
599 | // mad_stream_init(&d->stream); | ||
600 | // mad_frame_init(&d->frame); | ||
601 | // mad_synth_init(&d->synth); | ||
602 | |||
603 | // return TRUE; | ||
604 | debugMsg( "LibMadPlugin::audioSetSample" ); | ||
571 | return FALSE; | 605 | return FALSE; |
572 | } | 606 | } |
573 | 607 | ||
574 | 608 | ||
575 | long LibMadPlugin::audioGetSample( int ) { | 609 | long LibMadPlugin::audioGetSample( int ) { |
576 | debugMsg( "LibMadPlugin::audioGetSample" ); | 610 | debugMsg( "LibMadPlugin::audioGetSample" ); |
577 | return 0; | 611 | return 0; |
578 | } | 612 | } |
579 | 613 | ||
580 | /* | 614 | /* |
581 | bool LibMadPlugin::audioReadSamples( short *, int, long, int ) { | 615 | bool LibMadPlugin::audioReadSamples( short *, int, long, int ) { |
582 | debugMsg( "LibMadPlugin::audioReadSamples" ); | 616 | debugMsg( "LibMadPlugin::audioReadSamples" ); |
583 | return FALSE; | 617 | return FALSE; |
584 | } | 618 | } |
585 | 619 | ||
586 | 620 | ||