Skip to content
Snippets Groups Projects
Commit ea7395db authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Merge branch 'feature/audio-float' into 'master'

Switch to float audio

See merge request nicolas.pope/ftl!317
parents 76e46ab5 749acfed
Branches
Tags
1 merge request!317Switch to float audio
Pipeline #28611 failed
Showing with 44 additions and 38 deletions
...@@ -12,11 +12,11 @@ class Audio { ...@@ -12,11 +12,11 @@ class Audio {
size_t size() const { return data_.size()*sizeof(short); } size_t size() const { return data_.size()*sizeof(short); }
std::vector<short> &data() { return data_; } std::vector<float> &data() { return data_; }
const std::vector<short> &data() const { return data_; } const std::vector<float> &data() const { return data_; }
private: private:
std::vector<short> data_; std::vector<float> data_;
}; };
} }
......
...@@ -174,6 +174,12 @@ using StereoBuffer16 = ftl::audio::FixedBuffer<short,2,960,SIZE>; ...@@ -174,6 +174,12 @@ using StereoBuffer16 = ftl::audio::FixedBuffer<short,2,960,SIZE>;
template <int SIZE> template <int SIZE>
using MonoBuffer16 = ftl::audio::FixedBuffer<short,1,960,SIZE>; using MonoBuffer16 = ftl::audio::FixedBuffer<short,1,960,SIZE>;
template <int SIZE>
using StereoBufferF = ftl::audio::FixedBuffer<float,2,960,SIZE>;
template <int SIZE>
using MonoBufferF = ftl::audio::FixedBuffer<float,1,960,SIZE>;
} }
} }
......
...@@ -13,7 +13,7 @@ class Decoder { ...@@ -13,7 +13,7 @@ class Decoder {
Decoder() { }; Decoder() { };
virtual ~Decoder() { }; virtual ~Decoder() { };
virtual bool decode(const ftl::codecs::Packet &pkt, std::vector<short> &out)=0; virtual bool decode(const ftl::codecs::Packet &pkt, std::vector<float> &out)=0;
virtual bool accepts(const ftl::codecs::Packet &)=0; virtual bool accepts(const ftl::codecs::Packet &)=0;
}; };
......
...@@ -13,7 +13,7 @@ class Encoder { ...@@ -13,7 +13,7 @@ class Encoder {
Encoder() {}; Encoder() {};
virtual ~Encoder() {}; virtual ~Encoder() {};
virtual bool encode(const std::vector<short> &in, ftl::codecs::Packet &pkt)=0; virtual bool encode(const std::vector<float> &in, ftl::codecs::Packet &pkt)=0;
virtual void reset() {} virtual void reset() {}
......
...@@ -13,7 +13,7 @@ class SoftwareDecoder : public ftl::audio::Decoder { ...@@ -13,7 +13,7 @@ class SoftwareDecoder : public ftl::audio::Decoder {
SoftwareDecoder(); SoftwareDecoder();
~SoftwareDecoder(); ~SoftwareDecoder();
bool decode(const ftl::codecs::Packet &pkt, std::vector<short> &out) override; bool decode(const ftl::codecs::Packet &pkt, std::vector<float> &out) override;
bool accepts(const ftl::codecs::Packet &) override; bool accepts(const ftl::codecs::Packet &) override;
...@@ -22,8 +22,8 @@ class SoftwareDecoder : public ftl::audio::Decoder { ...@@ -22,8 +22,8 @@ class SoftwareDecoder : public ftl::audio::Decoder {
bool cur_stereo_; bool cur_stereo_;
ftl::codecs::definition_t cur_definition_; ftl::codecs::definition_t cur_definition_;
bool _decodeOpus(const ftl::codecs::Packet &pkt, std::vector<short> &out); bool _decodeOpus(const ftl::codecs::Packet &pkt, std::vector<float> &out);
bool _decodeRaw(const ftl::codecs::Packet &pkt, std::vector<short> &out); bool _decodeRaw(const ftl::codecs::Packet &pkt, std::vector<float> &out);
bool _createOpus(const ftl::codecs::Packet &pkt); bool _createOpus(const ftl::codecs::Packet &pkt);
}; };
......
...@@ -13,7 +13,7 @@ class SoftwareEncoder : public ftl::audio::Encoder { ...@@ -13,7 +13,7 @@ class SoftwareEncoder : public ftl::audio::Encoder {
SoftwareEncoder(); SoftwareEncoder();
~SoftwareEncoder(); ~SoftwareEncoder();
bool encode(const std::vector<short> &in, ftl::codecs::Packet &pkt) override; bool encode(const std::vector<float> &in, ftl::codecs::Packet &pkt) override;
void reset() override; void reset() override;
...@@ -25,8 +25,8 @@ class SoftwareEncoder : public ftl::audio::Encoder { ...@@ -25,8 +25,8 @@ class SoftwareEncoder : public ftl::audio::Encoder {
ftl::codecs::definition_t cur_definition_; ftl::codecs::definition_t cur_definition_;
uint8_t cur_bitrate_; uint8_t cur_bitrate_;
bool _encodeRaw(const std::vector<short> &in, ftl::codecs::Packet &pkt); bool _encodeRaw(const std::vector<float> &in, ftl::codecs::Packet &pkt);
bool _encodeOpus(const std::vector<short> &in, ftl::codecs::Packet &pkt); bool _encodeOpus(const std::vector<float> &in, ftl::codecs::Packet &pkt);
bool _createOpus(ftl::codecs::Packet &pkt); bool _createOpus(ftl::codecs::Packet &pkt);
}; };
......
...@@ -27,7 +27,7 @@ class Source : public ftl::Configurable, public ftl::data::DiscreteSource { ...@@ -27,7 +27,7 @@ class Source : public ftl::Configurable, public ftl::data::DiscreteSource {
bool active_; bool active_;
ftl::audio::AudioSettings settings_; ftl::audio::AudioSettings settings_;
ftl::audio::Buffer<short> *buffer_; ftl::audio::Buffer<float> *buffer_;
int to_read_; int to_read_;
int64_t latency_; int64_t latency_;
......
...@@ -25,7 +25,7 @@ class Speaker : public ftl::Configurable { ...@@ -25,7 +25,7 @@ class Speaker : public ftl::Configurable {
float volume(); float volume();
private: private:
ftl::audio::Buffer<short> *buffer_; ftl::audio::Buffer<float> *buffer_;
bool active_; bool active_;
float extra_delay_; float extra_delay_;
float volume_; float volume_;
......
...@@ -49,7 +49,7 @@ bool SoftwareDecoder::_createOpus(const ftl::codecs::Packet &pkt) { ...@@ -49,7 +49,7 @@ bool SoftwareDecoder::_createOpus(const ftl::codecs::Packet &pkt) {
return true; return true;
} }
bool SoftwareDecoder::decode(const ftl::codecs::Packet &pkt, std::vector<short> &out) { bool SoftwareDecoder::decode(const ftl::codecs::Packet &pkt, std::vector<float> &out) {
switch (pkt.codec) { switch (pkt.codec) {
case codec_t::OPUS : return _decodeOpus(pkt, out); case codec_t::OPUS : return _decodeOpus(pkt, out);
case codec_t::RAW : return _decodeRaw(pkt, out); case codec_t::RAW : return _decodeRaw(pkt, out);
...@@ -57,7 +57,7 @@ bool SoftwareDecoder::decode(const ftl::codecs::Packet &pkt, std::vector<short> ...@@ -57,7 +57,7 @@ bool SoftwareDecoder::decode(const ftl::codecs::Packet &pkt, std::vector<short>
} }
} }
bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<short> &out) { bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<float> &out) {
#ifdef HAVE_OPUS #ifdef HAVE_OPUS
if (!_createOpus(pkt)) return false; if (!_createOpus(pkt)) return false;
...@@ -66,7 +66,7 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh ...@@ -66,7 +66,7 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh
out.resize(10*FRAME_SIZE*channels); out.resize(10*FRAME_SIZE*channels);
const unsigned char *inptr = pkt.data.data(); const unsigned char *inptr = pkt.data.data();
short *outptr = out.data(); float *outptr = out.data();
int count = 0; int count = 0;
int frames = 0; int frames = 0;
...@@ -77,7 +77,7 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh ...@@ -77,7 +77,7 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh
inptr += 2; inptr += 2;
i += (*len)+2; i += (*len)+2;
int samples = opus_multistream_decode(opus_decoder_, inptr, *len, outptr, FRAME_SIZE, 0); int samples = opus_multistream_decode_float(opus_decoder_, inptr, *len, outptr, FRAME_SIZE, 0);
if (samples != FRAME_SIZE) { if (samples != FRAME_SIZE) {
LOG(ERROR) << "Failed to Opus decode: " << samples; LOG(ERROR) << "Failed to Opus decode: " << samples;
...@@ -101,10 +101,10 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh ...@@ -101,10 +101,10 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh
#endif #endif
} }
bool SoftwareDecoder::_decodeRaw(const ftl::codecs::Packet &pkt, std::vector<short> &out) { bool SoftwareDecoder::_decodeRaw(const ftl::codecs::Packet &pkt, std::vector<float> &out) {
size_t size = pkt.data.size()/sizeof(short); size_t size = pkt.data.size()/sizeof(float);
out.resize(size); out.resize(size);
auto *ptr = (short*)pkt.data.data(); auto *ptr = (float*)pkt.data.data();
for (size_t i=0; i<size; i++) out.data()[i] = ptr[i]; for (size_t i=0; i<size; i++) out.data()[i] = ptr[i];
return true; return true;
} }
......
...@@ -24,7 +24,7 @@ SoftwareEncoder::~SoftwareEncoder() { ...@@ -24,7 +24,7 @@ SoftwareEncoder::~SoftwareEncoder() {
} }
bool SoftwareEncoder::encode(const std::vector<short> &in, ftl::codecs::Packet &pkt) { bool SoftwareEncoder::encode(const std::vector<float> &in, ftl::codecs::Packet &pkt) {
auto codec = (pkt.codec == codec_t::Any) ? codec_t::OPUS : pkt.codec; auto codec = (pkt.codec == codec_t::Any) ? codec_t::OPUS : pkt.codec;
// Force RAW if no opus // Force RAW if no opus
...@@ -67,7 +67,7 @@ bool SoftwareEncoder::_createOpus(ftl::codecs::Packet &pkt) { ...@@ -67,7 +67,7 @@ bool SoftwareEncoder::_createOpus(ftl::codecs::Packet &pkt) {
return true; return true;
} }
bool SoftwareEncoder::_encodeOpus(const std::vector<short> &in, ftl::codecs::Packet &pkt) { bool SoftwareEncoder::_encodeOpus(const std::vector<float> &in, ftl::codecs::Packet &pkt) {
#ifdef HAVE_OPUS #ifdef HAVE_OPUS
static const float MAX_BITRATE = 128000.0f; static const float MAX_BITRATE = 128000.0f;
static const float MIN_BITRATE = 24000.0f; static const float MIN_BITRATE = 24000.0f;
...@@ -98,7 +98,7 @@ bool SoftwareEncoder::_encodeOpus(const std::vector<short> &in, ftl::codecs::Pac ...@@ -98,7 +98,7 @@ bool SoftwareEncoder::_encodeOpus(const std::vector<short> &in, ftl::codecs::Pac
for (unsigned int i=0; i<in.size(); i+=channels*FRAME_SIZE) { for (unsigned int i=0; i<in.size(); i+=channels*FRAME_SIZE) {
short *len = (short*)outptr; short *len = (short*)outptr;
outptr += 2; outptr += 2;
int nbBytes = opus_multistream_encode(opus_encoder_, &in.data()[i], FRAME_SIZE, outptr, MAX_PACKET_SIZE); int nbBytes = opus_multistream_encode_float(opus_encoder_, &in.data()[i], FRAME_SIZE, outptr, MAX_PACKET_SIZE);
if (nbBytes <= 0) return false; if (nbBytes <= 0) return false;
//if (nbBytes > 32000) LOG(WARNING) << "Packet exceeds size limit"; //if (nbBytes > 32000) LOG(WARNING) << "Packet exceeds size limit";
...@@ -119,9 +119,9 @@ bool SoftwareEncoder::_encodeOpus(const std::vector<short> &in, ftl::codecs::Pac ...@@ -119,9 +119,9 @@ bool SoftwareEncoder::_encodeOpus(const std::vector<short> &in, ftl::codecs::Pac
#endif #endif
} }
bool SoftwareEncoder::_encodeRaw(const std::vector<short> &in, ftl::codecs::Packet &pkt) { bool SoftwareEncoder::_encodeRaw(const std::vector<float> &in, ftl::codecs::Packet &pkt) {
const unsigned char *ptr = (unsigned char*)in.data(); const unsigned char *ptr = (unsigned char*)in.data();
pkt.data = std::move(std::vector<unsigned char>(ptr, ptr+in.size()*sizeof(short))); pkt.data = std::move(std::vector<unsigned char>(ptr, ptr+in.size()*sizeof(float)));
return true; return true;
} }
......
...@@ -21,7 +21,7 @@ static int pa_source_callback(const void *input, void *output, ...@@ -21,7 +21,7 @@ static int pa_source_callback(const void *input, void *output,
PaStreamCallbackFlags statusFlags, void *userData) { PaStreamCallbackFlags statusFlags, void *userData) {
auto *buffer = (BUFFER*)userData; auto *buffer = (BUFFER*)userData;
short *in = (short*)input; float *in = (float*)input;
buffer->writeFrame(in); buffer->writeFrame(in);
return 0; return 0;
} }
...@@ -74,16 +74,16 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null ...@@ -74,16 +74,16 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null
//} //}
if (channels >= 2) { if (channels >= 2) {
buffer_ = new ftl::audio::StereoBuffer16<100>(48000); buffer_ = new ftl::audio::StereoBufferF<100>(48000);
} else { } else {
buffer_ = new ftl::audio::MonoBuffer16<100>(48000); buffer_ = new ftl::audio::MonoBufferF<100>(48000);
} }
PaStreamParameters inputParameters; PaStreamParameters inputParameters;
//bzero( &inputParameters, sizeof( inputParameters ) ); //bzero( &inputParameters, sizeof( inputParameters ) );
inputParameters.channelCount = channels; inputParameters.channelCount = channels;
inputParameters.device = device; inputParameters.device = device;
inputParameters.sampleFormat = paInt16; inputParameters.sampleFormat = paFloat32;
inputParameters.suggestedLatency = (device >= 0) ? Pa_GetDeviceInfo(device)->defaultLowInputLatency : 0; inputParameters.suggestedLatency = (device >= 0) ? Pa_GetDeviceInfo(device)->defaultLowInputLatency : 0;
inputParameters.hostApiSpecificStreamInfo = NULL; inputParameters.hostApiSpecificStreamInfo = NULL;
...@@ -99,7 +99,7 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null ...@@ -99,7 +99,7 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null
48000, // Sample rate 48000, // Sample rate
ftl::audio::kFrameSize, // Size of single frame ftl::audio::kFrameSize, // Size of single frame
paNoFlag, paNoFlag,
(buffer_->channels() == 1) ? pa_source_callback<ftl::audio::MonoBuffer16<100>> : pa_source_callback<ftl::audio::StereoBuffer16<100>>, (buffer_->channels() == 1) ? pa_source_callback<ftl::audio::MonoBufferF<100>> : pa_source_callback<ftl::audio::StereoBufferF<100>>,
this->buffer_ this->buffer_
); );
} else { } else {
...@@ -107,10 +107,10 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null ...@@ -107,10 +107,10 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null
&stream_, &stream_,
channels, channels,
0, 0,
paInt16, paFloat32,
48000, // Sample rate 48000, // Sample rate
ftl::audio::kFrameSize, // Size of single frame ftl::audio::kFrameSize, // Size of single frame
(buffer_->channels() == 1) ? pa_source_callback<ftl::audio::MonoBuffer16<100>> : pa_source_callback<ftl::audio::StereoBuffer16<100>>, (buffer_->channels() == 1) ? pa_source_callback<ftl::audio::MonoBufferF<100>> : pa_source_callback<ftl::audio::StereoBufferF<100>>,
this->buffer_ this->buffer_
); );
} }
...@@ -185,7 +185,7 @@ bool Source::retrieve(ftl::data::Frame &frame) { ...@@ -185,7 +185,7 @@ bool Source::retrieve(ftl::data::Frame &frame) {
if (to_read_ < 1 || !buffer_) return true; if (to_read_ < 1 || !buffer_) return true;
auto alist = frame.create<std::list<Audio>>((buffer_->channels() == 2) ? Channel::AudioStereo : Channel::AudioMono); auto alist = frame.create<std::list<Audio>>((buffer_->channels() == 2) ? Channel::AudioStereo : Channel::AudioMono);
Audio aframe; Audio aframe;
std::vector<short> &data = aframe.data(); std::vector<float> &data = aframe.data();
buffer_->read(data, to_read_); buffer_->read(data, to_read_);
alist = std::move(aframe); alist = std::move(aframe);
return true; return true;
......
...@@ -20,7 +20,7 @@ static int pa_speaker_callback(const void *input, void *output, ...@@ -20,7 +20,7 @@ static int pa_speaker_callback(const void *input, void *output,
PaStreamCallbackFlags statusFlags, void *userData) { PaStreamCallbackFlags statusFlags, void *userData) {
auto *buffer = (BUFFER*)userData; // ftl::audio::MonoBuffer16<2000> auto *buffer = (BUFFER*)userData; // ftl::audio::MonoBuffer16<2000>
short *out = (short*)output; float *out = (float*)output;
buffer->readFrame(out); buffer->readFrame(out);
...@@ -77,16 +77,16 @@ void Speaker::_open(int fsize, int sample, int channels) { ...@@ -77,16 +77,16 @@ void Speaker::_open(int fsize, int sample, int channels) {
if (sample == 0 || channels == 0) return; if (sample == 0 || channels == 0) return;
if (channels >= 2) { if (channels >= 2) {
buffer_ = new ftl::audio::StereoBuffer16<2000>(sample); buffer_ = new ftl::audio::StereoBufferF<2000>(sample);
} else { } else {
buffer_ = new ftl::audio::MonoBuffer16<2000>(sample); buffer_ = new ftl::audio::MonoBufferF<2000>(sample);
} }
PaStreamParameters outputParameters; PaStreamParameters outputParameters;
//bzero( &inputParameters, sizeof( inputParameters ) ); //bzero( &inputParameters, sizeof( inputParameters ) );
outputParameters.channelCount = channels; outputParameters.channelCount = channels;
outputParameters.device = Pa_GetDefaultOutputDevice(); outputParameters.device = Pa_GetDefaultOutputDevice();
outputParameters.sampleFormat = paInt16; outputParameters.sampleFormat = paFloat32;
outputParameters.suggestedLatency = Pa_GetDeviceInfo(outputParameters.device)->defaultLowOutputLatency; outputParameters.suggestedLatency = Pa_GetDeviceInfo(outputParameters.device)->defaultLowOutputLatency;
outputParameters.hostApiSpecificStreamInfo = NULL; outputParameters.hostApiSpecificStreamInfo = NULL;
...@@ -100,7 +100,7 @@ void Speaker::_open(int fsize, int sample, int channels) { ...@@ -100,7 +100,7 @@ void Speaker::_open(int fsize, int sample, int channels) {
sample, // Sample rate sample, // Sample rate
960, // Size of single frame 960, // Size of single frame
paNoFlag, paNoFlag,
(channels == 1) ? pa_speaker_callback<ftl::audio::MonoBuffer16<2000>> : pa_speaker_callback<ftl::audio::StereoBuffer16<2000>>, (channels == 1) ? pa_speaker_callback<ftl::audio::MonoBufferF<2000>> : pa_speaker_callback<ftl::audio::StereoBufferF<2000>>,
this->buffer_ this->buffer_
); );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment