1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
/***************************************************************************
* Copyright (C) 2008-2010 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef VOLUMECONTROL_H
#define VOLUMECONTROL_H
#include <QObject>
#include "qmmp.h"
#include "buffer.h"
/*! @brief The VolumeControl class provides the base interface class for volume control.
* @author Ilya Kotov <forkotov02@hotmail.ru>
*/
class VolumeControl : public QObject
{
Q_OBJECT
public:
/*!
* Object constructor.
* @param parent Parent object.
*/
VolumeControl(QObject *parent = 0);
/*!
* Destructor.
*/
~VolumeControl();
/*!
* Setups volume level.
* Subclass should reimplement this fucntion.
* @param left Left channel volume level. It should be \b 0..100
* @param right Right channel volume level. It should be \b 0..100
*/
virtual void setVolume(int left, int right) = 0;
/*!
* Returns left channel volume.
*/
int left();
/*!
* Returns right channel volume.
*/
int right();
/*!
* Creates output volume control object if implemented, \b otherwise it creates SoftwareVolume object.
* @param parent Parent object.
*/
static VolumeControl *create(QObject *parent = 0);
signals:
/*!
* Emitted when volume is changed.
* @param left Left channel volume level. It should be \b 0..100
* @param right Right channel volume level. It should be \b 0..100
*/
void volumeChanged(int left, int right);
public slots:
/*!
* Forces the volumeChanged signal to emit.
*/
void checkVolume();
protected:
/*!
* Gets current volume.
* @param left Pointer to the left volume level.
* @param right Pointer to the right volume level
*/
virtual void volume(int *left, int *right) = 0;
private:
int m_left, m_right;
bool m_prev_block;
};
/*! @brief The SoftwareVolume class provides access to the software volume control.
* @author Ilya Kotov <forkotov02@hotmail.ru>
*/
class SoftwareVolume : public VolumeControl
{
Q_OBJECT
public:
/*!
* Object constructor.
* @param parent Parent object.
*/
SoftwareVolume(QObject *parent = 0);
/*!
* Destructor.
*/
~SoftwareVolume();
/*!
* Setups volume level.
* Subclass should reimplement this fucntion.
* @param left Left channel volume level. It should be \b 0..100
* @param right Right channel volume level. It should be \b 0..100
*/
void setVolume(int left, int right);
/*!
* Changes volume of buffer.
* @param b Pointer to the buffer object.
* @param chan Number of channels.
* @param format Audio format.
*/
void changeVolume(Buffer *b, int chan, Qmmp::AudioFormat format);
/*!
* Returns software volume object instance.
*/
static SoftwareVolume *instance();
protected:
/*! @internal
* Gets current volume.
* @param left Pointer to the left volume level.
* @param right Pointer to the right volume level
*/
void volume(int *left, int *right);
private:
int m_left, m_right;
double m_scaleLeft, m_scaleRight;
static SoftwareVolume *m_instance;
};
#endif
|