openMSX
SoundDevice.hh
Go to the documentation of this file.
1#ifndef SOUNDDEVICE_HH
2#define SOUNDDEVICE_HH
3
4#include "EmuTime.hh"
5#include "WavWriter.hh"
7#include <array>
8#include <optional>
9#include <string>
10#include <string_view>
11
12namespace openmsx {
13
14class DeviceConfig;
15class DynamicClock;
16class Filename;
17class MSXMixer;
18
20{
21public:
22 static constexpr unsigned MAX_CHANNELS = 24;
23
24 SoundDevice(const SoundDevice&) = delete;
26
30 [[nodiscard]] const std::string& getName() const { return name; }
31
35 [[nodiscard]] std::string_view getDescription() const { return description; }
36
40 [[nodiscard]] bool isStereo() const;
41
55 float left;
56 float right;
57 };
60 return {f * softwareVolumeLeft, f * softwareVolumeRight};
61 }
62
73 void setSoftwareVolume(float volume, EmuTime::param time);
74 void setSoftwareVolume(float left, float right, EmuTime::param time);
75
76 void recordChannel(unsigned channel, const Filename& filename);
77 void muteChannel (unsigned channel, bool muted);
78
79protected:
88 SoundDevice(MSXMixer& mixer, std::string_view name, static_string_view description,
89 unsigned numChannels, unsigned inputRate, bool stereo);
91
100 [[nodiscard]] virtual float getAmplificationFactorImpl() const;
101
108 void registerSound(const DeviceConfig& config);
109
114 void unregisterSound();
115
117 void updateStream(EmuTime::param time);
118
119 void setInputRate(unsigned sampleRate) { inputSampleRate = sampleRate; }
120 [[nodiscard]] unsigned getInputRate() const { return inputSampleRate; }
121
122public: // Will be called by Mixer:
128 virtual void setOutputRate(unsigned hostSampleRate, double speed) = 0;
129
148 [[nodiscard]] virtual bool updateBuffer(size_t length, float* buffer,
149 EmuTime::param time) = 0;
150
151protected:
160 static void addFill(float*& buffer, float value, unsigned num);
161
175 virtual void generateChannels(std::span<float*> buffers, unsigned num) = 0;
176
189 [[nodiscard]] bool mixChannels(float* dataOut, size_t samples);
190
192 [[nodiscard]] const DynamicClock& getHostSampleClock() const;
193 [[nodiscard]] double getEffectiveSpeed() const;
194
195private:
196 MSXMixer& mixer;
197 const std::string name;
198 const static_string_view description;
199
200 std::array<std::optional<Wav16Writer>, MAX_CHANNELS> writer;
201
202 float softwareVolumeLeft = 1.0f;
203 float softwareVolumeRight = 1.0f;
204 unsigned inputSampleRate;
205 const unsigned numChannels;
206 const unsigned stereo;
207 unsigned numRecordChannels = 0;
208 std::array<int, MAX_CHANNELS> channelBalance;
209 std::array<bool, MAX_CHANNELS> channelMuted;
210 bool balanceCenter = true;
211};
212
213} // namespace openmsx
214
215#endif
Represents a clock with a variable frequency.
This class represents a filename.
Definition Filename.hh:18
double getEffectiveSpeed() const
SoundDevice & operator=(const SoundDevice &)=delete
std::string_view getDescription() const
Gets a description of this sound device, to be presented to the user.
virtual bool updateBuffer(size_t length, float *buffer, EmuTime::param time)=0
Generate sample data.
void recordChannel(unsigned channel, const Filename &filename)
void updateStream(EmuTime::param time)
unsigned getInputRate() const
AmplificationFactors getAmplificationFactor() const
const std::string & getName() const
Get the unique name that identifies this sound device.
static void addFill(float *&buffer, float value, unsigned num)
Adds a number of samples that all have the same value.
const DynamicClock & getHostSampleClock() const
See MSXMixer::getHostSampleClock().
void setInputRate(unsigned sampleRate)
virtual void setOutputRate(unsigned hostSampleRate, double speed)=0
When a SoundDevice registers itself with the Mixer, the Mixer sets the required sampleRate through th...
void setSoftwareVolume(float volume, EmuTime::param time)
Change the 'software volume' of this sound device.
bool mixChannels(float *dataOut, size_t samples)
Calls generateChannels() and combines the output to a single channel.
static constexpr unsigned MAX_CHANNELS
void unregisterSound()
Unregisters this sound device with the Mixer.
SoundDevice(const SoundDevice &)=delete
bool isStereo() const
Is this a stereo device? This is set in the constructor and cannot be changed anymore.
virtual void generateChannels(std::span< float * > buffers, unsigned num)=0
Abstract method to generate the actual sound data.
void registerSound(const DeviceConfig &config)
Registers this sound device with the Mixer.
void muteChannel(unsigned channel, bool muted)
virtual float getAmplificationFactorImpl() const
Get amplification/attenuation factor for this device.
static_string_view
This file implemented 3 utility functions:
Definition Autofire.cc:9
Gets this device its 'amplification factor'.