From a638391b5009c4819c245075d9028eb0870cac0e Mon Sep 17 00:00:00 2001 From: Merlyn Morgan-Graham Date: Sat, 16 Aug 2025 02:36:09 -0700 Subject: [PATCH] Introduce enum for SDL_GetCameraPermissionState result --- include/SDL3/SDL_camera.h | 16 +++++++++++++++- src/camera/SDL_camera.c | 18 +++++++++--------- src/camera/SDL_syscamera.h | 4 ++-- src/camera/coremedia/SDL_camera_coremedia.m | 4 ++-- src/dynapi/SDL_dynapi_procs.h | 2 +- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/include/SDL3/SDL_camera.h b/include/SDL3/SDL_camera.h index c0e2ee0fed418..6dc79d378361e 100644 --- a/include/SDL3/SDL_camera.h +++ b/include/SDL3/SDL_camera.h @@ -136,6 +136,20 @@ typedef enum SDL_CameraPosition SDL_CAMERA_POSITION_BACK_FACING } SDL_CameraPosition; +/** + * The current state of a request for camera access. + * + * \since This enum is available since SDL 3.4.0. + * + * \sa SDL_GetCameraPermissionState + */ +typedef enum SDL_CameraPermissionState +{ + SDL_CAMERA_PERMISSION_STATE_DENIED = -1, + SDL_CAMERA_PERMISSION_STATE_PENDING, + SDL_CAMERA_PERMISSION_STATE_APPROVED, +} SDL_CameraPermissionState; + /** * Use this function to get the number of built-in camera drivers. @@ -368,7 +382,7 @@ extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id * \sa SDL_OpenCamera * \sa SDL_CloseCamera */ -extern SDL_DECLSPEC int SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera); +extern SDL_DECLSPEC SDL_CameraPermissionState SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera); /** * Get the instance ID of an opened camera. diff --git a/src/camera/SDL_camera.c b/src/camera/SDL_camera.c index 48c6b500dff4a..855c9be6aaa1a 100644 --- a/src/camera/SDL_camera.c +++ b/src/camera/SDL_camera.c @@ -270,7 +270,7 @@ static void ClosePhysicalCamera(SDL_Camera *device) SDL_aligned_free(device->zombie_pixels); - device->permission = 0; + device->permission = SDL_CAMERA_PERMISSION_STATE_PENDING; device->zombie_pixels = NULL; device->filled_output_surfaces.next = NULL; device->empty_output_surfaces.next = NULL; @@ -581,7 +581,7 @@ void SDL_CameraPermissionOutcome(SDL_Camera *device, bool approved) pending.next = NULL; SDL_PendingCameraEvent *pending_tail = &pending; - const int permission = approved ? 1 : -1; + const SDL_CameraPermissionState permission = approved ? SDL_CAMERA_PERMISSION_STATE_APPROVED : SDL_CAMERA_PERMISSION_STATE_DENIED; ObtainPhysicalCameraObj(device); if (device->permission != permission) { @@ -665,7 +665,7 @@ bool SDL_GetCameraFormat(SDL_Camera *camera, SDL_CameraSpec *spec) SDL_Camera *device = camera; // currently there's no separation between physical and logical device. ObtainPhysicalCameraObj(device); - if (device->permission > 0) { + if (device->permission > SDL_CAMERA_PERMISSION_STATE_PENDING) { SDL_copyp(spec, &device->spec); result = true; } else { @@ -808,9 +808,9 @@ bool SDL_CameraThreadIterate(SDL_Camera *device) } const int permission = device->permission; - if (permission <= 0) { + if (permission <= SDL_CAMERA_PERMISSION_STATE_PENDING) { SDL_UnlockMutex(device->lock); - return (permission < 0) ? false : true; // if permission was denied, shut it down. if undecided, we're done for now. + return (permission < SDL_CAMERA_PERMISSION_STATE_PENDING) ? false : true; // if permission was denied, shut it down. if undecided, we're done for now. } bool failed = false; // set to true if disaster worthy of treating the device as lost has happened. @@ -1264,7 +1264,7 @@ SDL_Surface *SDL_AcquireCameraFrame(SDL_Camera *camera, Uint64 *timestampNS) ObtainPhysicalCameraObj(device); - if (device->permission <= 0) { + if (device->permission <= SDL_CAMERA_PERMISSION_STATE_PENDING) { ReleaseCamera(device); SDL_SetError("Camera permission has not been granted"); return NULL; @@ -1371,12 +1371,12 @@ SDL_PropertiesID SDL_GetCameraProperties(SDL_Camera *camera) return result; } -int SDL_GetCameraPermissionState(SDL_Camera *camera) +SDL_CameraPermissionState SDL_GetCameraPermissionState(SDL_Camera *camera) { - int result; + SDL_CameraPermissionState result; if (!camera) { SDL_InvalidParamError("camera"); - result = -1; + result = SDL_CAMERA_PERMISSION_STATE_DENIED; } else { SDL_Camera *device = camera; // currently there's no separation between physical and logical device. ObtainPhysicalCameraObj(device); diff --git a/src/camera/SDL_syscamera.h b/src/camera/SDL_syscamera.h index 30a02f391ac7b..094ad0faa99d1 100644 --- a/src/camera/SDL_syscamera.h +++ b/src/camera/SDL_syscamera.h @@ -160,8 +160,8 @@ struct SDL_Camera // Optional properties. SDL_PropertiesID props; - // -1: user denied permission, 0: waiting for user response, 1: user approved permission. - int permission; + // Current state of user permission check. + SDL_CameraPermissionState permission; // Data private to this driver, used when device is opened and running. struct SDL_PrivateCameraData *hidden; diff --git a/src/camera/coremedia/SDL_camera_coremedia.m b/src/camera/coremedia/SDL_camera_coremedia.m index f58fb92784b85..94b71109704f4 100644 --- a/src/camera/coremedia/SDL_camera_coremedia.m +++ b/src/camera/coremedia/SDL_camera_coremedia.m @@ -85,7 +85,7 @@ @implementation SDLPrivateCameraData static bool CheckCameraPermissions(SDL_Camera *device) { - if (device->permission == 0) { // still expecting a permission result. + if (device->permission == SDL_CAMERA_PERMISSION_STATE_PENDING) { // still expecting a permission result. if (@available(macOS 14, *)) { const AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; if (status != AVAuthorizationStatusNotDetermined) { // NotDetermined == still waiting for an answer from the user. @@ -96,7 +96,7 @@ static bool CheckCameraPermissions(SDL_Camera *device) } } - return (device->permission > 0); + return (device->permission > SDL_CAMERA_PERMISSION_STATE_PENDING); } // this delegate just receives new video frames on a Grand Central Dispatch queue, and fires off the diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index d1e362cdff8ba..1230d583f099f 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -288,7 +288,7 @@ SDL_DYNAPI_PROC(const char*,SDL_GetCameraDriver,(int a),(a),return) SDL_DYNAPI_PROC(bool,SDL_GetCameraFormat,(SDL_Camera *a, SDL_CameraSpec *b),(a,b),return) SDL_DYNAPI_PROC(SDL_CameraID,SDL_GetCameraID,(SDL_Camera *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetCameraName,(SDL_CameraID a),(a),return) -SDL_DYNAPI_PROC(int,SDL_GetCameraPermissionState,(SDL_Camera *a),(a),return) +SDL_DYNAPI_PROC(SDL_CameraPermissionState,SDL_GetCameraPermissionState,(SDL_Camera *a),(a),return) SDL_DYNAPI_PROC(SDL_CameraPosition,SDL_GetCameraPosition,(SDL_CameraID a),(a),return) SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetCameraProperties,(SDL_Camera *a),(a),return) SDL_DYNAPI_PROC(SDL_CameraSpec**,SDL_GetCameraSupportedFormats,(SDL_CameraID a, int *b),(a,b),return)