--- linuxsampler/trunk/src/drivers/audio/AudioOutputDeviceCoreAudio.h 2009/02/03 19:38:19 1831 +++ linuxsampler/trunk/src/drivers/audio/AudioOutputDeviceCoreAudio.h 2009/02/05 17:48:54 1832 @@ -28,6 +28,7 @@ #include "../../common/Thread.h" #include "AudioOutputDevice.h" +#include "CAAudioDeviceModel.h" #include #include @@ -38,7 +39,9 @@ * * Implements audio output to the Core Audio architecture. */ - class AudioOutputDeviceCoreAudio : public AudioOutputDevice, protected Thread { + class AudioOutputDeviceCoreAudio : public AudioOutputDevice, + public CAAudioDeviceModelListener, protected Thread { + private: struct AQPlayerState { AudioStreamBasicDescription mDataFormat; @@ -50,15 +53,12 @@ AudioOutputDeviceCoreAudio* pDevice; // needed for the callback }; - struct DeviceInfo { - uint uiSamplerate; - uint uiChannelNumber; - }; - public: AudioOutputDeviceCoreAudio(std::map Parameters); virtual ~AudioOutputDeviceCoreAudio(); + virtual void DeviceChanged(); // from CAAudioDeviceModelListener + // derived abstract methods from class 'AudioOutputDevice' virtual void Play(); virtual bool IsPlaying(); @@ -75,6 +75,28 @@ // *************** PARAMETERS *************** + /** Device Parameter 'DEVICE' + * + * Used to select the desired output device. + */ + class ParameterDevice : public DeviceCreationParameterString { + public: + ParameterDevice(); + ParameterDevice(String s) throw (Exception); + virtual String Description(); + virtual bool Fix(); + virtual bool Mandatory(); + virtual std::map DependsAsParameters(); + virtual optional DefaultAsString(std::map Parameters); + virtual std::vector PossibilitiesAsString(std::map Parameters); + virtual void OnSetValue(String s) throw (Exception); + int GetDeviceIndex(); + static String Name(); + + private: + String CreateDeviceName(int devIndex); + }; + /** Device Parameter 'SAMPLERATE' * * Used to set the sample rate of the audio output device. @@ -83,7 +105,9 @@ public: ParameterSampleRate(); ParameterSampleRate(String s); + virtual std::map DependsAsParameters(); virtual optional DefaultAsInt(std::map Parameters); + virtual std::vector PossibilitiesAsInt(std::map Parameters); }; /** Device Parameters 'CHANNELS' @@ -96,6 +120,7 @@ ParameterChannels(); ParameterChannels(String s); virtual optional DefaultAsInt(std::map Parameters); + virtual std::vector PossibilitiesAsInt(std::map Parameters); }; /** Device Parameter 'BUFFERS' @@ -142,19 +167,24 @@ int Main(); ///< Implementation of virtual method from class Thread private: - uint uiCoreAudioChannels; - uint uiBufferNumber; // once initialized this value shouldn't be changed - uint uiBufferSize; // once initialized this value shouldn't be changed - AQPlayerState aqPlayerState; - atomic_t pausedNew; - uint pausedOld; - Mutex destroyMutex; - - static DeviceInfo* pDeviceInfo; + CAAudioDeviceModel CurrentDevice; + uint uiCoreAudioChannels; + uint uiBufferNumber; // once initialized this value shouldn't be changed + uint uiBufferSize; // once initialized this value shouldn't be changed + AQPlayerState aqPlayerState; + atomic_t pausedNew; + uint pausedOld; + atomic_t restartQueue; + Mutex destroyMutex; + + void CreateAndStartAudioQueue(); + void DestroyAudioQueue(); + void FillBuffers(); + void PrimeAudioQueue(); + static void AudioQueueListener(void *inUserData, AudioQueueRef inAQ, AudioQueuePropertyID inID); static void HandleOutputBuffer(void *aqData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer); static void SetAudioDataFormat(AudioStreamBasicDescription* pDataFormat); - static DeviceInfo* GetDeviceInfo(); }; } // namespace LinuxSampler