this repo has no description
1#ifndef AUCOMPONENTINTERNAL_H
2#define AUCOMPONENTINTERNAL_H
3#include "AudioUnit.h"
4#include <CoreServices/ComponentsInternal.h>
5#include <asoundlib.h>
6#include <dispatch/dispatch.h>
7#include <vector>
8#include "AudioOutputUnitComponent.h"
9
10#ifndef kOutputBus
11# define kOutputBus 0 // playback
12# define kInputBus 1 // recording
13#endif
14
15class AudioUnitALSA : public AudioOutputUnitComponent
16{
17private:
18 AudioUnitALSA(int cardIndex, char* cardName);
19public:
20 static AudioUnitComponent* create(int cardIndex);
21 virtual ~AudioUnitALSA();
22
23 int cardIndex() const override { return m_cardIndex; }
24
25 OSStatus init() override;
26 OSStatus deinit() override;
27
28 OSStatus start() override;
29 OSStatus stop() override;
30
31 OSStatus reset(AudioUnitScope inScope, AudioUnitElement inElement) override;
32
33 OSStatus render(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) override;
34private:
35 void initOutput();
36 void initInput();
37
38 void startOutput();
39 void startInput();
40 void startDescriptors(const struct pollfd* fds, int count);
41
42 void processAudioEvent(struct pollfd origPoll, int event);
43 void requestDataForPlayback();
44 void pushDataFromInput();
45
46 OSStatus renderOutput(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, AudioBufferList *ioData);
47 OSStatus renderInterleavedOutput(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, AudioBufferList *ioData);
48 OSStatus renderPlanarOutput(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, AudioBufferList *ioData);
49
50 OSStatus renderInput(AudioUnitRenderActionFlags *ioActionFlags,const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, AudioBufferList *ioData);
51 OSStatus renderInterleavedInput(AudioUnitRenderActionFlags *ioActionFlags,const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, AudioBufferList *ioData);
52 OSStatus renderPlanarInput(AudioUnitRenderActionFlags *ioActionFlags,const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, AudioBufferList *ioData);
53
54 inline bool isOutputPlanar() const { return m_config[kOutputBus].second.mFormatFlags & kAudioFormatFlagIsNonInterleaved; }
55 inline bool isInputPlanar() const { return m_config[kInputBus].first.mFormatFlags & kAudioFormatFlagIsNonInterleaved; }
56private:
57 int m_cardIndex;
58 char* m_cardName;
59 snd_pcm_t *m_pcmOutput, *m_pcmInput;
60 std::vector<dispatch_source_t> m_sources;
61};
62
63#endif
64