gtkIOStream  1.7.0
GTK+ << C++ IOStream operators for GTK+. Now with ORBing, numerical computation, audio client and more ...
Mixer.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 MIXER_H_
18 #define MIXER_H_
19 
20 #include <ALSA/MixerElement.H>
21 
22 namespace ALSA {
25  class Mixer {
26  snd_mixer_t *handle;
27  std::vector<MixerElement> mixerElements;
28 
29  public:
30  Mixer(){
31  handle=NULL;
32  }
33 
34  virtual ~Mixer(){
35  if (handle)
36  close();
37  }
38 
42  int open(){
43  int err;
44  if ((err = snd_mixer_open(&handle, 0)) < 0) {
45  handle=NULL;
46  return ALSADebug().evaluateError(err);
47  }
48  return 0;
49  }
50 
54  int close(){
55  MIXER_NOT_OPEN_CHECK(handle)
56  int err;
57  if ((err = snd_mixer_close(handle)) < 0) {
58  handle=NULL;
59  return ALSADebug().evaluateError(err);
60  }
61  handle=NULL;
62  return 0;
63  }
64 
69  int attach(std::string card){
70  MIXER_NOT_OPEN_CHECK(handle)
71  int err;
72  if ((err = snd_mixer_attach(handle, card.c_str())) < 0) {
73  snd_mixer_close(handle);
74  std::string msg="Mixer attach "; msg+=card;
75  return ALSADebug().evaluateError(err, msg);
76  }
77  return 0;
78  }
79 
84  MIXER_NOT_OPEN_CHECK(handle)
85  int err;
86  if ((err = snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
87  snd_mixer_close(handle);
88  return ALSADebug().evaluateError(err, "Mixer register ");
89  }
90  return 0;
91  }
92 
96  int load(){
97  MIXER_NOT_OPEN_CHECK(handle)
98  int err;
99  if ((err = snd_mixer_load(handle)) < 0) {
100  snd_mixer_close(handle);
101  return ALSADebug().evaluateError(err, "Mixer load ");
102  }
103  return 0;
104  }
105 
110  int openCard(std::string card){
111  int err=0;
112  if (handle)
113  if ((err=close())<0)
114  return err;
115  if ((err=open())<0)
116  return err;
117  if ((err=attach(card))<0)
118  return err;
119  if ((err=registerMixer())<0)
120  return err;
121  if ((err=load())<0)
122  return err;
123  return err;
124  }
125 
129  void scanMixer(){
130  if (!handle)
132  else {
133  mixerElements.resize(0);
134  for (snd_mixer_elem_t *elem = snd_mixer_first_elem(handle); elem; elem = snd_mixer_elem_next(elem)){
135  mixerElements.push_back(MixerElement(elem));
136  }
137  }
138  }
139 
142  friend std::ostream &operator<<(std::ostream &os, Mixer &m){
143  os<<"[\n";
144  for (int i=0; i<m.mixerElements.size(); i++)
145  os<<m.mixerElements[i]<< ((i<m.mixerElements.size()-1) ? ",\n" : "\n");
146  os<<"]\n";
147  return os;
148  }
149 
153  std::string getState(){
154  std::ostringstream oss;
155  oss<<*this;
156  return oss.str();
157  }
158 
163  std::string getElementState(std::string name){
164  int i=getElementIndex(name);
165  std::ostringstream oss;
166  if (i<0)
167  oss<<"{\"name\":\""<<name<<"\",\"error\":"<< ALSA_MIXER_FIND_ELEMENT_ERROR <<"}";
168  else
169  oss<<mixerElements[i];
170  return oss.str();
171  }
172 
175  int getElementIndex(std::string name){
176  for (int i=0; i<mixerElements.size(); i++)
177  if (name.compare(mixerElements[i].name)==0)
178  return i;
179  return -1;
180  }
181 
187  long setPlaybackVol(std::string name, long v){
188  int i=getElementIndex(name);
189  if (i<0)
191  return mixerElements[i].setPlaybackVol(v);
192  }
193 
200  long setPlaybackChVol(std::string name, snd_mixer_selem_channel_id_t channel, long v){
201  int i=getElementIndex(name);
202  if (i<0)
204  return mixerElements[i].setPlaybackVol(channel, v);
205  }
206 
212  std::string setPlaybackVolJSON(std::string name, long v){
213  long val=setPlaybackVol(name, v);
214  std::ostringstream ret;
215  if (val<0)
216  ret<<"{\"name\":\""<<name<<"\",\"error\":"<< val <<"}";
217  else
218  ret<<"{\"name\":\""<<name<<"\",\"val\":"<<val<<"}";
219  return ret.str();
220  }
221 
228  std::string setPlaybackChVolJSON(std::string name, snd_mixer_selem_channel_id_t channel, long v){
229  long val=setPlaybackChVol(name, channel, v);
230  std::ostringstream ret;
231  if (val<0)
232  ret<<"{\"name\":\""<<name<<"\",\"channel\":"<< channel<<",\"error\":"<< val <<"}";
233  else
234  ret<<"{\"name\":\""<<name<<"\",\"channel\":"<< channel<<",\"val\":"<<val<<"}";
235  return ret.str();
236  }
237 
244  std::string setPlaybackChVolJSON(std::string name, int channel, long v){
245  return setPlaybackChVolJSON(name, (snd_mixer_selem_channel_id_t) channel, v);
246  }
247 
253  int setPlaybackVolDB(std::string name, double &dB){
254  int i=getElementIndex(name);
255  if (i<0)
257  return mixerElements[i].setPlaybackVolDB(dB);
258  }
259 
266  int setPlaybackChVolDB(std::string name, snd_mixer_selem_channel_id_t channel, double &dB){
267  int i=getElementIndex(name);
268  if (i<0)
270  return mixerElements[i].setPlaybackVolDB(channel, dB);
271  }
272 
278  std::string setPlaybackVolDBJSON(std::string name, double dB){
279  int err=setPlaybackVolDB(name, dB);
280  std::ostringstream ret;
281  if (err<0)
282  ret<<"{\"name\":\""<<name<<"\",\"error\":"<< err <<"}";
283  else
284  ret<<"{\"name\":\""<<name<<"\",\"val\":"<< dB <<"}";
285  return ret.str();
286  }
287 
294  std::string setPlaybackChVolDBJSON(std::string name, snd_mixer_selem_channel_id_t channel, double dB){
295  int err=setPlaybackChVolDB(name, channel, dB);
296  std::ostringstream ret;
297  if (err<0)
298  ret<<"{\"name\":\""<<name<<"\",\"channel\":"<< channel<<",\"error\":"<< err <<"}";
299  else
300  ret<<"{\"name\":\""<<name<<"\",\"channel\":"<< channel<<",\"val\":"<< dB <<"}";
301  return ret.str();
302  }
303 
310  std::string setPlaybackChVolDBJSON(std::string name, int channel, double dB){
311  return setPlaybackChVolDBJSON(name, (snd_mixer_selem_channel_id_t) channel, dB);
312  }
313 
319  int setPlaybackSwitch(std::string name, int v){
320  int i=getElementIndex(name);
321  if (i<0)
323  return mixerElements[i].setPlaybackSwitch(v);
324  }
325 
331  std::string setPlaybackSwitchJSON(std::string name, int v){
332  int err=setPlaybackSwitch(name, v);
333  std::ostringstream ret;
334  if (err<0)
335  ret<<"{\"name\":\""<<name<<"\",\"error\":"<< err <<"}";
336  else
337  ret<<"{\"name\":\""<<name<<"\",\"switch\":"<< err <<"}";
338  return ret.str();
339  }
340 
346  long setCaptureVol(std::string name, long v){
347  int i=getElementIndex(name);
348  if (i<0)
350  return mixerElements[i].setCaptureVol(v);
351  }
352 
359  long setCaptureVol(std::string name, snd_mixer_selem_channel_id_t channel, long v){
360  int i=getElementIndex(name);
361  if (i<0)
363  return mixerElements[i].setCaptureVol(channel, v);
364  }
365 
371  std::string setCaptureVolJSON(std::string name, long v){
372  long val=setCaptureVol(name, v);
373  std::ostringstream ret;
374  if (val<0)
375  ret<<"{\"name\":\""<<name<<"\",\"error\":"<< val <<"}";
376  else
377  ret<<"{\"name\":\""<<name<<"\",\"val\":"<<val<<"}";
378  return ret.str();
379  }
380 
387  std::string setCaptureChVolJSON(std::string name, snd_mixer_selem_channel_id_t channel, long v){
388  long val=setCaptureVol(name, channel, v);
389  std::ostringstream ret;
390  if (val<0)
391  ret<<"{\"name\":\""<<name<<"\",\"channel\":"<< channel<<",\"error\":"<< val <<"}";
392  else
393  ret<<"{\"name\":\""<<name<<"\",\"channel\":"<< channel<<",\"val\":"<<val<<"}";
394  return ret.str();
395  }
396 
403  std::string setCaptureChVolJSON(std::string name, int channel, long v){
404  return setCaptureChVolJSON(name, (snd_mixer_selem_channel_id_t) channel, v);
405  }
406 
412  int setCaptureVolDB(std::string name, double &dB){
413  int i=getElementIndex(name);
414  if (i<0)
416  return mixerElements[i].setCaptureVolDB(dB);
417  }
418 
425  int setCaptureChVolDB(std::string name, snd_mixer_selem_channel_id_t channel, double &dB){
426  int i=getElementIndex(name);
427  if (i<0)
429  return mixerElements[i].setCaptureVolDB(channel, dB);
430  }
431 
437  std::string setCaptureVolDBJSON(std::string name, double dB){
438  int err=setCaptureVolDB(name, dB);
439  std::ostringstream ret;
440  if (err<0)
441  ret<<"{\"name\":\""<<name<<"\",\"error\":"<< err <<"}";
442  else
443  ret<<"{\"name\":\""<<name<<"\",\"val\":"<< dB <<"}";
444  return ret.str();
445  }
446 
453  std::string setCaptureChVolDBJSON(std::string name, snd_mixer_selem_channel_id_t channel, double dB){
454  int err=setCaptureChVolDB(name, channel, dB);
455  std::ostringstream ret;
456  if (err<0)
457  ret<<"{\"name\":\""<<name<<"\",\"channel\":"<< channel<<",\"error\":"<< err <<"}";
458  else
459  ret<<"{\"name\":\""<<name<<"\",\"channel\":"<< channel<<",\"val\":"<< dB <<"}";
460  return ret.str();
461  }
462 
469  std::string setCaptureChVolDBJSON(std::string name, int channel, double dB){
470  return setCaptureChVolDBJSON(name, (snd_mixer_selem_channel_id_t) channel, dB);
471  }
477  int setCaptureSwitch(std::string name, int v){
478  int i=getElementIndex(name);
479  if (i<0)
481  return mixerElements[i].setCaptureSwitch(v);
482  }
483 
489  std::string setCaptureSwitchJSON(std::string name, int v){
490  int err=setCaptureSwitch(name, v);
491  std::ostringstream ret;
492  if (err<0)
493  ret<<"{\"name\":\""<<name<<"\",\"error\":"<< err <<"}";
494  else
495  ret<<"{\"name\":\""<<name<<"\",\"switch\":"<< err <<"}";
496  return ret.str();
497  }
498  };
499 }
500 #endif // MIXER_H_
long setPlaybackVol(std::string name, long v)
Definition: Mixer.H:187
long setCaptureVol(std::string name, long v)
Definition: Mixer.H:346
int open()
Definition: Mixer.H:42
#define ALSA_MIXER_NOT_OPEN_ERROR
error when mixer pointer is null
Definition: ALSADebug.H:32
std::vector< MixerElement > mixerElements
The vector of all mixer elements.
Definition: Mixer.H:27
virtual ~Mixer()
Definition: Mixer.H:34
int setPlaybackVolDB(std::string name, double &dB)
Definition: Mixer.H:253
int openCard(std::string card)
Definition: Mixer.H:110
#define MIXER_NOT_OPEN_CHECK(handle)
Definition: ALSA.H:35
std::string setPlaybackChVolJSON(std::string name, int channel, long v)
Definition: Mixer.H:244
std::string setCaptureChVolDBJSON(std::string name, snd_mixer_selem_channel_id_t channel, double dB)
Definition: Mixer.H:453
int setCaptureChVolDB(std::string name, snd_mixer_selem_channel_id_t channel, double &dB)
Definition: Mixer.H:425
Definition: ALSA.H:26
virtual int evaluateError(int errorNum)
Definition: ALSADebug.H:61
std::string setPlaybackChVolDBJSON(std::string name, snd_mixer_selem_channel_id_t channel, double dB)
Definition: Mixer.H:294
int load()
Definition: Mixer.H:96
std::string setPlaybackChVolJSON(std::string name, snd_mixer_selem_channel_id_t channel, long v)
Definition: Mixer.H:228
std::string setPlaybackVolDBJSON(std::string name, double dB)
Definition: Mixer.H:278
int setCaptureVolDB(std::string name, double &dB)
Definition: Mixer.H:412
int getElementIndex(std::string name)
Definition: Mixer.H:175
long setCaptureVol(std::string name, snd_mixer_selem_channel_id_t channel, long v)
Definition: Mixer.H:359
std::string setCaptureChVolDBJSON(std::string name, int channel, double dB)
Definition: Mixer.H:469
int registerMixer()
Definition: Mixer.H:83
#define ALSA_MIXER_FIND_ELEMENT_ERROR
error when trying to find a mixer element
Definition: ALSADebug.H:34
long setPlaybackChVol(std::string name, snd_mixer_selem_channel_id_t channel, long v)
Definition: Mixer.H:200
std::string setCaptureChVolJSON(std::string name, snd_mixer_selem_channel_id_t channel, long v)
Definition: Mixer.H:387
snd_mixer_t * handle
Definition: Mixer.H:26
friend std::ostream & operator<<(std::ostream &os, Mixer &m)
Definition: Mixer.H:142
std::string setPlaybackVolJSON(std::string name, long v)
Definition: Mixer.H:212
int setPlaybackChVolDB(std::string name, snd_mixer_selem_channel_id_t channel, double &dB)
Definition: Mixer.H:266
void scanMixer()
Definition: Mixer.H:129
std::string setCaptureSwitchJSON(std::string name, int v)
Definition: Mixer.H:489
int setCaptureSwitch(std::string name, int v)
Definition: Mixer.H:477
Mixer()
Definition: Mixer.H:30
int attach(std::string card)
Definition: Mixer.H:69
std::string setPlaybackChVolDBJSON(std::string name, int channel, double dB)
Definition: Mixer.H:310
std::string setPlaybackSwitchJSON(std::string name, int v)
Definition: Mixer.H:331
int close()
Definition: Mixer.H:54
std::string setCaptureVolJSON(std::string name, long v)
Definition: Mixer.H:371
std::string getState()
Definition: Mixer.H:153
std::string setCaptureChVolJSON(std::string name, int channel, long v)
Definition: Mixer.H:403
int setPlaybackSwitch(std::string name, int v)
Definition: Mixer.H:319
std::string setCaptureVolDBJSON(std::string name, double dB)
Definition: Mixer.H:437
std::string getElementState(std::string name)
Definition: Mixer.H:163
gtkIOStream: /tmp/gtkiostream/include/ALSA/Mixer.H Source File
GTK+ IOStream  Beta