Something went wrong. Try again.
Cider Isn't Darwin Emulation, Really
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232/*This file is part of Darling.
Copyright (C) 2015-2016 Lubos Dolezel
Darling is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.
Darling is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.
You should have received a copy of the GNU General Public Licensealong with Darling. If not, see <http://www.gnu.org/licenses/>.*/
#include "AudioHardware.h"#include "AudioHardwareImpl.h"#include <CoreServices/MacErrors.h>#include <memory>
static std::unique_ptr<AudioHardwareImpl> g_systemObject;
static AudioHardwareImpl* GetSystemObject(){ if (!g_systemObject) { static std::mutex singleLock; singleLock.lock(); if (!g_systemObject) g_systemObject.reset(nullptr); // TODO: create ALSA or PA here singleLock.unlock(); } return g_systemObject.get();}
static AudioHardwareImpl* GetObject(AudioObjectID objID){ if (objID == kAudioObjectSystemObject) return GetSystemObject(); return nullptr;}
void AudioObjectShow(AudioObjectID inObjectID){ AudioHardwareImpl* obj = GetObject(inObjectID); if (obj) obj->show();}
Boolean AudioObjectHasProperty(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress){ AudioHardwareImpl* obj = GetObject(inObjectID); if (!obj) return kAudioHardwareBadObjectError; return obj->hasProperty(inAddress);}
OSStatus AudioObjectIsPropertySettable(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, Boolean* outIsSettable){ AudioHardwareImpl* obj = GetObject(inObjectID); if (!obj) return kAudioHardwareBadObjectError; return obj->isPropertySettable(inAddress, outIsSettable);}
OSStatus AudioObjectGetPropertyDataSize(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32* outDataSize){ AudioHardwareImpl* obj = GetObject(inObjectID); if (!obj) return kAudioHardwareBadObjectError; return obj->getPropertyDataSize(inAddress, inQualifierDataSize, inQualifierData, outDataSize);}
OSStatus AudioObjectGetPropertyData(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32* ioDataSize, void* outData){ AudioHardwareImpl* obj = GetObject(inObjectID); if (!obj) return kAudioHardwareBadObjectError; return obj->getPropertyData(inAddress, inQualifierDataSize, inQualifierData, ioDataSize, outData);}
OSStatus AudioObjectSetPropertyData(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32 inDataSize, const void* inData){ AudioHardwareImpl* obj = GetObject(inObjectID); if (!obj) return kAudioHardwareBadObjectError; return obj->setPropertyData(inAddress, inQualifierDataSize, inQualifierData, inDataSize, inData);}
OSStatus AudioObjectAddPropertyListener(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData){ AudioHardwareImpl* obj = GetObject(inObjectID); if (!obj) return kAudioHardwareBadObjectError; return obj->addPropertyListener(inAddress, inListener, inClientData);}
OSStatus AudioObjectRemovePropertyListener(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData){ AudioHardwareImpl* obj = GetObject(inObjectID); if (!obj) return kAudioHardwareBadObjectError; return obj->removePropertyListener(inAddress, inListener, inClientData);}
OSStatus AudioHardwareUnload(void){ g_systemObject.reset(nullptr); return noErr;}
OSStatus AudioHardwareCreateAggregateDevice(CFDictionaryRef, AudioObjectID* outDeviceID){ if (outDeviceID) *outDeviceID = 0; return unimpErr;}
OSStatus AudioHardwareDestroyAggregateDevice(AudioObjectID inDeviceID){ return unimpErr;}
OSStatus AudioDeviceCreateIOProcID(AudioObjectID inDevice, AudioDeviceIOProc inProc, void* inClientData, AudioDeviceIOProcID* outIOProcID){ AudioHardwareImpl* obj = GetObject(inDevice); if (!obj) return kAudioHardwareBadObjectError; return obj->createIOProcID(inProc, inClientData, outIOProcID);}
OSStatus AudioDeviceDestroyIOProcID(AudioObjectID inDevice, AudioDeviceIOProcID inIOProcID){ AudioHardwareImpl* obj = GetObject(inDevice); if (!obj) return kAudioHardwareBadObjectError; return obj->destroyIOProcID(inIOProcID);}
OSStatus AudioDeviceStart(AudioObjectID inDevice, AudioDeviceIOProcID inProcID){ AudioHardwareImpl* obj = GetObject(inDevice); if (!obj) return kAudioHardwareBadObjectError; return obj->start(inProcID, nullptr, 0);}
OSStatus AudioDeviceStartAtTime(AudioObjectID inDevice, AudioDeviceIOProcID inProcID, AudioTimeStamp* ioRequestedStartTime, UInt32 inFlags){ AudioHardwareImpl* obj = GetObject(inDevice); if (!obj) return kAudioHardwareBadObjectError; return obj->start(inProcID, ioRequestedStartTime, inFlags);}
OSStatus AudioDeviceStop(AudioObjectID inDevice, AudioDeviceIOProcID inProcID){ AudioHardwareImpl* obj = GetObject(inDevice); if (!obj) return kAudioHardwareBadObjectError; return obj->stop(inProcID);}
OSStatus AudioDeviceGetCurrentTime(AudioObjectID inDevice, AudioTimeStamp* outTime){ AudioHardwareImpl* obj = GetObject(inDevice); if (!obj) return kAudioHardwareBadObjectError; return obj->getCurrentTime(outTime);}
OSStatus AudioDeviceTranslateTime(AudioObjectID inDevice, const AudioTimeStamp* inTime, AudioTimeStamp* outTime){ AudioHardwareImpl* obj = GetObject(inDevice); if (!obj) return kAudioHardwareBadObjectError; return obj->translateTime(inTime, outTime);}
OSStatus AudioDeviceGetNearestStartTime(AudioObjectID inDevice, AudioTimeStamp* ioRequestedStartTime, UInt32 inFlags){ AudioHardwareImpl* obj = GetObject(inDevice); if (!obj) return kAudioHardwareBadObjectError; return obj->getNearestStartTime(ioRequestedStartTime, inFlags);}