I have learned that since std::<span>'s introduction in C++20, we no longer need to use the traditional void read(T* input, int numSamples) API and can instead pass in a span that encompasses both the content and size in a non-owning way. My question is, if we are handling multi-channel data, what should this become? Would it be a std::span<std::span<T>>? That doesn't seem to make sense since the spanned elements should be contiguous.
Previously the file IO API I saw either used std::vector<std::vector<T>> directly, or used raw pointers like T** channels, which didn't seem to be as general and modern as it can be.