Skip to content
This repository was archived by the owner on Oct 18, 2023. It is now read-only.

Commit e2e34bf

Browse files
committed
Add 4 point to manipulate audio source
1 parent 685b693 commit e2e34bf

6 files changed

Lines changed: 99 additions & 5 deletions

File tree

module/includes/components/AudioSource.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,19 @@
1818

1919
namespace sw
2020
{
21+
class AudioSourceManager;
22+
2123
class SW_GRAPH_MODULE_EXPORT AudioSource : public sw::Component
2224
{
2325
private:
2426
ALuint m_source;
27+
bool m_loop;
28+
float m_currentSample;
29+
float m_startPoint;
30+
float m_startLoopPoint;
31+
float m_endPoint;
32+
float m_endLoopPoint;
33+
2534
public:
2635
explicit AudioSource(sw::GameObject& entity);
2736
~AudioSource() override;
@@ -32,6 +41,13 @@ namespace sw
3241
AudioSource& stop();
3342
AudioSource& setVolume(float volume);
3443
AudioSource& setPitch(float pitch);
44+
AudioSource& setLoop(bool loop);
45+
AudioSource& setStartPoint(float second);
46+
AudioSource& setStartLoopPoint(float second);
47+
AudioSource& setEndPoint(float second);
48+
AudioSource& setEndLoopPoint(float second);
49+
50+
friend AudioSourceManager;
3551
};
3652
}
3753

module/includes/managers/AudioSourceManager.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace sw
2121
using sw::AManager<AudioSource>::AManager;
2222
~AudioSourceManager() override = default;
2323

24-
void onUpdate() override {};
24+
void onUpdate() override;
2525
}; // class AudioSourceManager
2626

2727
} // namespace sw

module/includes/resources/Audio.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,21 @@ namespace sw
2222
class SW_GRAPH_MODULE_EXPORT Audio
2323
{
2424
private:
25-
SF_INFO m_fileInfo;
2625
SNDFILE *m_file;
26+
SF_INFO m_fileInfo;
2727
ALsizei m_numberSamples;
2828
ALsizei m_rate;
2929
std::vector<ALshort> m_samples;
3030
ALenum m_format;
3131
ALuint m_buffer;
32+
double m_duration;
3233

3334
public:
3435
explicit Audio(std::string path);
3536
~Audio();
3637

3738
[[nodiscard]] ALuint getBuffer() const;
39+
[[nodiscard]] double getDuration() const;
3840
};
3941
}
4042

module/sources/components/AudioSource.cpp

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,17 @@
88

99
#include "AudioSource.hpp"
1010
#include "OpenResources.hpp"
11+
#include "GameObject.hpp"
1112

1213
sw::AudioSource::AudioSource(sw::GameObject &gameObject) :
1314
sw::Component(gameObject),
14-
m_source(-1)
15+
m_source(-1),
16+
m_loop(false),
17+
m_currentSample(0.0f),
18+
m_startPoint(0.0f),
19+
m_startLoopPoint(-1),
20+
m_endLoopPoint(-1),
21+
m_endPoint(-1)
1522
{
1623
alGenSources(1, &m_source);
1724
}
@@ -24,7 +31,9 @@ sw::AudioSource::~AudioSource() noexcept
2431

2532
sw::AudioSource &sw::AudioSource::setAudio(std::string audio)
2633
{
27-
alSourcei(m_source, AL_BUFFER, sw::OpenResources::m_naudio[audio]->getBuffer());
34+
auto audioFile = sw::OpenResources::m_naudio[audio];
35+
alSourcei(m_source, AL_BUFFER, audioFile->getBuffer());
36+
m_endPoint = audioFile->getDuration();
2837
return (*this);
2938
}
3039

@@ -43,6 +52,7 @@ sw::AudioSource &sw::AudioSource::pause()
4352
sw::AudioSource &sw::AudioSource::stop()
4453
{
4554
alSourceStop(m_source);
55+
setStartLoopPoint(m_startPoint);
4656
return (*this);
4757
}
4858

@@ -56,4 +66,35 @@ sw::AudioSource &sw::AudioSource::setPitch(float pitch)
5666
{
5767
alSourcef(m_source, AL_PITCH, pitch);
5868
return (*this);
69+
}
70+
71+
sw::AudioSource &sw::AudioSource::setLoop(bool loop)
72+
{
73+
m_loop = loop;
74+
alSourcei(m_source, AL_LOOPING, m_loop ? AL_TRUE : AL_FALSE);
75+
return (*this);
76+
}
77+
78+
sw::AudioSource &sw::AudioSource::setStartPoint(float second)
79+
{
80+
alSourcef(m_source, AL_SEC_OFFSET, second);
81+
return (*this);
82+
}
83+
84+
sw::AudioSource &sw::AudioSource::setStartLoopPoint(float second)
85+
{
86+
m_startLoopPoint = second;
87+
return (*this);
88+
}
89+
90+
sw::AudioSource &sw::AudioSource::setEndPoint(float second)
91+
{
92+
m_endPoint = second;
93+
return (*this);
94+
}
95+
96+
sw::AudioSource &sw::AudioSource::setEndLoopPoint(float second)
97+
{
98+
m_endLoopPoint = second;
99+
return (*this);
59100
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
** Society: Creative Rift
3+
** SHIPWRECK ENGINE, 2022
4+
** Author: Guillaume S.
5+
** File name: AudioSourceManager.hpp
6+
** Description: [CHANGE]
7+
*/
8+
9+
#include "AudioSourceManager.hpp"
10+
11+
void sw::AudioSourceManager::onUpdate()
12+
{
13+
for (auto& [_, audioSource] : m_components) {
14+
alGetSourcef(audioSource->m_source, AL_SEC_OFFSET, &audioSource->m_currentSample);
15+
if (audioSource->m_endLoopPoint != -1 && audioSource->m_endLoopPoint <= audioSource->m_currentSample) {
16+
audioSource->stop();
17+
alSourcef(audioSource->m_source, AL_SEC_OFFSET, audioSource->m_startLoopPoint);
18+
audioSource->play();
19+
}
20+
if (audioSource->m_endPoint != -1 && audioSource->m_endPoint <= audioSource->m_currentSample)
21+
audioSource->stop();
22+
}
23+
}

module/sources/resources/Audio.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,21 @@
1313

1414
sw::Audio::Audio(std::string path) :
1515
m_file(nullptr),
16-
m_fileInfo()
16+
m_fileInfo(),
17+
m_numberSamples(0),
18+
m_rate(0),
19+
m_samples(),
20+
m_format(AL_NONE),
21+
m_buffer(0),
22+
m_duration(0)
1723
{
1824
m_file = sf_open(path.c_str(), SFM_READ, &m_fileInfo);
1925
if (!m_file)
2026
throw sw::Error("Cannot open file: " + path, "");
2127
m_numberSamples = (ALsizei)(m_fileInfo.channels * m_fileInfo.frames);
2228
m_rate = (ALsizei)m_fileInfo.samplerate;
2329
m_samples.resize(m_numberSamples);
30+
m_duration = (double)m_fileInfo.frames / m_fileInfo.samplerate;
2431
sf_read_short(m_file, &m_samples[0], m_numberSamples);
2532
sf_close(m_file);
2633

@@ -45,4 +52,9 @@ sw::Audio::~Audio() noexcept
4552
ALuint sw::Audio::getBuffer() const
4653
{
4754
return (m_buffer);
55+
}
56+
57+
double sw::Audio::getDuration() const
58+
{
59+
return (m_duration);
4860
}

0 commit comments

Comments
 (0)