1 /***************************************************************************
2     copyright            : (C) 2004 by Allan Sandfeld Jensen
3     email                : kde@carewolf.org
4  ***************************************************************************/
5 
6 /***************************************************************************
7  *   This library is free software; you can redistribute it and/or modify  *
8  *   it under the terms of the GNU Lesser General Public License version   *
9  *   2.1 as published by the Free Software Foundation.                     *
10  *                                                                         *
11  *   This library is distributed in the hope that it will be useful, but   *
12  *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
14  *   Lesser General Public License for more details.                       *
15  *                                                                         *
16  *   You should have received a copy of the GNU Lesser General Public      *
17  *   License along with this library; if not, write to the Free Software   *
18  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA         *
19  *   02110-1301  USA                                                       *
20  *                                                                         *
21  *   Alternatively, this file is available under the Mozilla Public        *
22  *   License Version 1.1.  You may obtain a copy of the License at         *
23  *   http://www.mozilla.org/MPL/                                           *
24  ***************************************************************************/
25 
26 #ifndef TAGLIB_MPCPROPERTIES_H
27 #define TAGLIB_MPCPROPERTIES_H
28 
29 #include "taglib_export.h"
30 #include "audioproperties.h"
31 
32 namespace TagLib {
33 
34   namespace MPC {
35 
36     class File;
37 
38     static const unsigned int HeaderSize = 8 * 7;
39 
40     //! An implementation of audio property reading for MPC
41 
42     /*!
43      * This reads the data from an MPC stream found in the AudioProperties
44      * API.
45      */
46 
47     class TAGLIB_EXPORT Properties : public AudioProperties
48     {
49     public:
50       /*!
51        * Create an instance of MPC::Properties with the data read from the
52        * ByteVector \a data.
53        *
54        * This constructor is deprecated. It only works for MPC version up to 7.
55        */
56       Properties(const ByteVector &data, long streamLength, ReadStyle style = Average);
57 
58       /*!
59        * Create an instance of MPC::Properties with the data read directly
60        * from a MPC::File.
61        */
62       Properties(File *file, long streamLength, ReadStyle style = Average);
63 
64       /*!
65        * Destroys this MPC::Properties instance.
66        */
67       virtual ~Properties();
68 
69       /*!
70        * Returns the length of the file in seconds.  The length is rounded down to
71        * the nearest whole second.
72        *
73        * \note This method is just an alias of lengthInSeconds().
74        *
75        * \deprecated
76        */
77       virtual int length() const;
78 
79       /*!
80        * Returns the length of the file in seconds.  The length is rounded down to
81        * the nearest whole second.
82        *
83        * \see lengthInMilliseconds()
84        */
85       // BIC: make virtual
86       int lengthInSeconds() const;
87 
88       /*!
89        * Returns the length of the file in milliseconds.
90        *
91        * \see lengthInSeconds()
92        */
93       // BIC: make virtual
94       int lengthInMilliseconds() const;
95 
96       /*!
97        * Returns the average bit rate of the file in kb/s.
98        */
99       virtual int bitrate() const;
100 
101       /*!
102        * Returns the sample rate in Hz.
103        */
104       virtual int sampleRate() const;
105 
106       /*!
107        * Returns the number of audio channels.
108        */
109       virtual int channels() const;
110 
111       /*!
112        * Returns the version of the bitstream (SV4-SV8)
113        */
114       int mpcVersion() const;
115 
116       unsigned int totalFrames() const;
117       unsigned int sampleFrames() const;
118 
119       /*!
120       * Returns the track gain as an integer value,
121       * to convert to dB: trackGain in dB = 64.82 - (trackGain / 256)
122       */
123       int trackGain() const;
124 
125       /*!
126       * Returns the track peak as an integer value,
127       * to convert to dB: trackPeak in dB = trackPeak / 256
128       * to convert to floating [-1..1]: trackPeak = 10^(trackPeak / 256 / 20)/32768
129       */
130       int trackPeak() const;
131 
132       /*!
133       * Returns the album gain as an integer value,
134       * to convert to dB: albumGain in dB = 64.82 - (albumGain / 256)
135       */
136       int albumGain() const;
137 
138       /*!
139       * Returns the album peak as an integer value,
140       * to convert to dB: albumPeak in dB = albumPeak / 256
141       * to convert to floating [-1..1]: albumPeak = 10^(albumPeak / 256 / 20)/32768
142       */
143       int albumPeak() const;
144 
145     private:
146       Properties(const Properties &);
147       Properties &operator=(const Properties &);
148 
149       void readSV7(const ByteVector &data, long streamLength);
150       void readSV8(File *file, long streamLength);
151 
152       class PropertiesPrivate;
153       PropertiesPrivate *d;
154     };
155   }
156 }
157 
158 #endif
159