diff options
Diffstat (limited to 'src/common/resources')
-rw-r--r-- | src/common/resources/resourcemanager.cpp | 16 | ||||
-rw-r--r-- | src/common/resources/resourcemanager.h | 3 | ||||
-rw-r--r-- | src/common/resources/sndfile.cpp | 130 | ||||
-rw-r--r-- | src/common/resources/sndfile.h | 54 |
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 + }; +}; |