mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-11-26 21:58:37 -05:00
Audio device selection fixes for OSX
This commit is contained in:
parent
3da7e18b88
commit
955ec54b44
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
wxBEGIN_EVENT_TABLE(AppFrame, wxFrame)
|
wxBEGIN_EVENT_TABLE(AppFrame, wxFrame)
|
||||||
//EVT_MENU(wxID_NEW, AppFrame::OnNewWindow)
|
//EVT_MENU(wxID_NEW, AppFrame::OnNewWindow)
|
||||||
//EVT_MENU(wxID_CLOSE, AppFrame::OnClose)
|
EVT_MENU(wxID_CLOSE, AppFrame::OnClose)
|
||||||
EVT_MENU(wxID_ANY, AppFrame::OnMenu)
|
EVT_MENU(wxID_ANY, AppFrame::OnMenu)
|
||||||
|
|
||||||
EVT_COMMAND(wxID_ANY, wxEVT_THREAD, AppFrame::OnThread)
|
EVT_COMMAND(wxID_ANY, wxEVT_THREAD, AppFrame::OnThread)
|
||||||
@ -122,7 +122,6 @@ AppFrame::AppFrame() :
|
|||||||
|
|
||||||
wxMenu *menu = new wxMenu;
|
wxMenu *menu = new wxMenu;
|
||||||
|
|
||||||
std::vector<RtAudio::DeviceInfo> devices;
|
|
||||||
std::vector<RtAudio::DeviceInfo>::iterator devices_i;
|
std::vector<RtAudio::DeviceInfo>::iterator devices_i;
|
||||||
std::map<int,RtAudio::DeviceInfo>::iterator mdevices_i;
|
std::map<int,RtAudio::DeviceInfo>::iterator mdevices_i;
|
||||||
AudioThread::enumerateDevices(devices);
|
AudioThread::enumerateDevices(devices);
|
||||||
@ -143,6 +142,7 @@ AppFrame::AppFrame() :
|
|||||||
|
|
||||||
for (mdevices_i = output_devices.begin(); mdevices_i != output_devices.end(); mdevices_i++) {
|
for (mdevices_i = output_devices.begin(); mdevices_i != output_devices.end(); mdevices_i++) {
|
||||||
wxMenuItem *itm = menu->AppendRadioItem(wxID_RT_AUDIO_DEVICE+mdevices_i->first,mdevices_i->second.name,wxT("Description?"));
|
wxMenuItem *itm = menu->AppendRadioItem(wxID_RT_AUDIO_DEVICE+mdevices_i->first,mdevices_i->second.name,wxT("Description?"));
|
||||||
|
itm->SetId(wxID_RT_AUDIO_DEVICE+mdevices_i->first);
|
||||||
if (mdevices_i->second.isDefaultOutput) {
|
if (mdevices_i->second.isDefaultOutput) {
|
||||||
itm->Check(true);
|
itm->Check(true);
|
||||||
}
|
}
|
||||||
@ -171,7 +171,7 @@ AppFrame::~AppFrame() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AppFrame::OnMenu(wxCommandEvent& event) {
|
void AppFrame::OnMenu(wxCommandEvent& event) {
|
||||||
if (event.GetId() >= wxID_RT_AUDIO_DEVICE && event.GetId() < wxID_RT_AUDIO_DEVICE+output_devices.size()) {
|
if (event.GetId() >= wxID_RT_AUDIO_DEVICE && event.GetId() < wxID_RT_AUDIO_DEVICE+devices.size()) {
|
||||||
if (activeDemodulator) {
|
if (activeDemodulator) {
|
||||||
activeDemodulator->setOutputDevice(event.GetId()-wxID_RT_AUDIO_DEVICE);
|
activeDemodulator->setOutputDevice(event.GetId()-wxID_RT_AUDIO_DEVICE);
|
||||||
activeDemodulator = NULL;
|
activeDemodulator = NULL;
|
||||||
@ -179,6 +179,10 @@ void AppFrame::OnMenu(wxCommandEvent& event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppFrame::OnClose(wxCommandEvent& WXUNUSED(event)) {
|
||||||
|
Close(true);
|
||||||
|
}
|
||||||
|
|
||||||
void AppFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event)) {
|
void AppFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event)) {
|
||||||
new AppFrame();
|
new AppFrame();
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#define wxID_RT_AUDIO_DEVICE 10000
|
#define wxID_RT_AUDIO_DEVICE 1000
|
||||||
|
|
||||||
// Define a new frame type
|
// Define a new frame type
|
||||||
class AppFrame: public wxFrame {
|
class AppFrame: public wxFrame {
|
||||||
@ -22,6 +22,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void OnMenu(wxCommandEvent& event);
|
void OnMenu(wxCommandEvent& event);
|
||||||
|
void OnClose(wxCommandEvent& event);
|
||||||
void OnNewWindow(wxCommandEvent& event);
|
void OnNewWindow(wxCommandEvent& event);
|
||||||
void OnIdle(wxIdleEvent& event);
|
void OnIdle(wxIdleEvent& event);
|
||||||
|
|
||||||
@ -35,6 +36,7 @@ private:
|
|||||||
|
|
||||||
DemodulatorInstance *activeDemodulator;
|
DemodulatorInstance *activeDemodulator;
|
||||||
|
|
||||||
|
std::vector<RtAudio::DeviceInfo> devices;
|
||||||
std::map<int,RtAudio::DeviceInfo> input_devices;
|
std::map<int,RtAudio::DeviceInfo> input_devices;
|
||||||
std::map<int,RtAudio::DeviceInfo> output_devices;
|
std::map<int,RtAudio::DeviceInfo> output_devices;
|
||||||
std::map<int,wxMenuItem *> output_device_menuitems;
|
std::map<int,wxMenuItem *> output_device_menuitems;
|
||||||
|
@ -25,7 +25,7 @@ AudioThread::~AudioThread() {
|
|||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
void AudioThread::bindThread(AudioThread *other) {
|
void AudioThread::bindThread(AudioThread *other) {
|
||||||
if (boundThreads.find(other) == boundThreads.end()) {
|
if (std::find(boundThreads.load()->begin(), boundThreads.load()->end(), other) == boundThreads.load()->end()) {
|
||||||
boundThreads.load()->push_back(other);
|
boundThreads.load()->push_back(other);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -275,13 +275,11 @@ void AudioThread::setupDevice(int deviceId) {
|
|||||||
RtAudio::StreamOptions opts;
|
RtAudio::StreamOptions opts;
|
||||||
opts.streamName = "CubicSDR Audio Output";
|
opts.streamName = "CubicSDR Audio Output";
|
||||||
|
|
||||||
output_device = deviceId;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
if (active && deviceController.find(parameters.deviceId) != deviceController.end()) {
|
if (deviceController.find(output_device.load()) != deviceController.end()) {
|
||||||
deviceController[parameters.deviceId]->removeThread(this);
|
deviceController[output_device.load()]->removeThread(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
opts.priority = sched_get_priority_max(SCHED_FIFO);
|
opts.priority = sched_get_priority_max(SCHED_FIFO);
|
||||||
@ -290,6 +288,7 @@ void AudioThread::setupDevice(int deviceId) {
|
|||||||
|
|
||||||
if (deviceController.find(parameters.deviceId) == deviceController.end()) {
|
if (deviceController.find(parameters.deviceId) == deviceController.end()) {
|
||||||
deviceController[parameters.deviceId] = new AudioThread(NULL, NULL);
|
deviceController[parameters.deviceId] = new AudioThread(NULL, NULL);
|
||||||
|
deviceController[parameters.deviceId]->setInitOutputDevice(parameters.deviceId);
|
||||||
deviceController[parameters.deviceId]->bindThread(this);
|
deviceController[parameters.deviceId]->bindThread(this);
|
||||||
deviceThread[parameters.deviceId] = new std::thread(&AudioThread::threadMain, deviceController[parameters.deviceId]);
|
deviceThread[parameters.deviceId] = new std::thread(&AudioThread::threadMain, deviceController[parameters.deviceId]);
|
||||||
} else if (deviceController[parameters.deviceId] == this) {
|
} else if (deviceController[parameters.deviceId] == this) {
|
||||||
@ -315,6 +314,8 @@ void AudioThread::setupDevice(int deviceId) {
|
|||||||
e.printMessage();
|
e.printMessage();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output_device = deviceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AudioThread::getOutputDevice() {
|
int AudioThread::getOutputDevice() {
|
||||||
@ -324,6 +325,10 @@ int AudioThread::getOutputDevice() {
|
|||||||
return output_device;
|
return output_device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioThread::setInitOutputDevice(int deviceId) {
|
||||||
|
output_device = deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
void AudioThread::threadMain() {
|
void AudioThread::threadMain() {
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
pthread_t tID = pthread_self(); // ID of this thread
|
pthread_t tID = pthread_self(); // ID of this thread
|
||||||
@ -339,7 +344,9 @@ void AudioThread::threadMain() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setupDevice(dac.getDefaultOutputDevice());
|
setupDevice((output_device.load() == -1)?(dac.getDefaultOutputDevice()):output_device.load());
|
||||||
|
|
||||||
|
std::cout << "Audio thread started." << std::endl;
|
||||||
|
|
||||||
while (!terminated) {
|
while (!terminated) {
|
||||||
AudioThreadCommand command;
|
AudioThreadCommand command;
|
||||||
|
@ -70,6 +70,7 @@ public:
|
|||||||
static void enumerateDevices(std::vector<RtAudio::DeviceInfo> &devs);
|
static void enumerateDevices(std::vector<RtAudio::DeviceInfo> &devs);
|
||||||
|
|
||||||
void setupDevice(int deviceId);
|
void setupDevice(int deviceId);
|
||||||
|
void setInitOutputDevice(int deviceId);
|
||||||
int getOutputDevice();
|
int getOutputDevice();
|
||||||
void threadMain();
|
void threadMain();
|
||||||
void terminate();
|
void terminate();
|
||||||
|
Loading…
Reference in New Issue
Block a user