add an option to select audio device

This commit is contained in:
tildearrow 2022-02-13 21:42:57 -05:00
parent d2d60c4f1a
commit 53482105dc
8 changed files with 119 additions and 40 deletions

View file

@ -26,6 +26,10 @@ bool TAAudio::setRun(bool run) {
return running;
}
std::vector<String> TAAudio::listAudioDevices() {
return std::vector<String>();
}
bool TAAudio::init(TAAudioDesc& request, TAAudioDesc& response) {
response=request;
return true;

View file

@ -1,4 +1,6 @@
#include <SDL_audio.h>
#include <string.h>
#include <vector>
#include "../ta-log.h"
#include "sdl.h"
@ -49,14 +51,40 @@ bool TAAudioSDL::setRun(bool run) {
return running;
}
std::vector<String> TAAudioSDL::listAudioDevices() {
std::vector<String> ret;
if (!audioSysStarted) {
if (SDL_Init(SDL_INIT_AUDIO)<0) {
logE("could not initialize SDL to list audio devices\n");
} else {
audioSysStarted=true;
}
}
int count=SDL_GetNumAudioDevices(false);
if (count<0) return ret;
for (int i=0; i<count; i++) {
const char* devName=SDL_GetAudioDeviceName(i,false);
if (devName!=NULL) {
ret.push_back(String(devName));
}
}
return ret;
}
bool TAAudioSDL::init(TAAudioDesc& request, TAAudioDesc& response) {
if (initialized) {
logE("audio already initialized\n");
return false;
}
if (SDL_Init(SDL_INIT_AUDIO)<0) {
logE("could not initialize SDL\n");
return false;
if (!audioSysStarted) {
if (SDL_Init(SDL_INIT_AUDIO)<0) {
logE("could not initialize SDL\n");
return false;
}
audioSysStarted=true;
}
desc=request;
@ -69,12 +97,13 @@ bool TAAudioSDL::init(TAAudioDesc& request, TAAudioDesc& response) {
ac.callback=taSDLProcess;
ac.userdata=this;
ai=SDL_OpenAudioDevice(NULL,0,&ac,&ar,SDL_AUDIO_ALLOW_FREQUENCY_CHANGE);
ai=SDL_OpenAudioDevice(request.deviceName.empty()?NULL:request.deviceName.c_str(),0,&ac,&ar,SDL_AUDIO_ALLOW_FREQUENCY_CHANGE);
if (ai==0) {
logE("could not open audio device: %s\n",SDL_GetError());
return false;
}
desc.deviceName=request.deviceName;
desc.name="";
desc.rate=ar.freq;
desc.inChans=0;

View file

@ -4,6 +4,7 @@
class TAAudioSDL: public TAAudio {
SDL_AudioSpec ac, ar;
SDL_AudioDeviceID ai;
bool audioSysStarted;
public:
void onProcess(unsigned char* buf, int nframes);
@ -11,5 +12,8 @@ class TAAudioSDL: public TAAudio {
void* getContext();
bool quit();
bool setRun(bool run);
std::vector<String> listAudioDevices();
bool init(TAAudioDesc& request, TAAudioDesc& response);
TAAudioSDL():
audioSysStarted(false) {}
};

View file

@ -31,7 +31,7 @@ enum TAAudioFormat {
};
struct TAAudioDesc {
String name;
String name, deviceName;
double rate;
unsigned int bufsize, fragments;
unsigned char inChans, outChans;
@ -46,40 +46,6 @@ struct TAAudioDesc {
outFormat(TA_AUDIO_FORMAT_F32) {}
};
class TAAudio {
protected:
TAAudioDesc desc;
TAAudioFormat outFormat;
bool running, initialized;
float** inBufs;
float** outBufs;
void (*audioProcCallback)(void*,float**,float**,int,int,unsigned int);
void* audioProcCallbackUser;
void (*sampleRateChanged)(SampleRateChangeEvent);
void (*bufferSizeChanged)(BufferSizeChangeEvent);
public:
void setSampleRateChangeCallback(void (*callback)(SampleRateChangeEvent));
void setBufferSizeChangeCallback(void (*callback)(BufferSizeChangeEvent));
void setCallback(void (*callback)(void*,float**,float**,int,int,unsigned int), void* user);
virtual void* getContext();
virtual bool quit();
virtual bool setRun(bool run);
virtual bool init(TAAudioDesc& request, TAAudioDesc& response);
TAAudio():
outFormat(TA_AUDIO_FORMAT_F32),
running(false),
initialized(false),
inBufs(NULL),
outBufs(NULL),
audioProcCallback(NULL),
sampleRateChanged(NULL),
bufferSizeChanged(NULL) {}
virtual ~TAAudio();
};
enum TAMidiMessageTypes {
TA_MIDI_NOTE_OFF=0x80,
@ -146,7 +112,42 @@ class TAMidiOut {
class TAMidi {
std::vector<TAMidiIn*> in;
std::vector<TAMidiOut*> out;
};
class TAAudio {
protected:
TAAudioDesc desc;
TAAudioFormat outFormat;
bool running, initialized;
float** inBufs;
float** outBufs;
void (*audioProcCallback)(void*,float**,float**,int,int,unsigned int);
void* audioProcCallbackUser;
void (*sampleRateChanged)(SampleRateChangeEvent);
void (*bufferSizeChanged)(BufferSizeChangeEvent);
public:
TAMidi* midi;
void setSampleRateChangeCallback(void (*callback)(SampleRateChangeEvent));
void setBufferSizeChangeCallback(void (*callback)(BufferSizeChangeEvent));
void setCallback(void (*callback)(void*,float**,float**,int,int,unsigned int), void* user);
virtual void* getContext();
virtual bool quit();
virtual bool setRun(bool run);
virtual std::vector<String> listAudioDevices();
virtual bool init(TAAudioDesc& request, TAAudioDesc& response);
TAAudio():
outFormat(TA_AUDIO_FORMAT_F32),
running(false),
initialized(false),
inBufs(NULL),
outBufs(NULL),
audioProcCallback(NULL),
sampleRateChanged(NULL),
bufferSizeChanged(NULL) {}
virtual ~TAAudio();
};
#endif