Skip to content

Commit

Permalink
Add support for ALCUserClient and alc-verb under 10.5
Browse files Browse the repository at this point in the history
  • Loading branch information
Goldfish64 committed Aug 8, 2021
1 parent 7ff9cef commit 1001ce2
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 4 deletions.
6 changes: 3 additions & 3 deletions AppleALC.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@
DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
MACOSX_DEPLOYMENT_TARGET = 10.6;
MACOSX_DEPLOYMENT_TARGET = 10.5;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
Expand All @@ -716,7 +716,7 @@
DEVELOPMENT_TEAM = "";
ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
MACOSX_DEPLOYMENT_TARGET = 10.6;
MACOSX_DEPLOYMENT_TARGET = 10.5;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
Expand All @@ -741,7 +741,7 @@
DEVELOPMENT_TEAM = "";
ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
MACOSX_DEPLOYMENT_TARGET = 10.6;
MACOSX_DEPLOYMENT_TARGET = 10.5;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
Expand Down
32 changes: 31 additions & 1 deletion AppleALC/ALCUserClient/ALCUserClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

OSDefineMetaClassAndStructors(ALCUserClient, IOUserClient);

#if __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_4
const IOExternalMethodDispatch ALCUserClient::sMethods[kNumberOfMethods] = {
{ //kMethodExecuteVerb
reinterpret_cast<IOExternalMethodAction>(&ALCUserClient::methodExecuteVerb), // Method pointer
Expand All @@ -22,7 +23,6 @@ const IOExternalMethodDispatch ALCUserClient::sMethods[kNumberOfMethods] = {
}
};

#if __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_4
IOReturn ALCUserClient::externalMethod(uint32_t selector, IOExternalMethodArguments* arguments, IOExternalMethodDispatch* dispatch, OSObject* target, void* reference) {
if (selector >= kNumberOfMethods)
return kIOReturnUnsupported;
Expand All @@ -34,6 +34,36 @@ IOReturn ALCUserClient::externalMethod(uint32_t selector, IOExternalMethodArgume

return super::externalMethod(selector, arguments, dispatch, target, reference);
}

#else
IOExternalMethodACID ALCUserClient::sMethodsLegacy[kNumberOfMethods] = {
{ //kMethodExecuteVerb
NULL,
#if defined(__i386__)
kIOExternalMethodACIDPadding,
#endif
(IOMethodACID) sendHdaCommandInternal,
#if defined(__x86_64__)
kIOExternalMethodACIDPadding,
#endif
kIOUCScalarIScalarO,
3,
1
}
};

IOExternalMethod* ALCUserClient::getTargetAndMethodForIndex(IOService **targetP, UInt32 index) {
if (index >= kNumberOfMethods)
return NULL;

*targetP = this;
return reinterpret_cast<IOExternalMethod*>(&sMethodsLegacy[index]);
}

IOReturn ALCUserClient::sendHdaCommandInternal(ALCUserClient *that, uint16_t nid, uint16_t verb, uint16_t param, uint64_t *outVal) {
*outVal = that->mProvider->sendHdaCommand(nid, verb, param);
return kIOReturnSuccess;
}
#endif

bool ALCUserClient::initWithTask(task_t owningTask, void* securityToken, UInt32 type, OSDictionary* properties) {
Expand Down
8 changes: 8 additions & 0 deletions AppleALC/ALCUserClient/ALCUserClient.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,13 @@ class EXPORT ALCUserClient : public IOUserClient {

ALCUserClientProvider* mProvider { nullptr };
task_t mTask {nullptr};

#if __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_4
static const IOExternalMethodDispatch sMethods[kNumberOfMethods];
#else
static IOExternalMethodACID sMethodsLegacy[kNumberOfMethods];
static IOReturn sendHdaCommandInternal(ALCUserClient *that, uint16_t nid, uint16_t verb, uint16_t param, uint64_t *outVal);
#endif

public:
virtual bool start(IOService* provider) APPLE_KEXT_OVERRIDE;
Expand All @@ -34,6 +40,8 @@ class EXPORT ALCUserClient : public IOUserClient {
virtual IOReturn externalMethod(uint32_t selector, IOExternalMethodArguments* arguments,
IOExternalMethodDispatch* dispatch, OSObject* target,
void* reference) APPLE_KEXT_OVERRIDE;
#else
virtual IOExternalMethod *getTargetAndMethodForIndex(IOService **targetP, UInt32 index) APPLE_KEXT_OVERRIDE;
#endif

protected:
Expand Down

0 comments on commit 1001ce2

Please sign in to comment.