libsidplayfp 2.5.1
player.h
1/*
2 * This file is part of libsidplayfp, a SID player engine.
3 *
4 * Copyright 2011-2022 Leandro Nini <drfiemost@users.sourceforge.net>
5 * Copyright 2007-2010 Antti Lankila
6 * Copyright 2000-2001 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
24#ifndef PLAYER_H
25#define PLAYER_H
26
27#include <stdint.h>
28#include <cstdio>
29
30#include "sidplayfp/siddefs.h"
31#include "sidplayfp/SidConfig.h"
32#include "sidplayfp/SidTuneInfo.h"
33
34#include "SidInfoImpl.h"
35#include "sidrandom.h"
36#include "mixer.h"
37#include "c64/c64.h"
38
39#ifdef HAVE_CONFIG_H
40# include "config.h"
41#endif
42
43#ifdef HAVE_CXX11
44# include <atomic>
45#endif
46#include <vector>
47
48class SidTune;
49class SidInfo;
50class sidbuilder;
51
52
53namespace libsidplayfp
54{
55
56class Player
57{
58private:
59 typedef enum
60 {
61 STOPPED,
62 PLAYING,
63 STOPPING
64 } state_t;
65
66private:
68 c64 m_c64;
69
71 Mixer m_mixer;
72
74 SidTune *m_tune;
75
77 SidInfoImpl m_info;
78
80 SidConfig m_cfg;
81
83 const char *m_errorString;
84
85#ifndef HAVE_CXX11
86 volatile state_t m_isPlaying;
87#else
88 std::atomic<state_t> m_isPlaying;
89#endif
90
91 sidrandom m_rand;
92
94 uint8_t videoSwitch;
95
96private:
103 c64::model_t c64model(SidConfig::c64_model_t defaultModel, bool forced);
104
110 void initialise();
111
115 void sidRelease();
116
122 void sidCreate(sidbuilder *builder, SidConfig::sid_model_t defaultModel, bool digiboost,
123 bool forced, const std::vector<unsigned int> &extraSidAddresses);
124
133 void sidParams(double cpuFreq, int frequency,
134 SidConfig::sampling_method_t sampling, bool fastSampling);
135
136 inline void run(unsigned int events);
137
138public:
139 Player();
140 ~Player() {}
141
142 const SidConfig &config() const { return m_cfg; }
143
144 const SidInfo &info() const { return m_info; }
145
146 bool config(const SidConfig &cfg, bool force=false);
147
148 bool fastForward(unsigned int percent);
149
150 bool load(SidTune *tune);
151
152 uint_least32_t play(short *buffer, uint_least32_t samples);
153
154 bool isPlaying() const { return m_isPlaying != STOPPED; }
155
156 void stop();
157
158 uint_least32_t timeMs() const { return m_c64.getTimeMs(); }
159
160 void debug(const bool enable, FILE *out) { m_c64.debug(enable, out); }
161
162 void mute(unsigned int sidNum, unsigned int voice, bool enable);
163
164 const char *error() const { return m_errorString; }
165
166 void setKernal(const uint8_t* rom);
167 void setBasic(const uint8_t* rom);
168 void setChargen(const uint8_t* rom);
169
170 uint_least16_t getCia1TimerA() const { return m_c64.getCia1TimerA(); }
171
172 bool getSidStatus(unsigned int sidNum, uint8_t regs[32]);
173};
174
175}
176
177#endif // PLAYER_H
Definition SidConfig.h:40
sid_model_t
SID chip model.
Definition SidConfig.h:51
sampling_method_t
Sampling method.
Definition SidConfig.h:76
c64_model_t
C64 model.
Definition SidConfig.h:66
Definition SidInfoImpl.h:53
Definition SidInfo.h:34
Definition SidTune.h:43
Definition mixer.h:42
Definition player.h:57
Definition c64.h:73
model_t
Definition c64.h:76
Definition sidrandom.h:31
Definition sidbuilder.h:41