#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); } }