gtkIOStream  1.7.0
GTK+ << C++ IOStream operators for GTK+. Now with ORBing, numerical computation, audio client and more ...
Hardware.H
Go to the documentation of this file.
1 /* Copyright 2000-2018 Matt Flax <flatmax@flatmax.org>
2  This file is part of GTK+ IOStream class set
3 
4  GTK+ IOStream is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  GTK+ IOStream is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You have received a copy of the GNU General Public License
15  along with GTK+ IOStream
16 */
17 #ifndef HARDWARE_H
18 #define HARDWARE_H
19 
20 #include <ALSA/ALSA.H>
21 
22 namespace ALSA {
23 
26  class Hardware : public PCM {
27  snd_pcm_hw_params_t *hParams;
28  protected:
29 
33  int setHWParams() {
34  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
35  return snd_pcm_hw_params(getPCM(), hParams);
36  }
37 
38  public:
42  int getHWParams() {
43  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
44  return snd_pcm_hw_params_current(getPCM(), hParams);
45  }
46 
51  int fillParams() {
52  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
53  int ret=snd_pcm_hw_params_any(getPCM(), hParams);
54  if (ret<0)
55  ALSADebug().evaluateError(ret);
56  return ret;
57  }
58 
63  int resetParams() {
64  return fillParams();
65  }
66 
68  hParams=NULL;
69  snd_pcm_hw_params_malloc(&hParams);
70  if (!hParams)
71  assert("Couldn't malloc HW params");
72  }
73 
74  virtual ~Hardware() {
75  if (hParams)
76  snd_pcm_hw_params_free(hParams);
77  hParams=NULL;
78  }
79 
83  void copyFrom(snd_pcm_hw_params_t *hParamsIn){
84  snd_pcm_hw_params_copy(hParams, hParamsIn);
85  }
86 
91  int rateResample(unsigned int state) {
92  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
93  return snd_pcm_hw_params_set_rate_resample(getPCM(), hParams, state);
94  }
95 
105  int setAccess(snd_pcm_access_t access) {
106  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
107  int ret=snd_pcm_hw_params_set_access(getPCM(), hParams, access);
108  if (ret<0)
109  return ALSADebug().evaluateError(ret);
110  return ret;
111  }
112 
116  int getAccess(void){
117  snd_pcm_access_t access;
118  int ret=snd_pcm_hw_params_get_access(hParams, &access);
119  if (ret>=0)
120  ret=access;
121  return ret;
122  }
123 
182  int setFormat(snd_pcm_format_t format) {
183  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
184  int ret=snd_pcm_hw_params_set_format(getPCM(), hParams, format);
185  if (ret<0)
186  return ALSADebug().evaluateError(ret);
187  return ret;
188  }
189 
195  int getFormat(snd_pcm_format_t &format){
196  return snd_pcm_hw_params_get_format(hParams, &format);
197  }
198 
203  int ret=0;
204  snd_pcm_format_t format;
205  if ((ret=getFormat(format))<0)
206  return ret;
207  return snd_pcm_format_physical_width(format);
208  }
209 
214  int setChannels(unsigned int cnt) {
215  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
216  return snd_pcm_hw_params_set_channels(getPCM(), hParams, cnt);
217  }
218 
222  int getChannels() {
223  unsigned int cnt;
224  int err=snd_pcm_hw_params_get_channels(hParams, &cnt);
225  if (err<0)
226  return err;
227  else
228  return cnt;
229  }
230 
235  PCM_NOT_OPEN_CHECK_NO_PRINT(getPCM(), int) // check pcm is open
236  unsigned int mCh;
237  int ret=snd_pcm_hw_params_get_channels_max(hParams, &mCh);
238  if (ret<0)
239  return ALSADebug().evaluateError(ret);
240  return mCh;
241  }
242 
248  int setSampleRate(unsigned int rrate, int dir=0) {
249  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
250  int ret=snd_pcm_hw_params_set_rate_near(getPCM(), hParams, &rrate, &dir);
251  if (ret<0)
252  return ALSADebug().evaluateError(ret);
253  return ret;
254  }
255 
261  int getSampleRate(int dir=0) {
262  unsigned int rate;
263  int err=snd_pcm_hw_params_get_rate(hParams, &rate, &dir);
264  if (err<0)
265  return err;
266  else
267  return rate;
268  }
269 
275  int getPeriodSize(snd_pcm_uframes_t *p, int *dir=NULL) {
276  return snd_pcm_hw_params_get_period_size(hParams, p, dir);
277  }
278 
284  int getPeriodSize(int *dir=NULL) {
285  snd_pcm_uframes_t p;
286  return getPeriodSize(&p, dir);
287  }
288 
294  int setPeriodSize(snd_pcm_uframes_t *p, int *dir=0) {
295  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
296  return snd_pcm_hw_params_set_period_size_near(getPCM(), hParams, p, dir);
297  }
298 
303  int setBufSize(snd_pcm_uframes_t bufSize) {
304  PCM_NOT_OPEN_CHECK(getPCM()) // check pcm is open
305  snd_pcm_uframes_t periodSize = bufSize * 2;
306 
307  int err = snd_pcm_hw_params_set_buffer_size_near(getPCM(), hParams, &periodSize);
308  if (err < 0) {
309  printf("Unable to set buffer size %d %s \n",(int)(bufSize*2), snd_strerror(err));
310  return err;
311  }
312  periodSize /= 2;
313  if ((err = setPeriodSize(&periodSize)) < 0)
314  printf("Unable to set period size %d %s \n",(int)periodSize, snd_strerror(err));
315  return err;
316  }
317 
318  const char *formatDescription(const snd_pcm_format_t format) const {
319  return snd_pcm_format_description(format);
320  }
321 
325  const char *getDeviceName(){
326  PCM_NOT_OPEN_CHECK_STRING(getPCM()) // check pcm is open
327  return snd_pcm_name(getPCM());
328  }
329 
331  int ret=0;
332  if (!logEnabled())
333  return ret;
334  return snd_pcm_hw_params_dump(hParams, log);
335  }
336  };
337 }
338 #endif //HARDWARE_H
int setSampleRate(unsigned int rrate, int dir=0)
Definition: Hardware.H:248
void copyFrom(snd_pcm_hw_params_t *hParamsIn)
Definition: Hardware.H:83
const char * getDeviceName()
Definition: Hardware.H:325
int getPeriodSize(snd_pcm_uframes_t *p, int *dir=NULL)
Definition: Hardware.H:275
const char * formatDescription(const snd_pcm_format_t format) const
Definition: Hardware.H:318
int setBufSize(snd_pcm_uframes_t bufSize)
Definition: Hardware.H:303
virtual ~Hardware()
Definition: Hardware.H:74
#define PCM_NOT_OPEN_CHECK_STRING(pcm)
Definition: ALSA.H:31
#define PCM_NOT_OPEN_CHECK_NO_PRINT(pcm, type)
Definition: ALSA.H:28
virtual snd_pcm_t * getPCM()
Definition: PCM.H:42
int setPeriodSize(snd_pcm_uframes_t *p, int *dir=0)
Definition: Hardware.H:294
int setHWParams()
Definition: Hardware.H:33
Definition: ALSA.H:26
Definition: PCM.H:26
int getHWParams()
Definition: Hardware.H:42
int setAccess(snd_pcm_access_t access)
Definition: Hardware.H:105
float p
int getFormat(snd_pcm_format_t &format)
Definition: Hardware.H:195
int getMaxChannels()
Definition: Hardware.H:234
virtual int evaluateError(int errorNum)
Definition: ALSADebug.H:61
int getAccess(void)
Definition: Hardware.H:116
int fillParams()
Definition: Hardware.H:51
#define PCM_NOT_OPEN_CHECK(pcm)
Definition: ALSA.H:30
snd_pcm_hw_params_t * hParams
PCM params.
Definition: Hardware.H:27
int getSampleRate(int dir=0)
Definition: Hardware.H:261
int getPeriodSize(int *dir=NULL)
Definition: Hardware.H:284
snd_output_t * log
The log stream if enabled.
Definition: PCM.H:28
int getFormatPhysicalWidth()
Definition: Hardware.H:202
int rateResample(unsigned int state)
Definition: Hardware.H:91
int setFormat(snd_pcm_format_t format)
Definition: Hardware.H:182
int resetParams()
Definition: Hardware.H:63
int getChannels()
Definition: Hardware.H:222
int setChannels(unsigned int cnt)
Definition: Hardware.H:214
int dumpHWParams()
Definition: Hardware.H:330
int logEnabled()
Definition: PCM.H:113
gtkIOStream: /tmp/gtkiostream/include/ALSA/Hardware.H Source File
GTK+ IOStream  Beta