LMMS
Loading...
Searching...
No Matches
Multi_Buffer.h
Go to the documentation of this file.
1// Multi-channel sound buffer interface, and basic mono and stereo buffers
2
3// Blip_Buffer 0.4.1
4#ifndef MULTI_BUFFER_H
5#define MULTI_BUFFER_H
6
7#include "blargg_common.h"
8#include "Blip_Buffer.h"
9
10// Interface to one or more Blip_Buffers mapped to one or more channels
11// consisting of left, center, and right buffers.
13public:
15 virtual ~Multi_Buffer() { }
16
17 // Set the number of channels available
18 virtual blargg_err_t set_channel_count( int );
19
20 // Get indexed channel, from 0 to channel count - 1
26 enum { type_index_mask = 0xFF };
27 enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
28 virtual channel_t channel( int index, int type ) = 0;
29
30 // See Blip_Buffer.h
31 virtual blargg_err_t set_sample_rate( long rate, int msec = blip_default_length ) = 0;
32 virtual void clock_rate( long ) = 0;
33 virtual void bass_freq( int ) = 0;
34 virtual void clear() = 0;
35 long sample_rate() const;
36
37 // Length of buffer, in milliseconds
38 int length() const;
39
40 // See Blip_Buffer.h
41 virtual void end_frame( blip_time_t ) = 0;
42
43 // Number of samples per output frame (1 = mono, 2 = stereo)
44 int samples_per_frame() const;
45
46 // Count of changes to channel configuration. Incremented whenever
47 // a change is made to any of the Blip_Buffers for any channel.
49
50 // See Blip_Buffer.h
51 virtual long read_samples( blip_sample_t*, long ) = 0;
52 virtual long samples_avail() const = 0;
53
54public:
55 BLARGG_DISABLE_NOTHROW
56protected:
58private:
59 // noncopyable
62
67};
68
69// Uses a single buffer and outputs mono samples.
70class Mono_Buffer : public Multi_Buffer {
73public:
74 // Buffer used for all channels
75 Blip_Buffer* center() { return &buf; }
76
77public:
80 blargg_err_t set_sample_rate( long rate, int msec = blip_default_length );
81 void clock_rate( long rate ) { buf.clock_rate( rate ); }
82 void bass_freq( int freq ) { buf.bass_freq( freq ); }
83 void clear() { buf.clear(); }
84 long samples_avail() const { return buf.samples_avail(); }
85 long read_samples( blip_sample_t* p, long s ) { return buf.read_samples( p, s ); }
86 channel_t channel( int, int ) { return chan; }
87 void end_frame( blip_time_t t ) { buf.end_frame( t ); }
88};
89
90// Uses three buffers (one for center) and outputs stereo sample pairs.
92public:
93
94 // Buffers used for all channels
95 Blip_Buffer* center() { return &bufs [0]; }
96 Blip_Buffer* left() { return &bufs [1]; }
97 Blip_Buffer* right() { return &bufs [2]; }
98
99public:
102 blargg_err_t set_sample_rate( long, int msec = blip_default_length );
103 void clock_rate( long );
104 void bass_freq( int );
105 void clear();
106 channel_t channel( int, int ) { return chan; }
107 void end_frame( blip_time_t );
108
109 long samples_avail() const { return bufs [0].samples_avail() * 2; }
110 long read_samples( blip_sample_t*, long );
111
112private:
113 enum { buf_count = 3 };
118
119 void mix_stereo_no_center( blip_sample_t*, blargg_long );
120 void mix_stereo( blip_sample_t*, blargg_long );
121 void mix_mono( blip_sample_t*, blargg_long );
122};
123
124// Silent_Buffer generates no samples, useful where no sound is wanted
127public:
129 blargg_err_t set_sample_rate( long rate, int msec = blip_default_length );
130 void clock_rate( long ) { }
131 void bass_freq( int ) { }
132 void clear() { }
133 channel_t channel( int, int ) { return chan; }
135 long samples_avail() const { return 0; }
136 long read_samples( blip_sample_t*, long ) { return 0; }
137};
138
139
140inline blargg_err_t Multi_Buffer::set_sample_rate( long rate, int msec )
141{
142 sample_rate_ = rate;
143 length_ = msec;
144 return 0;
145}
146
147inline blargg_err_t Silent_Buffer::set_sample_rate( long rate, int msec )
148{
149 return Multi_Buffer::set_sample_rate( rate, msec );
150}
151
153
154inline long Multi_Buffer::sample_rate() const { return sample_rate_; }
155
156inline int Multi_Buffer::length() const { return length_; }
157
158#endif
blip_long blip_time_t
Definition Blip_Buffer.h:17
int const blip_default_length
Definition Blip_Buffer.h:488
short blip_sample_t
Definition Blip_Buffer.h:20
const long clock_rate
Definition Gym_Emu.cpp:26
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition Blip_Buffer.h:23
void clear()
Definition Multi_Buffer.h:83
void clock_rate(long rate)
Definition Multi_Buffer.h:81
Mono_Buffer()
Definition Multi_Buffer.cpp:43
channel_t channel(int, int)
Definition Multi_Buffer.h:86
blargg_err_t set_sample_rate(long rate, int msec=blip_default_length)
Definition Multi_Buffer.cpp:52
~Mono_Buffer()
Definition Multi_Buffer.cpp:50
long samples_avail() const
Definition Multi_Buffer.h:84
long read_samples(blip_sample_t *p, long s)
Definition Multi_Buffer.h:85
channel_t chan
Definition Multi_Buffer.h:72
Blip_Buffer buf
Definition Multi_Buffer.h:71
void end_frame(blip_time_t t)
Definition Multi_Buffer.h:87
void bass_freq(int freq)
Definition Multi_Buffer.h:82
Blip_Buffer * center()
Definition Multi_Buffer.h:75
int length_
Definition Multi_Buffer.h:65
int length() const
Definition Multi_Buffer.h:156
unsigned channels_changed_count_
Definition Multi_Buffer.h:63
int const samples_per_frame_
Definition Multi_Buffer.h:66
Multi_Buffer & operator=(const Multi_Buffer &)
long sample_rate() const
Definition Multi_Buffer.h:154
virtual void clock_rate(long)=0
virtual long read_samples(blip_sample_t *, long)=0
@ wave_type
Definition Multi_Buffer.h:27
@ mixed_type
Definition Multi_Buffer.h:27
@ noise_type
Definition Multi_Buffer.h:27
Multi_Buffer(const Multi_Buffer &)
virtual blargg_err_t set_channel_count(int)
Definition Multi_Buffer.cpp:29
long sample_rate_
Definition Multi_Buffer.h:64
Multi_Buffer(int samples_per_frame)
Definition Multi_Buffer.cpp:22
void channels_changed()
Definition Multi_Buffer.h:57
unsigned channels_changed_count()
Definition Multi_Buffer.h:48
virtual long samples_avail() const =0
virtual void end_frame(blip_time_t)=0
virtual channel_t channel(int index, int type)=0
@ type_index_mask
Definition Multi_Buffer.h:26
virtual void bass_freq(int)=0
virtual blargg_err_t set_sample_rate(long rate, int msec=blip_default_length)=0
Definition Multi_Buffer.h:140
int samples_per_frame() const
Definition Multi_Buffer.h:152
virtual void clear()=0
virtual ~Multi_Buffer()
Definition Multi_Buffer.h:15
long samples_avail() const
Definition Multi_Buffer.h:135
channel_t chan
Definition Multi_Buffer.h:126
void end_frame(blip_time_t)
Definition Multi_Buffer.h:134
void bass_freq(int)
Definition Multi_Buffer.h:131
void clock_rate(long)
Definition Multi_Buffer.h:130
channel_t channel(int, int)
Definition Multi_Buffer.h:133
Silent_Buffer()
Definition Multi_Buffer.cpp:33
long read_samples(blip_sample_t *, long)
Definition Multi_Buffer.h:136
void clear()
Definition Multi_Buffer.h:132
blargg_err_t set_sample_rate(long rate, int msec=blip_default_length)
Definition Multi_Buffer.h:147
void bass_freq(int)
Definition Multi_Buffer.cpp:82
long read_samples(blip_sample_t *, long)
Definition Multi_Buffer.cpp:106
blargg_err_t set_sample_rate(long, int msec=blip_default_length)
Definition Multi_Buffer.cpp:69
Blip_Buffer * right()
Definition Multi_Buffer.h:97
int stereo_added
Definition Multi_Buffer.h:116
void end_frame(blip_time_t)
Definition Multi_Buffer.cpp:96
Blip_Buffer bufs[buf_count]
Definition Multi_Buffer.h:114
void mix_stereo_no_center(blip_sample_t *, blargg_long)
Definition Multi_Buffer.cpp:184
Blip_Buffer * center()
Definition Multi_Buffer.h:95
@ buf_count
Definition Multi_Buffer.h:113
long samples_avail() const
Definition Multi_Buffer.h:109
void clear()
Definition Multi_Buffer.cpp:88
~Stereo_Buffer()
Definition Multi_Buffer.cpp:67
Blip_Buffer * left()
Definition Multi_Buffer.h:96
Stereo_Buffer()
Definition Multi_Buffer.cpp:60
int was_stereo
Definition Multi_Buffer.h:117
void mix_stereo(blip_sample_t *, blargg_long)
Definition Multi_Buffer.cpp:151
channel_t channel(int, int)
Definition Multi_Buffer.h:106
channel_t chan
Definition Multi_Buffer.h:115
void mix_mono(blip_sample_t *, blargg_long)
Definition Multi_Buffer.cpp:213
struct huft * t
Definition inflate.c:943
unsigned s
Definition inflate.c:1555
JHUFF_TBL long freq[]
Definition jchuff.h:50
Definition Multi_Buffer.h:21
Blip_Buffer * right
Definition Multi_Buffer.h:24
Blip_Buffer * left
Definition Multi_Buffer.h:23
Blip_Buffer * center
Definition Multi_Buffer.h:22
uch * p
Definition crypt.c:594