Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cMP3File.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cMP3File_H
7 #define _INC_cMP3File_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "../AV/cAVSink.h"
14 
15 namespace GrayLib
16 {
17  class cWaveFormat;
18 
20  {
25 
26  public:
27  enum MASK_TYPE
28  {
29  // Assume big endian (network order) read order from file.
30  // Chop up the 32 bits into sections.
31  MASK_CHANNEL = 0x000000C0,
32  MASK_PADDING = 0x00000200,
33  MASK_SAMPLERATE = 0x00000C00,
34  MASK_BITRATE = 0x0000f000,
35  MASK_PROTECTION = 0x00010000, // has NO 16 bit CRC to follow. (if set)
36  MASK_LAYER = 0x00060000,
37  MASK_VERSION = 0x00180000,
38  MASK_FRAME_SYNC = 0xFFE00000, // Must have all bits set.
39  };
41  {
42  // MASK_CHANNEL
43  CHANNEL_STEREO = 0x00000000,
44  CHANNEL_JOINT = 0x00000040,
45  CHANNEL_DUAL = 0x00000080,
46  CHANNEL_MONO = 0x000000C0,
47  };
49  {
50  // MASK_SAMPLERATE
51  SAMPLERATE_IDX_QTY = 3,
52  SAMPLERATE_MASK = 0x03,
53  };
55  {
56  // MASK_BITRATE
57  BITRATE_IDX_UNK0 = 0, // unused.
58  BITRATE_IDX_UNK15 = 15, // unused.
59  BITRATE_MASK = 0x0f,
60  BITRATE_IDX_QTY = 16,
61  };
63  {
64  // MASK_LAYER = Layer description
65  LAYER_UNK = 0,
66  LAYER_3 = 1,
67  LAYER_2 = 2,
68  LAYER_1 = 3,
69  LAYER_MASK = 0x03,
70  };
72  {
73  // MASK_VERSION
74  VERSION_25 = 0, // Nonstandard proprietary MPEG-2.5 Audio Layer III
75  VERSION_INVALID = 1,
76  VERSION_2 = 2, // MPEG-2 Audio Layer III
77  VERSION_1 = 3, // MPEG-1 Audio Layer III
78  VERSION_MASK = 0x03,
79  };
80 
82  {
83  SHIFT_CHANNEL = 0,
84  SHIFT_SAMPLERATE = 10, // 32, 44.1, 48 kHz
85  SHIFT_BITRATE = 12, // 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 and 320 kbit/s
86  SHIFT_LAYER = 17,
87  SHIFT_VERSION = 19,
88  };
89 
90  private:
91  enum SAMPLERATE_VER_TYPE
92  {
93  SAMPLERATE_VER_1, // for VERSION_1
94  SAMPLERATE_VER_2, // for VERSION_2
95  SAMPLERATE_VER_25, // for VERSION_25
96  SAMPLERATE_VER_QTY
97  };
98  enum BITRATE_VER_TYPE
99  {
100  BITRATE_VER_1, // for VERSION_1
101  BITRATE_VER_2, // for VERSION_25 and VERSION_2
102  BITRATE_VER_QTY
103  };
104  static const WORD k_SampleRate[SAMPLERATE_IDX_QTY][SAMPLERATE_VER_QTY];
105  static const WORD k_BitRate[BITRATE_IDX_QTY][BITRATE_VER_QTY];
106  UINT32 m_uCode;
107 
108  public:
109  cMP3Header(UINT uCode) noexcept
110  : m_uCode(uCode)
111  {
112  }
113 
114  static bool GRAYCALL IsValidAudioCode(UINT32 uCode);
115 
116  void put_Code(UINT32 uCode)
117  {
119  m_uCode = uCode;
120  }
121  UINT32 get_Code() const
122  {
124  return m_uCode;
125  }
126  bool isValidAudioCode() const
127  {
128  return IsValidAudioCode(m_uCode);
129  }
130  bool isAudioTag3v1() const
131  {
132  // Audio Tag ID3v1
133  // m_uCode = TAG* followed by 12 more bytes.
134  if (((BYTE)(m_uCode >> 24)) != 'T')
135  return false;
136  if (((BYTE)(m_uCode >> 16)) != 'A')
137  return false;
138  if (((BYTE)(m_uCode >> 8)) != 'G')
139  return false;
140  return true;
141  }
142 
144  {
145  return (CHANNEL_TYPE)(m_uCode & MASK_CHANNEL);
146  }
147  WORD get_ChannelQty() const
148  {
149  return (get_Channel() == CHANNEL_MONO) ? 1 : 2;
150  }
152  {
153  m_uCode &= ~MASK_CHANNEL;
154  m_uCode |= (eChan & MASK_CHANNEL);
155  }
157  {
158  return (BITRATE_IDX_TYPE)((m_uCode & MASK_BITRATE) >> SHIFT_BITRATE);
159  }
161  {
162  m_uCode &= ~MASK_BITRATE;
163  m_uCode |= ((idx << SHIFT_BITRATE) & MASK_BITRATE);
164  }
166  {
167  return (SAMPLERATE_IDX_TYPE)((m_uCode & MASK_SAMPLERATE) >> SHIFT_SAMPLERATE);
168  }
170  {
171  m_uCode &= ~MASK_SAMPLERATE;
172  m_uCode |= ((idx << SHIFT_SAMPLERATE) & MASK_SAMPLERATE);
173  }
175  {
176  return (VERSION_TYPE)((m_uCode & MASK_VERSION) >> SHIFT_VERSION);
177  }
179  {
180  m_uCode &= ~MASK_VERSION;
181  m_uCode |= (eVer << SHIFT_VERSION) & MASK_VERSION;
182  }
183  bool hasProtectionCRC() const
184  {
185  return !(m_uCode & MASK_PROTECTION);
186  }
187 
188  // Derived params.
189  UINT get_BitRate() const;
190  HRESULT put_BitRate(UINT uBitRate);
191  UINT get_SampleRate() const;
192  HRESULT put_SampleRate(UINT uSampleRate);
193 
194  UINT get_Samples() const
195  {
196  return (get_SampleRate() > 32000) ? 1152 : 576;
197  }
198  size_t get_SizeBlock() const;
199 
200  HRESULT GetWaveFormat(cWaveFormat& form) const;
201  };
202 
204  {
208 
209  public:
210  cMP3FileReader(cStreamInput& stmIn, cAVSink* pAVSink);
211  virtual ~cMP3FileReader();
212 
213  virtual HRESULT ReadStream() override;
214  UNITTEST_FRIEND(cMP3File);
215  };
216 
218  {
222  public:
224 
225  public:
227  : m_pStreamOut(pStreamOut)
228  {
229  }
230  virtual ~cMP3FileWriter()
231  {
232  }
233 
234  virtual HRESULT OnHeaderStream(const cAVHeaderStream& head, const void* pForm, size_t nSizeForm) override;
235  virtual HRESULT OnFrame(const cAVHeaderFrame& head, const void* pData, size_t nSizeData) override;
236  };
237 }
238 #endif
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
Definition: cAVSink.h:80
Definition: cAVSink.h:60
Definition: cAVSink.h:181
Definition: cAVSink.h:130
Definition: cMP3File.h:204
Definition: cMP3File.h:218
virtual ~cMP3FileWriter()
Definition: cMP3File.h:230
cMP3FileWriter(cStreamOutput *pStreamOut)
Definition: cMP3File.h:226
cStreamOutput * m_pStreamOut
to here.
Definition: cMP3File.h:223
Definition: cMP3File.h:20
bool hasProtectionCRC() const
Definition: cMP3File.h:183
WORD get_ChannelQty() const
Definition: cMP3File.h:147
bool isAudioTag3v1() const
Definition: cMP3File.h:130
void put_Version(VERSION_TYPE eVer)
Definition: cMP3File.h:178
cMP3Header(UINT uCode) noexcept
Definition: cMP3File.h:109
bool isValidAudioCode() const
Definition: cMP3File.h:126
void put_Channel(CHANNEL_TYPE eChan)
Definition: cMP3File.h:151
LAYER_TYPE
Definition: cMP3File.h:63
VERSION_TYPE
Definition: cMP3File.h:72
UINT get_Samples() const
Definition: cMP3File.h:194
SAMPLERATE_IDX_TYPE
Definition: cMP3File.h:49
BITRATE_IDX_TYPE get_BitRateIdx() const
Definition: cMP3File.h:156
void put_BitRateIdx(BITRATE_IDX_TYPE idx)
Definition: cMP3File.h:160
BITRATE_IDX_TYPE
Definition: cMP3File.h:55
void put_SampleRateIdx(SAMPLERATE_IDX_TYPE idx)
Definition: cMP3File.h:169
VERSION_TYPE get_Version() const
Definition: cMP3File.h:174
SHIFT_TYPE
Definition: cMP3File.h:82
SAMPLERATE_IDX_TYPE get_SampleRateIdx() const
Definition: cMP3File.h:165
MASK_TYPE
Definition: cMP3File.h:28
CHANNEL_TYPE get_Channel() const
Definition: cMP3File.h:143
UINT32 get_Code() const
Definition: cMP3File.h:121
CHANNEL_TYPE
Definition: cMP3File.h:41
void put_Code(UINT32 uCode)
Definition: cMP3File.h:116
Definition: cWaveFormat.h:151
Definition: cStream.h:306
Definition: cStream.h:126
Definition: cMesh.h:22