libsidplayfp  2.4.0
player.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-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 
48 class SidTune;
49 class SidInfo;
50 class sidbuilder;
51 
52 
53 namespace libsidplayfp
54 {
55 
56 class Player
57 {
58 private:
59  typedef enum
60  {
61  STOPPED,
62  PLAYING,
63  STOPPING
64  } state_t;
65 
66 private:
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 
96 private:
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 
138 public:
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 time() const { return m_c64.getTime(); }
159 
160  uint_least32_t timeMs() const { return m_c64.getTimeMs(); }
161 
162  void debug(const bool enable, FILE *out) { m_c64.debug(enable, out); }
163 
164  void mute(unsigned int sidNum, unsigned int voice, bool enable);
165 
166  const char *error() const { return m_errorString; }
167 
168  void setKernal(const uint8_t* rom);
169  void setBasic(const uint8_t* rom);
170  void setChargen(const uint8_t* rom);
171 
172  uint_least16_t getCia1TimerA() const { return m_c64.getCia1TimerA(); }
173 
174  bool getSidStatus(unsigned int sidNum, uint8_t regs[32]);
175 };
176 
177 }
178 
179 #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:43
Definition: player.h:57
Definition: c64.h:73
model_t
Definition: c64.h:76
Definition: sidrandom.h:31
Definition: sidbuilder.h:41