this repo has no description
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