00001 #ifndef AUDIOOUTPUTALSA
00002 #define AUDIOOUTPUTALSA
00003
00004 #include <vector>
00005 #include <qstring.h>
00006 #include <qmutex.h>
00007
00008 #define ALSA_PCM_NEW_HW_PARAMS_API
00009 #define ALSA_PCM_NEW_SW_PARAMS_API
00010 #include <alsa/asoundlib.h>
00011
00012 #include "audiooutputbase.h"
00013
00014 using namespace std;
00015
00016 class AudioOutputALSA : public AudioOutputBase
00017 {
00018 public:
00019 AudioOutputALSA(QString laudio_main_device, QString laudio_passthru_device,
00020 int laudio_bits,
00021 int laudio_channels, int laudio_samplerate,
00022 AudioOutputSource source,
00023 bool set_initial_vol, bool laudio_passthru);
00024 virtual ~AudioOutputALSA();
00025
00026
00027 virtual int GetVolumeChannel(int channel);
00028 virtual void SetVolumeChannel(int channel, int volume);
00029
00030
00031 protected:
00032
00033 virtual bool OpenDevice(void);
00034 virtual void CloseDevice(void);
00035 virtual void WriteAudio(unsigned char *aubuf, int size);
00036 virtual inline int getSpaceOnSoundcard(void);
00037 virtual inline int getBufferedOnSoundcard(void);
00038
00039 private:
00040 inline int SetParameters(snd_pcm_t *handle,
00041 snd_pcm_format_t format, unsigned int channels,
00042 unsigned int rate, unsigned int buffer_time,
00043 unsigned int period_time);
00044
00045
00046
00047 void SetCurrentVolume(QString control, int channel, int volume);
00048 void OpenMixer(bool setstartingvolume);
00049 void CloseMixer(void);
00050 void SetupMixer(void);
00051 void GetVolumeRange(snd_mixer_elem_t *elem);
00052
00053 private:
00054 snd_pcm_t *pcm_handle;
00055 int numbadioctls;
00056 QMutex killAudioLock;
00057 snd_mixer_t *mixer_handle;
00058 QString mixer_control;
00059 float volume_range_multiplier;
00060 long playback_vol_min;
00061 long playback_vol_max;
00062 snd_pcm_sframes_t (*pcm_write_func)(
00063 snd_pcm_t*, const void*, snd_pcm_uframes_t);
00064 };
00065
00066 #endif
00067