summaryrefslogtreecommitdiffstats
path: root/src/common
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/common
parent2260f6bf4feb62929e32a1bea9cd3f403aa034b1 (diff)
downloadcolobot-1630cf0ed20ea8df879327af1275ff281a9bc7e0.tar.gz
colobot-1630cf0ed20ea8df879327af1275ff281a9bc7e0.tar.bz2
colobot-1630cf0ed20ea8df879327af1275ff281a9bc7e0.zip
Implemented libsndfile loader in PhysFS
Diffstat (limited to 'src/common')
-rw-r--r--src/common/resources/resourcemanager.cpp16
-rw-r--r--src/common/resources/resourcemanager.h3
-rw-r--r--src/common/resources/sndfile.cpp130
-rw-r--r--src/common/resources/sndfile.h54
4 files changed, 198 insertions, 5 deletions
diff --git a/src/common/resources/resourcemanager.cpp b/src/common/resources/resourcemanager.cpp
index ccef2a3..b01424b 100644
--- a/src/common/resources/resourcemanager.cpp
+++ b/src/common/resources/resourcemanager.cpp
@@ -124,7 +124,13 @@ SDL_RWops* CResourceManager::GetSDLFileHandler(const std::string &filename)
}
-int CResourceManager::SDLClose(SDL_RWops* context)
+CSNDFile* CResourceManager::GetSNDFileHandler(const std::string &filename)
+{
+ return new CSNDFile(filename);
+}
+
+
+int CResourceManager::SDLClose(SDL_RWops *context)
{
if (CheckSDLContext(context))
{
@@ -138,7 +144,7 @@ int CResourceManager::SDLClose(SDL_RWops* context)
}
-int CResourceManager::SDLRead(SDL_RWops* context, void* ptr, int size, int maxnum)
+int CResourceManager::SDLRead(SDL_RWops *context, void *ptr, int size, int maxnum)
{
if (CheckSDLContext(context))
{
@@ -152,13 +158,13 @@ int CResourceManager::SDLRead(SDL_RWops* context, void* ptr, int size, int maxnu
}
-int CResourceManager::SDLWrite(SDL_RWops* context, const void* ptr, int size, int num)
+int CResourceManager::SDLWrite(SDL_RWops *context, const void *ptr, int size, int num)
{
return 0;
}
-int CResourceManager::SDLSeek(SDL_RWops* context, int offset, int whence)
+int CResourceManager::SDLSeek(SDL_RWops *context, int offset, int whence)
{
if (CheckSDLContext(context))
{
@@ -188,7 +194,7 @@ int CResourceManager::SDLSeek(SDL_RWops* context, int offset, int whence)
}
-bool CResourceManager::CheckSDLContext(SDL_RWops* context)
+bool CResourceManager::CheckSDLContext(SDL_RWops *context)
{
if (context->type != 0xc010b04f)
{
diff --git a/src/common/resources/resourcemanager.h b/src/common/resources/resourcemanager.h
index ba11d73..fec71da 100644
--- a/src/common/resources/resourcemanager.h
+++ b/src/common/resources/resourcemanager.h
@@ -19,6 +19,8 @@
#include <string>
#include <SDL.h>
+#include "common/resources/sndfile.h"
+
class CResourceManager
{
public:
@@ -30,6 +32,7 @@ public:
static bool SetSaveLocation(const std::string &location);
static std::string GetLanguageLocation();
static SDL_RWops* GetSDLFileHandler(const std::string &filename);
+ static CSNDFile* GetSNDFileHandler(const std::string &filename);
private:
static int SDLSeek(SDL_RWops *context, int offset, int whence);
diff --git a/src/common/resources/sndfile.cpp b/src/common/resources/sndfile.cpp
new file mode 100644
index 0000000..9e8e729
--- /dev/null
+++ b/src/common/resources/sndfile.cpp
@@ -0,0 +1,130 @@
+// * This file is part of the COLOBOT source code
+// * Copyright (C) 2014 Polish Portal of Colobot (PPC)
+// *
+// * 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 3 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, see http://www.gnu.org/licenses/.
+
+#include "common/resources/sndfile.h"
+
+#include <cstring>
+
+
+CSNDFile::CSNDFile(const std::string& filename)
+{
+ memset(&m_file_info, 0, sizeof(SF_INFO));
+
+ if (PHYSFS_isInit())
+ {
+ m_file = PHYSFS_openRead(filename.c_str());
+ }
+ else
+ {
+ m_last_error = "Resource system not started!";
+ }
+
+ if (m_file)
+ {
+ m_snd_file = sf_open_virtual(&snd_callbacks, SFM_READ, &m_file_info, m_file);
+ if (!m_snd_file)
+ {
+ m_last_error = "Could not load file";
+ }
+ }
+ else
+ {
+ m_last_error = std::string(PHYSFS_getLastError());
+ }
+}
+
+
+CSNDFile::~CSNDFile()
+{
+ if (m_file)
+ {
+ PHYSFS_close(m_file);
+ }
+
+ if (m_snd_file)
+ {
+ sf_close(m_snd_file);
+ }
+}
+
+
+bool CSNDFile::IsOpen()
+{
+ return m_snd_file;
+}
+
+
+SF_INFO &CSNDFile::GetFileInfo()
+{
+ return m_file_info;
+}
+
+
+std::string& CSNDFile::GetLastError()
+{
+ return m_last_error;
+}
+
+
+sf_count_t CSNDFile::Read(short int *ptr, sf_count_t items)
+{
+ return sf_read_short(m_snd_file, ptr, items);
+}
+
+
+sf_count_t CSNDFile::SNDLength(void *data)
+{
+ return PHYSFS_fileLength(static_cast<PHYSFS_File *>(data));
+}
+
+
+sf_count_t CSNDFile::SNDRead(void *ptr, sf_count_t count, void *data)
+{
+ return PHYSFS_read(static_cast<PHYSFS_File *>(data), ptr, 1, count);
+}
+
+
+sf_count_t CSNDFile::SNDSeek(sf_count_t offset, int whence, void *data)
+{
+ PHYSFS_File *file = static_cast<PHYSFS_File *>(data);
+
+ switch(whence)
+ {
+ case SEEK_CUR:
+ PHYSFS_seek(file, PHYSFS_tell(file) + offset);
+ break;
+ case SEEK_SET:
+ PHYSFS_seek(file, offset);
+ break;
+ case SEEK_END:
+ PHYSFS_seek(file, PHYSFS_fileLength(file) + offset);
+ break;
+ }
+
+ return PHYSFS_tell(file);
+}
+
+
+sf_count_t CSNDFile::SNDTell(void *data)
+{
+ return PHYSFS_tell(static_cast<PHYSFS_File *>(data));
+}
+
+
+sf_count_t CSNDFile::SNDWrite(const void *ptr, sf_count_t count, void *data)
+{
+ return PHYSFS_write(static_cast<PHYSFS_File *>(data), ptr, 1, count);
+}
diff --git a/src/common/resources/sndfile.h b/src/common/resources/sndfile.h
new file mode 100644
index 0000000..5ea6ccc
--- /dev/null
+++ b/src/common/resources/sndfile.h
@@ -0,0 +1,54 @@
+// * This file is part of the COLOBOT source code
+// * Copyright (C) 2014 Polish Portal of Colobot (PPC)
+// *
+// * 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 3 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, see http://www.gnu.org/licenses/.
+
+#pragma once
+
+#include <string>
+#include <physfs.h>
+#include <sndfile.h>
+
+
+class CSNDFile
+{
+public:
+ CSNDFile(const std::string &filename);
+ virtual ~CSNDFile();
+
+ SF_INFO &GetFileInfo();
+ bool IsOpen();
+ std::string &GetLastError();
+ sf_count_t Read(short int *ptr, sf_count_t items);
+
+private:
+ static sf_count_t SNDLength(void *data);
+ static sf_count_t SNDSeek(sf_count_t offset, int whence, void *data);
+ static sf_count_t SNDRead(void *ptr, sf_count_t count, void *data);
+ static sf_count_t SNDWrite(const void *ptr, sf_count_t count, void *data);
+ static sf_count_t SNDTell(void *data);
+
+ SF_INFO m_file_info;
+ SNDFILE *m_snd_file;
+ PHYSFS_File *m_file;
+ std::string m_last_error;
+
+ SF_VIRTUAL_IO snd_callbacks = {
+ SNDLength,
+ SNDSeek,
+ SNDRead,
+ SNDWrite,
+ SNDTell
+ };
+};