Complete documentation of all libwsv5 functions, types, and structures.
- Initialization & Cleanup
- Configuration
- Connection Management
- Scene Operations
- Recording & Streaming
- Source Control
- Generic Requests
- Status & Monitoring
- Types & Structures
- Error Handling
- Callbacks
- Constants
Initialize the libwsv5 library.
Signature:
obsws_error_t obsws_init(void);Returns:
OBSWS_OK- Library initialized successfullyOBSWS_ERROR_OUT_OF_MEMORY- Memory allocation failed
Description: Must be called once before creating any connections. Sets up internal data structures and resources.
Example:
obsws_error_t err = obsws_init();
if (err != OBSWS_OK) {
fprintf(stderr, "Failed to initialize: %s\n", obsws_error_string(err));
return 1;
}Clean up library resources.
Signature:
void obsws_cleanup(void);Description: Frees all library resources. Call after all connections are closed. Safe to call multiple times.
Example:
obsws_disconnect(conn);
obsws_cleanup();Initialize a configuration structure with default values.
Signature:
void obsws_config_init(obsws_config_t *config);Parameters:
config- Pointer to configuration structure
Description: Sets all configuration fields to sensible defaults. Must be called before setting custom values.
Example:
obsws_config_t config;
obsws_config_init(&config);
config.host = "192.168.1.100";
config.port = 4455;
config.password = "mypassword";Set the logging verbosity level.
Signature:
void obsws_set_log_level(obsws_log_level_t level);Parameters:
level- Log level (OBSWS_LOG_ERROR, OBSWS_LOG_WARNING, OBSWS_LOG_INFO, OBSWS_LOG_DEBUG)
Description: Controls which log messages are printed. Call before connecting for best results.
Set the debug output level.
Signature:
void obsws_set_debug_level(obsws_debug_level_t level);Parameters:
level- Debug level (OBSWS_DEBUG_NONE, OBSWS_DEBUG_LOW, OBSWS_DEBUG_MEDIUM, OBSWS_DEBUG_HIGH)
Description: Higher levels output more detailed protocol information, useful for debugging.
Get current debug level.
Signature:
obsws_debug_level_t obsws_get_debug_level(void);Returns:
- Current debug level
Enable/disable timestamps in log output.
Signature:
obsws_error_t obsws_set_log_timestamps(bool enabled);Parameters:
enabled- true to enable timestamps, false to disable
Returns:
OBSWS_OK- Success
Enable/disable colored output in logs.
Signature:
obsws_error_t obsws_set_log_colors(int auto_detect);Parameters:
auto_detect- 0=disable, 1=force enable, 2=auto-detect terminal
Returns:
OBSWS_OK- Success
Establish connection to OBS.
Signature:
obsws_connection_t *obsws_connect(obsws_config_t *config);Parameters:
config- Connection configuration
Returns:
- Connection handle on success
NULLon failure (check logs for details)
Description:
Creates a new connection to OBS and initiates WebSocket connection. Use obsws_is_connected() to verify connection is established.
Example:
obsws_config_t config;
obsws_config_init(&config);
config.host = "localhost";
config.port = 4455;
config.password = "password";
obsws_connection_t *conn = obsws_connect(&config);
if (!conn) {
fprintf(stderr, "Failed to connect\n");
return 1;
}
// Wait for connection to establish
for (int i = 0; i < 100; i++) {
if (obsws_is_connected(conn)) break;
obsws_process_events(conn, 100);
}Close connection to OBS.
Signature:
void obsws_disconnect(obsws_connection_t *conn);Parameters:
conn- Connection to close
Description: Cleanly closes the WebSocket connection and frees resources. Safe to call multiple times.
Example:
obsws_disconnect(conn);Check if connection is established and authenticated.
Signature:
bool obsws_is_connected(obsws_connection_t *conn);Parameters:
conn- Connection to check
Returns:
trueif connected and authenticatedfalseotherwise
Example:
if (obsws_is_connected(conn)) {
printf("Ready to send commands\n");
}Get current connection state.
Signature:
obsws_state_t obsws_get_state(obsws_connection_t *conn);Parameters:
conn- Connection to query
Returns:
- Current state (OBSWS_STATE_DISCONNECTED, OBSWS_STATE_CONNECTING, etc.)
Convert connection state to human-readable string.
Signature:
const char *obsws_state_string(obsws_state_t state);Parameters:
state- State to convert
Returns:
- String representation (e.g., "Connected", "Disconnected")
Example:
obsws_state_t state = obsws_get_state(conn);
printf("State: %s\n", obsws_state_string(state));Send keep-alive ping to OBS.
Signature:
obsws_error_t obsws_ping(obsws_connection_t *conn);Parameters:
conn- Connection to ping
Returns:
OBSWS_OK- Ping sent successfully- Other error codes on failure
Description: Manually sends a keep-alive ping. Usually not needed as library sends automatic pings.
Get name of currently active scene.
Signature:
obsws_error_t obsws_get_current_scene(obsws_connection_t *conn, char *scene_name, size_t name_size);Parameters:
conn- Connectionscene_name- Buffer to receive scene namename_size- Buffer size
Returns:
OBSWS_OK- Scene name retrievedOBSWS_ERROR_NOT_CONNECTED- Not connected- Other error codes on failure
Example:
char scene[256] = {0};
obsws_error_t err = obsws_get_current_scene(conn, scene, sizeof(scene));
if (err == OBSWS_OK) {
printf("Current scene: %s\n", scene);
}Switch to a different scene.
Signature:
obsws_error_t obsws_set_current_scene(obsws_connection_t *conn, const char *scene_name, obsws_response_t **response);Parameters:
conn- Connectionscene_name- Name of scene to switch toresponse- Pointer to receive response (can be NULL)
Returns:
OBSWS_OKif request sent- Check
response->successfor operation success
Example:
obsws_response_t *response = NULL;
obsws_error_t err = obsws_set_current_scene(conn, "Scene1", &response);
if (err == OBSWS_OK && response && response->success) {
printf("Switched to Scene1\n");
}
obsws_response_free(response);Get list of all scenes.
Signature:
obsws_error_t obsws_get_scene_list(obsws_connection_t *conn, char *scenes_json, size_t json_size);Parameters:
conn- Connectionscenes_json- Buffer to receive JSON arrayjson_size- Buffer size
Returns:
OBSWS_OK- Scene list retrieved- Other error codes on failure
Example:
char scenes[4096] = {0};
obsws_error_t err = obsws_get_scene_list(conn, scenes, sizeof(scenes));
if (err == OBSWS_OK) {
printf("Scenes: %s\n", scenes);
}Start recording.
Signature:
obsws_error_t obsws_start_recording(obsws_connection_t *conn, obsws_response_t **response);Parameters:
conn- Connectionresponse- Pointer to receive response (can be NULL)
Returns:
OBSWS_OKif request sent- Check
response->successfor operation success
Example:
obsws_response_t *response = NULL;
obsws_error_t err = obsws_start_recording(conn, &response);
if (err == OBSWS_OK && response && response->success) {
printf("Recording started\n");
}
obsws_response_free(response);Stop recording.
Signature:
obsws_error_t obsws_stop_recording(obsws_connection_t *conn, obsws_response_t **response);Parameters:
conn- Connectionresponse- Pointer to receive response (can be NULL)
Returns:
OBSWS_OKif request sent- Check
response->successfor operation success
Get current recording status.
Signature:
obsws_error_t obsws_get_recording_status(obsws_connection_t *conn, bool *is_recording, bool *is_paused);Parameters:
conn- Connectionis_recording- Pointer to receive recording statusis_paused- Pointer to receive pause status
Returns:
OBSWS_OK- Status retrieved- Other error codes on failure
Example:
bool recording = false, paused = false;
obsws_error_t err = obsws_get_recording_status(conn, &recording, &paused);
if (err == OBSWS_OK) {
printf("Recording: %s, Paused: %s\n", recording ? "yes" : "no", paused ? "yes" : "no");
}Start streaming.
Signature:
obsws_error_t obsws_start_streaming(obsws_connection_t *conn, obsws_response_t **response);Parameters:
conn- Connectionresponse- Pointer to receive response (can be NULL)
Returns:
OBSWS_OKif request sent- Check
response->successfor operation success
Stop streaming.
Signature:
obsws_error_t obsws_stop_streaming(obsws_connection_t *conn, obsws_response_t **response);Parameters:
conn- Connectionresponse- Pointer to receive response (can be NULL)
Returns:
OBSWS_OKif request sent- Check
response->successfor operation success
Get current streaming status.
Signature:
obsws_error_t obsws_get_streaming_status(obsws_connection_t *conn, bool *is_streaming, bool *is_reconnecting);Parameters:
conn- Connectionis_streaming- Pointer to receive streaming statusis_reconnecting- Pointer to receive reconnecting status
Returns:
OBSWS_OK- Status retrieved- Other error codes on failure
Show or hide a scene item (source).
Signature:
obsws_error_t obsws_set_source_visibility(obsws_connection_t *conn, const char *scene_name,
const char *source_name, bool visible, obsws_response_t **response);Parameters:
conn- Connectionscene_name- Scene containing the itemsource_name- Name of source/itemvisible- true to show, false to hideresponse- Pointer to receive response
Returns:
OBSWS_OKif request sent- Check
response->successfor operation success
Example:
obsws_response_t *response = NULL;
obsws_error_t err = obsws_set_source_visibility(conn, "Scene1", "Camera", true, &response);
if (err == OBSWS_OK && response && response->success) {
printf("Camera shown\n");
}
obsws_response_free(response);Enable or disable a filter on a source.
Signature:
obsws_error_t obsws_set_source_filter_enabled(obsws_connection_t *conn, const char *source_name,
const char *filter_name, bool enabled, obsws_response_t **response);Parameters:
conn- Connectionsource_name- Source namefilter_name- Filter nameenabled- true to enable, false to disableresponse- Pointer to receive response
Returns:
OBSWS_OKif request sent- Check
response->successfor operation success
Check if an input is muted.
Signature:
obsws_error_t obsws_get_input_mute(obsws_connection_t *conn, const char *input_name, bool *is_muted);Parameters:
conn- Connectioninput_name- Input nameis_muted- Pointer to receive mute status
Returns:
OBSWS_OK- Status retrieved- Other error codes on failure
Example:
bool muted = false;
obsws_error_t err = obsws_get_input_mute(conn, "Microphone", &muted);
if (err == OBSWS_OK) {
printf("Muted: %s\n", muted ? "yes" : "no");
}Mute or unmute an input.
Signature:
obsws_error_t obsws_set_input_mute(obsws_connection_t *conn, const char *input_name,
bool mute, obsws_response_t **response);Parameters:
conn- Connectioninput_name- Input namemute- true to mute, false to unmuteresponse- Pointer to receive response
Returns:
OBSWS_OKif request sent- Check
response->successfor operation success
Send a generic request to OBS and wait for response.
Signature:
obsws_error_t obsws_send_request(obsws_connection_t *conn, const char *request_type,
const char *request_data, obsws_response_t **response, uint32_t timeout_ms);Parameters:
conn- Connectionrequest_type- OBS request type (e.g., "GetVersion", "SetCurrentProgramScene")request_data- Optional JSON string with request parametersresponse- Pointer to receive response (can be NULL)timeout_ms- Timeout in milliseconds (0 = use configured default)
Returns:
OBSWS_OKif response receivedOBSWS_ERROR_TIMEOUTif no response within timeout- Other error codes on failure
Description: This is the core function for all OBS operations. The library provides convenience functions for common operations, but this function can be used for any OBS WebSocket request.
Example:
obsws_response_t *response = NULL;
const char *data = "{\"sceneName\": \"Scene1\"}";
obsws_error_t err = obsws_send_request(conn, "SetCurrentProgramScene", data, &response, 0);
if (err == OBSWS_OK && response) {
printf("Success: %s\n", response->success ? "yes" : "no");
if (response->response_data) {
printf("Data: %s\n", response->response_data);
}
obsws_response_free(response);
}Free response memory.
Signature:
void obsws_response_free(obsws_response_t *response);Parameters:
response- Response to free (can be NULL)
Description:
Must be called for every non-NULL response received from obsws_send_request(). Safe to call with NULL.
Get connection statistics.
Signature:
obsws_error_t obsws_get_stats(obsws_connection_t *conn, obsws_stats_t *stats);Parameters:
conn- Connectionstats- Pointer to receive statistics
Returns:
OBSWS_OK- Statistics retrieved- Other error codes on failure
Example:
obsws_stats_t stats = {0};
obsws_error_t err = obsws_get_stats(conn, &stats);
if (err == OBSWS_OK) {
printf("Messages sent: %lu\n", stats.messages_sent);
printf("Messages received: %lu\n", stats.messages_received);
printf("Bytes sent: %lu\n", stats.bytes_sent);
printf("Bytes received: %lu\n", stats.bytes_received);
printf("Errors: %lu\n", stats.error_count);
}Process pending events for connection.
Signature:
void obsws_process_events(obsws_connection_t *conn, int timeout_ms);Parameters:
conn- Connectiontimeout_ms- Time to wait for events (0 = don't wait)
Description: Should be called periodically to allow background event thread to process messages. Alternatively, use event callbacks.
Example:
// Simple polling loop
while (running) {
obsws_process_events(conn, 100);
// Do other work
}Get library version string.
Signature:
const char *obsws_version(void);Returns:
- Version string (e.g., "1.0.0")
Error code enumeration.
typedef enum {
OBSWS_OK = 0,
OBSWS_ERROR_INVALID_PARAM = -1,
OBSWS_ERROR_CONNECTION_FAILED = -2,
OBSWS_ERROR_AUTH_FAILED = -3,
OBSWS_ERROR_SEND_FAILED = -5,
OBSWS_ERROR_RECV_FAILED = -6,
OBSWS_ERROR_NOT_CONNECTED = -7,
OBSWS_ERROR_OUT_OF_MEMORY = -8,
OBSWS_ERROR_TIMEOUT = -9,
OBSWS_ERROR_INVALID_RESPONSE = -10
} obsws_error_t;Connection state enumeration.
typedef enum {
OBSWS_STATE_DISCONNECTED,
OBSWS_STATE_CONNECTING,
OBSWS_STATE_AUTHENTICATING,
OBSWS_STATE_CONNECTED
} obsws_state_t;Logging level enumeration.
typedef enum {
OBSWS_LOG_ERROR,
OBSWS_LOG_WARNING,
OBSWS_LOG_INFO,
OBSWS_LOG_DEBUG
} obsws_log_level_t;Debug level enumeration.
typedef enum {
OBSWS_DEBUG_NONE,
OBSWS_DEBUG_LOW,
OBSWS_DEBUG_MEDIUM,
OBSWS_DEBUG_HIGH
} obsws_debug_level_t;Connection configuration structure.
typedef struct {
/* Connection parameters */
const char *host; // OBS host (default: "localhost")
int port; // WebSocket port (default: 4455)
const char *password; // Authentication password
bool use_ssl; // Enable TLS/SSL
/* Timeout settings (milliseconds) */
int recv_timeout_ms; // Receive timeout (default: 30000)
int send_timeout_ms; // Send timeout (default: 30000)
/* Auto-reconnect settings */
bool auto_reconnect; // Enable auto-reconnect
int reconnect_delay_ms; // Initial delay (default: 2000)
int max_reconnect_delay_ms; // Maximum delay (default: 10000)
int max_reconnect_attempts; // Max attempts (default: 10)
/* Keep-alive */
int ping_interval_ms; // Ping interval (default: 20000)
/* Callbacks */
obsws_log_callback_t log_callback;
obsws_event_callback_t event_callback;
obsws_state_callback_t state_callback;
void *user_data; // User-defined data for callbacks
/* Logging */
const char *log_directory; // Directory for log files
} obsws_config_t;Response data structure.
typedef struct {
bool success; // Operation success flag
char *response_data; // JSON response data
const char *error_message; // Error message if failed
} obsws_response_t;Connection statistics structure.
typedef struct {
uint64_t messages_sent; // Number of messages sent
uint64_t messages_received; // Number of messages received
uint64_t bytes_sent; // Total bytes sent
uint64_t bytes_received; // Total bytes received
uint64_t reconnect_count; // Number of reconnections
uint64_t error_count; // Number of errors
} obsws_stats_t;Convert error code to human-readable string.
Signature:
const char *obsws_error_string(obsws_error_t error);Parameters:
error- Error code
Returns:
- Descriptive error message
Example:
obsws_error_t err = obsws_send_request(conn, "GetVersion", NULL, &response, 0);
if (err != OBSWS_OK) {
fprintf(stderr, "Error: %s\n", obsws_error_string(err));
}Logging callback function type.
Signature:
typedef void (*obsws_log_callback_t)(obsws_log_level_t level, const char *message, void *user_data);Parameters:
level- Log levelmessage- Log messageuser_data- User-defined data
Example:
void my_log_callback(obsws_log_level_t level, const char *message, void *user_data) {
const char *level_str;
switch (level) {
case OBSWS_LOG_ERROR: level_str = "ERROR"; break;
case OBSWS_LOG_WARNING: level_str = "WARN"; break;
case OBSWS_LOG_INFO: level_str = "INFO"; break;
case OBSWS_LOG_DEBUG: level_str = "DEBUG"; break;
default: level_str = "?"; break;
}
printf("[%s] %s\n", level_str, message);
}
config.log_callback = my_log_callback;
config.user_data = (void *)0;Event notification callback function type.
Signature:
typedef void (*obsws_event_callback_t)(obsws_connection_t *conn, const char *event_type,
const char *event_data, void *user_data);Parameters:
conn- Connection that received eventevent_type- Event type name (e.g., "SceneChanged")event_data- JSON event datauser_data- User-defined data
Example:
void my_event_callback(obsws_connection_t *conn, const char *event_type,
const char *event_data, void *user_data) {
printf("Event: %s\nData: %s\n", event_type, event_data);
}
config.event_callback = my_event_callback;Connection state change callback function type.
Signature:
typedef void (*obsws_state_callback_t)(obsws_connection_t *conn, obsws_state_t old_state,
obsws_state_t new_state, void *user_data);Parameters:
conn- Connection that changed stateold_state- Previous statenew_state- New stateuser_data- User-defined data
Example:
void my_state_callback(obsws_connection_t *conn, obsws_state_t old_state,
obsws_state_t new_state, void *user_data) {
printf("State: %s -> %s\n", obsws_state_string(old_state), obsws_state_string(new_state));
}
config.state_callback = my_state_callback;#define OBSWS_DEFAULT_HOST "localhost"
#define OBSWS_DEFAULT_PORT 4455
#define OBSWS_DEFAULT_PASSWORD ""
#define OBSWS_DEFAULT_RECV_TIMEOUT_MS 30000
#define OBSWS_DEFAULT_SEND_TIMEOUT_MS 30000
#define OBSWS_DEFAULT_AUTO_RECONNECT true
#define OBSWS_DEFAULT_RECONNECT_DELAY 2000
#define OBSWS_DEFAULT_MAX_RECONNECT_DELAY 10000
#define OBSWS_DEFAULT_MAX_RECONNECT_ATTEMPTS 10
#define OBSWS_DEFAULT_PING_INTERVAL 20000#define OBSWS_VERSION "1.0.0"
#define OBSWS_PROTOCOL_VERSION 1 // OBS WebSocket v5 RPC versionobsws_response_t *response = NULL;
obsws_error_t err = obsws_send_request(conn, "GetVersion", NULL, &response, 0);
if (err != OBSWS_OK) {
fprintf(stderr, "Request failed: %s\n", obsws_error_string(err));
// Handle error
} else if (!response) {
fprintf(stderr, "No response\n");
// Handle no response
} else if (!response->success) {
fprintf(stderr, "OBS error: %s\n", response->error_message);
// Handle OBS error
} else {
printf("Success: %s\n", response->response_data);
// Handle success
}
obsws_response_free(response);// Wait for connection with timeout
int timeout = 10000; // 10 seconds
int elapsed = 0;
while (!obsws_is_connected(conn) && elapsed < timeout) {
obsws_process_events(conn, 100);
elapsed += 100;
}
if (!obsws_is_connected(conn)) {
fprintf(stderr, "Connection timeout\n");
}obsws_connection_t *conns[3];
// Connect to multiple OBS instances
for (int i = 0; i < 3; i++) {
obsws_config_t config;
obsws_config_init(&config);
config.host = hosts[i];
config.port = ports[i];
config.password = passwords[i];
conns[i] = obsws_connect(&config);
}
// Process all connections
while (running) {
for (int i = 0; i < 3; i++) {
if (conns[i] && obsws_is_connected(conns[i])) {
obsws_process_events(conns[i], 10);
}
}
}
// Cleanup
for (int i = 0; i < 3; i++) {
if (conns[i]) obsws_disconnect(conns[i]);
}Author: Aidan A. Bradley
License: MIT
Last Updated: November 2, 2024