-
Notifications
You must be signed in to change notification settings - Fork 345
/
audiooutputalsa.h
65 lines (54 loc) · 1.93 KB
/
audiooutputalsa.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#ifndef AUDIOOUTPUTALSA
#define AUDIOOUTPUTALSA
#define ALSA_PCM_NEW_HW_PARAMS_API
#define ALSA_PCM_NEW_SW_PARAMS_API
#include <alsa/asoundlib.h>
#include <QMap>
#include "audiooutputbase.h"
using namespace std;
class AudioOutputALSA : public AudioOutputBase
{
public:
AudioOutputALSA(const AudioSettings &settings);
virtual ~AudioOutputALSA();
// Volume control
virtual int GetVolumeChannel(int channel) const; // Returns 0-100
virtual void SetVolumeChannel(int channel, int volume); // range 0-100 for vol
static QMap<QString, QString> *GetALSADevices(const char *type);
protected:
// You need to implement the following functions
virtual bool OpenDevice(void);
virtual void CloseDevice(void);
virtual void WriteAudio(uchar *aubuf, int size);
virtual int GetBufferedOnSoundcard(void) const;
AudioOutputSettings* GetOutputSettings(void);
private:
int TryOpenDevice(int open_mode, int try_ac3);
int GetPCMInfo(int &card, int &device, int &subdevice);
bool SetPreallocBufferSize(int size);
bool IncPreallocBufferSize(int buffer_time);
inline int SetParameters(snd_pcm_t *handle, snd_pcm_format_t format,
uint channels, uint rate, uint buffer_time,
uint period_time);
// Volume related
bool OpenMixer(void);
private:
snd_pcm_t *pcm_handle;
int pbufsize;
int m_card, m_device, m_subdevice;
QMutex killAudioLock;
snd_pcm_sframes_t (*pcm_write_func)(snd_pcm_t*, const void*,
snd_pcm_uframes_t);
bool m_autopassthrough;
QString m_lastdevice;
struct {
QString device;
QString control;
snd_mixer_t* handle;
snd_mixer_elem_t* elem;
long volmin;
long volmax;
long volrange;
} m_mixer;
};
#endif