libsidplayfp  2.12.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 
46 class SidTune;
47 class SidInfo;
48 class sidbuilder;
49 
50 
51 namespace libsidplayfp
52 {
53 
54 class Player
55 {
56 private:
57  enum class state_t
58  {
59  STOPPED,
60  PLAYING,
61  STOPPING
62  };
63 
64 private:
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 
90 private:
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 
132 public:
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  void filter(unsigned int sidNum, bool enable);
159 
160  const char *error() const { return m_errorString; }
161 
162  void setKernal(const uint8_t* rom);
163  void setBasic(const uint8_t* rom);
164  void setChargen(const uint8_t* rom);
165 
166  uint_least16_t getCia1TimerA() const { return m_c64.getCia1TimerA(); }
167 
168  bool getSidStatus(unsigned int sidNum, uint8_t regs[32]);
169 };
170 
171 }
172 
173 #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
Definition: sidrandom.h:31
Definition: sidbuilder.h:41