diff --git a/components/audio/include/ftl/audio/audio.hpp b/components/audio/include/ftl/audio/audio.hpp index 5241c28dc58e1ad1444bcb6b5eb0578dce09e004..967d1f2c1242436fd1dc7d3929d2834d99e7826f 100644 --- a/components/audio/include/ftl/audio/audio.hpp +++ b/components/audio/include/ftl/audio/audio.hpp @@ -12,11 +12,11 @@ class Audio { size_t size() const { return data_.size()*sizeof(short); } - std::vector<short> &data() { return data_; } - const std::vector<short> &data() const { return data_; } + std::vector<float> &data() { return data_; } + const std::vector<float> &data() const { return data_; } private: - std::vector<short> data_; + std::vector<float> data_; }; } diff --git a/components/audio/include/ftl/audio/buffer.hpp b/components/audio/include/ftl/audio/buffer.hpp index 353fa55fcfe90871257cef1e7ce9d8fb26c7c486..da39fd9c3802f01c99dce542de3f5c4f6ee5821b 100644 --- a/components/audio/include/ftl/audio/buffer.hpp +++ b/components/audio/include/ftl/audio/buffer.hpp @@ -174,6 +174,12 @@ using StereoBuffer16 = ftl::audio::FixedBuffer<short,2,960,SIZE>; template <int 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>; + } } diff --git a/components/audio/include/ftl/audio/decoder.hpp b/components/audio/include/ftl/audio/decoder.hpp index c13860a8bbe3fe62aed2c783fdccf89118c0c0c3..30929daaf6aad886fe499dc1d1fbbba7aa42fe3b 100644 --- a/components/audio/include/ftl/audio/decoder.hpp +++ b/components/audio/include/ftl/audio/decoder.hpp @@ -13,7 +13,7 @@ class Decoder { 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; }; diff --git a/components/audio/include/ftl/audio/encoder.hpp b/components/audio/include/ftl/audio/encoder.hpp index 2e17f4497fc03804b48a6b6f8f59afc12e82a148..c68c799420e1dff28650b12a086ec8b10545a6dc 100644 --- a/components/audio/include/ftl/audio/encoder.hpp +++ b/components/audio/include/ftl/audio/encoder.hpp @@ -13,7 +13,7 @@ class Encoder { 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() {} diff --git a/components/audio/include/ftl/audio/software_decoder.hpp b/components/audio/include/ftl/audio/software_decoder.hpp index c0ae871a69e7acfb336598a26e93ad0990b40060..40d47fe45c2377f2d754dfc6d2071d717a5d612e 100644 --- a/components/audio/include/ftl/audio/software_decoder.hpp +++ b/components/audio/include/ftl/audio/software_decoder.hpp @@ -13,7 +13,7 @@ class SoftwareDecoder : public ftl::audio::Decoder { 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; @@ -22,8 +22,8 @@ class SoftwareDecoder : public ftl::audio::Decoder { bool cur_stereo_; ftl::codecs::definition_t cur_definition_; - bool _decodeOpus(const ftl::codecs::Packet &pkt, std::vector<short> &out); - bool _decodeRaw(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<float> &out); bool _createOpus(const ftl::codecs::Packet &pkt); }; diff --git a/components/audio/include/ftl/audio/software_encoder.hpp b/components/audio/include/ftl/audio/software_encoder.hpp index 4f11843c1f1da142999c1c1ab30dd9c426230fe8..35b7fb10826b429d546bffe6e57e662f9a6e1da3 100644 --- a/components/audio/include/ftl/audio/software_encoder.hpp +++ b/components/audio/include/ftl/audio/software_encoder.hpp @@ -13,7 +13,7 @@ class SoftwareEncoder : public ftl::audio::Encoder { 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; @@ -25,8 +25,8 @@ class SoftwareEncoder : public ftl::audio::Encoder { ftl::codecs::definition_t cur_definition_; uint8_t cur_bitrate_; - bool _encodeRaw(const std::vector<short> &in, ftl::codecs::Packet &pkt); - bool _encodeOpus(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<float> &in, ftl::codecs::Packet &pkt); bool _createOpus(ftl::codecs::Packet &pkt); }; diff --git a/components/audio/include/ftl/audio/source.hpp b/components/audio/include/ftl/audio/source.hpp index 1ece75db1be6c5bc8b5ba0fae31e6ffea9984c47..823846d2cb08d9bb4bf7b18946a2f1fe38cf66a6 100644 --- a/components/audio/include/ftl/audio/source.hpp +++ b/components/audio/include/ftl/audio/source.hpp @@ -27,7 +27,7 @@ class Source : public ftl::Configurable, public ftl::data::DiscreteSource { bool active_; ftl::audio::AudioSettings settings_; - ftl::audio::Buffer<short> *buffer_; + ftl::audio::Buffer<float> *buffer_; int to_read_; int64_t latency_; diff --git a/components/audio/include/ftl/audio/speaker.hpp b/components/audio/include/ftl/audio/speaker.hpp index 885a6e4752b1d6d36867db3d3d77be41ee39ad3a..89a890af63e77127b8f83926cc24ac51321ede94 100644 --- a/components/audio/include/ftl/audio/speaker.hpp +++ b/components/audio/include/ftl/audio/speaker.hpp @@ -25,7 +25,7 @@ class Speaker : public ftl::Configurable { float volume(); private: - ftl::audio::Buffer<short> *buffer_; + ftl::audio::Buffer<float> *buffer_; bool active_; float extra_delay_; float volume_; diff --git a/components/audio/src/software_decoder.cpp b/components/audio/src/software_decoder.cpp index 62888eed97f2da5dfb97f7f49d7e988bc00345a9..3a1d0bd918b3a24bd4feba3b6391f2c4b417edaa 100644 --- a/components/audio/src/software_decoder.cpp +++ b/components/audio/src/software_decoder.cpp @@ -49,7 +49,7 @@ bool SoftwareDecoder::_createOpus(const ftl::codecs::Packet &pkt) { 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) { case codec_t::OPUS : return _decodeOpus(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> } } -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 if (!_createOpus(pkt)) return false; @@ -66,7 +66,7 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh out.resize(10*FRAME_SIZE*channels); const unsigned char *inptr = pkt.data.data(); - short *outptr = out.data(); + float *outptr = out.data(); int count = 0; int frames = 0; @@ -77,7 +77,7 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh inptr += 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) { LOG(ERROR) << "Failed to Opus decode: " << samples; @@ -101,10 +101,10 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh #endif } -bool SoftwareDecoder::_decodeRaw(const ftl::codecs::Packet &pkt, std::vector<short> &out) { - size_t size = pkt.data.size()/sizeof(short); +bool SoftwareDecoder::_decodeRaw(const ftl::codecs::Packet &pkt, std::vector<float> &out) { + size_t size = pkt.data.size()/sizeof(float); 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]; return true; } diff --git a/components/audio/src/software_encoder.cpp b/components/audio/src/software_encoder.cpp index adc618c5e98efae47b803656d6e1fd9ded07538e..2b17d85469acd26a2acc77a56c2edbc6309a3cc5 100644 --- a/components/audio/src/software_encoder.cpp +++ b/components/audio/src/software_encoder.cpp @@ -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; // Force RAW if no opus @@ -67,7 +67,7 @@ bool SoftwareEncoder::_createOpus(ftl::codecs::Packet &pkt) { 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 static const float MAX_BITRATE = 128000.0f; static const float MIN_BITRATE = 24000.0f; @@ -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) { short *len = (short*)outptr; 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 > 32000) LOG(WARNING) << "Packet exceeds size limit"; @@ -119,9 +119,9 @@ bool SoftwareEncoder::_encodeOpus(const std::vector<short> &in, ftl::codecs::Pac #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(); - 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; } diff --git a/components/audio/src/source.cpp b/components/audio/src/source.cpp index c6c49757eb726cf8f159c264111af43c9e3d6f50..e1dd8693b876d26823056bcbefc66da47d027d33 100644 --- a/components/audio/src/source.cpp +++ b/components/audio/src/source.cpp @@ -21,7 +21,7 @@ static int pa_source_callback(const void *input, void *output, PaStreamCallbackFlags statusFlags, void *userData) { auto *buffer = (BUFFER*)userData; - short *in = (short*)input; + float *in = (float*)input; buffer->writeFrame(in); return 0; } @@ -74,16 +74,16 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null //} if (channels >= 2) { - buffer_ = new ftl::audio::StereoBuffer16<100>(48000); + buffer_ = new ftl::audio::StereoBufferF<100>(48000); } else { - buffer_ = new ftl::audio::MonoBuffer16<100>(48000); + buffer_ = new ftl::audio::MonoBufferF<100>(48000); } PaStreamParameters inputParameters; //bzero( &inputParameters, sizeof( inputParameters ) ); inputParameters.channelCount = channels; inputParameters.device = device; - inputParameters.sampleFormat = paInt16; + inputParameters.sampleFormat = paFloat32; inputParameters.suggestedLatency = (device >= 0) ? Pa_GetDeviceInfo(device)->defaultLowInputLatency : 0; inputParameters.hostApiSpecificStreamInfo = NULL; @@ -99,7 +99,7 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null 48000, // Sample rate ftl::audio::kFrameSize, // Size of single frame 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_ ); } else { @@ -107,10 +107,10 @@ Source::Source(nlohmann::json &config) : ftl::Configurable(config), buffer_(null &stream_, channels, 0, - paInt16, + paFloat32, 48000, // Sample rate 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_ ); } @@ -185,7 +185,7 @@ bool Source::retrieve(ftl::data::Frame &frame) { if (to_read_ < 1 || !buffer_) return true; auto alist = frame.create<std::list<Audio>>((buffer_->channels() == 2) ? Channel::AudioStereo : Channel::AudioMono); Audio aframe; - std::vector<short> &data = aframe.data(); + std::vector<float> &data = aframe.data(); buffer_->read(data, to_read_); alist = std::move(aframe); return true; diff --git a/components/audio/src/speaker.cpp b/components/audio/src/speaker.cpp index 9474b450075a965afd7617d06cd8f4e48deaf12b..4c17df9ec1ea4a41dc6f640c3b35118915093b45 100644 --- a/components/audio/src/speaker.cpp +++ b/components/audio/src/speaker.cpp @@ -20,7 +20,7 @@ static int pa_speaker_callback(const void *input, void *output, PaStreamCallbackFlags statusFlags, void *userData) { auto *buffer = (BUFFER*)userData; // ftl::audio::MonoBuffer16<2000> - short *out = (short*)output; + float *out = (float*)output; buffer->readFrame(out); @@ -77,16 +77,16 @@ void Speaker::_open(int fsize, int sample, int channels) { if (sample == 0 || channels == 0) return; if (channels >= 2) { - buffer_ = new ftl::audio::StereoBuffer16<2000>(sample); + buffer_ = new ftl::audio::StereoBufferF<2000>(sample); } else { - buffer_ = new ftl::audio::MonoBuffer16<2000>(sample); + buffer_ = new ftl::audio::MonoBufferF<2000>(sample); } PaStreamParameters outputParameters; //bzero( &inputParameters, sizeof( inputParameters ) ); outputParameters.channelCount = channels; outputParameters.device = Pa_GetDefaultOutputDevice(); - outputParameters.sampleFormat = paInt16; + outputParameters.sampleFormat = paFloat32; outputParameters.suggestedLatency = Pa_GetDeviceInfo(outputParameters.device)->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; @@ -100,7 +100,7 @@ void Speaker::_open(int fsize, int sample, int channels) { sample, // Sample rate 960, // Size of single frame 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_ );