initial commit
This commit is contained in:
commit
36ca6059c1
49 changed files with 5290 additions and 0 deletions
97
audio.h
Normal file
97
audio.h
Normal file
|
@ -0,0 +1,97 @@
|
|||
#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);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue