kwave  18.07.70
PlayBack-PulseAudio.h
Go to the documentation of this file.
1 /***************************************************************************
2  PlayBack-PulseAudio.h - playback device for PulseAudio
3  -------------------
4  begin : Tue Sep 29 2009
5  copyright : (C) 2009 by Thomas Eschenbacher
6  email : Thomas.Eschenbacher@gmx.de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #ifndef PLAY_BACK_PULSE_AUDIO_H
19 #define PLAY_BACK_PULSE_AUDIO_H
20 
21 #include "config.h"
22 #ifdef HAVE_PULSEAUDIO_SUPPORT
23 
24 #include <poll.h>
25 
26 #include <pulse/context.h>
27 #include <pulse/error.h>
28 #include <pulse/gccmacro.h>
29 #include <pulse/introspect.h>
30 #include <pulse/mainloop.h>
31 #include <pulse/proplist.h>
32 #include <pulse/stream.h>
33 
34 #include <QList>
35 #include <QMap>
36 #include <QMutex>
37 #include <QString>
38 #include <QWaitCondition>
39 
40 #include "libkwave/FileInfo.h"
42 #include "libkwave/Runnable.h"
43 #include "libkwave/SampleArray.h"
44 #include "libkwave/WorkerThread.h"
45 
46 namespace Kwave
47 {
49  public Kwave::Runnable
50  {
51  public:
52 
57  explicit PlayBackPulseAudio(const Kwave::FileInfo &info);
58 
60  virtual ~PlayBackPulseAudio() Q_DECL_OVERRIDE;
61 
66  virtual QString open(const QString &device, double rate,
67  unsigned int channels, unsigned int bits,
68  unsigned int bufbase) Q_DECL_OVERRIDE;
69 
74  virtual int write(const Kwave::SampleArray &samples) Q_DECL_OVERRIDE;
75 
80  virtual int close() Q_DECL_OVERRIDE;
81 
83  virtual QStringList supportedDevices() Q_DECL_OVERRIDE;
84 
86  virtual QString fileFilter() Q_DECL_OVERRIDE;
87 
95  virtual QList<unsigned int> supportedBits(const QString &device)
96  Q_DECL_OVERRIDE;
97 
108  virtual int detectChannels(const QString &device,
109  unsigned int &min, unsigned int &max)
110  Q_DECL_OVERRIDE;
111 
116  int mainloopPoll(struct pollfd *ufds, unsigned long int nfds,
117  int timeout);
118 
119  protected:
120 
122  int flush();
123 
125  virtual void run_wrapper(const QVariant &params) Q_DECL_OVERRIDE;
126 
127  private:
128 
136  static void pa_context_notify_cb(pa_context *c, void *data);
137 
148  static void pa_sink_info_cb(pa_context *c, const pa_sink_info *info,
149  int eol, void *userdata);
150 
158  static void pa_stream_state_cb(pa_stream *p, void *userdata);
159 
167  static void pa_write_cb(pa_stream *p, size_t nbytes, void *userdata);
168 
176  static void pa_stream_success_cb(pa_stream *s, int success,
177  void *userdata);
178 
184  void notifyContext(pa_context *c);
185 
194  void notifySinkInfo(pa_context *c, const pa_sink_info *info, int eol);
195 
201  void notifyStreamState(pa_stream *stream);
202 
209  void notifyWrite(pa_stream *stream, size_t nbytes);
210 
217  void notifySuccess(pa_stream *stream, int success);
218 
222  bool connectToServer();
223 
227  void disconnectFromServer();
228 
230  void scanDevices();
231 
232  private:
233 
235  typedef struct
236  {
237  QString m_name;
238  QString m_description;
239  QString m_driver;
240  quint32 m_card;
241  pa_sample_spec m_sample_spec;
242  } sink_info_t;
243 
244  private:
247 
250 
252  QWaitCondition m_mainloop_signal;
253 
256 
258  double m_rate;
259 
261  unsigned int m_bytes_per_sample;
262 
264  void *m_buffer;
265 
268 
271 
276  unsigned int m_bufbase;
277 
279  pa_proplist *m_pa_proplist;
280 
282  pa_mainloop *m_pa_mainloop;
283 
285  pa_context *m_pa_context;
286 
288  pa_stream *m_pa_stream;
289 
294  QMap<QString, sink_info_t> m_device_list;
295 
296  };
297 }
298 
299 #endif /* HAVE_PULSEAUDIO_SUPPORT */
300 
301 #endif /* PLAY_BACK_PULSE_AUDIO_H */
302 
303 //***************************************************************************
304 //***************************************************************************
static void pa_context_notify_cb(pa_context *c, void *data)
virtual int close() Q_DECL_OVERRIDE
Definition: App.h:33
virtual QStringList supportedDevices() Q_DECL_OVERRIDE
Kwave::WorkerThread m_mainloop_thread
void notifyStreamState(pa_stream *stream)
virtual ~PlayBackPulseAudio() Q_DECL_OVERRIDE
void notifyContext(pa_context *c)
PlayBackPulseAudio(const Kwave::FileInfo &info)
static void pa_sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata)
virtual QString open(const QString &device, double rate, unsigned int channels, unsigned int bits, unsigned int bufbase) Q_DECL_OVERRIDE
virtual QString fileFilter() Q_DECL_OVERRIDE
static void pa_stream_state_cb(pa_stream *p, void *userdata)
virtual int write(const Kwave::SampleArray &samples) Q_DECL_OVERRIDE
static void pa_write_cb(pa_stream *p, size_t nbytes, void *userdata)
virtual QList< unsigned int > supportedBits(const QString &device) Q_DECL_OVERRIDE
QMap< QString, sink_info_t > m_device_list
void notifySuccess(pa_stream *stream, int success)
virtual void run_wrapper(const QVariant &params) Q_DECL_OVERRIDE
void notifyWrite(pa_stream *stream, size_t nbytes)
static void pa_stream_success_cb(pa_stream *s, int success, void *userdata)
int mainloopPoll(struct pollfd *ufds, unsigned long int nfds, int timeout)
virtual int detectChannels(const QString &device, unsigned int &min, unsigned int &max) Q_DECL_OVERRIDE
void notifySinkInfo(pa_context *c, const pa_sink_info *info, int eol)