std::size_t * data_length,
std::size_t sample_length)
{
+ // FIX: Interpolate.
+
std::size_t bytes_read = 0;
- std::size_t samples_read = 0;
+ std::size_t samples_written = 0;
while ( *data_length >= bytes_per && sample_length >= samples_per ) {
*data_length -= bytes_per;
o += samples_per;
- samples_read += samples_per;
+ samples_written += samples_per;
sample_length -= samples_per;
}
*data_length = bytes_read;
- return samples_read;
+ return samples_written;
}
std::size_t
std::size_t data_length,
std::size_t * sample_length)
{
- std::size_t bytes_read = 0;
+ // FIX: Interpolate.
+
+ std::size_t bytes_written = 0;
std::size_t samples_read = 0;
while ( data_length >= bytes_per && *sample_length >= samples_per ) {
codec2_encode(c, o, (std::int16_t *)i);
o += bytes_per;
- bytes_read += bytes_per;
+ bytes_written += bytes_per;
data_length -= bytes_per;
i += samples_per;
*sample_length -= samples_per;
}
*sample_length = samples_read;
- return bytes_read;
+ return bytes_written;
}
std::size_t
/// the only reliable sample rate they all have in common. SampleRate
/// may be lower than that and thus there may be resampling in the
/// drivers.
-const unsigned int SampleRate = 48000;
+const unsigned int SampleRate = 8000;
/// The number of audio samples per millisecond, at SampleRate.
///
--- /dev/null
+#if 0
+#include <soxr.h>
+#include "drivers.h"
+
+namespace FreeDV {
+ void
+ Interpolate16(
+ const std::int16_t * in,
+ std::int16_t * out,
+ std::size_t in_rate,
+ std::size_t out_rate,
+ std::size_t in_length,
+ std::size_t out_length)
+ {
+ std::size_t out_done = 0;
+
+ /// The "Gibbs effect" may be seen because I don't save data from the
+ /// previous block. Fix this by making the resampler a class,
+ /// instantiate it to save state, and use the iterative rather than the
+ /// one-shot version.
+ const soxr_error_t error = soxr_oneshot(
+ in_rate,
+ out_rate,
+ 1, // Number of channels.
+ in,
+ in_length,
+ NULL,
+ out,
+ out_length,
+ &out_done,
+ NULL,
+ NULL,
+ NULL);
+ }
+};
+#endif
std::size_t data_length,
std::size_t * sample_length)
{
- std::size_t bytes_read = 0;
+ // FIX: Interpolate.
+
+ std::size_t bytes_written = 0;
std::size_t samples_read = 0;
while ( data_length >= bytes_per && *sample_length >= samples_per ) {
codec2_encode(c, o, (std::int16_t *)i);
o += bytes_per;
- bytes_read += bytes_per;
+ bytes_written += bytes_per;
data_length -= bytes_per;
i += samples_per;
*sample_length -= samples_per;
}
*sample_length = samples_read;
- return bytes_read;
+ return bytes_written;
}
std::size_t
std::size_t * data_length,
std::size_t sample_length)
{
+ // FIX: Interpolate.
+
std::size_t bytes_read = 0;
- std::size_t samples_read = 0;
+ std::size_t samples_written = 0;
while ( *data_length >= bytes_per && sample_length >= samples_per ) {
codec2_decode(c, o, i);
*data_length -= bytes_per;
o += samples_per;
- samples_read += samples_per;
+ samples_written += samples_per;
sample_length -= samples_per;
}
*data_length = bytes_read;
- return samples_read;
+ return samples_written;
}
std::size_t