00001 00006 #ifndef _CHANNELHEADER_H_ 00007 #define _CHANNELHEADER_H_ 00008 00009 #include "mp3_format.h" 00010 #include "bitstream.h" 00011 #include "bitarray.h" 00012 00019 class ChannelHeader 00020 { 00021 public: 00022 00030 ChannelHeader(Bitstream &bs) {} 00031 00037 virtual int Size() const = 0; 00038 00044 virtual void Write(Bitstream &bs) = 0; 00045 00051 virtual int DataSize() const = 0; 00052 00058 virtual int Gain() const = 0; 00059 00065 virtual void ChangeGain(int n) = 0; 00066 00072 virtual ~ChannelHeader() {} 00073 }; 00074 00075 template<class T> class ChannelHeaderTemplate : public ChannelHeader 00076 { 00077 public: 00078 ChannelHeaderTemplate<T>(Bitstream &bs) : ChannelHeader(bs), m_ch(bs) {} 00079 int Size() const { return T::size; } 00080 void Write(Bitstream &bs) { m_ch.Write(bs); } 00081 int DataSize() const { return m_ch^T::part2_3_length; } 00082 int Gain() const { return m_ch^T::global_gain; } 00083 void ChangeGain(int n) { m_ch.Set(T::global_gain, (m_ch^T::global_gain) + n); } 00084 00085 private: 00086 Bitarray<T> m_ch; //Data (bit struct) 00087 }; 00088 00089 extern template class ChannelHeaderTemplate<mp3_channel_header_mpeg1>; 00090 extern template class ChannelHeaderTemplate<mp3_channel_header_mpeg2>; 00091 00092 typedef ChannelHeaderTemplate<mp3_channel_header_mpeg1> ChannelHeaderMPEG1; 00093 typedef ChannelHeaderTemplate<mp3_channel_header_mpeg2> ChannelHeaderMPEG2; 00094 00095 #endif //_CHANNELHEADER_H_