1 /*
2     SPDX-FileCopyrightText: 2007-2009 Sergio Pistone <sergio_pistone@yahoo.com.ar>
3     SPDX-FileCopyrightText: 2010-2018 Mladen Milinkovic <max@smoothware.net>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #ifndef WAVEFORMAT_H
9 #define WAVEFORMAT_H
10 
11 #include <QString>
12 
13 class WaveFormat
14 {
15 // valid bits per sample a 8, 16, 24 & 32 (all signed, except 8)
16 
17 public:
WaveFormat()18 	WaveFormat() :
19 		m_sampleRate(44100),
20 		m_channels(2),
21 		m_bitsPerSample(16),
22 		m_integer(true)
23 	{}
24 
25 	WaveFormat(int sampleRate, int channels, int bitsPerSample, bool integer = true) :
m_sampleRate(sampleRate)26 		m_sampleRate(sampleRate),
27 		m_channels(channels),
28 		m_bitsPerSample(bitsPerSample),
29 		m_integer(integer)
30 	{}
31 
WaveFormat(const WaveFormat & wf)32 	WaveFormat(const WaveFormat &wf) :
33 		m_sampleRate(wf.m_sampleRate),
34 		m_channels(wf.m_channels),
35 		m_bitsPerSample(wf.m_bitsPerSample),
36 		m_integer(wf.m_integer)
37 	{}
38 
39 	WaveFormat & operator=(const WaveFormat &wf)
40 	{
41 		if(this == &wf)
42 			return *this;
43 		m_sampleRate = wf.m_sampleRate;
44 		m_channels = wf.m_channels;
45 		m_bitsPerSample = wf.m_bitsPerSample;
46 		m_integer = wf.m_integer;
47 		return *this;
48 	}
49 
50 	bool operator==(const WaveFormat &wf) const { return m_sampleRate == wf.sampleRate() && m_channels == wf.m_channels && m_bitsPerSample == wf.m_bitsPerSample; }
51 	bool operator!=(const WaveFormat &wf) const { return m_sampleRate != wf.sampleRate() || m_channels != wf.m_channels || m_bitsPerSample != wf.m_bitsPerSample; }
52 
isValid()53 	inline bool isValid() const { return m_sampleRate > 0 && m_channels > 0 && m_bitsPerSample > 0 && (m_bitsPerSample % 8 == 0) && m_bitsPerSample <= 32; }
54 
sampleRate()55 	inline int sampleRate() const { return m_sampleRate; }
setSampleRate(int value)56 	inline void setSampleRate(int value) { m_sampleRate = value; }
57 
channels()58 	inline int channels() const { return m_channels; }
setChannels(int value)59 	inline void setChannels(int value) { m_channels = value; }
60 
bitsPerSample()61 	inline int bitsPerSample() const { return m_bitsPerSample; }
setBitsPerSample(int value)62 	inline void setBitsPerSample(int value) { m_bitsPerSample = value; }
63 
bitsPerFrame()64 	inline int bitsPerFrame() const { return m_bitsPerSample * m_channels; }
bytesPerFrame()65 	inline int bytesPerFrame() const { return m_bitsPerSample * m_channels / 8; }
66 
bytesPerSample()67 	inline int bytesPerSample() const { return m_bitsPerSample / 8; }
setBytesPerSample(int value)68 	inline void setBytesPerSample(int value) { m_bitsPerSample = value * 8; }
69 
isSigned()70 	inline bool isSigned() const { return m_bitsPerSample != 8 || !m_integer; }
isInteger()71 	inline bool isInteger() const { return m_integer; }
setInteger(bool value)72 	inline void setInteger(bool value) { m_integer = value; }
73 
blockAlign()74 	inline int blockAlign() const { return m_channels * m_bitsPerSample / 8; }
blockAlign(int channels,int bitsPerSample)75 	inline static int blockAlign(int channels, int bitsPerSample) { return channels * bitsPerSample / 8; }
76 
toString()77 	inline QString toString() const { return QStringLiteral("%1Hz.%2ch.%3bps.%4").arg(m_sampleRate).arg(m_channels).arg(m_bitsPerSample).arg(m_integer ? "int" : "float"); }
78 
79 private:
80 	int m_sampleRate;
81 	int m_channels;
82 	int m_bitsPerSample;
83 	bool m_integer;
84 };
85 
86 #endif
87