00001 #ifndef AUDIOOUTPUTALSA
00002 #define AUDIOOUTPUTALSA
00003
00004 #define ALSA_PCM_NEW_HW_PARAMS_API
00005 #define ALSA_PCM_NEW_SW_PARAMS_API
00006 #include <alsa/asoundlib.h>
00007
00008 #include <QMap>
00009
00010 #include "audiooutputbase.h"
00011
00012 using namespace std;
00013
00014 class AudioOutputALSA : public AudioOutputBase
00015 {
00016 public:
00017 AudioOutputALSA(const AudioSettings &settings);
00018 virtual ~AudioOutputALSA();
00019
00020
00021 virtual int GetVolumeChannel(int channel) const;
00022 virtual void SetVolumeChannel(int channel, int volume);
00023 static QMap<QString, QString> *GetDevices(const char *type);
00024
00025 protected:
00026
00027 virtual bool OpenDevice(void);
00028 virtual void CloseDevice(void);
00029 virtual void WriteAudio(uchar *aubuf, int size);
00030 virtual int GetBufferedOnSoundcard(void) const;
00031 AudioOutputSettings* GetOutputSettings(bool passthrough);
00032
00033 private:
00034 int TryOpenDevice(int open_mode, int try_ac3);
00035 int GetPCMInfo(int &card, int &device, int &subdevice);
00036 bool SetPreallocBufferSize(int size);
00037 bool IncPreallocBufferSize(int requested, int buffer_time);
00038 inline int SetParameters(snd_pcm_t *handle, snd_pcm_format_t format,
00039 uint channels, uint rate, uint buffer_time,
00040 uint period_time);
00041 QByteArray *GetELD(int card, int device, int subdevice);
00042
00043 bool OpenMixer(void);
00044
00045 private:
00046 snd_pcm_t *pcm_handle;
00047 int pbufsize;
00048 int m_card, m_device, m_subdevice;
00049 QMutex killAudioLock;
00050 QString m_lastdevice;
00051
00052 struct {
00053 QString device;
00054 QString control;
00055 snd_mixer_t* handle;
00056 snd_mixer_elem_t* elem;
00057 long volmin;
00058 long volmax;
00059 long volrange;
00060 } m_mixer;
00061
00062 };
00063 #endif