satdump/plugins/sdr_sources/rtaudio_sdr_support/rtaudio_sdr.cpp
2025-07-05 04:05:20 +02:00

156 lines
4.5 KiB
C++

#include "rtaudio_sdr.h"
int RtAudioSource::callback_stereo(void * /*outputBuffer*/, void *inputBuffer, unsigned int nBufferFrames, double /*streamTime*/, RtAudioStreamStatus /*status*/, void *userData)
{
std::shared_ptr<dsp::stream<complex_t>> stream = *((std::shared_ptr<dsp::stream<complex_t>> *)userData);
int16_t *buffer = (int16_t *)inputBuffer;
for (int i = 0; i < (int)nBufferFrames; i++)
stream->writeBuf[i] = complex_t(buffer[i * 2 + 0] / 32768.0f, buffer[i * 2 + 1] / 32768.0f);
stream->swap(nBufferFrames);
return 0;
}
int RtAudioSource::callback_mono(void * /*outputBuffer*/, void *inputBuffer, unsigned int nBufferFrames, double /*streamTime*/, RtAudioStreamStatus /*status*/, void *userData)
{
std::shared_ptr<dsp::stream<complex_t>> stream = *((std::shared_ptr<dsp::stream<complex_t>> *)userData);
int16_t *buffer = (int16_t *)inputBuffer;
for (int i = 0; i < (int)nBufferFrames; i++)
stream->writeBuf[i] = complex_t(buffer[i], 0);
stream->swap(nBufferFrames);
return 0;
}
void RtAudioSource::set_settings(nlohmann::json settings)
{
d_settings = settings;
channel_mode = getValueOrDefault(d_settings["channel_cnt"], channel_mode);
if (is_started) {}
}
nlohmann::json RtAudioSource::get_settings()
{
d_settings["channel_cnt"] = channel_mode;
return d_settings;
}
void RtAudioSource::open()
{
is_open = true;
// Set available samplerate
available_samplerates.clear();
RtAudio::DeviceInfo info = adc_dev.getDeviceInfo(std::stoi(d_sdr_id));
for (auto s : info.sampleRates)
available_samplerates.push_back(s);
channel_count = info.inputChannels;
if (channel_count == 2)
channel_mode = 2;
// Init UI stuff
samplerate_option_str = "";
for (uint64_t samplerate : available_samplerates)
samplerate_option_str += format_notated(samplerate, "sps") + '\0';
}
void RtAudioSource::start()
{
DSPSampleSource::start();
if (adc_dev.getDeviceCount() < 1)
throw satdump_exception("No audio devices found!");
adc_prm.deviceId = std::stoi(d_sdr_id);
adc_prm.nChannels = channel_mode;
adc_prm.firstChannel = 0;
unsigned int sampleRate = current_samplerate;
unsigned int bufferFrames = 256; // 256 sample frames
if (channel_mode == 1)
adc_dev.openStream(NULL, &adc_prm, RTAUDIO_SINT16, sampleRate, &bufferFrames, &RtAudioSource::callback_mono, &output_stream);
else if (channel_mode == 2)
adc_dev.openStream(NULL, &adc_prm, RTAUDIO_SINT16, sampleRate, &bufferFrames, &RtAudioSource::callback_stereo, &output_stream);
adc_dev.startStream();
is_started = true;
}
void RtAudioSource::stop()
{
if (is_started)
{
adc_dev.stopStream();
adc_dev.closeStream();
}
is_started = false;
}
void RtAudioSource::close() { is_open = false; }
void RtAudioSource::set_frequency(uint64_t frequency)
{
if (is_started)
{
// No Freq for audio!
logger->debug("Set RtAudio frequency to %d", frequency);
}
DSPSampleSource::set_frequency(frequency);
}
void RtAudioSource::drawControlUI()
{
if (is_started)
RImGui::beginDisabled();
RImGui::Combo("Samplerate", &selected_samplerate, samplerate_option_str.c_str());
current_samplerate = available_samplerates[selected_samplerate];
if (channel_count >= 2)
{
if (RImGui::RadioButton("Mono##rtaudiomono", channel_mode == 1))
channel_mode = 1;
if (RImGui::RadioButton("Stereo##rtaudiomono", channel_mode == 2))
channel_mode = 2;
}
if (is_started)
RImGui::endDisabled();
}
void RtAudioSource::set_samplerate(uint64_t samplerate)
{
for (int i = 0; i < (int)available_samplerates.size(); i++)
{
if (samplerate == available_samplerates[i])
{
selected_samplerate = i;
current_samplerate = samplerate;
return;
}
}
throw satdump_exception("Unsupported samplerate : " + std::to_string(samplerate) + "!");
}
uint64_t RtAudioSource::get_samplerate() { return current_samplerate; }
std::vector<dsp::SourceDescriptor> RtAudioSource::getAvailableSources()
{
std::vector<dsp::SourceDescriptor> results;
RtAudio adc_dev;
unsigned int devices = adc_dev.getDeviceCount();
RtAudio::DeviceInfo info;
for (unsigned int i = 0; i < devices; i++)
{
info = adc_dev.getDeviceInfo(i);
// if (info.probed == true)
results.push_back({"rtaudio", "RtAudio - " + info.name, std::to_string(i)});
}
return results;
}