kwave  18.07.70
Record-PulseAudio.h
Go to the documentation of this file.
1 /*************************************************************************
2  Record-PulseAudio.h - device for audio recording via PulesAudio
3  -------------------
4  begin : Sun Okt 20 2013
5  copyright : (C) 2014 by Joerg-Christian Boehme
6  email : joerg@chaosdorf.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 KWAVE_RECORD_PULSEAUDIO_H
19 #define KWAVE_RECORD_PULSEAUDIO_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/introspect.h>
29 #include <pulse/mainloop.h>
30 #include <pulse/proplist.h>
31 #include <pulse/sample.h>
32 #include <pulse/stream.h>
33 
34 #include <QList>
35 #include <QMutex>
36 #include <QString>
37 #include <QStringList>
38 #include <QWaitCondition>
39 
40 #include "libkwave/Runnable.h"
41 #include "libkwave/SampleFormat.h"
42 #include "libkwave/WorkerThread.h"
43 
44 #include "RecordDevice.h"
45 
46 namespace Kwave
47 {
48 
50  {
51  public:
52 
55 
57  virtual ~RecordPulseAudio() Q_DECL_OVERRIDE;
58 
68  virtual QString open(const QString& dev) Q_DECL_OVERRIDE;
69 
71  virtual Kwave::byte_order_t endianness() Q_DECL_OVERRIDE;
72 
74  virtual Kwave::SampleFormat::Format sampleFormat() Q_DECL_OVERRIDE;
75 
82  virtual int setSampleFormat(Kwave::SampleFormat::Format new_format)
83  Q_DECL_OVERRIDE;
84 
89  virtual QList<Kwave::SampleFormat::Format> detectSampleFormats()
90  Q_DECL_OVERRIDE;
91 
96  virtual int bitsPerSample() Q_DECL_OVERRIDE;
97 
103  virtual int setBitsPerSample(unsigned int new_bits) Q_DECL_OVERRIDE;
104 
110  virtual QList< unsigned int > supportedBits() Q_DECL_OVERRIDE;
111 
113  virtual Kwave::Compression::Type compression() Q_DECL_OVERRIDE;
114 
121  virtual int setCompression(Kwave::Compression::Type new_compression)
122  Q_DECL_OVERRIDE;
123 
128  virtual QList<Kwave::Compression::Type> detectCompressions()
129  Q_DECL_OVERRIDE;
130 
132  virtual double sampleRate() Q_DECL_OVERRIDE;
133 
141  virtual int setSampleRate(double& new_rate) Q_DECL_OVERRIDE;
142 
144  virtual QList< double > detectSampleRates() Q_DECL_OVERRIDE;
145 
147  virtual int tracks() Q_DECL_OVERRIDE;
148 
157  virtual int setTracks(unsigned int& tracks) Q_DECL_OVERRIDE;
158 
166  virtual int detectTracks(unsigned int& min, unsigned int& max)
167  Q_DECL_OVERRIDE;
168 
170  virtual int close() Q_DECL_OVERRIDE;
171 
179  virtual int read(QByteArray& buffer, unsigned int offset)
180  Q_DECL_OVERRIDE;
181 
183  virtual QStringList supportedDevices() Q_DECL_OVERRIDE;
184 
189  int mainloopPoll(struct pollfd *ufds, unsigned long int nfds,
190  int timeout);
191 
192  protected:
193 
195  virtual void run_wrapper(const QVariant &params) Q_DECL_OVERRIDE;
196 
197  private:
198 
204  void detectSupportedFormats(const QString &device);
205 
213  static void pa_context_notify_cb(pa_context *c, void *userdata);
214 
225  static void pa_source_info_cb(pa_context *c, const pa_source_info *info,
226  int eol, void *userdata);
227 
235  static void pa_stream_state_cb(pa_stream *p, void *userdata);
236 
244  static void pa_read_cb(pa_stream *p, size_t nbytes, void *userdata);
245 
254  void notifySourceInfo(pa_context *c, const pa_source_info *info, int eol);
255 
261  void notifyContext(pa_context *c);
262 
268  void notifyStreamState(pa_stream *stream);
269 
276  void notifyRead(pa_stream *stream, size_t nbytes);
277 
281  bool connectToServer();
282 
286  void disconnectFromServer();
287 
289  void scanDevices();
290 
302  pa_sample_format_t mode2format(int compression, int bits,
303  Kwave::SampleFormat::Format sample_format);
304 
312  int initialize(uint32_t buffer_size);
313 
314  private:
315 
317  typedef struct
318  {
319  QString m_name;
320  QString m_description;
321  QString m_driver;
322  quint32 m_card;
323  pa_sample_spec m_sample_spec;
324  } source_info_t;
325 
326  private:
327 
330 
333 
335  QWaitCondition m_mainloop_signal;
336 
339 
341  quint8 m_tracks;
342 
344  double m_rate;
345 
348 
350  unsigned int m_bits_per_sample;
351 
358  QList<pa_sample_format_t> m_supported_formats;
359 
362 
364  pa_proplist *m_pa_proplist;
365 
367  pa_mainloop *m_pa_mainloop;
368 
370  pa_context *m_pa_context;
371 
373  pa_stream *m_pa_stream;
374 
376  QString m_pa_device;
377 
379  QString m_name;
380 
382  QString m_device;
383 
388  QMap<QString, source_info_t> m_device_list;
389  };
390 
391 }
392 
393 #endif /* HAVE_PULSEAUDIO_SUPPORT */
394 
395 #endif // KWAVE_RECORD_PULSEAUDIO_H
byte_order_t
Definition: ByteOrder.h:25
pa_sample_format_t mode2format(int compression, int bits, Kwave::SampleFormat::Format sample_format)
Definition: App.h:33
QList< pa_sample_format_t > m_supported_formats
void notifyRead(pa_stream *stream, size_t nbytes)
virtual int setSampleFormat(Kwave::SampleFormat::Format new_format) Q_DECL_OVERRIDE
virtual void run_wrapper(const QVariant &params) Q_DECL_OVERRIDE
void detectSupportedFormats(const QString &device)
void notifyStreamState(pa_stream *stream)
virtual int bitsPerSample() Q_DECL_OVERRIDE
virtual QStringList supportedDevices() Q_DECL_OVERRIDE
virtual Kwave::Compression::Type compression() Q_DECL_OVERRIDE
virtual QList< double > detectSampleRates() Q_DECL_OVERRIDE
QWaitCondition m_mainloop_signal
virtual int setCompression(Kwave::Compression::Type new_compression) Q_DECL_OVERRIDE
static void pa_source_info_cb(pa_context *c, const pa_source_info *info, int eol, void *userdata)
Kwave::WorkerThread m_mainloop_thread
int initialize(uint32_t buffer_size)
virtual ~RecordPulseAudio() Q_DECL_OVERRIDE
virtual QList< unsigned int > supportedBits() Q_DECL_OVERRIDE
virtual int close() Q_DECL_OVERRIDE
virtual QList< Kwave::SampleFormat::Format > detectSampleFormats() Q_DECL_OVERRIDE
QMap< QString, source_info_t > m_device_list
virtual Kwave::byte_order_t endianness() Q_DECL_OVERRIDE
static void pa_read_cb(pa_stream *p, size_t nbytes, void *userdata)
void notifySourceInfo(pa_context *c, const pa_source_info *info, int eol)
static void pa_context_notify_cb(pa_context *c, void *userdata)
virtual int detectTracks(unsigned int &min, unsigned int &max) Q_DECL_OVERRIDE
virtual int setSampleRate(double &new_rate) Q_DECL_OVERRIDE
virtual int read(QByteArray &buffer, unsigned int offset) Q_DECL_OVERRIDE
virtual QList< Kwave::Compression::Type > detectCompressions() Q_DECL_OVERRIDE
virtual Kwave::SampleFormat::Format sampleFormat() Q_DECL_OVERRIDE
void notifyContext(pa_context *c)
virtual QString open(const QString &dev) Q_DECL_OVERRIDE
int mainloopPoll(struct pollfd *ufds, unsigned long int nfds, int timeout)
static void pa_stream_state_cb(pa_stream *p, void *userdata)
virtual double sampleRate() Q_DECL_OVERRIDE
Kwave::SampleFormat::Format m_sample_format
virtual int setBitsPerSample(unsigned int new_bits) Q_DECL_OVERRIDE
virtual int setTracks(unsigned int &tracks) Q_DECL_OVERRIDE
virtual int tracks() Q_DECL_OVERRIDE
Kwave::Compression::Type m_compression