decoder-mp3.h
branchtrunk
changeset 0 474a1293c3c0
equal deleted inserted replaced
-1:000000000000 0:474a1293c3c0
       
     1 /*
       
     2  * MP3/MPlayer plugin to VDR (C++)
       
     3  *
       
     4  * (C) 2001-2005 Stefan Huelswitt <s.huelswitt@gmx.de>
       
     5  *
       
     6  * This code is free software; you can redistribute it and/or
       
     7  * modify it under the terms of the GNU General Public License
       
     8  * as published by the Free Software Foundation; either version 2
       
     9  * of the License, or (at your option) any later version.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful,
       
    12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    14  * GNU General Public License for more details.
       
    15  *
       
    16  * You should have received a copy of the GNU General Public License
       
    17  * along with this program; if not, write to the Free Software
       
    18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
       
    19  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
       
    20  */
       
    21 
       
    22 #ifndef ___DECODER_MP3_H
       
    23 #define ___DECODER_MP3_H
       
    24 
       
    25 #define DEC_MP3     DEC_ID('M','P','3',' ')
       
    26 #define DEC_MP3_STR "MP3"
       
    27 
       
    28 #include <mad.h>
       
    29 #include <id3tag.h>
       
    30 
       
    31 #include "decoder.h"
       
    32 #include "decoder-core.h"
       
    33 
       
    34 #if MAD_F_FRACBITS != 28
       
    35 #warning libmad with MAD_F_FRACBITS != 28 not tested
       
    36 #endif
       
    37 
       
    38 class cStream;
       
    39 
       
    40 // ----------------------------------------------------------------
       
    41 
       
    42 class cScanID3 : public cSongInfo {
       
    43 private:
       
    44   bool keepOpen, *urgent;
       
    45   //
       
    46   bool Abort(bool result);
       
    47   struct id3_tag *GetID3(struct mad_stream *stream, id3_length_t tagsize) const;
       
    48   void ParseID3(const struct id3_tag *tag);
       
    49   void ParseStr(const struct id3_tag *tag, const char *id, char * &data);
       
    50   void ParsePic(const struct id3_tag *tag, const char *id, char * &name);
       
    51   int ParseXing(struct mad_bitptr *ptr, unsigned int bitlen) const;
       
    52 protected:
       
    53   cStream *str;
       
    54 public:
       
    55   cScanID3(cStream *Str, bool *Urgent);
       
    56   virtual ~cScanID3() {}
       
    57   virtual bool DoScan(bool KeepOpen=false);
       
    58   virtual void InfoHook(struct mad_header *header) {}
       
    59   };
       
    60 
       
    61 // ----------------------------------------------------------------
       
    62 
       
    63 class cMP3Decoder : public cDecoder {
       
    64 private:
       
    65   struct Decode ds;
       
    66   //
       
    67   struct mad_stream *stream;
       
    68   struct mad_frame *frame;
       
    69   struct mad_synth *synth;
       
    70   mad_timer_t playtime, skiptime;
       
    71   //
       
    72   struct FrameInfo {
       
    73     unsigned long long Pos;
       
    74     mad_timer_t Time;
       
    75     } *fi;
       
    76   int framenum, framemax, errcount, mute;
       
    77   //
       
    78   void Init(void);
       
    79   void Clean(void);
       
    80   struct Decode *Done(eDecodeStatus status);
       
    81   eDecodeStatus DecodeError(bool hdr);
       
    82   void MakeSkipTime(mad_timer_t *skiptime, mad_timer_t playtime, int secs, float bsecs);
       
    83 protected:
       
    84   cStream *str;
       
    85   cScanID3 *scan;
       
    86   bool isStream;
       
    87 public:
       
    88   cMP3Decoder(const char *Filename, bool preinit=true);
       
    89   virtual ~cMP3Decoder();
       
    90   virtual bool Valid(void);
       
    91   virtual cFileInfo *FileInfo(void);
       
    92   virtual cSongInfo *SongInfo(bool get);
       
    93   virtual cPlayInfo *PlayInfo(void);
       
    94   virtual bool Start(void);
       
    95   virtual bool Stop(void);
       
    96   virtual bool Skip(int Seconds, float bsecs);
       
    97   virtual struct Decode *Decode(void);
       
    98   };
       
    99 
       
   100 #endif //___DECODER_MP3_H