this repo has no description
at fixPythonPipStalling 82 lines 3.1 kB view raw
1/* 2This file is part of Darling. 3 4Copyright (C) 2020 Lubos Dolezel 5 6Darling is free software: you can redistribute it and/or modify 7it under the terms of the GNU General Public License as published by 8the Free Software Foundation, either version 3 of the License, or 9(at your option) any later version. 10 11Darling is distributed in the hope that it will be useful, 12but WITHOUT ANY WARRANTY; without even the implied warranty of 13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14GNU General Public License for more details. 15 16You should have received a copy of the GNU General Public License 17along with Darling. If not, see <http://www.gnu.org/licenses/>. 18*/ 19 20#ifndef CAC_AUHAL_H 21#define CAC_AUHAL_H 22#include "AUBase.h" 23#include <CoreAudio/AudioHardware.h> 24#include <condition_variable> 25#include <mutex> 26#include <memory> 27#include <stdint.h> 28 29class AUHAL : public AUBase 30{ 31public: 32 AUHAL(AudioComponentInstance inInstance, bool supportRecording = true); 33 ~AUHAL(); 34 35 bool CanScheduleParameters() const override; 36 bool StreamFormatWritable(AudioUnitScope scope, AudioUnitElement element) override; 37 OSStatus Version() override; 38 39 OSStatus Start() override; 40 OSStatus Stop() override; 41 42 OSStatus SetProperty(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, const void* inData, UInt32 inDataSize) override; 43 OSStatus GetPropertyInfo(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, UInt32& outDataSize, Boolean& outWritable) override; 44 OSStatus GetProperty(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, void* outData) override; 45 46 OSStatus Render(AudioUnitRenderActionFlags& ioActionFlags, const AudioTimeStamp& inTimeStamp, UInt32 inNumberFrames) override; 47 48 static OSStatus ComponentEntryDispatch(ComponentParameters *params, AUHAL *This); 49private: 50 static OSStatus playbackCallback(AudioObjectID inObjectID, 51 const AudioTimeStamp* inNow, const AudioBufferList* inInputData, 52 const AudioTimeStamp* inInputTime, 53 AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime, 54 void* inClientData); 55 static OSStatus recordCallback(AudioObjectID inObjectID, 56 const AudioTimeStamp* inNow, const AudioBufferList* inInputData, 57 const AudioTimeStamp* inInputTime, 58 AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime, 59 void* inClientData); 60 61 OSStatus doPlayback(const AudioTimeStamp* inNow, AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime); 62 OSStatus doRecord(const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* inInputTime); 63 64protected: 65 AURenderCallbackStruct m_outputAvailableCb = { 0 }; 66 bool m_enableOutput = true, m_enableInput = false; 67 bool m_running = false; 68 69 AudioDeviceID m_outputDevice, m_inputDevice; 70 AudioDeviceIOProcID m_outputProcID = 0, m_inputProcID = 0; 71 72 bool m_dataAvailable = false; 73 std::condition_variable m_dataAvailableCV; 74 std::mutex m_dataAvailableMutex; 75 76 // TODO: Prepare for non-interleaved audio 77 std::unique_ptr<uint8_t[]> m_buffer; 78 size_t m_bufferSize = 0, m_bufferUsed = 0; 79}; 80 81#endif 82