this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

CoreAudio: Implement sound device and AudioUnit for system sounds

+123 -23
+1
src/CoreAudio/CoreAudio/AudioHardware.cpp
··· 38 38 g_objects.insert(std::make_pair(kAudioObjectSystemObject, std::make_unique<AudioHardwareImplPA>(kAudioObjectSystemObject))); 39 39 g_objects.insert(std::make_pair(kAudioObjectSystemObject + 1, std::make_unique<AudioHardwareImplPAOutput>(kAudioObjectSystemObject + 1))); 40 40 g_objects.insert(std::make_pair(kAudioObjectSystemObject + 2, std::make_unique<AudioHardwareImplPAInput>(kAudioObjectSystemObject + 2))); 41 + g_objects.insert(std::make_pair(kAudioObjectSystemObject + 1, std::make_unique<AudioHardwareImplPAOutput>(kAudioObjectSystemObject + 3, "event"))); 41 42 }); 42 43 } 43 44
+17 -5
src/CoreAudio/CoreAudio/pulse/AudioHardwareImplPA.cpp
··· 27 27 #include <mutex> 28 28 #include <thread> 29 29 30 - pa_context* AudioHardwareImplPA::m_context; 31 - std::unique_ptr<PADispatchMainLoop> AudioHardwareImplPA::m_loop; 32 - 33 - AudioHardwareImplPA::AudioHardwareImplPA(AudioObjectID myId) 34 - : AudioHardwareImpl(myId) 30 + AudioHardwareImplPA::AudioHardwareImplPA(AudioObjectID myId, const char* paRole) 31 + : AudioHardwareImpl(myId), m_paRole(paRole) 35 32 { 36 33 m_name = CFSTR("PulseAudio"); 37 34 m_manufacturer = CFSTR("PulseAudio"); 38 35 m_uid = CFSTR("PulseAudio:SystemObject"); 36 + } 37 + 38 + AudioHardwareImplPA::~AudioHardwareImplPA() 39 + { 40 + if (m_context) 41 + pa_context_unref(m_context); 39 42 } 40 43 41 44 OSStatus AudioHardwareImplPA::getPropertyData(const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, ··· 55 58 if (AudioDeviceID* devId = static_cast<AudioDeviceID*>(outData); devId && *ioDataSize >= sizeof(AudioDeviceID)) 56 59 { 57 60 *devId = kAudioObjectSystemObject + 1; 61 + } 62 + *ioDataSize = sizeof(AudioDeviceID); 63 + return kAudioHardwareNoError; 64 + case kAudioHardwarePropertyDefaultSystemOutputDevice: 65 + if (AudioDeviceID* devId = static_cast<AudioDeviceID*>(outData); devId && *ioDataSize >= sizeof(AudioDeviceID)) 66 + { 67 + *devId = kAudioObjectSystemObject + 3; 58 68 } 59 69 *ioDataSize = sizeof(AudioDeviceID); 60 70 return kAudioHardwareNoError; ··· 180 190 181 191 pa_proplist_sets(proplist, PA_PROP_APPLICATION_NAME, appname); 182 192 pa_proplist_sets(proplist, PA_PROP_APPLICATION_ID, appid); 193 + if (m_paRole) 194 + pa_proplist_sets(proplist, PA_PROP_MEDIA_ROLE, m_paRole); 183 195 // pa_proplist_sets(proplist, PA_PROP_APPLICATION_ICON_NAME, "icon-name"); 184 196 // pa_proplist_sets(proplist, PA_PROP_MEDIA_ROLE, "game"); 185 197
+6 -4
src/CoreAudio/CoreAudio/pulse/AudioHardwareImplPA.h
··· 28 28 class AudioHardwareImplPA : public AudioHardwareImpl 29 29 { 30 30 public: 31 - AudioHardwareImplPA(AudioObjectID myId); 31 + AudioHardwareImplPA(AudioObjectID myId, const char* paRole = nullptr); 32 + ~AudioHardwareImplPA(); 32 33 33 34 OSStatus getPropertyData(const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, 34 35 const void* inQualifierData, UInt32* ioDataSize, void* outData) override; ··· 36 37 OSStatus setPropertyData(const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, 37 38 const void* inQualifierData, UInt32 inDataSize, const void* inData) override; 38 39 39 - static void getPAContext(void (^cb)(pa_context*)); 40 + void getPAContext(void (^cb)(pa_context*)); 40 41 static pa_sample_spec paSampleSpecForASBD(const AudioStreamBasicDescription& asbd, bool* convertSignedUnsigned = nullptr); 41 42 protected: 42 43 AudioHardwareStream* createStream(AudioDeviceIOProc callback, void* clientData) override; 43 44 bool validateFormat(const AudioStreamBasicDescription* asbd) const override; 44 45 private: 45 - static pa_context* m_context; 46 - static std::unique_ptr<PADispatchMainLoop> m_loop; 46 + pa_context* m_context = nullptr; 47 + std::unique_ptr<PADispatchMainLoop> m_loop; 48 + const char* m_paRole; 47 49 }; 48 50 49 51 #endif
+2 -2
src/CoreAudio/CoreAudio/pulse/AudioHardwareImplPAOutput.cpp
··· 20 20 #include "AudioHardwareImplPAOutput.h" 21 21 #include "AudioHardwareStreamPAOutput.h" 22 22 23 - AudioHardwareImplPAOutput::AudioHardwareImplPAOutput(AudioObjectID myId) 24 - : AudioHardwareImplPA(myId) 23 + AudioHardwareImplPAOutput::AudioHardwareImplPAOutput(AudioObjectID myId, const char* paRole) 24 + : AudioHardwareImplPA(myId, paRole) 25 25 { 26 26 m_uid = CFSTR("PulseAudio:Output"); 27 27 }
+1 -1
src/CoreAudio/CoreAudio/pulse/AudioHardwareImplPAOutput.h
··· 24 24 class AudioHardwareImplPAOutput : public AudioHardwareImplPA 25 25 { 26 26 public: 27 - AudioHardwareImplPAOutput(AudioObjectID myId); 27 + AudioHardwareImplPAOutput(AudioObjectID myId, const char* paRole = nullptr); 28 28 29 29 OSStatus getPropertyData(const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, 30 30 const void* inQualifierData, UInt32* ioDataSize, void* outData) override;
+2 -2
src/CoreAudio/CoreAudio/pulse/AudioHardwareStreamPA.cpp
··· 23 23 #include <type_traits> 24 24 #include <limits> 25 25 26 - AudioHardwareStreamPA::AudioHardwareStreamPA(AudioHardwareImpl* hw, AudioDeviceIOProc callback, void* clientData) 26 + AudioHardwareStreamPA::AudioHardwareStreamPA(AudioHardwareImplPA* hw, AudioDeviceIOProc callback, void* clientData) 27 27 : AudioHardwareStream(hw, false), m_callback(callback), m_clientData(clientData) 28 28 { 29 - AudioHardwareImplPA::getPAContext(^(pa_context* context) { 29 + hw->getPAContext(^(pa_context* context) { 30 30 if (!context) 31 31 { 32 32 std::cerr << "Failed to get PulseAudio context\n";
+2 -1
src/CoreAudio/CoreAudio/pulse/AudioHardwareStreamPA.h
··· 23 23 #include <pulse/pulseaudio.h> 24 24 #include <CoreAudio/CoreAudioTypes.h> 25 25 #include <CoreAudio/AudioHardware.h> 26 + #include "AudioHardwareImplPA.h" 26 27 27 28 class AudioHardwareStreamPA : public AudioHardwareStream 28 29 { 29 30 public: 30 - AudioHardwareStreamPA(AudioHardwareImpl* hw, AudioDeviceIOProc callback, void* clientData); 31 + AudioHardwareStreamPA(AudioHardwareImplPA* hw, AudioDeviceIOProc callback, void* clientData); 31 32 ~AudioHardwareStreamPA(); 32 33 33 34 void stop(void(^cbDone)()) override;
+1 -1
src/CoreAudio/CoreAudio/pulse/AudioHardwareStreamPAInput.cpp
··· 22 22 #include <iostream> 23 23 #include <vector> 24 24 25 - AudioHardwareStreamPAInput::AudioHardwareStreamPAInput(AudioHardwareImpl* hw, AudioDeviceIOProc callback, void* clientData) 25 + AudioHardwareStreamPAInput::AudioHardwareStreamPAInput(AudioHardwareImplPA* hw, AudioDeviceIOProc callback, void* clientData) 26 26 : AudioHardwareStreamPA(hw, callback, clientData) 27 27 { 28 28 // m_dump.open("/tmp/dump.raw", std::ios_base::out | std::ios_base::binary);
+1 -1
src/CoreAudio/CoreAudio/pulse/AudioHardwareStreamPAInput.h
··· 25 25 class AudioHardwareStreamPAInput : public AudioHardwareStreamPA 26 26 { 27 27 public: 28 - AudioHardwareStreamPAInput(AudioHardwareImpl* hw, AudioDeviceIOProc callback, void* clientData); 28 + AudioHardwareStreamPAInput(AudioHardwareImplPA* hw, AudioDeviceIOProc callback, void* clientData); 29 29 private: 30 30 void start() override; 31 31 static void paStreamReadCB(pa_stream* s, size_t length, void* self);
+1 -1
src/CoreAudio/CoreAudio/pulse/AudioHardwareStreamPAOutput.cpp
··· 22 22 #include <iostream> 23 23 #include <algorithm> 24 24 25 - AudioHardwareStreamPAOutput::AudioHardwareStreamPAOutput(AudioHardwareImpl* hw, AudioDeviceIOProc callback, void* clientData) 25 + AudioHardwareStreamPAOutput::AudioHardwareStreamPAOutput(AudioHardwareImplPA* hw, AudioDeviceIOProc callback, void* clientData) 26 26 : AudioHardwareStreamPA(hw, callback, clientData) 27 27 { 28 28 }
+1 -1
src/CoreAudio/CoreAudio/pulse/AudioHardwareStreamPAOutput.h
··· 24 24 class AudioHardwareStreamPAOutput : public AudioHardwareStreamPA 25 25 { 26 26 public: 27 - AudioHardwareStreamPAOutput(AudioHardwareImpl* hw, AudioDeviceIOProc callback, void* clientData); 27 + AudioHardwareStreamPAOutput(AudioHardwareImplPA* hw, AudioDeviceIOProc callback, void* clientData); 28 28 private: 29 29 void start() override; 30 30 static void paStreamWriteCB(pa_stream* s, size_t length, void* self);
+2 -2
src/CoreAudio/CoreAudioComponent/AUHAL.cpp
··· 28 28 kInputBus 29 29 }; 30 30 31 - AUHAL::AUHAL(AudioComponentInstance inInstance) 32 - : AUBase(inInstance, 1, 1) 31 + AUHAL::AUHAL(AudioComponentInstance inInstance, bool supportRecording) 32 + : AUBase(inInstance, 1, supportRecording ? 1 : 0) 33 33 { 34 34 UInt32 propSize = sizeof(AudioDeviceID); 35 35 AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &propSize, &m_outputDevice);
+2 -2
src/CoreAudio/CoreAudioComponent/AUHAL.h
··· 29 29 class AUHAL : public AUBase 30 30 { 31 31 public: 32 - AUHAL(AudioComponentInstance inInstance); 32 + AUHAL(AudioComponentInstance inInstance, bool supportRecording = true); 33 33 34 34 bool CanScheduleParameters() const override; 35 35 bool StreamFormatWritable(AudioUnitScope scope, AudioUnitElement element) override; ··· 58 58 OSStatus doPlayback(const AudioTimeStamp* inNow, AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime); 59 59 OSStatus doRecord(const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* inInputTime); 60 60 61 - private: 61 + protected: 62 62 AURenderCallbackStruct m_outputAvailableCb = { 0 }; 63 63 bool m_enableOutput = true, m_enableInput = false; 64 64 bool m_running = false;
+1
src/CoreAudio/CoreAudioComponent/CMakeLists.txt
··· 28 28 PublicUtility/CAHostTimeBase.cpp 29 29 PublicUtility/CAVectorUnit.cpp 30 30 AUHAL.cpp 31 + SystemOutputAU.cpp 31 32 ) 32 33 33 34 add_darling_bundle(CoreAudioComponent "" ${component_sources})
+52
src/CoreAudio/CoreAudioComponent/SystemOutputAU.cpp
··· 1 + /* 2 + This file is part of Darling. 3 + 4 + Copyright (C) 2020 Lubos Dolezel 5 + 6 + Darling is free software: you can redistribute it and/or modify 7 + it under the terms of the GNU General Public License as published by 8 + the Free Software Foundation, either version 3 of the License, or 9 + (at your option) any later version. 10 + 11 + Darling is distributed in the hope that it will be useful, 12 + but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + GNU General Public License for more details. 15 + 16 + You should have received a copy of the GNU General Public License 17 + along with Darling. If not, see <http://www.gnu.org/licenses/>. 18 + */ 19 + #include "SystemOutputAU.h" 20 + 21 + #pragma GCC visibility push(default) 22 + AUDIOCOMPONENT_ENTRY(AUOutputBaseFactory, SystemOutputAU); 23 + #pragma GCC visibility pop 24 + 25 + enum { 26 + kOutputBus = 0, 27 + kInputBus 28 + }; 29 + 30 + SystemOutputAU::SystemOutputAU(AudioComponentInstance inInstance) 31 + : AUHAL(inInstance) 32 + { 33 + UInt32 propSize = sizeof(AudioDeviceID); 34 + AudioHardwareGetProperty(kAudioHardwarePropertyDefaultSystemOutputDevice, &propSize, &m_outputDevice); 35 + } 36 + 37 + OSStatus SystemOutputAU::SetProperty(AudioUnitPropertyID inID, AudioUnitScope inScope, 38 + AudioUnitElement inElement, const void* inData, UInt32 inDataSize) 39 + { 40 + switch (inID) 41 + { 42 + case kAudioOutputUnitProperty_EnableIO: 43 + { 44 + if (inElement == kInputBus) 45 + return kAudioUnitErr_InvalidElement; 46 + break; 47 + } 48 + case kAudioOutputUnitProperty_CurrentDevice: 49 + return kAudioUnitErr_InvalidProperty; 50 + } 51 + return AUHAL::SetProperty(inID, inScope, inElement, inData, inDataSize); 52 + }
+31
src/CoreAudio/CoreAudioComponent/SystemOutputAU.h
··· 1 + /* 2 + This file is part of Darling. 3 + 4 + Copyright (C) 2020 Lubos Dolezel 5 + 6 + Darling is free software: you can redistribute it and/or modify 7 + it under the terms of the GNU General Public License as published by 8 + the Free Software Foundation, either version 3 of the License, or 9 + (at your option) any later version. 10 + 11 + Darling is distributed in the hope that it will be useful, 12 + but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + GNU General Public License for more details. 15 + 16 + You should have received a copy of the GNU General Public License 17 + along with Darling. If not, see <http://www.gnu.org/licenses/>. 18 + */ 19 + 20 + #ifndef _CA_SYSTEM_OUTPUT_AU_H 21 + #define _CA_SYSTEM_OUTPUT_AU_H 22 + #include "AUHAL.h" 23 + 24 + class SystemOutputAU : public AUHAL 25 + { 26 + public: 27 + SystemOutputAU(AudioComponentInstance inInstance); 28 + OSStatus SetProperty(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, const void* inData, UInt32 inDataSize) override; 29 + }; 30 + 31 + #endif