15#define SSTVENC_SUNAU_MAGIC (0x2e736e64u)
20#define SSTVENC_SUNAU_HEADER_SZ (7)
25#ifdef MISSING_ENDIAN_H
31static uint16_t be16toh(uint16_t in) {
return ntohs(in); }
32static uint16_t htobe16(uint16_t in) {
return htons(in); }
34static uint32_t be32toh(uint32_t in) {
return ntohl(in); }
35static uint32_t htobe32(uint32_t in) {
return htonl(in); }
37static uint64_t be64toh(uint64_t in) {
38 return ((uint64_t)((((uint64_t)ntohl(in >> 32)) << 32)
39 | ntohl(in & UINT32_MAX)));
41static uint64_t htobe64(uint64_t in) {
42 return ((uint64_t)((((uint64_t)htonl(in >> 32)) << 32)
43 | htonl(in & UINT32_MAX)));
50#define SSTVENC_SUNAU_STATE_HEADER (0x0001)
60 return htobe32(tmp.ui);
71 return be32toh(tmp.f);
82 return htobe64(tmp.ui);
93 return be64toh(tmp.f);
117 hdr[i] = htobe32(hdr[i]);
135 size_t n_sample,
const double* sample) {
137 int8_t isample[n_sample];
140 for (i = 0; i < n_sample; i++) {
142 isample[i] = INT8_MAX * sample[i];
145 size_t sz = fwrite(isample, n_sample,
sizeof(int8_t), enc->
fh);
158 size_t n_sample,
const double* sample) {
160 int16_t isample[n_sample];
163 for (i = 0; i < n_sample; i++) {
165 isample[i] = INT16_MAX * sample[i];
167 isample[i] = htobe16(isample[i]);
170 size_t sz = fwrite(isample, n_sample,
sizeof(int16_t), enc->
fh);
183 size_t n_sample,
const double* sample) {
185 int32_t isample[n_sample];
188 for (i = 0; i < n_sample; i++) {
190 isample[i] = INT32_MAX * sample[i];
192 isample[i] = htobe32(isample[i]);
195 size_t sz = fwrite(isample, n_sample,
sizeof(int32_t), enc->
fh);
208 size_t n_sample,
const double* sample) {
210 int32_t fsample[n_sample];
213 for (i = 0; i < n_sample; i++) {
218 size_t sz = fwrite(fsample, n_sample,
sizeof(int32_t), enc->
fh);
231 size_t n_sample,
const double* sample) {
233 int64_t fsample[n_sample];
236 for (i = 0; i < n_sample; i++) {
241 size_t sz = fwrite(fsample, n_sample,
sizeof(int64_t), enc->
fh);
271 uint32_t sample_rate, uint8_t encoding,
289 uint32_t sample_rate, uint8_t encoding,
296 enc->
fh = fopen(path,
"wb");
297 if (enc->
fh == NULL) {
311 const double* samples) {
312 if ((n_samples % enc->
channels) != 0) {
349 if (fseek(enc->
fh,
sizeof(uint32_t) * 2, SEEK_SET) == 0) {
352 size_t res = fwrite(&data_sz, 1,
sizeof(uint32_t), enc->
fh);
353 if (res <
sizeof(uint32_t)) {
362 if (fclose(enc->
fh) != 0) {
374 if (fread(hdr,
sizeof(hdr), 1, fh) < 1) {
381 hdr[i] = be32toh(hdr[i]);
403 if (fseek(fh, hdr[1], SEEK_SET) < 0) {
415 FILE* fh = fopen(path,
"rb");
430 size_t*
const n_samples,
double* samples) {
432 int8_t* in_buffer = (int8_t*)(&(samples[*n_samples]))
433 - (
sizeof(int8_t) * (*n_samples));
434 size_t in_buffer_sz = *n_samples;
439 read_sz = fread(in_buffer,
sizeof(int8_t), in_buffer_sz, dec->
fh);
440 if (read_sz < in_buffer_sz) {
449 *n_samples = read_sz;
451 *samples = -(double)(*in_buffer) / (double)INT8_MIN;
461 size_t*
const n_samples,
double* samples) {
463 int16_t* in_buffer = (int16_t*)(&(samples[*n_samples]))
464 - (
sizeof(int16_t) * (*n_samples));
465 size_t in_buffer_sz = *n_samples;
470 read_sz = fread(in_buffer,
sizeof(int16_t), in_buffer_sz, dec->
fh);
471 if (read_sz < in_buffer_sz) {
480 *n_samples = read_sz;
482 int16_t host_endian = be16toh(*in_buffer);
484 *samples = -(double)(host_endian) / (double)INT16_MIN;
494 size_t*
const n_samples,
double* samples) {
496 int32_t* in_buffer = (int32_t*)(&(samples[*n_samples]))
497 - (
sizeof(int32_t) * (*n_samples));
498 size_t in_buffer_sz = *n_samples;
503 read_sz = fread(in_buffer,
sizeof(int32_t), in_buffer_sz, dec->
fh);
504 if (read_sz < in_buffer_sz) {
513 *n_samples = read_sz;
515 int32_t host_endian = be32toh(*in_buffer);
517 *samples = -(double)(host_endian) / (double)INT32_MIN;
527 size_t*
const n_samples,
double* samples) {
529 uint32_t* in_buffer = (uint32_t*)(&(samples[*n_samples]))
530 - (
sizeof(uint32_t) * (*n_samples));
531 size_t in_buffer_sz = *n_samples;
536 read_sz = fread(in_buffer,
sizeof(
float), in_buffer_sz, dec->
fh);
537 if (read_sz < in_buffer_sz) {
546 *n_samples = read_sz;
558 size_t*
const n_samples,
double* samples) {
560 uint64_t* in_buffer = (uint64_t*)samples;
561 size_t in_buffer_sz = *n_samples;
566 read_sz = fread(in_buffer,
sizeof(
double), in_buffer_sz, dec->
fh);
567 if (read_sz < in_buffer_sz) {
576 *n_samples = read_sz;
588 size_t*
const n_samples,
double* samples) {
607 int res = fclose(dec->
fh);
int sstvenc_sunau_dec_init_fh(struct sstvenc_sunau *const dec, FILE *fh)
static int sstvenc_sunau_read_s8(struct sstvenc_sunau *const dec, size_t *const n_samples, double *samples)
static int sstvenc_sunau_read_f64(struct sstvenc_sunau *const dec, size_t *const n_samples, double *samples)
static double dbe64toh(uint64_t in)
static int sstvenc_sunau_read_f32(struct sstvenc_sunau *const dec, size_t *const n_samples, double *samples)
static uint64_t dhtobe64(double in)
static int sstvenc_sunau_write_s16(struct sstvenc_sunau *const enc, size_t n_sample, const double *sample)
#define SSTVENC_SUNAU_HEADER_SZ
static int sstvenc_sunau_read_s16(struct sstvenc_sunau *const dec, size_t *const n_samples, double *samples)
static int sstvenc_sunau_enc_write_header(struct sstvenc_sunau *const enc)
int sstvenc_sunau_enc_write(struct sstvenc_sunau *const enc, size_t n_samples, const double *samples)
int sstvenc_sunau_check(uint32_t sample_rate, uint8_t encoding, uint8_t channels)
int sstvenc_sunau_enc_init_fh(struct sstvenc_sunau *const enc, FILE *fh, uint32_t sample_rate, uint8_t encoding, uint8_t channels)
static int sstvenc_sunau_read_s32(struct sstvenc_sunau *const dec, size_t *const n_samples, double *samples)
#define SSTVENC_SUNAU_MAGIC
static int sstvenc_sunau_write_s8(struct sstvenc_sunau *const enc, size_t n_sample, const double *sample)
#define SSTVENC_SUNAU_STATE_HEADER
int sstvenc_sunau_dec_close(struct sstvenc_sunau *const dec)
int sstvenc_sunau_dec_read(struct sstvenc_sunau *const enc, size_t *const n_samples, double *samples)
static int sstvenc_sunau_write_s32(struct sstvenc_sunau *const enc, size_t n_sample, const double *sample)
static float fbe32toh(uint32_t in)
int sstvenc_sunau_enc_init(struct sstvenc_sunau *const enc, const char *path, uint32_t sample_rate, uint8_t encoding, uint8_t channels)
static int sstvenc_sunau_write_f32(struct sstvenc_sunau *const enc, size_t n_sample, const double *sample)
int sstvenc_sunau_dec_init(struct sstvenc_sunau *const dec, const char *path)
static uint32_t fhtobe32(float in)
int sstvenc_sunau_enc_close(struct sstvenc_sunau *const enc)
static int sstvenc_sunau_write_f64(struct sstvenc_sunau *const enc, size_t n_sample, const double *sample)