mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-06-04 15:04:38 -04:00
Multiple audio support: Web API: new GET and PATCHes to set input and output parameters
This commit is contained in:
@@ -23,6 +23,10 @@ QString WebAPIAdapterInterface::instanceDevicesURL = "/sdrangel/devices";
|
||||
QString WebAPIAdapterInterface::instanceChannelsURL = "/sdrangel/channels";
|
||||
QString WebAPIAdapterInterface::instanceLoggingURL = "/sdrangel/logging";
|
||||
QString WebAPIAdapterInterface::instanceAudioURL = "/sdrangel/audio";
|
||||
QString WebAPIAdapterInterface::instanceAudioInputSetURL = "/sdrangel/audio/input/set";
|
||||
QString WebAPIAdapterInterface::instanceAudioOutputSetURL = "/sdrangel/audio/output/set";
|
||||
QString WebAPIAdapterInterface::instanceAudioInputUnsetURL = "/sdrangel/audio/input/unset";
|
||||
QString WebAPIAdapterInterface::instanceAudioOutputUnsetURL = "/sdrangel/audio/output/unset";
|
||||
QString WebAPIAdapterInterface::instanceLocationURL = "/sdrangel/location";
|
||||
QString WebAPIAdapterInterface::instanceDVSerialURL = "/sdrangel/dvserial";
|
||||
QString WebAPIAdapterInterface::instancePresetsURL = "/sdrangel/presets";
|
||||
|
||||
@@ -33,7 +33,8 @@ namespace SWGSDRangel
|
||||
class SWGInstanceChannelsResponse;
|
||||
class SWGLoggingInfo;
|
||||
class SWGAudioDevices;
|
||||
class SWGAudioDevicesSelect;
|
||||
class SWGAudioInputDevice;
|
||||
class SWGAudioOutputDevice;
|
||||
class SWGLocationInformation;
|
||||
class SWGDVSeralDevices;
|
||||
class SWGPresets;
|
||||
@@ -152,11 +153,12 @@ public:
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler of /sdrangel/audio (PATCH) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels
|
||||
* Handler of /sdrangel/audio/input (PATCH) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels
|
||||
* returns the Http status code (default 501: not implemented)
|
||||
*/
|
||||
virtual int instanceAudioPatch(
|
||||
SWGSDRangel::SWGAudioDevicesSelect& response __attribute__((unused)),
|
||||
virtual int instanceAudioInputPatch(
|
||||
SWGSDRangel::SWGAudioInputDevice& response __attribute__((unused)),
|
||||
const QStringList& audioInputKeys __attribute__((unused)),
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
error.init();
|
||||
@@ -164,6 +166,20 @@ public:
|
||||
return 501;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler of /sdrangel/audio/output (PATCH) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels
|
||||
* returns the Http status code (default 501: not implemented)
|
||||
*/
|
||||
virtual int instanceAudioOutputPatch(
|
||||
SWGSDRangel::SWGAudioOutputDevice& response __attribute__((unused)),
|
||||
const QStringList& audioOutputKeys __attribute__((unused)),
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("Function not implemented");
|
||||
return 501;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler of /sdrangel/location (GET) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels
|
||||
* returns the Http status code (default 501: not implemented)
|
||||
@@ -552,6 +568,10 @@ public:
|
||||
static QString instanceChannelsURL;
|
||||
static QString instanceLoggingURL;
|
||||
static QString instanceAudioURL;
|
||||
static QString instanceAudioInputSetURL;
|
||||
static QString instanceAudioOutputSetURL;
|
||||
static QString instanceAudioInputUnsetURL;
|
||||
static QString instanceAudioOutputUnsetURL;
|
||||
static QString instanceLocationURL;
|
||||
static QString instanceDVSerialURL;
|
||||
static QString instancePresetsURL;
|
||||
|
||||
@@ -84,6 +84,10 @@ void WebAPIRequestMapper::service(qtwebapp::HttpRequest& request, qtwebapp::Http
|
||||
instanceLoggingService(request, response);
|
||||
} else if (path == WebAPIAdapterInterface::instanceAudioURL) {
|
||||
instanceAudioService(request, response);
|
||||
} else if (path == WebAPIAdapterInterface::instanceAudioInputSetURL) {
|
||||
instanceAudioInputSetService(request, response);
|
||||
} else if (path == WebAPIAdapterInterface::instanceAudioOutputSetURL) {
|
||||
instanceAudioOutputSetService(request, response);
|
||||
} else if (path == WebAPIAdapterInterface::instanceLocationURL) {
|
||||
instanceLocationService(request, response);
|
||||
} else if (path == WebAPIAdapterInterface::instanceDVSerialURL) {
|
||||
@@ -315,21 +319,106 @@ void WebAPIRequestMapper::instanceAudioService(qtwebapp::HttpRequest& request, q
|
||||
response.write(errorResponse.asJson().toUtf8());
|
||||
}
|
||||
}
|
||||
else if (request.getMethod() == "PATCH")
|
||||
else
|
||||
{
|
||||
response.setStatus(405,"Invalid HTTP method");
|
||||
errorResponse.init();
|
||||
*errorResponse.getMessage() = "Invalid HTTP method";
|
||||
response.write(errorResponse.asJson().toUtf8());
|
||||
}
|
||||
}
|
||||
|
||||
void WebAPIRequestMapper::instanceAudioInputSetService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response)
|
||||
{
|
||||
// TODO
|
||||
SWGSDRangel::SWGErrorResponse errorResponse;
|
||||
response.setHeader("Content-Type", "application/json");
|
||||
|
||||
if (request.getMethod() == "PATCH")
|
||||
{
|
||||
SWGSDRangel::SWGAudioDevicesSelect normalResponse;
|
||||
QString jsonStr = request.getBody();
|
||||
QJsonObject jsonObject;
|
||||
|
||||
if (parseJsonBody(jsonStr, jsonObject, response))
|
||||
{
|
||||
normalResponse.fromJson(jsonStr);
|
||||
int status = m_adapter->instanceAudioPatch(normalResponse, errorResponse);
|
||||
response.setStatus(status);
|
||||
SWGSDRangel::SWGAudioInputDevice normalResponse;
|
||||
resetAudioInputDevice(normalResponse);
|
||||
QStringList audioInputDeviceKeys;
|
||||
|
||||
if (status/100 == 2) {
|
||||
response.write(normalResponse.asJson().toUtf8());
|
||||
} else {
|
||||
if (validateAudioInputDevice(normalResponse, jsonObject, audioInputDeviceKeys))
|
||||
{
|
||||
int status = m_adapter->instanceAudioInputPatch(
|
||||
normalResponse,
|
||||
audioInputDeviceKeys,
|
||||
errorResponse);
|
||||
response.setStatus(status);
|
||||
|
||||
if (status/100 == 2) {
|
||||
response.write(normalResponse.asJson().toUtf8());
|
||||
} else {
|
||||
response.write(errorResponse.asJson().toUtf8());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
response.setStatus(400,"Invalid JSON request");
|
||||
errorResponse.init();
|
||||
*errorResponse.getMessage() = "Invalid JSON request";
|
||||
response.write(errorResponse.asJson().toUtf8());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
response.setStatus(400,"Invalid JSON format");
|
||||
errorResponse.init();
|
||||
*errorResponse.getMessage() = "Invalid JSON format";
|
||||
response.write(errorResponse.asJson().toUtf8());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
response.setStatus(405,"Invalid HTTP method");
|
||||
errorResponse.init();
|
||||
*errorResponse.getMessage() = "Invalid HTTP method";
|
||||
response.write(errorResponse.asJson().toUtf8());
|
||||
}
|
||||
}
|
||||
|
||||
void WebAPIRequestMapper::instanceAudioOutputSetService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response)
|
||||
{
|
||||
SWGSDRangel::SWGErrorResponse errorResponse;
|
||||
response.setHeader("Content-Type", "application/json");
|
||||
|
||||
if (request.getMethod() == "PATCH")
|
||||
{
|
||||
QString jsonStr = request.getBody();
|
||||
QJsonObject jsonObject;
|
||||
|
||||
if (parseJsonBody(jsonStr, jsonObject, response))
|
||||
{
|
||||
SWGSDRangel::SWGAudioOutputDevice normalResponse;
|
||||
resetAudioOutputDevice(normalResponse);
|
||||
QStringList audioOutputDeviceKeys;
|
||||
|
||||
if (validateAudioOutputDevice(normalResponse, jsonObject, audioOutputDeviceKeys))
|
||||
{
|
||||
int status = m_adapter->instanceAudioOutputPatch(
|
||||
normalResponse,
|
||||
audioOutputDeviceKeys,
|
||||
errorResponse);
|
||||
response.setStatus(status);
|
||||
|
||||
if (status/100 == 2) {
|
||||
response.write(normalResponse.asJson().toUtf8());
|
||||
} else {
|
||||
response.write(errorResponse.asJson().toUtf8());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
response.setStatus(400,"Invalid JSON request");
|
||||
errorResponse.init();
|
||||
*errorResponse.getMessage() = "Invalid JSON request";
|
||||
response.write(errorResponse.asJson().toUtf8());
|
||||
}
|
||||
}
|
||||
@@ -1745,6 +1834,72 @@ bool WebAPIRequestMapper::validateChannelReport(
|
||||
}
|
||||
}
|
||||
|
||||
bool WebAPIRequestMapper::validateAudioInputDevice(
|
||||
SWGSDRangel::SWGAudioInputDevice& audioInputDevice,
|
||||
QJsonObject& jsonObject,
|
||||
QStringList& audioInputDeviceKeys)
|
||||
{
|
||||
if (jsonObject.contains("index")) {
|
||||
audioInputDevice.setIndex(jsonObject["index"].toInt());
|
||||
} else {
|
||||
audioInputDevice.setIndex(-1); // assume systam default
|
||||
}
|
||||
if (jsonObject.contains("sampleRate"))
|
||||
{
|
||||
audioInputDevice.setSampleRate(jsonObject["sampleRate"].toInt());
|
||||
audioInputDeviceKeys.append("sampleRate");
|
||||
}
|
||||
if (jsonObject.contains("volume"))
|
||||
{
|
||||
audioInputDevice.setVolume(jsonObject["volume"].toDouble());
|
||||
audioInputDeviceKeys.append("volume");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WebAPIRequestMapper::validateAudioOutputDevice(
|
||||
SWGSDRangel::SWGAudioOutputDevice& audioOutputDevice,
|
||||
QJsonObject& jsonObject,
|
||||
QStringList& audioOutputDeviceKeys)
|
||||
{
|
||||
if (jsonObject.contains("index")) {
|
||||
audioOutputDevice.setIndex(jsonObject["index"].toInt());
|
||||
} else {
|
||||
audioOutputDevice.setIndex(-1); // assume systam default
|
||||
}
|
||||
if (jsonObject.contains("sampleRate"))
|
||||
{
|
||||
audioOutputDevice.setSampleRate(jsonObject["sampleRate"].toInt());
|
||||
audioOutputDeviceKeys.append("sampleRate");
|
||||
}
|
||||
if (jsonObject.contains("copyToUDP"))
|
||||
{
|
||||
audioOutputDevice.setCopyToUdp(jsonObject["copyToUDP"].toInt() == 0 ? 0 : 1);
|
||||
audioOutputDeviceKeys.append("copyToUDP");
|
||||
}
|
||||
if (jsonObject.contains("udpUsesRTP"))
|
||||
{
|
||||
audioOutputDevice.setUdpUsesRtp(jsonObject["udpUsesRTP"].toInt() == 0 ? 0 : 1);
|
||||
audioOutputDeviceKeys.append("udpUsesRTP");
|
||||
}
|
||||
if (jsonObject.contains("udpChannelMode"))
|
||||
{
|
||||
audioOutputDevice.setUdpChannelMode(jsonObject["udpChannelMode"].toInt());
|
||||
audioOutputDeviceKeys.append("udpChannelMode");
|
||||
}
|
||||
if (jsonObject.contains("udpAddress"))
|
||||
{
|
||||
audioOutputDevice.setUdpAddress(new QString(jsonObject["udpAddress"].toString()));
|
||||
audioOutputDeviceKeys.append("udpAddress");
|
||||
}
|
||||
if (jsonObject.contains("udpPort"))
|
||||
{
|
||||
audioOutputDevice.setUdpPort(jsonObject["udpPort"].toInt());
|
||||
audioOutputDeviceKeys.append("udpPort");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void WebAPIRequestMapper::appendSettingsSubKeys(
|
||||
const QJsonObject& parentSettingsJsonObject,
|
||||
QJsonObject& childSettingsJsonObject,
|
||||
@@ -1786,3 +1941,16 @@ void WebAPIRequestMapper::resetChannelReport(SWGSDRangel::SWGChannelReport& chan
|
||||
channelReport.setNfmDemodReport(0);
|
||||
channelReport.setNfmModReport(0);
|
||||
}
|
||||
|
||||
void WebAPIRequestMapper::resetAudioInputDevice(SWGSDRangel::SWGAudioInputDevice& audioInputDevice)
|
||||
{
|
||||
audioInputDevice.cleanup();
|
||||
audioInputDevice.setName(0);
|
||||
}
|
||||
|
||||
void WebAPIRequestMapper::resetAudioOutputDevice(SWGSDRangel::SWGAudioOutputDevice& audioOutputDevice)
|
||||
{
|
||||
audioOutputDevice.cleanup();
|
||||
audioOutputDevice.setName(0);
|
||||
audioOutputDevice.setUdpAddress(0);
|
||||
}
|
||||
|
||||
@@ -52,6 +52,8 @@ private:
|
||||
void instanceChannelsService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response);
|
||||
void instanceLoggingService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response);
|
||||
void instanceAudioService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response);
|
||||
void instanceAudioInputSetService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response);
|
||||
void instanceAudioOutputSetService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response);
|
||||
void instanceLocationService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response);
|
||||
void instanceDVSerialService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response);
|
||||
void instancePresetsService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response);
|
||||
@@ -78,6 +80,8 @@ private:
|
||||
bool validateDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings, QJsonObject& jsonObject, QStringList& deviceSettingsKeys);
|
||||
bool validateChannelSettings(SWGSDRangel::SWGChannelSettings& deviceSettings, QJsonObject& jsonObject, QStringList& channelSettingsKeys);
|
||||
bool validateChannelReport(SWGSDRangel::SWGChannelReport& deviceReport, QJsonObject& jsonObject, QStringList& channelReportKeys);
|
||||
bool validateAudioInputDevice(SWGSDRangel::SWGAudioInputDevice& audioInputDevice, QJsonObject& jsonObject, QStringList& audioInputDeviceKeys);
|
||||
bool validateAudioOutputDevice(SWGSDRangel::SWGAudioOutputDevice& audioOutputDevice, QJsonObject& jsonObject, QStringList& audioOutputDeviceKeys);
|
||||
|
||||
void appendSettingsSubKeys(
|
||||
const QJsonObject& parentSettingsJsonObject,
|
||||
@@ -90,6 +94,8 @@ private:
|
||||
void resetDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings);
|
||||
void resetChannelSettings(SWGSDRangel::SWGChannelSettings& deviceSettings);
|
||||
void resetChannelReport(SWGSDRangel::SWGChannelReport& deviceSettings);
|
||||
void resetAudioInputDevice(SWGSDRangel::SWGAudioInputDevice& audioInputDevice);
|
||||
void resetAudioOutputDevice(SWGSDRangel::SWGAudioOutputDevice& audioOutputDevice);
|
||||
};
|
||||
|
||||
#endif /* SDRBASE_WEBAPI_WEBAPIREQUESTMAPPER_H_ */
|
||||
|
||||
Reference in New Issue
Block a user