diff --git a/sflphone-gtk/src/configwindow.c b/sflphone-gtk/src/configwindow.c index 94030500b6c75589567d82a9e056afd408318d6e..0ee2158ff2ddf6754d60e7bdb5e8675c018bc519 100644 --- a/sflphone-gtk/src/configwindow.c +++ b/sflphone-gtk/src/configwindow.c @@ -239,9 +239,6 @@ config_window_fill_input_audio_device_list() int c = 0; for(audioDevice = list; *list; list++) { - - //int index = atoi(audioDevice); - //details = dbus_get_audio_device_details(index); gtk_list_store_append(inputAudioDeviceManagerStore, &iter); gtk_list_store_set(inputAudioDeviceManagerStore, &iter, 0, *list, 1, c, -1); c++; diff --git a/src/audio/audiolayer.cpp b/src/audio/audiolayer.cpp index e02ea6cdee2a9eac052409e6e6f028a6d85c3fd9..6d18cec645455785447cab7ef94e78c179fe4f3e 100644 --- a/src/audio/audiolayer.cpp +++ b/src/audio/audiolayer.cpp @@ -49,6 +49,7 @@ _outChannel = 1; // don't put in stereo _echoTesting = false; get_alsa_version(); + getHardware(2); #ifdef SFL_TEST_SINE leftPhase_ = 0; @@ -114,7 +115,7 @@ AudioLayer::openDevice (int indexIn, int indexOut, int sampleRate, int frameSize ost::MutexLock guard( _mutex ); - std::string pcmp = buildDeviceTopo(PCM_FRONT, indexOut ); + std::string pcmp = buildDeviceTopo(PCM_DMIX, indexOut ); std::string pcmc = buildDeviceTopo(PCM_FRONT, indexIn ); return open_device( pcmp , pcmc, flag); } @@ -278,7 +279,7 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) if(flag == 0 || flag == 2) { _debug(" Opening capture device %s\n", pcm_c.c_str()); - if(err = snd_pcm_open(&_capture_handle, pcm_c.c_str() , SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK) < 0){ + if(err = snd_pcm_open(&_capture_handle, pcm_c.c_str(), SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK) < 0){ _debug(" Error while opening capture device %s (%s)\n", pcm_c.c_str(), snd_strerror(err)); return false; } @@ -493,4 +494,59 @@ AudioLayer::buildDeviceTopo( std::string prefixe, int suffixe) return pcm; } - + std::vector<std::string> +AudioLayer::getHardware( int flag ) +{ + std::vector<std::string> cards_id; + + snd_ctl_t* handle; + snd_ctl_card_info_t *info; + snd_pcm_info_t* pcminfo; + snd_ctl_card_info_alloca( &info ); + snd_pcm_info_alloca( &pcminfo ); + + int numCard = -1 ; + int err; + int dev = -1; + std::stringstream ss; + + if(snd_card_next( &numCard ) < 0 || numCard < 0) + return cards_id; + + while(numCard >= 0){ + ss << numCard; + std::string name= "hw:"; + name.append(ss.str()); + + if( snd_ctl_open( &handle, name.c_str(), 0) == 0 ){ + if( snd_ctl_card_info( handle, info) == 0){ + snd_pcm_info_set_device( pcminfo , dev); + snd_pcm_info_set_subdevice( pcminfo, 0 ); + + if(flag == 2) + snd_pcm_info_set_stream( pcminfo, SND_PCM_STREAM_CAPTURE ); + else + snd_pcm_info_set_stream( pcminfo, SND_PCM_STREAM_PLAYBACK ); + + if( snd_ctl_pcm_info ( handle ,pcminfo ) < 0) _debug(" Cannot get info\n"); + _debug("card %i : %s [%s]- device %i : %s [%s]\n - driver %s - dir %i\n", + numCard, + snd_ctl_card_info_get_id(info), + snd_ctl_card_info_get_name( info ), + numCard, + snd_pcm_info_get_id(pcminfo), + snd_pcm_info_get_name( pcminfo), + snd_ctl_card_info_get_driver( info ), + snd_pcm_info_get_stream( pcminfo ) ); + if(snd_pcm_info_get_name( pcminfo ) != NULL) + cards_id.push_back(snd_ctl_card_info_get_name( info )); + } + snd_ctl_close( handle ); + } + if ( snd_card_next( &numCard ) < 0 ) { + break; + } + + } + return cards_id; +} diff --git a/src/audio/audiolayer.h b/src/audio/audiolayer.h index 438cf17ff4e06842d14f7077fc5cfb6580dc63c1..1fc4fb385b9c86d5d298603b975fef8323105232 100644 --- a/src/audio/audiolayer.h +++ b/src/audio/audiolayer.h @@ -68,6 +68,7 @@ class AudioLayer { int getMic(void *, int); std::vector<std::string> get_sound_cards( void ); std::string buildDeviceTopo( std::string prefixe, int suffixe); + std::vector<std::string> getHardware( int flag ); int audioCallback (const void *, void *, unsigned long); diff --git a/src/global.h b/src/global.h index ede4ac32a2a3e55269d155bea1ab6e776914dfb1..66559c35763f83f5982aba85b42f81b198bdaf24 100644 --- a/src/global.h +++ b/src/global.h @@ -76,5 +76,6 @@ typedef short int16; #define PCM_FRONT "plug:front" #define PCM_DEFAULT "default" +#define PCM_DMIX "plug:dmix" #endif // __GLOBAL_H__ diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 4cb2bae2c8fb9e11a5766404d3370e2a9d92e7a7..949346101bd2af580e0d205841c230b40c9d5d79 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -1251,7 +1251,8 @@ ManagerImpl::setAudioManager(const std::string& audioManager) ManagerImpl::getAudioOutputDeviceList(void) { _debug("Get audio output device list"); - return _audiodriver -> get_sound_cards(); + //return _audiodriver -> get_sound_cards(); + return _audiodriver -> getHardware(1); } /** @@ -1271,7 +1272,8 @@ ManagerImpl::setAudioOutputDevice(const int index) ManagerImpl::getAudioInputDeviceList(void) { _debug("Get audio input device list\n"); - return _audiodriver -> get_sound_cards(); + //return _audiodriver -> get_sound_cards(); + return _audiodriver->getHardware(2); } /**