// This file is part of Background Music. // // Background Music is free software: you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation, either version 2 of the // License, or (at your option) any later version. // // Background Music is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Background Music. If not, see . // // VC_Control.cpp // VCDriver // // Copyright © 2017 Kyle Neideck // Copyright (C) 2013 Apple Inc. All Rights Reserved. // // Self Include #include "VC_Control.h" // PublicUtility Includes #include "CADebugMacros.h" #include "CAException.h" // System Includes #include #pragma clang assume_nonnull begin VC_Control::VC_Control(AudioObjectID inObjectID, AudioClassID inClassID, AudioClassID inBaseClassID, AudioObjectID inOwnerObjectID, AudioObjectPropertyScope inScope, AudioObjectPropertyElement inElement) : VC_Object(inObjectID, inClassID, inBaseClassID, inOwnerObjectID), mScope(inScope), mElement(inElement) { } bool VC_Control::HasProperty(AudioObjectID inObjectID, pid_t inClientPID, const AudioObjectPropertyAddress& inAddress) const { CheckObjectID(inObjectID); bool theAnswer = false; switch(inAddress.mSelector) { case kAudioControlPropertyScope: case kAudioControlPropertyElement: theAnswer = true; break; default: theAnswer = VC_Object::HasProperty(inObjectID, inClientPID, inAddress); break; }; return theAnswer; } bool VC_Control::IsPropertySettable(AudioObjectID inObjectID, pid_t inClientPID, const AudioObjectPropertyAddress& inAddress) const { CheckObjectID(inObjectID); bool theAnswer = false; switch(inAddress.mSelector) { case kAudioControlPropertyScope: case kAudioControlPropertyElement: theAnswer = false; break; default: theAnswer = VC_Object::IsPropertySettable(inObjectID, inClientPID, inAddress); break; }; return theAnswer; } UInt32 VC_Control::GetPropertyDataSize(AudioObjectID inObjectID, pid_t inClientPID, const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize, const void* inQualifierData) const { CheckObjectID(inObjectID); UInt32 theAnswer = 0; switch(inAddress.mSelector) { case kAudioControlPropertyScope: theAnswer = sizeof(AudioObjectPropertyScope); break; case kAudioControlPropertyElement: theAnswer = sizeof(AudioObjectPropertyElement); break; default: theAnswer = VC_Object::GetPropertyDataSize(inObjectID, inClientPID, inAddress, inQualifierDataSize, inQualifierData); break; }; return theAnswer; } void VC_Control::GetPropertyData(AudioObjectID inObjectID, pid_t inClientPID, const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32 inDataSize, UInt32& outDataSize, void* outData) const { CheckObjectID(inObjectID); switch(inAddress.mSelector) { case kAudioControlPropertyScope: // This property returns the scope that the control is attached to. ThrowIf(inDataSize < sizeof(AudioObjectPropertyScope), CAException(kAudioHardwareBadPropertySizeError), "VC_Control::GetPropertyData: not enough space for the return value of " "kAudioControlPropertyScope for the control"); *reinterpret_cast(outData) = mScope; outDataSize = sizeof(AudioObjectPropertyScope); break; case kAudioControlPropertyElement: // This property returns the element that the control is attached to. ThrowIf(inDataSize < sizeof(AudioObjectPropertyElement), CAException(kAudioHardwareBadPropertySizeError), "VC_Control::GetPropertyData: not enough space for the return value of " "kAudioControlPropertyElement for the control"); *reinterpret_cast(outData) = mElement; outDataSize = sizeof(AudioObjectPropertyElement); break; default: VC_Object::GetPropertyData(inObjectID, inClientPID, inAddress, inQualifierDataSize, inQualifierData, inDataSize, outDataSize, outData); break; }; } void VC_Control::CheckObjectID(AudioObjectID inObjectID) const { ThrowIf(inObjectID == kAudioObjectUnknown || inObjectID != GetObjectID(), CAException(kAudioHardwareBadObjectError), "VC_Control::CheckObjectID: wrong audio object ID for the control"); } #pragma clang assume_nonnull end