libsidplayfp 2.15.0
SidTuneBase.h
1/*
2 * This file is part of libsidplayfp, a SID player engine.
3 *
4 * Copyright 2011-2021 Leandro Nini <drfiemost@users.sourceforge.net>
5 * Copyright 2007-2010 Antti Lankila
6 * Copyright 2000 Simon White
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 */
22
23#ifndef SIDTUNEBASE_H
24#define SIDTUNEBASE_H
25
26#include <stdint.h>
27#include <memory>
28#include <vector>
29#include <string>
30
31#include "sidplayfp/SidTuneInfo.h"
32#include "sidplayfp/siddefs.h"
33
34#include "SmartPtr.h"
35#include "SidTuneInfoImpl.h"
36
37#include "sidcxx11.h"
38
39namespace libsidplayfp
40{
41
42class sidmemory;
43template <class T> class SmartPtr_sidtt;
44
49{
50private:
51 const char* m_msg;
52public:
53 loadError(const char* msg) : m_msg(msg) {}
54 const char* message() const { return m_msg; }
55};
56
61{
62protected:
63 using buffer_t = std::vector<uint8_t>;
64
65protected:
67 static constexpr unsigned int MAX_SONGS = 256;
68
69 // Generic error messages
70 static const char ERR_TRUNCATED[];
71 static const char ERR_INVALID[];
72
73public: // ----------------------------------------------------------------
74 virtual ~SidTuneBase() = default;
75
76 using LoaderFunc = void (*)(const char* fileName, buffer_t& bufferRef);
77
94 static SidTuneBase* load(const char* fileName, const char **fileNameExt, bool separatorIsSlash)
95 {
96 return load(nullptr, fileName, fileNameExt, separatorIsSlash);
97 }
98
113 static SidTuneBase* load(LoaderFunc loader, const char* fileName, const char **fileNameExt, bool separatorIsSlash);
114
124 static SidTuneBase* read(const uint_least8_t* sourceBuffer, uint_least32_t bufferLen)
125 {
126 return getFromBuffer(sourceBuffer, bufferLen);
127 }
128
136 unsigned int selectSong(unsigned int songNum);
137
141 const SidTuneInfo* getInfo() const { return info.get(); }
142
149 const SidTuneInfo* getInfo(unsigned int songNum)
150 {
151 selectSong(songNum);
152 return info.get();
153 }
154
160 virtual void placeSidTuneInC64mem(sidmemory& mem);
161
169 virtual const char *createMD5(char *) { return nullptr; }
170
178 virtual const char *createMD5New(char *) { return nullptr; }
179
183 const uint_least8_t* c64Data() const { return &cache[fileOffset]; }
184
185protected: // -------------------------------------------------------------
186
187 std::unique_ptr<SidTuneInfoImpl> info;
188
189 uint_least8_t songSpeed[MAX_SONGS];
190 SidTuneInfo::clock_t clockSpeed[MAX_SONGS];
191
193 uint_least32_t fileOffset;
194
195 buffer_t cache;
196
197protected:
198 SidTuneBase();
199
208 static void loadFile(const char* fileName, buffer_t& bufferRef);
209
216 void convertOldStyleSpeedToTables(uint_least32_t speed,
217 SidTuneInfo::clock_t clock = SidTuneInfo::CLOCK_PAL);
218
222 bool checkCompatibility();
223
227 bool checkRelocInfo();
228
234 void resolveAddrs(const uint_least8_t* c64data);
235
253 virtual void acceptSidTune(const char* dataFileName, const char* infoFileName,
254 buffer_t& buf, bool isSlashedFileName);
255
260
261private: // ---------------------------------------------------------------
262
263#if !defined(SIDTUNE_NO_STDIN_LOADER)
264 static SidTuneBase* getFromStdIn();
265#endif
266 static SidTuneBase* getFromFiles(const char* fileName, const char **fileNameExtensions, bool separatorIsSlash)
267 {
268 return getFromFiles(nullptr, fileName, fileNameExtensions, separatorIsSlash);
269 }
270
271 static SidTuneBase* getFromFiles(LoaderFunc loader, const char* fileName, const char **fileNameExtensions, bool separatorIsSlash);
272
276 static SidTuneBase* getFromBuffer(const uint_least8_t* const buffer, uint_least32_t bufferLen);
277
285 static void createNewFileName(std::string& destString,
286 const char* sourceName, const char* sourceExt);
287
288private:
289 // prevent copying
290 SidTuneBase(const SidTuneBase&) = delete;
291 SidTuneBase& operator=(SidTuneBase&) = delete;
292};
293
294}
295
296#endif /* SIDTUNEBASE_H */
Definition SidTuneInfo.h:39
Definition SidTuneBase.h:61
bool checkCompatibility()
Definition SidTuneBase.cpp:515
virtual void acceptSidTune(const char *dataFileName, const char *infoFileName, buffer_t &buf, bool isSlashedFileName)
Definition SidTuneBase.cpp:257
const SidTuneInfo * getInfo() const
Definition SidTuneBase.h:141
void resolveAddrs(const uint_least8_t *c64data)
Definition SidTuneBase.cpp:480
virtual const char * createMD5New(char *)
Definition SidTuneBase.h:178
std::string petsciiToAscii(SmartPtr_sidtt< const uint8_t > &spPet)
Definition SidTuneBase.cpp:546
const SidTuneInfo * getInfo(unsigned int songNum)
Definition SidTuneBase.h:149
static constexpr unsigned int MAX_SONGS
Also PSID file format limit.
Definition SidTuneBase.h:67
void convertOldStyleSpeedToTables(uint_least32_t speed, SidTuneInfo::clock_t clock=SidTuneInfo::CLOCK_PAL)
Definition SidTuneBase.cpp:412
static SidTuneBase * read(const uint_least8_t *sourceBuffer, uint_least32_t bufferLen)
Definition SidTuneBase.h:124
virtual void placeSidTuneInC64mem(sidmemory &mem)
Definition SidTuneBase.cpp:146
virtual const char * createMD5(char *)
Definition SidTuneBase.h:169
static SidTuneBase * load(const char *fileName, const char **fileNameExt, bool separatorIsSlash)
Definition SidTuneBase.h:94
const uint_least8_t * c64Data() const
Definition SidTuneBase.h:183
bool checkRelocInfo()
Definition SidTuneBase.cpp:433
unsigned int selectSong(unsigned int songNum)
Definition SidTuneBase.cpp:111
uint_least32_t fileOffset
For files with header: offset to real data.
Definition SidTuneBase.h:193
static void loadFile(const char *fileName, buffer_t &bufferRef)
Definition SidTuneBase.cpp:162
Definition SmartPtr.h:193
Definition SidTuneBase.h:49
Definition sidmemory.h:34