21bb06f4ce90844768c836f4bfe644abb9f332de
[camargo/neiasound.git] / src / nSoundSource.h
1 // Copyright (C) 2015 Lucas Pires Camargo
2 // 
3 // This file is part of neiasound - Qt-style OpenAL wrapper for games.
4 // 
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 // 
9 // 1. Redistributions of source code must retain the above copyright notice,
10 // this list of conditions and the following disclaimer.
11 // 
12 // 2. Redistributions in binary form must reproduce the above copyright notice,
13 // this list of conditions and the following disclaimer in the documentation
14 // and/or other materials provided with the distribution.
15 // 
16 // THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY EXPRESS
17 // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
19 // NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
20 // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef NSOUNDSOURCE_H
27 #define NSOUNDSOURCE_H
28
29 #include <QObject>
30 #include <QVector3D>
31 #include "nSoundSourceRole.h"
32
33 class nSoundSystem;
34 class nSoundBuffer;
35
36
37 class nSoundSource : public QObject
38 {
39     Q_OBJECT
40     Q_ENUMS(nSoundSourceState)
41     Q_ENUMS(nSoundSourceRole)
42
43     Q_PROPERTY(unsigned int openalHandle READ openalHandle)
44     Q_PROPERTY(nSoundSourceRole role READ role)
45     Q_PROPERTY(nSoundSourceState state READ state)
46     Q_PROPERTY(qreal gain READ gain WRITE setGain)
47     Q_PROPERTY(qreal pitch READ pitch WRITE setPitch)
48     Q_PROPERTY(qreal rolloffFactor READ rolloffFactor WRITE setRolloffFactor)
49     Q_PROPERTY(bool loop READ loop WRITE setLoop)
50     Q_PROPERTY(QVector3D position READ position WRITE setPosition)
51     Q_PROPERTY(bool destroyAfterStopped READ destroyAfterStopped WRITE setDestroyAfterStopped NOTIFY onDestroyAfterStoppedChanged )
52
53     Q_PROPERTY(qreal fading READ isFading)
54     Q_PROPERTY(qreal fadeTarget READ fadeTarget)
55     Q_PROPERTY(qreal fadeDeltaPerSecond READ fadeDeltaPerSecond)
56
57
58 public:
59     enum nSoundSourceState
60     {
61         SSS_UNKNOWN,
62         SSS_PLAYING,
63         SSS_PAUSED,
64         SSS_STOPPED,
65         SSS_INITIAL
66     };
67
68     explicit nSoundSource(QString name, nSoundSourceRole role, nSoundSystem * parent);
69     virtual ~nSoundSource();
70
71     unsigned int openalHandle(){return m_handle;}
72     nSoundSourceState state();
73     nSoundSourceRole role(){return m_role;}
74     qreal gain();
75     qreal pitch();
76     qreal rolloffFactor();
77     bool loop();
78     QVector3D position();
79
80     bool isFading() const {return m_fading;}
81     qreal fadeTarget() const {return m_fadeTarget;}
82     qreal fadeDeltaPerSecond() const {return m_fadeDeltaPerSecond;}
83
84     // GAIN CFG SUPPORT
85     static qreal _roleGainVolume(nSoundSourceRole role);
86     static void _resetRoleGains();
87
88     bool destroyAfterStopped() const
89     {
90         return m_destroyAfterStopped;
91     }
92
93 signals:
94
95     void onDestroyAfterStoppedChanged(bool arg);
96
97 public slots:
98     bool update(qreal frameTime);
99
100     void attachBuffer(nSoundBuffer * buffer);
101
102     void setGain(qreal);
103     void setPitch(qreal);
104     void setRolloffFactor(qreal);
105     void setLoop(bool);
106     void setPosition(QVector3D pos);
107
108     void fade(qreal to, qreal duration, qreal from = -1.0f);
109
110     void play();
111     void pause();
112     void stop();
113     void rewind();
114
115     void setDestroyAfterStopped(bool arg)
116     {
117         if (m_destroyAfterStopped == arg)
118             return;
119
120         m_destroyAfterStopped = arg;
121         emit onDestroyAfterStoppedChanged(arg);
122     }
123
124 private:
125     unsigned int m_handle;
126     nSoundSourceRole m_role;
127
128     qreal m_gainMirror;
129
130     bool m_fading;
131     qreal m_fadeTarget;
132     qreal m_fadeDeltaPerSecond;
133
134     //GAIN CFG SUPPORT
135     static bool _m_gainsInitialized;
136     static qreal _m_musicGain;
137     static qreal _m_sfxGain;
138     static qreal _m_voiceGain;
139     static qreal _m_ambienceGain;
140
141     bool m_destroyAfterStopped;
142 };
143
144 #endif // NSOUNDSOURCE_H