libsidplayfp 2.9.0
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#include <atomic>
44#include <vector>
45
46class SidTune;
47class SidInfo;
48class sidbuilder;
49
50
51namespace libsidplayfp
52{
53
54class Player
55{
56private:
57 enum class state_t
58 {
59 STOPPED,
60 PLAYING,
61 STOPPING
62 };
63
64private:
66 c64 m_c64;
67
69 Mixer m_mixer;
70
72 SidTune *m_tune;
73
75 SidInfoImpl m_info;
76
78 SidConfig m_cfg;
79
81 const char *m_errorString;
82
83 std::atomic<state_t> m_isPlaying;
84
85 sidrandom m_rand;
86
88 uint8_t videoSwitch;
89
90private:
97 c64::model_t c64model(SidConfig::c64_model_t defaultModel, bool forced);
98
104 void initialise();
105
109 void sidRelease();
110
116 void sidCreate(sidbuilder *builder, SidConfig::sid_model_t defaultModel, bool digiboost,
117 bool forced, const std::vector<unsigned int> &extraSidAddresses);
118
127 void sidParams(double cpuFreq, int frequency,
128 SidConfig::sampling_method_t sampling, bool fastSampling);
129
130 inline void run(unsigned int events);
131
132public:
133 Player();
134 ~Player() = default;
135
136 const SidConfig &config() const { return m_cfg; }
137
138 const SidInfo &info() const { return m_info; }
139
140 bool config(const SidConfig &cfg, bool force=false);
141
142 bool fastForward(unsigned int percent);
143
144 bool load(SidTune *tune);
145
146 uint_least32_t play(short *buffer, uint_least32_t samples);
147
148 bool isPlaying() const { return m_isPlaying != state_t::STOPPED; }
149
150 void stop();
151
152 uint_least32_t timeMs() const { return m_c64.getTimeMs(); }
153
154 void debug(const bool enable, FILE *out) { m_c64.debug(enable, out); }
155
156 void mute(unsigned int sidNum, unsigned int voice, bool enable);
157
158 const char *error() const { return m_errorString; }
159
160 void setKernal(const uint8_t* rom);
161 void setBasic(const uint8_t* rom);
162 void setChargen(const uint8_t* rom);
163
164 uint_least16_t getCia1TimerA() const { return m_c64.getCia1TimerA(); }
165
166 bool getSidStatus(unsigned int sidNum, uint8_t regs[32]);
167};
168
169}
170
171#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:84
c64_model_t
C64 model.
Definition SidConfig.h:74
Definition SidInfoImpl.h:53
Definition SidInfo.h:34
Definition SidTune.h:43
Definition mixer.h:42
Definition player.h:55
Definition c64.h:73
model_t
Definition c64.h:76
Definition sidrandom.h:31
Definition sidbuilder.h:41