1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-09-18 23:14:50 +00:00
QB64-PE/internal/c/parts/audio/extras/libxmp-lite/mdataio.h
Matthew Kilgore 481906977e Add a740g's miniaudio backend
This is a single commit adding all of a740g's audio backend. Later
commits will connect it together with QB64PE itself.
2022-08-27 14:27:55 -04:00

125 lines
2.1 KiB
C

#ifndef LIBXMP_MDATAIO_H
#define LIBXMP_MDATAIO_H
#include <stddef.h>
#include <limits.h>
#include "common.h"
static inline ptrdiff_t CAN_READ(MFILE *m)
{
if (m->size >= 0)
return m->pos >= 0 ? m->size - m->pos : 0;
return INT_MAX;
}
static inline uint8 mread8(MFILE *m, int *err)
{
uint8 x = 0xff;
size_t r = mread(&x, 1, 1, m);
if (err) {
*err = (r == 1) ? 0 : EOF;
}
return x;
}
static inline int8 mread8s(MFILE *m, int *err)
{
int r = mgetc(m);
if (err) {
*err = (r < 0) ? EOF : 0;
}
return (int8)r;
}
static inline uint16 mread16l(MFILE *m, int *err)
{
ptrdiff_t can_read = CAN_READ(m);
if (can_read >= 2) {
uint16 n = readmem16l(m->start + m->pos);
m->pos += 2;
if(err) *err = 0;
return n;
} else {
m->pos += can_read;
if(err) *err = EOF;
return EOF;
}
}
static inline uint16 mread16b(MFILE *m, int *err)
{
ptrdiff_t can_read = CAN_READ(m);
if (can_read >= 2) {
uint16 n = readmem16b(m->start + m->pos);
m->pos += 2;
if(err) *err = 0;
return n;
} else {
m->pos += can_read;
if(err) *err = EOF;
return EOF;
}
}
static inline uint32 mread24l(MFILE *m, int *err)
{
ptrdiff_t can_read = CAN_READ(m);
if (can_read >= 3) {
uint32 n = readmem24l(m->start + m->pos);
m->pos += 3;
if(err) *err = 0;
return n;
} else {
m->pos += can_read;
if(err) *err = EOF;
return EOF;
}
}
static inline uint32 mread24b(MFILE *m, int *err)
{
ptrdiff_t can_read = CAN_READ(m);
if (can_read >= 3) {
uint32 n = readmem24b(m->start + m->pos);
m->pos += 3;
if(err) *err = 0;
return n;
} else {
m->pos += can_read;
if(err) *err = EOF;
return EOF;
}
}
static inline uint32 mread32l(MFILE *m, int *err)
{
ptrdiff_t can_read = CAN_READ(m);
if (can_read >= 4) {
uint32 n = readmem32l(m->start + m->pos);
m->pos += 4;
if(err) *err = 0;
return n;
} else {
m->pos += can_read;
if(err) *err = EOF;
return EOF;
}
}
static inline uint32 mread32b(MFILE *m, int *err)
{
ptrdiff_t can_read = CAN_READ(m);
if (can_read >= 4) {
uint32 n = readmem32b(m->start + m->pos);
m->pos += 4;
if(err) *err = 0;
return n;
} else {
m->pos += can_read;
if(err) *err = EOF;
return EOF;
}
}
#endif