]> sjero.net Git - linphone/blob - linphone/mediastreamer2/src/mssndcard.c
remote ortp and add it as a submodule instead.
[linphone] / linphone / mediastreamer2 / src / mssndcard.c
1 /*
2 mediastreamer2 library - modular sound and video processing and streaming
3 Copyright (C) 2006  Simon MORLAT (simon.morlat@linphone.org)
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 */
19
20 #include "mediastreamer2/mssndcard.h"
21 #ifdef HAVE_CONFIG_H
22 #include "mediastreamer-config.h"
23 #endif
24
25 static MSSndCardManager *scm=NULL;
26
27 static MSSndCardManager * create_manager(){
28         MSSndCardManager *obj=(MSSndCardManager *)ms_new(MSSndCardManager,1);
29         obj->cards=NULL;
30         obj->descs=NULL;
31         return obj;
32 }
33
34 void ms_snd_card_manager_destroy(void){
35         if (scm!=NULL){
36                 MSList *elem;
37                 for(elem=scm->descs;elem!=NULL;elem=elem->next){
38                         MSSndCardDesc *desc = (MSSndCardDesc*)elem->data;
39                         if (desc->unload!=NULL)
40                                 desc->unload(scm);
41                 }
42                 ms_list_for_each(scm->cards,(void (*)(void*))ms_snd_card_destroy);
43                 ms_list_free(scm->cards);
44                 ms_list_free(scm->descs);
45         }
46         ms_free(scm);
47         scm=NULL;
48 }
49
50 MSSndCardManager * ms_snd_card_manager_get(void){
51         if (scm==NULL) scm=create_manager();
52         return scm;
53 }
54
55 MSSndCard * ms_snd_card_manager_get_card(MSSndCardManager *m, const char *id){
56         MSList *elem;
57         for (elem=m->cards;elem!=NULL;elem=elem->next){
58                 MSSndCard *card=(MSSndCard*)elem->data;
59                 if (id==NULL) return card;
60                 if (strcmp(ms_snd_card_get_string_id(card),id)==0)      return card;
61         }
62         if (id!=NULL) ms_warning("no card with id %s",id);
63         return NULL;
64 }
65
66 MSSndCard * ms_snd_card_manager_get_default_card(MSSndCardManager *m){
67         /*return the first card that has the capture+playback capability */
68         MSList *elem;
69         for (elem=m->cards;elem!=NULL;elem=elem->next){
70                 MSSndCard *card=(MSSndCard*)elem->data;
71                 if ((card->capabilities & MS_SND_CARD_CAP_CAPTURE )
72                         && (card->capabilities & MS_SND_CARD_CAP_PLAYBACK))
73                         return card;
74         }
75         return NULL;
76 }
77
78 MSSndCard * ms_snd_card_manager_get_default_capture_card(MSSndCardManager *m){
79         MSList *elem;
80         for (elem=m->cards;elem!=NULL;elem=elem->next){
81                 MSSndCard *card=(MSSndCard*)elem->data;
82                 if (card->capabilities & MS_SND_CARD_CAP_CAPTURE)
83                         return card;
84         }
85         return NULL;
86 }
87
88 MSSndCard * ms_snd_card_manager_get_default_playback_card(MSSndCardManager *m){
89         MSList *elem;
90         for (elem=m->cards;elem!=NULL;elem=elem->next){
91                 MSSndCard *card=(MSSndCard*)elem->data;
92                 if (card->capabilities & MS_SND_CARD_CAP_PLAYBACK)
93                         return card;
94         }
95         return NULL;
96 }
97
98 const MSList * ms_snd_card_manager_get_list(MSSndCardManager *m){
99         return m->cards;
100 }
101
102 void ms_snd_card_manager_add_card(MSSndCardManager *m, MSSndCard *c){
103         ms_message("Card %s added",ms_snd_card_get_string_id(c));
104         m->cards=ms_list_append(m->cards,c);
105 }
106
107 static void card_detect(MSSndCardManager *m, MSSndCardDesc *desc){
108         if (desc->detect!=NULL)
109                 desc->detect(m);
110 }
111
112 void ms_snd_card_manager_register_desc(MSSndCardManager *m, MSSndCardDesc *desc){
113         m->descs=ms_list_append(m->descs,desc);
114         card_detect(m,desc);
115 }
116
117 void ms_snd_card_manager_reload(MSSndCardManager *m){
118         MSList *elem;
119         ms_list_for_each(m->cards,(void (*)(void*))ms_snd_card_destroy);
120         ms_list_free(m->cards);
121         m->cards=NULL;
122         for(elem=m->descs;elem!=NULL;elem=elem->next)
123                 card_detect(m,(MSSndCardDesc*)elem->data);
124 }
125
126 MSSndCard * ms_snd_card_dup(MSSndCard *card){
127         MSSndCard *obj=NULL;
128         if (card->desc->duplicate!=NULL)
129                 obj=card->desc->duplicate(card);
130         return obj;
131 }
132
133 MSSndCard * ms_snd_card_new(MSSndCardDesc *desc){
134         MSSndCard *obj=(MSSndCard *)ms_new(MSSndCard,1);
135         obj->desc=desc;
136         obj->name=NULL;
137         obj->data=NULL;
138         obj->id=NULL;
139         obj->capabilities=MS_SND_CARD_CAP_CAPTURE|MS_SND_CARD_CAP_PLAYBACK;
140         if (desc->init!=NULL)
141                 desc->init(obj);
142         return obj;
143 }
144
145 const char *ms_snd_card_get_driver_type(const MSSndCard *obj){
146         return obj->desc->driver_type;
147 }
148
149 const char *ms_snd_card_get_name(const MSSndCard *obj){
150         return obj->name;
151 }
152
153 unsigned int ms_snd_card_get_capabilities(const MSSndCard *obj){
154         return obj->capabilities;
155 }
156
157 const char *ms_snd_card_get_string_id(MSSndCard *obj){
158         if (obj->id==NULL)      obj->id=ms_strdup_printf("%s: %s",obj->desc->driver_type,obj->name);
159         return obj->id;
160 }
161
162 void ms_snd_card_set_level(MSSndCard *obj, MSSndCardMixerElem e, int percent){
163         if (obj->desc->set_level!=NULL)
164                 obj->desc->set_level(obj,e,percent);
165         else ms_warning("ms_snd_card_set_level: unimplemented by %s wrapper",obj->desc->driver_type);
166 }
167
168 int ms_snd_card_get_level(MSSndCard *obj, MSSndCardMixerElem e){
169         if (obj->desc->get_level!=NULL)
170                 return obj->desc->get_level(obj,e);
171         else {
172                 ms_warning("ms_snd_card_get_level: unimplemented by %s wrapper",obj->desc->driver_type);
173                 return -1;
174         }
175 }
176
177 void ms_snd_card_set_capture(MSSndCard *obj, MSSndCardCapture c){
178         if (obj->desc->set_capture!=NULL)
179                 obj->desc->set_capture(obj,c);
180         else ms_warning("ms_snd_card_set_capture: unimplemented by %s wrapper",obj->desc->driver_type);
181 }
182
183 int ms_snd_card_set_control(MSSndCard *obj, MSSndCardControlElem e, int val)
184 {
185         if (obj->desc->set_control!=NULL)
186                 return obj->desc->set_control(obj,e,val);
187         else {
188                 ms_warning("ms_snd_card_set_control: unimplemented by %s wrapper",obj->desc->driver_type);
189                 return -1;
190         }
191 }
192
193 int ms_snd_card_get_control(MSSndCard *obj, MSSndCardControlElem e)
194 {
195         if (obj->desc->get_control!=NULL)
196                 return obj->desc->get_control(obj,e);
197         else {
198                 ms_warning("ms_snd_card_get_control: unimplemented by %s wrapper",obj->desc->driver_type);
199                 return -1;
200         }
201 }
202
203 struct _MSFilter * ms_snd_card_create_reader(MSSndCard *obj){
204         if (obj->desc->create_reader!=NULL)
205                 return obj->desc->create_reader(obj);
206         else ms_warning("ms_snd_card_create_reader: unimplemented by %s wrapper",obj->desc->driver_type);
207         return NULL;
208 }
209
210 struct _MSFilter * ms_snd_card_create_writer(MSSndCard *obj){
211         if (obj->desc->create_writer!=NULL)
212                 return obj->desc->create_writer(obj);
213         else ms_warning("ms_snd_card_create_writer: unimplemented by %s wrapper",obj->desc->driver_type);
214         return NULL;
215 }
216
217 void ms_snd_card_destroy(MSSndCard *obj){
218         if (obj->desc->uninit!=NULL) obj->desc->uninit(obj);
219         if (obj->name!=NULL) ms_free(obj->name);
220         if (obj->id!=NULL)      ms_free(obj->id);
221         ms_free(obj);
222 }
223
224 #ifdef __linux
225 #ifndef __ALSA_ENABLED__
226 MSSndCard * ms_alsa_card_new_custom(const char *pcmdev, const char *mixdev){
227         ms_warning("Alsa support not available in this build of mediastreamer2");
228         return NULL;
229 }
230 #endif
231 #endif