2 mediastreamer2 library - modular sound and video processing and streaming
3 Copyright (C) 2006 Simon MORLAT (simon.morlat@linphone.org)
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.
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.
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.
20 #include "mediastreamer2/mssndcard.h"
22 #include "mediastreamer-config.h"
25 static MSSndCardManager *scm=NULL;
27 static MSSndCardManager * create_manager(){
28 MSSndCardManager *obj=(MSSndCardManager *)ms_new(MSSndCardManager,1);
34 void ms_snd_card_manager_destroy(void){
37 for(elem=scm->descs;elem!=NULL;elem=elem->next){
38 MSSndCardDesc *desc = (MSSndCardDesc*)elem->data;
39 if (desc->unload!=NULL)
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);
50 MSSndCardManager * ms_snd_card_manager_get(void){
51 if (scm==NULL) scm=create_manager();
55 MSSndCard * ms_snd_card_manager_get_card(MSSndCardManager *m, const char *id){
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;
62 if (id!=NULL) ms_warning("no card with id %s",id);
66 MSSndCard * ms_snd_card_manager_get_default_card(MSSndCardManager *m){
67 /*return the first card that has the capture+playback capability */
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))
78 MSSndCard * ms_snd_card_manager_get_default_capture_card(MSSndCardManager *m){
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)
88 MSSndCard * ms_snd_card_manager_get_default_playback_card(MSSndCardManager *m){
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)
98 const MSList * ms_snd_card_manager_get_list(MSSndCardManager *m){
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);
107 static void card_detect(MSSndCardManager *m, MSSndCardDesc *desc){
108 if (desc->detect!=NULL)
112 void ms_snd_card_manager_register_desc(MSSndCardManager *m, MSSndCardDesc *desc){
113 m->descs=ms_list_append(m->descs,desc);
117 void ms_snd_card_manager_reload(MSSndCardManager *m){
119 ms_list_for_each(m->cards,(void (*)(void*))ms_snd_card_destroy);
120 ms_list_free(m->cards);
122 for(elem=m->descs;elem!=NULL;elem=elem->next)
123 card_detect(m,(MSSndCardDesc*)elem->data);
126 MSSndCard * ms_snd_card_dup(MSSndCard *card){
128 if (card->desc->duplicate!=NULL)
129 obj=card->desc->duplicate(card);
133 MSSndCard * ms_snd_card_new(MSSndCardDesc *desc){
134 MSSndCard *obj=(MSSndCard *)ms_new(MSSndCard,1);
139 obj->capabilities=MS_SND_CARD_CAP_CAPTURE|MS_SND_CARD_CAP_PLAYBACK;
140 if (desc->init!=NULL)
145 const char *ms_snd_card_get_driver_type(const MSSndCard *obj){
146 return obj->desc->driver_type;
149 const char *ms_snd_card_get_name(const MSSndCard *obj){
153 unsigned int ms_snd_card_get_capabilities(const MSSndCard *obj){
154 return obj->capabilities;
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);
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);
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);
172 ms_warning("ms_snd_card_get_level: unimplemented by %s wrapper",obj->desc->driver_type);
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);
183 int ms_snd_card_set_control(MSSndCard *obj, MSSndCardControlElem e, int val)
185 if (obj->desc->set_control!=NULL)
186 return obj->desc->set_control(obj,e,val);
188 ms_warning("ms_snd_card_set_control: unimplemented by %s wrapper",obj->desc->driver_type);
193 int ms_snd_card_get_control(MSSndCard *obj, MSSndCardControlElem e)
195 if (obj->desc->get_control!=NULL)
196 return obj->desc->get_control(obj,e);
198 ms_warning("ms_snd_card_get_control: unimplemented by %s wrapper",obj->desc->driver_type);
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);
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);
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);
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");