summaryrefslogtreecommitdiff
path: root/apps/codecs/libgme/multi_buffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libgme/multi_buffer.h')
-rw-r--r--apps/codecs/libgme/multi_buffer.h108
1 files changed, 75 insertions, 33 deletions
diff --git a/apps/codecs/libgme/multi_buffer.h b/apps/codecs/libgme/multi_buffer.h
index cfdae4f..e5efa5a 100644
--- a/apps/codecs/libgme/multi_buffer.h
+++ b/apps/codecs/libgme/multi_buffer.h
@@ -1,4 +1,4 @@
-// Multi-channel sound buffer interface, and basic mono and stereo buffers
+// Multi-channel sound buffer interface, stereo and effects buffers
// Blip_Buffer 0.4.1
#ifndef MULTI_BUFFER_H
@@ -16,57 +16,99 @@ struct channel_t {
enum { type_index_mask = 0xFF };
enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
-enum { buf_count = 3 };
-
-struct Stereo_Buffer {
- struct Blip_Buffer bufs [buf_count];
- struct channel_t chan;
- int stereo_added;
- int was_stereo;
-
+enum { stereo = 2 };
+enum { bufs_size = 3 };
+
+// Tracked_Blip_Buffer
+struct Tracked_Blip_Buffer {
+ struct Blip_Buffer blip;
+ int last_non_silence;
+};
+
+void Tracked_init( struct Tracked_Blip_Buffer* this );
+unsigned Tracked_non_silent( struct Tracked_Blip_Buffer* this );
+void Tracked_remove_all_samples( struct Tracked_Blip_Buffer * this );
+int Tracked_read_samples( struct Tracked_Blip_Buffer* this, blip_sample_t [], int );
+void Tracked_remove_silence( struct Tracked_Blip_Buffer* this, int );
+void Tracked_remove_samples( struct Tracked_Blip_Buffer* this, int );
+void Tracked_clear( struct Tracked_Blip_Buffer* this );
+void Tracked_end_frame( struct Tracked_Blip_Buffer* this, blip_time_t );
+
+static inline delta_t unsettled( struct Blip_Buffer* this )
+{
+ return this->reader_accum_ >> delta_bits;
+}
+
+// Stereo Mixer
+struct Stereo_Mixer {
+ struct Tracked_Blip_Buffer* bufs [3];
+ int samples_read;
+};
+
+void Mixer_init( struct Stereo_Mixer* this );
+void Mixer_read_pairs( struct Stereo_Mixer* this, blip_sample_t out [], int count );
+
+typedef struct Tracked_Blip_Buffer buf_t;
+
+// Multi_Buffer
+struct Multi_Buffer {
unsigned channels_changed_count_;
- long sample_rate_;
+ int sample_rate_;
int length_;
+ int channel_count_;
int samples_per_frame_;
+ int const *channel_types_;
+ bool immediate_removal_;
+
+ buf_t bufs [bufs_size];
+ struct Stereo_Mixer mixer;
+ struct channel_t chan;
};
-// Initializes Stereo_Buffer structure
-void Buffer_init( struct Stereo_Buffer* this );
+blargg_err_t Buffer_set_channel_count( struct Multi_Buffer* this, int n, int const* types );
+
+// Buffers used for all channels
+static inline struct Blip_Buffer* center( struct Multi_Buffer* this ) { return &this->bufs [2].blip; }
+static inline struct Blip_Buffer* left( struct Multi_Buffer* this ) { return &this->bufs [0].blip; }
+static inline struct Blip_Buffer* right( struct Multi_Buffer* this ) { return &this->bufs [1].blip; }
-blargg_err_t Buffer_set_sample_rate( struct Stereo_Buffer* this, long, int msec );
-void Buffer_clock_rate( struct Stereo_Buffer* this, long );
-void Buffer_bass_freq( struct Stereo_Buffer* this, int );
-void Buffer_clear( struct Stereo_Buffer* this );
-struct channel_t Buffer_channel( struct Stereo_Buffer* this );
-void Buffer_end_frame( struct Stereo_Buffer* this, blip_time_t );
+// Initializes Multi_Buffer structure
+void Buffer_init( struct Multi_Buffer* this );
-long Buffer_read_samples( struct Stereo_Buffer* this, blip_sample_t*, long );
+blargg_err_t Buffer_set_sample_rate( struct Multi_Buffer* this, int, int msec );
+void Buffer_clock_rate( struct Multi_Buffer* this, int );
+void Buffer_bass_freq( struct Multi_Buffer* this, int );
+void Buffer_clear( struct Multi_Buffer* this );
+void Buffer_end_frame( struct Multi_Buffer* this, blip_time_t ) ICODE_ATTR;
+
+static inline int Buffer_length( struct Multi_Buffer* this )
+{
+ return this->length_;
+}
// Count of changes to channel configuration. Incremented whenever
// a change is made to any of the Blip_Buffers for any channel.
-unsigned Buffer_channels_changed_count( struct Stereo_Buffer* this );
-void Buffer_channels_changed( struct Stereo_Buffer* this );
-
-void Buffer_mix_stereo_no_center( struct Stereo_Buffer* this, blip_sample_t*, blargg_long );
-void Buffer_mix_stereo( struct Stereo_Buffer* this, blip_sample_t*, blargg_long );
-void Buffer_mix_mono( struct Stereo_Buffer* this, blip_sample_t*, blargg_long );
+static inline unsigned Buffer_channels_changed_count( struct Multi_Buffer* this )
+{
+ return this->channels_changed_count_;
+}
-// Number of samples per output frame (1 = mono, 2 = stereo)
-static inline int Buffer_samples_per_frame( struct Stereo_Buffer* this )
+static inline void Buffer_disable_immediate_removal( struct Multi_Buffer* this )
{
- return this->samples_per_frame_;
+ this->immediate_removal_ = false;
}
-// See Blip_Buffer.h
-static inline long Buffer_sample_rate( struct Stereo_Buffer* this )
+static inline int Buffer_sample_rate( struct Multi_Buffer* this )
{
return this->sample_rate_;
}
-// Length of buffer, in milliseconds
-static inline int Buffer_length( struct Stereo_Buffer* this )
+static inline int Buffer_samples_avail( struct Multi_Buffer* this )
{
- return this->length_;
+ return (Blip_samples_avail(&this->bufs [0].blip) - this->mixer.samples_read) * 2;
}
+int Buffer_read_samples( struct Multi_Buffer* this, blip_sample_t*, int ) ICODE_ATTR;
+struct channel_t Buffer_channel( struct Multi_Buffer* this, int i );
+
#endif