oplplayer/audio.h
2025-03-20 11:02:57 +01:00

97 lines
2.1 KiB
C

#include "wavfile.h"
#define SND_MSGUNDER
#define SND_S32
#include "alsasnd.h"
#undef SND_S32
#include "alsasnd.h"
typedef struct {
aud_handle16 ihandle;
aud_handle32 lhandle;
uint32_t samplerate;
bool iswav;
bool iswide;
} aud_handle;
bool aud_open_dev(aud_handle *dev, const char *devname, uint32_t samplerate, uint8_t channels, uint32_t frames, uint32_t bufsize, bool wide) {
if(wide) {
int state = aud_open_dev32(&dev->lhandle, devname, samplerate, channels, frames, bufsize);
if(state == 2) {
wide = false;
mid_log(STR_AUD_FMTCH"\n", devname, 32, 16);
state = aud_open_dev16(&dev->ihandle, devname, samplerate, channels, frames, bufsize);
if(state == 2) {
mid_log(STR_AUD_FMTERR"\n", devname);
return false;
}
else if(state != 0) {
return false;
}
}
else if(state != 0) {
return false;
}
}
else {
int state = aud_open_dev16(&dev->ihandle, devname, samplerate, channels, frames, bufsize);
if(state == 2) {
wide = true;
mid_log(STR_AUD_FMTCH"\n", devname, 16, 32);
state = aud_open_dev32(&dev->lhandle, devname, samplerate, channels, frames, bufsize);
if(state == 2) {
mid_log(STR_AUD_FMTERR"\n", devname);
return false;
}
else if(state != 0) {
return false;
}
}
else if(state != 0) {
return false;
}
}
if(wide) {
dev->samplerate = dev->lhandle.samplerate;
dev->iswav = dev->lhandle.wav.buffer != NULL;
}
else {
dev->samplerate = dev->ihandle.samplerate;
dev->iswav = dev->ihandle.wav.buffer != NULL;
}
dev->iswide = wide;
return true;
}
void aud_push(aud_handle *dev, int16_t *data) {
if(dev->iswide) {
int32_t conv[dev->lhandle.channels];
for(int h = 0; h < dev->lhandle.channels; h++) {
conv[h] = ((int32_t)data[h]) << 16;
}
aud_push32(&dev->lhandle, conv);
}
else {
aud_push16(&dev->ihandle, data);
}
}
void aud_flush(aud_handle *dev) {
if(dev->iswide) {
aud_flush32(&dev->lhandle);
}
else {
aud_flush16(&dev->ihandle);
}
}
void aud_close(aud_handle *dev) {
if(dev->iswide) {
aud_close32(&dev->lhandle);
}
else {
aud_close16(&dev->ihandle);
}
}