98 lines
2.1 KiB
C
98 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);
|
||
|
}
|
||
|
}
|