mirror of
https://github.com/FreeRDP/FreeRDP.git
synced 2025-06-03 00:00:20 +00:00
Added permission checks for mac audio backend.
This commit is contained in:
parent
e18597f5eb
commit
0e0eb5f41f
@ -18,17 +18,18 @@
|
|||||||
|
|
||||||
define_channel_client_subsystem("audin" "mac" "")
|
define_channel_client_subsystem("audin" "mac" "")
|
||||||
FIND_LIBRARY(CORE_AUDIO CoreAudio)
|
FIND_LIBRARY(CORE_AUDIO CoreAudio)
|
||||||
|
FIND_LIBRARY(AVFOUNDATION AVFoundation)
|
||||||
FIND_LIBRARY(AUDIO_TOOL AudioToolbox)
|
FIND_LIBRARY(AUDIO_TOOL AudioToolbox)
|
||||||
FIND_LIBRARY(APP_SERVICES ApplicationServices)
|
FIND_LIBRARY(APP_SERVICES ApplicationServices)
|
||||||
|
|
||||||
set(${MODULE_PREFIX}_SRCS
|
set(${MODULE_PREFIX}_SRCS
|
||||||
audin_mac.c)
|
audin_mac.m)
|
||||||
|
|
||||||
include_directories(..)
|
include_directories(..)
|
||||||
include_directories(${MAC_INCLUDE_DIRS})
|
include_directories(${MAC_INCLUDE_DIRS})
|
||||||
|
|
||||||
add_channel_client_subsystem_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} "" TRUE "")
|
add_channel_client_subsystem_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} "" TRUE "")
|
||||||
|
|
||||||
set(${MODULE_PREFIX}_LIBS freerdp ${CORE_AUDIO} ${AUDIO_TOOL} ${APP_SERVICES} winpr)
|
set(${MODULE_PREFIX}_LIBS freerdp ${AVFOUNDATION} ${CORE_AUDIO} ${AUDIO_TOOL} ${APP_SERVICES} winpr)
|
||||||
|
|
||||||
target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})
|
target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
#include <winpr/debug.h>
|
#include <winpr/debug.h>
|
||||||
#include <winpr/cmdline.h>
|
#include <winpr/cmdline.h>
|
||||||
|
|
||||||
|
#import <AVFoundation/AVFoundation.h>
|
||||||
|
|
||||||
#define __COREFOUNDATION_CFPLUGINCOM__ 1
|
#define __COREFOUNDATION_CFPLUGINCOM__ 1
|
||||||
#define IUNKNOWN_C_GUTS \
|
#define IUNKNOWN_C_GUTS \
|
||||||
void *_reserved; \
|
void *_reserved; \
|
||||||
@ -76,6 +78,7 @@ typedef struct _AudinMacDevice
|
|||||||
|
|
||||||
rdpContext *rdpcontext;
|
rdpContext *rdpcontext;
|
||||||
|
|
||||||
|
bool isAuthorized;
|
||||||
bool isOpen;
|
bool isOpen;
|
||||||
AudioQueueRef audioQueue;
|
AudioQueueRef audioQueue;
|
||||||
AudioStreamBasicDescription audioFormat;
|
AudioStreamBasicDescription audioFormat;
|
||||||
@ -108,8 +111,12 @@ static AudioFormatFlags audin_mac_get_flags_for_format(const AUDIO_FORMAT* forma
|
|||||||
|
|
||||||
static BOOL audin_mac_format_supported(IAudinDevice *device, const AUDIO_FORMAT *format)
|
static BOOL audin_mac_format_supported(IAudinDevice *device, const AUDIO_FORMAT *format)
|
||||||
{
|
{
|
||||||
|
AudinMacDevice *mac = (AudinMacDevice *)device;
|
||||||
AudioFormatID req_fmt = 0;
|
AudioFormatID req_fmt = 0;
|
||||||
|
|
||||||
|
if (!mac->isAuthorized)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (device == NULL || format == NULL)
|
if (device == NULL || format == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
@ -131,6 +138,9 @@ static UINT audin_mac_set_format(IAudinDevice* device, const AUDIO_FORMAT* forma
|
|||||||
{
|
{
|
||||||
AudinMacDevice *mac = (AudinMacDevice *)device;
|
AudinMacDevice *mac = (AudinMacDevice *)device;
|
||||||
|
|
||||||
|
if (!mac->isAuthorized)
|
||||||
|
return ERROR_INTERNAL_ERROR;
|
||||||
|
|
||||||
if (device == NULL || format == NULL)
|
if (device == NULL || format == NULL)
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
@ -187,6 +197,9 @@ static UINT audin_mac_close(IAudinDevice* device)
|
|||||||
OSStatus devStat;
|
OSStatus devStat;
|
||||||
AudinMacDevice *mac = (AudinMacDevice *)device;
|
AudinMacDevice *mac = (AudinMacDevice *)device;
|
||||||
|
|
||||||
|
if (!mac->isAuthorized)
|
||||||
|
return ERROR_INTERNAL_ERROR;
|
||||||
|
|
||||||
if (device == NULL)
|
if (device == NULL)
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
@ -230,6 +243,10 @@ static UINT audin_mac_open(IAudinDevice* device, AudinReceive receive, void* use
|
|||||||
char errString[1024];
|
char errString[1024];
|
||||||
OSStatus devStat;
|
OSStatus devStat;
|
||||||
size_t index;
|
size_t index;
|
||||||
|
|
||||||
|
if (!mac->isAuthorized)
|
||||||
|
return ERROR_INTERNAL_ERROR;
|
||||||
|
|
||||||
mac->receive = receive;
|
mac->receive = receive;
|
||||||
mac->user_data = user_data;
|
mac->user_data = user_data;
|
||||||
devStat = AudioQueueNewInput(&(mac->audioFormat), mac_audio_queue_input_cb, mac, NULL,
|
devStat = AudioQueueNewInput(&(mac->audioFormat), mac_audio_queue_input_cb, mac, NULL,
|
||||||
@ -403,6 +420,34 @@ UINT freerdp_audin_client_subsystem_entry(PFREERDP_AUDIN_DEVICE_ENTRY_POINTS pEn
|
|||||||
goto error_out;
|
goto error_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AVAuthorizationStatus status =
|
||||||
|
[AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case AVAuthorizationStatusAuthorized:
|
||||||
|
mac->isAuthorized = TRUE;
|
||||||
|
break;
|
||||||
|
case AVAuthorizationStatusNotDetermined:
|
||||||
|
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo
|
||||||
|
completionHandler:^(BOOL granted) {
|
||||||
|
if (granted == YES)
|
||||||
|
{
|
||||||
|
mac->isAuthorized = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
WLog_WARN(TAG, "Microphone access denied by user");
|
||||||
|
}];
|
||||||
|
break;
|
||||||
|
case AVAuthorizationStatusRestricted:
|
||||||
|
WLog_WARN(TAG, "Microphone access restricted by policy");
|
||||||
|
break;
|
||||||
|
case AVAuthorizationStatusDenied:
|
||||||
|
WLog_WARN(TAG, "Microphone access denied by policy");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return CHANNEL_RC_OK;
|
return CHANNEL_RC_OK;
|
||||||
error_out:
|
error_out:
|
||||||
free(mac);
|
free(mac);
|
@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>NSCameraUsageDescription</key>
|
||||||
|
<string>This application requires camera access to redirect it to the remote host</string>
|
||||||
|
<key>NSMicrophoneUsageDescription</key>
|
||||||
|
<string>This application requires microphone access to redirect it to the remote host</string>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>English</string>
|
<string>English</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>NSCameraUsageDescription</key>
|
||||||
|
<string>This application requires camera access to redirect it to the remote host</string>
|
||||||
|
<key>NSMicrophoneUsageDescription</key>
|
||||||
|
<string>This application requires microphone access to redirect it to the remote host</string>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>en</string>
|
<string>en</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
|
Loading…
Reference in New Issue
Block a user