00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef AUDIOOUTPUTPULSE
00021 #define AUDIOOUTPUTPULSE
00022
00023 #include <pulse/pulseaudio.h>
00024
00025 #include "audiooutputbase.h"
00026
00027 class AudioOutputPulseAudio : public AudioOutputBase
00028 {
00029 public:
00030 AudioOutputPulseAudio(const AudioSettings &settings);
00031 ~AudioOutputPulseAudio();
00032
00033 int GetVolumeChannel(int channel) const;
00034 void SetVolumeChannel(int channel, int volume);
00035 void Drain(void);
00036
00037 protected:
00038 AudioOutputSettings* GetOutputSettings(bool digital);
00039 bool OpenDevice(void);
00040 void CloseDevice(void);
00041 void WriteAudio(unsigned char *aubuf, int size);
00042 int GetBufferedOnSoundcard(void) const;
00043
00044 private:
00045 char *ChooseHost(void);
00046 bool MapChannels(void);
00047 bool ContextConnect(void);
00048 bool ConnectPlaybackStream(void);
00049 void FlushStream(const char *caller);
00050
00051 static void ContextStateCallback(pa_context *c, void *arg);
00052 static void StreamStateCallback(pa_stream *s, void *arg);
00053 static void OpCompletionCallback(pa_context *c, int ok, void *arg);
00054 static void WriteCallback(pa_stream *s, size_t size, void *arg);
00055 static void BufferFlowCallback(pa_stream *s, void *tag);
00056 static void ServerInfoCallback(pa_context *context,
00057 const pa_server_info *inf, void *arg);
00058 static void SinkInfoCallback(pa_context *c, const pa_sink_info *info,
00059 int eol, void *arg);
00060
00061 pa_context *pcontext;
00062 pa_stream *pstream;
00063 pa_threaded_mainloop *mainloop;
00064 pa_sample_spec sample_spec;
00065 pa_channel_map channel_map;
00066 pa_cvolume volume_control;
00067 pa_buffer_attr buffer_settings;
00068 AudioOutputSettings *m_aosettings;
00069 };
00070 #endif
00071
00072