summaryrefslogtreecommitdiffstats
path: root/src/sound
diff options
context:
space:
mode:
authorKrzysztof Dermont <erihel@gmail.com>2014-06-21 02:58:41 +0200
committerKrzysztof Dermont <erihel@gmail.com>2014-06-21 02:59:26 +0200
commit1630cf0ed20ea8df879327af1275ff281a9bc7e0 (patch)
tree8ea090c6ce1e9ea5b5fc95198bdbf5489d8d686f /src/sound
parent2260f6bf4feb62929e32a1bea9cd3f403aa034b1 (diff)
downloadcolobot-1630cf0ed20ea8df879327af1275ff281a9bc7e0.tar.gz
colobot-1630cf0ed20ea8df879327af1275ff281a9bc7e0.tar.bz2
colobot-1630cf0ed20ea8df879327af1275ff281a9bc7e0.zip
Implemented libsndfile loader in PhysFS
Diffstat (limited to 'src/sound')
-rw-r--r--src/sound/oalsound/alsound.h67
-rw-r--r--src/sound/oalsound/buffer.cpp33
-rw-r--r--src/sound/sound.cpp10
3 files changed, 54 insertions, 56 deletions
diff --git a/src/sound/oalsound/alsound.h b/src/sound/oalsound/alsound.h
index bb9bf28..1249f14 100644
--- a/src/sound/oalsound/alsound.h
+++ b/src/sound/oalsound/alsound.h
@@ -48,45 +48,44 @@ public:
ALSound();
~ALSound();
- bool Create();
- bool Cache(Sound, const std::string &);
- bool CacheMusic(const std::string &);
-
- bool GetEnable();
-
- void SetAudioVolume(int volume);
- int GetAudioVolume();
- void SetMusicVolume(int volume);
- int GetMusicVolume();
-
- void SetListener(const Math::Vector &eye, const Math::Vector &lookat);
- void FrameMove(float rTime);
-
- int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false);
- int Play(Sound sound, const Math::Vector &pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false);
- bool FlushEnvelope(int channel);
- bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper);
- bool Position(int channel, const Math::Vector &pos);
- bool Frequency(int channel, float frequency);
- bool Stop(int channel);
- bool StopAll();
- bool MuteAll(bool bMute);
-
- bool PlayMusic(int rank, bool bRepeat, float fadeTime=2.0f);
- bool PlayMusic(const std::string &filename, bool bRepeat, float fadeTime=2.0f);
- bool RestartMusic();
- void SuspendMusic();
- void StopMusic(float fadeTime=2.0f);
- bool IsPlayingMusic();
- bool PlayPauseMusic(const std::string &filename, bool repeat);
- void StopPauseMusic();
-
- bool CheckChannel(int &channel);
+ bool Create() override;
+ bool Cache(Sound, const std::string &) override;
+ bool CacheMusic(const std::string &) override;
+
+ bool GetEnable() override;
+
+ void SetAudioVolume(int volume) override;
+ int GetAudioVolume() override;
+ void SetMusicVolume(int volume) override;
+ int GetMusicVolume() override;
+
+ void SetListener(const Math::Vector &eye, const Math::Vector &lookat) override;
+ void FrameMove(float rTime) override;
+
+ int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false) override;
+ int Play(Sound sound, const Math::Vector &pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false) override;
+ bool FlushEnvelope(int channel) override;
+ bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper) override;
+ bool Position(int channel, const Math::Vector &pos) override;
+ bool Frequency(int channel, float frequency) override;
+ bool Stop(int channel) override;
+ bool StopAll() override;
+ bool MuteAll(bool bMute) override;
+
+ bool PlayMusic(int rank, bool bRepeat, float fadeTime=2.0f) override;
+ bool PlayMusic(const std::string &filename, bool bRepeat, float fadeTime=2.0f) override;
+ bool RestartMusic() override;
+ void SuspendMusic() override;
+ void StopMusic(float fadeTime=2.0f) override;
+ bool IsPlayingMusic() override;
+ bool PlayPauseMusic(const std::string &filename, bool repeat) override;
+ void StopPauseMusic() override;
private:
void CleanUp();
int GetPriority(Sound);
bool SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded);
+ bool CheckChannel(int &channel);
bool m_enabled;
float m_audioVolume;
diff --git a/src/sound/oalsound/buffer.cpp b/src/sound/oalsound/buffer.cpp
index b27029c..d9441ad 100644
--- a/src/sound/oalsound/buffer.cpp
+++ b/src/sound/oalsound/buffer.cpp
@@ -17,7 +17,10 @@
#include "sound/oalsound/buffer.h"
-#include <cstring>
+#include <memory>
+
+#include "common/resources/resourcemanager.h"
+
Buffer::Buffer()
{
@@ -42,19 +45,17 @@ bool Buffer::LoadFromFile(std::string filename, Sound sound)
m_sound = sound;
GetLogger()->Debug("Loading audio file: %s\n", filename.c_str());
- SF_INFO fileInfo;
- memset(&fileInfo, 0, sizeof(SF_INFO));
- SNDFILE *file = sf_open(filename.c_str(), SFM_READ, &fileInfo);
+ std::unique_ptr<CSNDFile> file = std::unique_ptr<CSNDFile>(CResourceManager::GetSNDFileHandler(filename));
- GetLogger()->Trace(" channels %d\n", fileInfo.channels);
- GetLogger()->Trace(" format %d\n", fileInfo.format);
- GetLogger()->Trace(" frames %d\n", fileInfo.frames);
- GetLogger()->Trace(" samplerate %d\n", fileInfo.samplerate);
- GetLogger()->Trace(" sections %d\n", fileInfo.sections);
+ GetLogger()->Trace(" channels %d\n", file->GetFileInfo().channels);
+ GetLogger()->Trace(" format %d\n", file->GetFileInfo().format);
+ GetLogger()->Trace(" frames %d\n", file->GetFileInfo().frames);
+ GetLogger()->Trace(" samplerate %d\n", file->GetFileInfo().samplerate);
+ GetLogger()->Trace(" sections %d\n", file->GetFileInfo().sections);
- if (!file)
+ if (!file->IsOpen())
{
- GetLogger()->Warn("Could not load file. Reason: %s\n", sf_strerror(file));
+ GetLogger()->Warn("Could not load file. Reason: %s\n", file->GetLastError().c_str());
m_loaded = false;
return false;
}
@@ -64,23 +65,21 @@ bool Buffer::LoadFromFile(std::string filename, Sound sound)
{
GetLogger()->Warn("Could not create audio buffer\n");
m_loaded = false;
- sf_close(file);
return false;
}
// read chunks of 4096 samples
std::vector<uint16_t> data;
std::array<int16_t, 4096> buffer;
- data.reserve(fileInfo.frames);
+ data.reserve(file->GetFileInfo().frames);
size_t read = 0;
- while ((read = sf_read_short(file, buffer.data(), buffer.size())) != 0)
+ while ((read = file->Read(buffer.data(), buffer.size())) != 0)
{
data.insert(data.end(), buffer.begin(), buffer.begin() + read);
}
- sf_close(file);
- alBufferData(m_buffer, fileInfo.channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, &data.front(), data.size() * sizeof(uint16_t), fileInfo.samplerate);
- m_duration = static_cast<float>(fileInfo.frames) / fileInfo.samplerate;
+ alBufferData(m_buffer, file->GetFileInfo().channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, &data.front(), data.size() * sizeof(uint16_t), file->GetFileInfo().samplerate);
+ m_duration = static_cast<float>(file->GetFileInfo().frames) / file->GetFileInfo().samplerate;
m_loaded = true;
return true;
}
diff --git a/src/sound/sound.cpp b/src/sound/sound.cpp
index 9cae1fd..9c9f483 100644
--- a/src/sound/sound.cpp
+++ b/src/sound/sound.cpp
@@ -46,7 +46,7 @@ void CSoundInterface::CacheAll()
for ( int i = 1; i < SOUND_MAX; i++ )
{
std::stringstream filename;
- filename << "sound" << std::setfill('0') << std::setw(3) << i << ".wav";
+ filename << "sounds/sound" << std::setfill('0') << std::setw(3) << i << ".wav";
if ( !Cache(static_cast<Sound>(i), filename.str()) )
GetLogger()->Warn("Unable to load audio: %s\n", filename.str().c_str());
}
@@ -54,10 +54,10 @@ void CSoundInterface::CacheAll()
void CSoundInterface::AddMusicFiles()
{
- CacheMusic("Intro1.ogg");
- CacheMusic("Intro2.ogg");
- CacheMusic("music010.ogg");
- CacheMusic("music011.ogg");
+ CacheMusic("music/Intro1.ogg");
+ CacheMusic("music/Intro2.ogg");
+ CacheMusic("music/music010.ogg");
+ CacheMusic("music/music011.ogg");
}
bool CSoundInterface::Cache(Sound bSound, const std::string &bFile)