Skip to content

Commit

Permalink
Update mic permissions on MacOS to show restricted message if microph…
Browse files Browse the repository at this point in the history
…one access is restricted by parental controls
  • Loading branch information
streetpea committed Mar 27, 2024
1 parent e47b7a3 commit 0a83aae
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 20 deletions.
9 changes: 8 additions & 1 deletion gui/include/macMicPermission.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
#ifndef MAC_MIC_PERMISSION_H
#define MAC_MIC_PERMISSION_H

typedef void (*MacMicPermissionCb)(bool authorized, void *user);
typedef enum authorization_t
{
AUTHORIZED,
DENIED,
RESTRICTED
} Authorization;

typedef void (*MacMicPermissionCb)(Authorization authorization, void *user);

void macMicPermission(MacMicPermissionCb cb, void *user);

Expand Down
6 changes: 5 additions & 1 deletion gui/include/streamsession.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
#if CHIAKI_GUI_ENABLE_STEAMDECK_NATIVE
#include <sdeck.h>
#endif
// Using Q_OS_MACOS instead of __APPLE__ doesn't work for the necessary enums to be included
#ifdef __APPLE__
#include <macMicPermission.h>
#endif

#include "exception.h"
#include "sessionlog.h"
Expand Down Expand Up @@ -206,7 +210,7 @@ class StreamSession : public QObject
void PushHapticsFrame(uint8_t *buf, size_t buf_size);
void CantDisplayMessage(bool cant_display);
#ifdef Q_OS_MACOS
void SetMicAuthorization(bool authorized);
void SetMicAuthorization(Authorization authorization);
#endif
#if CHIAKI_GUI_ENABLE_SETSU
void HandleSetsuEvent(SetsuEvent *event);
Expand Down
10 changes: 5 additions & 5 deletions gui/src/macMicPermission.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ void macMicPermission(MacMicPermissionCb cb, void *user) {
{
case AVAuthorizationStatusAuthorized:
{
cb(true, user);
cb(AUTHORIZED, user);
break;
}
case AVAuthorizationStatusNotDetermined:
Expand All @@ -17,23 +17,23 @@ void macMicPermission(MacMicPermissionCb cb, void *user) {
// explicitly prompt them for approval.
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
if (granted) {
cb(true, user);
cb(AUTHORIZED, user);
}
else
cb(false, user);
cb(DENIED, user);
}];
break;
}
case AVAuthorizationStatusDenied:
{
// The user has previously denied access.
cb(false, user);
cb(DENIED, user);
break;
}
case AVAuthorizationStatusRestricted:
{
// The user can't grant access due to restrictions.
cb(false, user);
cb(RESTRICTED, user);
break;
}
}
Expand Down
31 changes: 18 additions & 13 deletions gui/src/streamsession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
#include <streamsession.h>
#include <settings.h>
#include <controllermanager.h>
#ifdef Q_OS_MACOS
#include <macMicPermission.h>
#endif

#include <chiaki/base64.h>
#include <chiaki/streamconnection.h>
Expand Down Expand Up @@ -87,7 +84,7 @@ static void AudioSettingsCb(uint32_t channels, uint32_t rate, void *user);
static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user);
static void HapticsFrameCb(uint8_t *buf, size_t buf_size, void *user);
#ifdef Q_OS_MACOS
static void MacMicRequestCb(bool authorized, void *user);
static void MacMicRequestCb(Authorization authorization, void *user);
#endif
static void CantDisplayCb(void *user, bool cant_display);
static void EventCb(ChiakiEvent *event, void *user);
Expand Down Expand Up @@ -1214,13 +1211,21 @@ void StreamSession::PushAudioFrame(int16_t *buf, size_t samples_count)
}

#ifdef Q_OS_MACOS
void StreamSession::SetMicAuthorization(bool authorized)
void StreamSession::SetMicAuthorization(Authorization authorization)
{
mic_authorization = authorized;
if(mic_authorization)
ToggleMute();
else
CHIAKI_LOGE(GetChiakiLog(), "You have denied mic access. Please manually enable mic access in your System Preferences.");
switch(authorization)
{
case AUTHORIZED:
mic_authorization = true;
ToggleMute();
break;
case DENIED:
CHIAKI_LOGE(GetChiakiLog(), "You have denied mic access. Please manually enable mic access in your System Preferences.");
break;
case RESTRICTED:
CHIAKI_LOGE(GetChiakiLog(), "Access to the microphone is restricted. Please change your parental controls to allow enabling mic access if desired.");
break;
}
}
#endif

Expand Down Expand Up @@ -1556,7 +1561,7 @@ class StreamSessionPrivate
static void PushAudioFrame(StreamSession *session, int16_t *buf, size_t samples_count) { session->PushAudioFrame(buf, samples_count); }
static void PushHapticsFrame(StreamSession *session, uint8_t *buf, size_t buf_size) { session->PushHapticsFrame(buf, buf_size); }
#ifdef Q_OS_MACOS
static void SetMicAuthorization(StreamSession *session, bool authorized) { session->SetMicAuthorization(authorized); }
static void SetMicAuthorization(StreamSession *session, Authorization authorization) { session->SetMicAuthorization(authorization); }
#endif
static void CantDisplayMessage(StreamSession *session, bool cant_display) {session->CantDisplayMessage(cant_display); }
static void Event(StreamSession *session, ChiakiEvent *event) { session->Event(event); }
Expand All @@ -1582,10 +1587,10 @@ static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user)
}

#ifdef Q_OS_MACOS
static void MacMicRequestCb(bool authorized, void *user)
static void MacMicRequestCb(Authorization authorization, void *user)
{
auto session = reinterpret_cast<StreamSession *>(user);
StreamSessionPrivate::SetMicAuthorization(session, authorized);
StreamSessionPrivate::SetMicAuthorization(session, authorization);
}
#endif

Expand Down

0 comments on commit 0a83aae

Please sign in to comment.