Change resampling s16 -> u8 to respect aliasing rules
This commit is contained in:
		| @@ -111,13 +111,19 @@ long CubebInput::Impl::DataCallback(cubeb_stream* stream, void* user_data, const | |||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     constexpr auto resample_s16_s8 = [](s16 sample) { | ||||||
|  |         return static_cast<u8>(static_cast<u16>(sample) >> 8); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     std::vector<u8> samples{}; |     std::vector<u8> samples{}; | ||||||
|     samples.reserve(num_frames * impl->sample_size_in_bytes); |     samples.reserve(num_frames * impl->sample_size_in_bytes); | ||||||
|     if (impl->sample_size_in_bytes == 1) { |     if (impl->sample_size_in_bytes == 1) { | ||||||
|         // If the sample format is 8bit, then resample back to 8bit before passing back to core |         // If the sample format is 8bit, then resample back to 8bit before passing back to core | ||||||
|         const s16* data = reinterpret_cast<const s16*>(input_buffer); |         for (std::size_t i; i < num_frames; i++) { | ||||||
|         std::transform(data, data + num_frames, std::back_inserter(samples), |             s16 data; | ||||||
|                        [](s16 sample) { return static_cast<u8>(static_cast<u16>(sample) >> 8); }); |             std::memcpy(&data, static_cast<const u8*>(input_buffer) + i * 2, 2); | ||||||
|  |             samples.push_back(resample_s16_s8(data)); | ||||||
|  |         } | ||||||
|     } else { |     } else { | ||||||
|         // Otherwise copy all of the samples to the buffer (which will be treated as s16 by core) |         // Otherwise copy all of the samples to the buffer (which will be treated as s16 by core) | ||||||
|         const u8* data = reinterpret_cast<const u8*>(input_buffer); |         const u8* data = reinterpret_cast<const u8*>(input_buffer); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user