+tdm_error virtual_output_set_connect(tdm_output *output)
+{
+ tdm_virtual_output_data *output_data = output;
+
+ RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+
+ if (output_data->status == TDM_OUTPUT_CONN_STATUS_CONNECTED ||
+ output_data->status == TDM_OUTPUT_CONN_STATUS_MODE_SETTED)
+ return TDM_ERROR_NONE;
+
+ output_data->status = TDM_OUTPUT_CONN_STATUS_CONNECTED;
+
+ if (output_data->status_func)
+ output_data->status_func(output_data, output_data->status,
+ output_data->status_user_data);
+
+ return TDM_ERROR_NONE;
+}
+
+tdm_error virtual_output_set_disconnect(tdm_output *output)
+{
+ tdm_virtual_output_data *output_data = output;
+
+ RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+
+ if (output_data->status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
+ return TDM_ERROR_NONE;
+
+ output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+
+ if (output_data->status_func)
+ output_data->status_func(output_data, output_data->status,
+ output_data->status_user_data);
+
+ return TDM_ERROR_NONE;
+}
+
+tdm_error
+virtual_output_set_status_handler(tdm_output *output,
+ tdm_output_status_handler func, void *user_data)
+{
+ tdm_virtual_output_data *output_data = output;
+
+ RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+ RETURN_VAL_IF_FAIL(func, TDM_ERROR_INVALID_PARAMETER);
+
+ output_data->status_func = func;
+ output_data->status_user_data = user_data;
+
+ return TDM_ERROR_NONE;
+}
+