Requests: Add SetSourceName (renaming sources)

Adds the `SetSourceName` request which can be used to rename sources.

Also works on scenes since scenes in OBS are also sources.
This commit is contained in:
tt2468 2020-05-15 16:13:24 -07:00
parent 590943ed95
commit 631ed022ed
3 changed files with 42 additions and 0 deletions

View File

@ -91,6 +91,7 @@ const QHash<QString, RpcMethodHandler> WSRequestHandler::messageMap {
{ "ToggleMute", &WSRequestHandler::ToggleMute },
{ "SetMute", &WSRequestHandler::SetMute },
{ "GetMute", &WSRequestHandler::GetMute },
{ "SetSourceName", &WSRequestHandler::SetSourceName },
{ "SetSyncOffset", &WSRequestHandler::SetSyncOffset },
{ "GetSyncOffset", &WSRequestHandler::GetSyncOffset },
{ "GetSpecialSources", &WSRequestHandler::GetSpecialSources },

View File

@ -108,6 +108,7 @@ class WSRequestHandler {
RpcResponse ToggleMute(const RpcRequest&);
RpcResponse SetMute(const RpcRequest&);
RpcResponse GetMute(const RpcRequest&);
RpcResponse SetSourceName(const RpcRequest&);
RpcResponse SetSyncOffset(const RpcRequest&);
RpcResponse GetSyncOffset(const RpcRequest&);
RpcResponse GetSpecialSources(const RpcRequest&);

View File

@ -341,6 +341,46 @@ RpcResponse WSRequestHandler::ToggleMute(const RpcRequest& request)
return request.success();
}
/**
* Sets (aka rename) the name of a source. Also works with scenes since scenes are technically sources in OBS.
*
* Note: If the new name already exists as a source, OBS will automatically modify the name to not interfere.
*
* @param {String} `sourceName` Source name.
* @param {String} `newName` New source name.
*
* @api requests
* @name SetSourceName
* @category sources
* @since 4.8.0
*/
RpcResponse WSRequestHandler::SetSourceName(const RpcRequest& request)
{
if (!request.hasField("sourceName") || !request.hasField("newName")) {
return request.failed("missing request parameters");
}
QString sourceName = obs_data_get_string(request.parameters(), "sourceName");
QString newName = obs_data_get_string(request.parameters(), "newName");
if (sourceName.isEmpty() || newName.isEmpty()) {
return request.failed("invalid request parameters");
}
OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8());
if (!source) {
return request.failed("specified source doesn't exist");
}
OBSSourceAutoRelease existingSource = obs_get_source_by_name(newName.toUtf8());
if (!existingSource) { // OBS is supposed to automatically rename colliding source names, but it doesn't. So this gets to be the solution for now.
obs_source_set_name(source, newName.toUtf8());
return request.success();
} else {
return request.failed("a source with that newSourceName already exists");
}
}
/**
* Set the audio sync offset of a specified source.
*