in torchaudio/csrc/sox/utils.cpp [153:193]
torch::Tensor convert_to_tensor(
sox_sample_t* buffer,
const int32_t num_samples,
const int32_t num_channels,
const caffe2::TypeMeta dtype,
const bool normalize,
const bool channels_first) {
torch::Tensor t;
uint64_t dummy = 0;
SOX_SAMPLE_LOCALS;
if (normalize || dtype == torch::kFloat32) {
t = torch::empty(
{num_samples / num_channels, num_channels}, torch::kFloat32);
auto ptr = t.data_ptr<float_t>();
for (int32_t i = 0; i < num_samples; ++i) {
ptr[i] = SOX_SAMPLE_TO_FLOAT_32BIT(buffer[i], dummy);
}
} else if (dtype == torch::kInt32) {
t = torch::from_blob(
buffer, {num_samples / num_channels, num_channels}, torch::kInt32)
.clone();
} else if (dtype == torch::kInt16) {
t = torch::empty({num_samples / num_channels, num_channels}, torch::kInt16);
auto ptr = t.data_ptr<int16_t>();
for (int32_t i = 0; i < num_samples; ++i) {
ptr[i] = SOX_SAMPLE_TO_SIGNED_16BIT(buffer[i], dummy);
}
} else if (dtype == torch::kUInt8) {
t = torch::empty({num_samples / num_channels, num_channels}, torch::kUInt8);
auto ptr = t.data_ptr<uint8_t>();
for (int32_t i = 0; i < num_samples; ++i) {
ptr[i] = SOX_SAMPLE_TO_UNSIGNED_8BIT(buffer[i], dummy);
}
} else {
throw std::runtime_error("Unsupported dtype.");
}
if (channels_first) {
t = t.transpose(1, 0);
}
return t.contiguous();
}