28 |
#include "../../common/Thread.h" |
#include "../../common/Thread.h" |
29 |
|
|
30 |
#include "AudioOutputDevice.h" |
#include "AudioOutputDevice.h" |
31 |
|
#include "CAAudioDeviceModel.h" |
32 |
|
|
33 |
#include <AudioToolbox/AudioToolbox.h> |
#include <AudioToolbox/AudioToolbox.h> |
34 |
#include <CoreAudio/CoreAudio.h> |
#include <CoreAudio/CoreAudio.h> |
39 |
* |
* |
40 |
* Implements audio output to the Core Audio architecture. |
* Implements audio output to the Core Audio architecture. |
41 |
*/ |
*/ |
42 |
class AudioOutputDeviceCoreAudio : public AudioOutputDevice, protected Thread { |
class AudioOutputDeviceCoreAudio : public AudioOutputDevice, |
43 |
|
public CAAudioDeviceModelListener, protected Thread { |
44 |
|
|
45 |
private: |
private: |
46 |
struct AQPlayerState { |
struct AQPlayerState { |
47 |
AudioStreamBasicDescription mDataFormat; |
AudioStreamBasicDescription mDataFormat; |
53 |
AudioOutputDeviceCoreAudio* pDevice; // needed for the callback |
AudioOutputDeviceCoreAudio* pDevice; // needed for the callback |
54 |
}; |
}; |
55 |
|
|
|
struct DeviceInfo { |
|
|
uint uiSamplerate; |
|
|
uint uiChannelNumber; |
|
|
}; |
|
|
|
|
56 |
public: |
public: |
57 |
AudioOutputDeviceCoreAudio(std::map<String,DeviceCreationParameter*> Parameters); |
AudioOutputDeviceCoreAudio(std::map<String,DeviceCreationParameter*> Parameters); |
58 |
virtual ~AudioOutputDeviceCoreAudio(); |
virtual ~AudioOutputDeviceCoreAudio(); |
59 |
|
|
60 |
|
virtual void DeviceChanged(); // from CAAudioDeviceModelListener |
61 |
|
|
62 |
// derived abstract methods from class 'AudioOutputDevice' |
// derived abstract methods from class 'AudioOutputDevice' |
63 |
virtual void Play(); |
virtual void Play(); |
64 |
virtual bool IsPlaying(); |
virtual bool IsPlaying(); |
75 |
|
|
76 |
// *************** PARAMETERS *************** |
// *************** PARAMETERS *************** |
77 |
|
|
78 |
|
/** Device Parameter 'DEVICE' |
79 |
|
* |
80 |
|
* Used to select the desired output device. |
81 |
|
*/ |
82 |
|
class ParameterDevice : public DeviceCreationParameterString { |
83 |
|
public: |
84 |
|
ParameterDevice(); |
85 |
|
ParameterDevice(String s) throw (Exception); |
86 |
|
virtual String Description(); |
87 |
|
virtual bool Fix(); |
88 |
|
virtual bool Mandatory(); |
89 |
|
virtual std::map<String,DeviceCreationParameter*> DependsAsParameters(); |
90 |
|
virtual optional<String> DefaultAsString(std::map<String,String> Parameters); |
91 |
|
virtual std::vector<String> PossibilitiesAsString(std::map<String,String> Parameters); |
92 |
|
virtual void OnSetValue(String s) throw (Exception); |
93 |
|
int GetDeviceIndex(); |
94 |
|
static String Name(); |
95 |
|
|
96 |
|
private: |
97 |
|
String CreateDeviceName(int devIndex); |
98 |
|
}; |
99 |
|
|
100 |
/** Device Parameter 'SAMPLERATE' |
/** Device Parameter 'SAMPLERATE' |
101 |
* |
* |
102 |
* Used to set the sample rate of the audio output device. |
* Used to set the sample rate of the audio output device. |
105 |
public: |
public: |
106 |
ParameterSampleRate(); |
ParameterSampleRate(); |
107 |
ParameterSampleRate(String s); |
ParameterSampleRate(String s); |
108 |
|
virtual std::map<String,DeviceCreationParameter*> DependsAsParameters(); |
109 |
virtual optional<int> DefaultAsInt(std::map<String,String> Parameters); |
virtual optional<int> DefaultAsInt(std::map<String,String> Parameters); |
110 |
|
virtual std::vector<int> PossibilitiesAsInt(std::map<String,String> Parameters); |
111 |
}; |
}; |
112 |
|
|
113 |
/** Device Parameters 'CHANNELS' |
/** Device Parameters 'CHANNELS' |
120 |
ParameterChannels(); |
ParameterChannels(); |
121 |
ParameterChannels(String s); |
ParameterChannels(String s); |
122 |
virtual optional<int> DefaultAsInt(std::map<String,String> Parameters); |
virtual optional<int> DefaultAsInt(std::map<String,String> Parameters); |
123 |
|
virtual std::vector<int> PossibilitiesAsInt(std::map<String,String> Parameters); |
124 |
}; |
}; |
125 |
|
|
126 |
/** Device Parameter 'BUFFERS' |
/** Device Parameter 'BUFFERS' |
167 |
int Main(); ///< Implementation of virtual method from class Thread |
int Main(); ///< Implementation of virtual method from class Thread |
168 |
|
|
169 |
private: |
private: |
170 |
uint uiCoreAudioChannels; |
CAAudioDeviceModel CurrentDevice; |
171 |
uint uiBufferNumber; // once initialized this value shouldn't be changed |
uint uiCoreAudioChannels; |
172 |
uint uiBufferSize; // once initialized this value shouldn't be changed |
uint uiBufferNumber; // once initialized this value shouldn't be changed |
173 |
AQPlayerState aqPlayerState; |
uint uiBufferSize; // once initialized this value shouldn't be changed |
174 |
atomic_t pausedNew; |
AQPlayerState aqPlayerState; |
175 |
uint pausedOld; |
atomic_t pausedNew; |
176 |
Mutex destroyMutex; |
uint pausedOld; |
177 |
|
atomic_t restartQueue; |
178 |
static DeviceInfo* pDeviceInfo; |
Mutex destroyMutex; |
179 |
|
|
180 |
|
void CreateAndStartAudioQueue(); |
181 |
|
void DestroyAudioQueue(); |
182 |
|
void FillBuffers(); |
183 |
|
void PrimeAudioQueue(); |
184 |
|
|
185 |
|
static void AudioQueueListener(void *inUserData, AudioQueueRef inAQ, AudioQueuePropertyID inID); |
186 |
static void HandleOutputBuffer(void *aqData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer); |
static void HandleOutputBuffer(void *aqData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer); |
187 |
static void SetAudioDataFormat(AudioStreamBasicDescription* pDataFormat); |
static void SetAudioDataFormat(AudioStreamBasicDescription* pDataFormat); |
|
static DeviceInfo* GetDeviceInfo(); |
|
188 |
}; |
}; |
189 |
} // namespace LinuxSampler |
} // namespace LinuxSampler |
190 |
|
|