this repo has no description
1#include "darling-config.h"
2#include "AUComponent.h"
3#include "AudioUnitALSA.h"
4#include "AudioUnitPA.h"
5#include <util/debug.h>
6#include <alsa/asoundlib.h>
7#include <CoreServices/MacErrors.h>
8
9AudioComponent AudioComponentFindNext(AudioComponent inAComponent, AudioComponentDescription *inDesc)
10{
11 TRACE2(inAComponent, inDesc);
12
13 int index = -1;
14
15 if (inDesc->componentType != kAudioUnitType_Output && inDesc->componentType != kAudioUnitType_Mixer)
16 return nullptr;
17
18 if (inAComponent != nullptr)
19 index = GetComponentIndex(inAComponent);
20
21 if (snd_card_next(&index) || index == -1)
22 return nullptr;
23
24 return CreateComponent(kComponentTypeAudioUnit, index);
25}
26
27OSStatus AudioComponentGetDescription(AudioComponent inComponent, AudioComponentDescription *outDesc)
28{
29 if (!outDesc)
30 return paramErr;
31
32 memset(outDesc, 0, sizeof(*outDesc));
33 outDesc->componentType = kAudioUnitType_Output;
34
35 return noErr;
36}
37
38OSStatus AudioComponentGetVersion(AudioComponent inComponent, UInt32 *outVersion)
39{
40 *outVersion = 0;
41 return noErr;
42}
43
44Boolean AudioComponentInstanceCanDo(AudioComponentInstance inInstance, SInt16 inSelectorID)
45{
46 return true;
47}
48
49OSStatus AudioComponentInstanceDispose(AudioComponentInstance inInstance)
50{
51 TRACE1(inInstance);
52
53 delete inInstance;
54 return noErr;
55}
56
57AudioComponent AudioComponentInstanceGetComponent(AudioComponentInstance inInstance)
58{
59 return CreateComponent(kComponentTypeAudioUnit, static_cast<AudioOutputUnitComponent*>(inInstance)->cardIndex());
60}
61
62OSStatus AudioComponentInstanceNew(AudioComponent inComponent, AudioComponentInstance *outInstance)
63{
64 TRACE1(inComponent);
65
66#if defined(ENABLE_PULSEAUDIO)
67 *outInstance = new AudioUnitPA;
68#elif defined(ENABLE_ALSA)
69 *outInstance = AudioUnitALSA::create(GetComponentIndex(inComponent));
70#else
71 *outInstance = nullptr;
72 return unimpErr;
73#endif
74 return *outInstance ? noErr : paramErr;
75}
76
77OSStatus AudioComponentCopyName(AudioComponent inComponent, CFStringRef *outName)
78{
79 int index = GetComponentIndex(inComponent);
80 char* name;
81
82 if (!outName)
83 return paramErr;
84
85 if (snd_card_get_longname(index, &name))
86 return paramErr;
87
88 *outName = CFStringCreateWithCString(nullptr, name, kCFStringEncodingUTF8);
89 free(name);
90
91 return noErr;
92}
93
94UInt32 AudioComponentCount(AudioComponentDescription *inDesc)
95{
96 UInt32 count = 0;
97 int index = -1;
98
99 // Is there a better way?
100 do
101 {
102 snd_card_next(&index);
103 if (index != -1)
104 count++;
105 }
106 while (index != -1);
107
108 return count;
109}
110