1/*
2 * Copyright 2006, Haiku.
3 *
4 * Copyright (c) 2004-2005 Matthijs Hollemans
5 * Copyright (c) 2003 Jerome Leveque
6 * Distributed under the terms of the MIT License.
7 *
8 * Authors:
9 * 		Jérôme Duval
10 *		Jérôme Leveque
11 *		Matthijs Hollemans
12 */
13
14#ifndef _SOFT_SYNTH_H
15#define _SOFT_SYNTH_H
16
17/*
18	This version of SoftSynth is a wrapper libfluidsynth.so.
19 */
20
21#include <fluidsynth.h>
22#include <Midi.h>
23#include <SoundPlayer.h>
24#include <Synth.h>
25
26class BMidiConsumer;
27class BMidiSynth;
28class BSynth;
29
30namespace BPrivate {
31
32class BSoftSynth
33{
34public:
35
36	bool InitCheck();
37
38	void Unload();
39	bool IsLoaded() const;
40
41	status_t SetDefaultInstrumentsFile();
42	status_t SetInstrumentsFile(const char* path);
43
44	status_t LoadAllInstruments();
45	status_t LoadInstrument(int16 instrument);
46	status_t UnloadInstrument(int16 instrument);
47	status_t RemapInstrument(int16 from, int16 to);
48	void FlushInstrumentCache(bool startStopCache);
49
50	void SetVolume(double volume);
51	double Volume(void) const;
52
53	status_t SetSamplingRate(int32 rate);
54	int32 SamplingRate() const;
55
56	status_t SetInterpolation(interpolation_mode mode);
57	interpolation_mode Interpolation() const;
58
59	status_t EnableReverb(bool enabled);
60	bool IsReverbEnabled() const;
61	void SetReverb(reverb_mode mode);
62	reverb_mode Reverb() const;
63
64	status_t SetMaxVoices(int32 max);
65	int16 MaxVoices(void) const;
66
67	status_t SetLimiterThreshold(int32 threshold);
68	int16 LimiterThreshold(void) const;
69
70	void Pause(void);
71	void Resume(void);
72
73	void NoteOff(uchar, uchar, uchar, uint32);
74	void NoteOn(uchar, uchar, uchar, uint32);
75	void KeyPressure(uchar, uchar, uchar, uint32);
76	void ControlChange(uchar, uchar, uchar, uint32);
77	void ProgramChange(uchar, uchar, uint32);
78 	void ChannelPressure(uchar, uchar, uint32);
79	void PitchBend(uchar, uchar, uchar, uint32);
80	void SystemExclusive(void*, size_t, uint32);
81	void SystemCommon(uchar, uchar, uchar, uint32);
82	void SystemRealTime(uchar, uint32);
83	void TempoChange(int32, uint32);
84	void AllNotesOff(bool, uint32);
85
86private:
87
88	friend class ::BSynth;
89	friend class ::BMidiSynth;
90
91	BSoftSynth();
92	~BSoftSynth();
93
94	void _Init();
95	void _Done();
96	static void PlayBuffer(void * cookie, void * data, size_t size, const media_raw_audio_format & format);
97
98	bool fInitCheck;
99	char* fInstrumentsFile;
100	int32 fSampleRate;
101	interpolation_mode fInterpMode;
102	int16 fMaxVoices;
103	int16 fLimiterThreshold;
104	reverb_mode fReverbMode;
105	bool fReverbEnabled;
106
107	fluid_synth_t *fSynth;
108	fluid_settings_t* fSettings;
109
110	BSoundPlayer *fSoundPlayer;
111};
112
113} // namespace BPrivate
114
115#endif // _SOFT_SYNTH_H
116