LMMS
Loading...
Searching...
No Matches
Classic_Emu.h
Go to the documentation of this file.
1// Common aspects of emulators which use Blip_Buffer for sound output
2
3// Game_Music_Emu https://bitbucket.org/mpyne/game-music-emu/
4#ifndef CLASSIC_EMU_H
5#define CLASSIC_EMU_H
6
7#include "blargg_common.h"
8#include "Blip_Buffer.h"
9#include "Music_Emu.h"
10
11class Classic_Emu : public Music_Emu {
12public:
15 void set_buffer( Multi_Buffer* );
16 blargg_err_t set_multi_channel( bool is_enabled ) override;
17protected:
18 // Services
19 enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
20 void set_voice_types( int const* t ) { voice_types = t; }
21 blargg_err_t setup_buffer( long clock_rate );
22 long clock_rate() const { return clock_rate_; }
23 void change_clock_rate( long ); // experimental
24
25 // Overridable
26 virtual void set_voice( int index, Blip_Buffer* center,
28 virtual void update_eq( blip_eq_t const& ) = 0;
29 virtual blargg_err_t start_track_( int track ) = 0;
30 virtual blargg_err_t run_clocks( blip_time_t& time_io, int msec ) = 0;
31protected:
32 blargg_err_t set_sample_rate_( long sample_rate );
33 void mute_voices_( int );
34 void set_equalizer_( equalizer_t const& );
35 blargg_err_t play_( long, sample_t* );
36private:
38 Multi_Buffer* stereo_buffer; // NULL if using custom buffer
41 int const* voice_types;
42};
43
45{
46 assert( !buf && new_buf );
47 buf = new_buf;
48}
49
50// ROM data handler, used by several Classic_Emu derivitives. Loads file data
51// with padding on both sides, allowing direct use in bank mapping. The main purpose
52// is to allow all file data to be loaded with only one read() call (for efficiency).
53
54class Rom_Data_ {
55public:
56 typedef unsigned char byte;
57protected:
58 enum { pad_extra = 8 };
59 blargg_vector<byte> rom;
61 blargg_long rom_addr;
62 blargg_long mask;
63 blargg_long size_; // TODO: eliminate
64
65 blargg_err_t load_rom_data_( Data_Reader& in, int header_size, void* header_out,
66 int fill, long pad_size );
67 void set_addr_( long addr, int unit );
68};
69
70template<int unit>
71class Rom_Data : public Rom_Data_ {
72 enum { pad_size = unit + pad_extra };
73public:
74 // Load file data, using already-loaded header 'h' if not NULL. Copy header
75 // from loaded file data into *out and fill unmapped bytes with 'fill'.
76 blargg_err_t load( Data_Reader& in, int header_size, void* header_out, int fill )
77 {
78 return load_rom_data_( in, header_size, header_out, fill, pad_size );
79 }
80
81 // Size of file data read in (excluding header)
82 long file_size() const { return file_size_; }
83
84 // Pointer to beginning of file data
85 byte* begin() const { return rom.begin() + pad_size; }
86
87 // Set address that file data should start at
88 void set_addr( long addr ) { set_addr_( addr, unit ); }
89
90 // Free data
91 void clear() { rom.clear(); }
92
93 // Size of data + start addr, rounded to a multiple of unit
94 long size() const { return size_; }
95
96 // Pointer to unmapped page filled with same value
97 byte* unmapped() { return rom.begin(); }
98
99 // Mask address to nearest power of two greater than size()
100 blargg_long mask_addr( blargg_long addr ) const
101 {
102 #ifdef check
103 check( addr <= mask );
104 #endif
105 return addr & mask;
106 }
107
108 // Pointer to page starting at addr. Returns unmapped() if outside data.
109 byte* at_addr( blargg_long addr )
110 {
111 blargg_ulong offset = mask_addr( addr ) - rom_addr;
112 if ( offset > blargg_ulong (rom.size() - pad_size) )
113 offset = 0; // unmapped
114 return &rom [offset];
115 }
116};
117
118#ifndef GME_APU_HOOK
119 #define GME_APU_HOOK( emu, addr, data ) ((void) 0)
120#endif
121
122#ifndef GME_FRAME_HOOK
123 #define GME_FRAME_HOOK( emu ) ((void) 0)
124#else
125 #define GME_FRAME_HOOK_DEFINED 1
126#endif
127
128#endif
blip_long blip_time_t
Definition Blip_Buffer.h:17
const long clock_rate
Definition Gym_Emu.cpp:26
assert(0)
#define check(expr)
Definition blargg_source.h:32
Definition Blip_Buffer.h:23
int const * voice_types
Definition Classic_Emu.h:41
void set_buffer(Multi_Buffer *)
Definition Classic_Emu.h:44
Multi_Buffer * stereo_buffer
Definition Classic_Emu.h:38
~Classic_Emu()
Definition Classic_Emu.cpp:33
blargg_err_t set_multi_channel(bool is_enabled) override
Definition Classic_Emu.cpp:57
unsigned buf_changed_count
Definition Classic_Emu.h:40
virtual blargg_err_t run_clocks(blip_time_t &time_io, int msec)=0
Multi_Buffer * buf
Definition Classic_Emu.h:37
virtual blargg_err_t start_track_(int track)=0
Definition Classic_Emu.cpp:97
virtual void update_eq(blip_eq_t const &)=0
@ noise_type
Definition Classic_Emu.h:19
@ mixed_type
Definition Classic_Emu.h:19
@ wave_type
Definition Classic_Emu.h:19
long clock_rate_
Definition Classic_Emu.h:39
Classic_Emu()
Definition Classic_Emu.cpp:21
void set_voice_types(int const *t)
Definition Classic_Emu.h:20
virtual void set_voice(int index, Blip_Buffer *center, Blip_Buffer *left, Blip_Buffer *right)=0
blargg_err_t play_(long, sample_t *)
Definition Classic_Emu.cpp:104
blargg_err_t set_sample_rate_(long sample_rate)
Definition Classic_Emu.cpp:46
void set_equalizer_(equalizer_t const &)
Definition Classic_Emu.cpp:38
void mute_voices_(int)
Definition Classic_Emu.cpp:63
blargg_err_t setup_buffer(long clock_rate)
Definition Classic_Emu.cpp:88
void change_clock_rate(long)
Definition Classic_Emu.cpp:82
long clock_rate() const
Definition Classic_Emu.h:22
Definition Data_Reader.h:10
Definition Multi_Buffer.h:12
Definition Classic_Emu.h:54
blargg_err_t load_rom_data_(Data_Reader &in, int header_size, void *header_out, int fill, long pad_size)
Definition Classic_Emu.cpp:129
long file_size_
Definition Classic_Emu.h:60
@ pad_extra
Definition Classic_Emu.h:58
blargg_long size_
Definition Classic_Emu.h:63
blargg_long rom_addr
Definition Classic_Emu.h:61
blargg_long mask
Definition Classic_Emu.h:62
blargg_vector< byte > rom
Definition Classic_Emu.h:59
void set_addr_(long addr, int unit)
Definition Classic_Emu.cpp:160
unsigned char byte
Definition Classic_Emu.h:56
Definition Classic_Emu.h:71
void set_addr(long addr)
Definition Classic_Emu.h:88
@ pad_size
Definition Classic_Emu.h:72
byte * begin() const
Definition Classic_Emu.h:85
blargg_err_t load(Data_Reader &in, int header_size, void *header_out, int fill)
Definition Classic_Emu.h:76
void clear()
Definition Classic_Emu.h:91
blargg_long mask_addr(blargg_long addr) const
Definition Classic_Emu.h:100
long size() const
Definition Classic_Emu.h:94
byte * at_addr(blargg_long addr)
Definition Classic_Emu.h:109
byte * unmapped()
Definition Classic_Emu.h:97
long file_size() const
Definition Classic_Emu.h:82
Definition Blip_Buffer.h:239
struct huft * t
Definition inflate.c:943
const int header_size
Definition Wave_Writer.cpp:24
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 left
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 right
float in
Definition lilv_test.c:1460
png_const_structrp png_const_inforp int * unit
Definition png.h:2161
gme_equalizer_t equalizer_t
Definition Music_Emu.h:106
Music_Emu()
Definition Music_Emu.cpp:51
long sample_rate() const
Definition Music_Emu.h:217
short sample_t
Definition Music_Emu.h:27