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_
 	);