Streamtools: Support multichannel FM
[jpcrr.git] / streamtools / resampler.hpp
blob116c0d75ead2ed266c2b221d5ac6250c092c197e
1 #ifndef _resampler__hpp__included__
2 #define _resampler__hpp__included__
4 #include "digital-filter.hpp"
5 #include "newpacket.hpp"
6 #include "opl.h"
8 uint64_t next_sample_time(uint64_t time, uint32_t rate);
10 struct resampler
12 virtual ~resampler();
13 virtual sample_number_t nextsample() = 0;
14 virtual void sendpacket(struct packet& p) = 0;
17 struct resampler_pcm : public resampler
19 resampler_pcm(uint32_t rate);
20 sample_number_t nextsample();
21 void sendpacket(struct packet& p);
22 private:
23 bool written;
24 uint32_t output_rate;
25 uint64_t last_read_time;
26 uint64_t last_write_time;
27 npair<int64_t> accumulator;
28 npair<short> current_levels;
31 struct resampler_fm : public resampler
33 resampler_fm(uint32_t rate);
34 sample_number_t nextsample();
35 void sendpacket(struct packet& p);
36 private:
37 opl_context ctx;
40 struct packet_demux
42 packet_demux(mixer& mix, uint32_t rate);
43 ~packet_demux();
44 sample_number_t nextsample();
45 void sendpacket(struct packet& p);
46 void sendoption(const std::string& option);
47 private:
48 void do_volume_change(struct packet& p);
49 mixer& use_mixer;
50 uint32_t used_rate;
51 std::map<uint32_t, resampler*> resamplers;
52 composite_filter* output_filter;
53 std::map<std::string, composite_filter*> input_filters;
56 void print_audio_resampler_help(const std::string& prefix);
57 void process_audio_resampler_options(packet_demux& d, const std::string& prefix, int argc, char** argv);
59 #endif